惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
V2EX
博客园 - 【当耐特】
爱范儿
爱范儿
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MyScale Blog
MyScale Blog
月光博客
月光博客
博客园_首页
G
Google Developers Blog
Recent Announcements
Recent Announcements
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
D
Docker
aimingoo的专栏
aimingoo的专栏
博客园 - Franky
有赞技术团队
有赞技术团队
I
InfoQ
小众软件
小众软件
云风的 BLOG
云风的 BLOG
The GitHub Blog
The GitHub Blog
H
Help Net Security
The Register - Security
The Register - Security
U
Unit 42
P
Palo Alto Networks Blog
N
News and Events Feed by Topic
酷 壳 – CoolShell
酷 壳 – CoolShell
C
CERT Recently Published Vulnerability Notes
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
Security Latest
Security Latest
Scott Helme
Scott Helme
罗磊的独立博客
B
Blog RSS Feed
C
Check Point Blog
H
Heimdal Security Blog
T
Threatpost
V
Visual Studio Blog
V
Vulnerabilities – Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Project Zero
Project Zero
Security Archives - TechRepublic
Security Archives - TechRepublic
S
Security Affairs
S
Schneier on Security
Apple Machine Learning Research
Apple Machine Learning Research
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
Attack and Defense Labs
Attack and Defense Labs
L
Lohrmann on Cybersecurity
D
DataBreaches.Net

Podcast

王自如:如果我是程序员我会淘汰我自己 鉴于中文播客有质量有深度的少, 想听些英语播客, 求推荐 - V2EX 新写了个小玩具~ 有人听罗永浩的播客么? 很有意思的一期播客 - V2EX 为啥有的 podcast 我加不上,是和地区有关系吗 - V2EX 小宇宙近期枯竭了,想知道 V 友们都在听什么播客。 - V2EX [试播] 第二期我们聊聊 OpenClaw - V2EX 「播客 EvanSays」一档与主播一起成长的播客节目,畅所欲言多提建议! - V2EX 大家通勤时都会听播客吗,有好的播客分享下吗 - V2EX 听英语播客,学习数理化(初中) - V2EX 有没有什么音乐播客推荐? - V2EX 求 2025 最好的播客推荐? - V2EX vget 可以批量下载小宇宙和苹果播客 - V2EX 有没有推荐的有意思的博客节目 - V2EX 播客 这玩意最近又火起来了?还是一直很火? - V2EX 你们上班的时候听不听播客?推荐推荐 - V2EX 最近 1 个多月看了罗永浩的播客,排个序,十分推荐各位去看。 - V2EX 大家觉得罗永浩的十字路口怎么样?为什么我觉得一期不如一期,后面实在听不下去了 - V2EX 现在的播客节目总给我一种精致感和精英感,听不下去。 - V2EX 有人能听得进去那种带观众录制的播客吗? - V2EX 佬们来分享一下日常听的播客 - V2EX 有没有人发现播客开始多了起来 - V2EX AI 时代,人类最后的“稀缺品”是什么? - V2EX AI 时代最残酷的真相:你最想招的人,根本不“找工作” - V2EX Vibe Coding——是代码的灾难,还是商业的英雄? - V2EX Ruby on Rails 创始人、作家与赛车手 DHH 的 6 小时访谈 - V2EX Teahour 又活了 - V2EX 播客录制踩坑记录 - V2EX 分享一个 AI 相关的中文 podcast,介绍 AI 相关的时事、进展 - V2EX 如何获取苹果 podcast 的字幕文本? - V2EX 那种没说几句就开始哈哈大笑的小圈子文化播客,为何受众一点不少? - V2EX 这几年太多的财富是 it 届爆发的,请问 v2 各位 it 届精英,你们平时都听什么播客? 播客小宇宙推荐: [赛博岛屿] 之从卖珍珠到 AIGC 创业,宇宙厂 95 后程序员的转型之路 - V2EX 来推荐一些你喜欢听的播客吧 - V2EX 我准备完整阅读金瓶梅并且录制成一个读书播客 - V2EX 有没有类似 Youtube 推荐机制的 Podcast 平台 求推荐听播客或者听书软件,以及一些质量不错的播客频道(财经、科技数码、软件、时事)都可以推荐。 - V2EX 你们听播客都是什么场景? 推荐我的播客“爱可可 AI 前沿快报” - V2EX 英文 podcast 推荐 - V2EX 大家有哪些好的播客节目推荐么? - V2EX 你有在听的 podcast 推荐吗? Google Podcasts 要下线了,你用过哪些被 Google 下线的产品 播客托管平台如何选择? - V2EX Podcast 分流设置 - V2EX 大家听播客,有听到哪些单集特别精彩的吗 - V2EX [摘录][随机波动]许子东文学通常不是答案但它提出问题 - V2EX 有没有有趣的英语初学者可以听懂的英语播客 大家都在听什么播客? 播客《纵横四海》主播初印象
篡改猴脚本:给 web 版小宇宙 FM 增加播放速率选项 - V2EX
yamedie · 2023-12-20 · via Podcast

通过TamperMonkey 扩展写脚本,给小宇宙播放页面增加了倍速选项,方便在电脑上收听。

搭配枫言枫语的这个播客榜单上班摸鱼 探索自己感兴趣的播客节目,真不错!

后续如果有新功能迭代,最新代码会在 博客 上进行更新。

xyzfm.png

// ==UserScript==
// @name         小宇宙 FM-增加倍速选项
// @namespace    http://tampermonkey.net/
// @version      0.6
// @description  try to take over the world!
// @author       icheer
// @match        https://www.xiaoyuzhoufm.com/episode/*
// @match        https://www.xiaoyuzhoufm.com/podcast/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=xiaoyuzhoufm.com
// @grant        none
// ==/UserScript==

(async function init (delay = 0) {
  const sleep = time => new Promise(resolve => setTimeout(resolve, time));
  const $ = sel => document.querySelector(sel);
  const CE = tag => document.createElement(tag);
  await sleep(delay);
  const panel = $('.controls');
  if (!panel) return console.error('panel not found');
  const audio = $('audio');
  if (!audio) return console.error('audio not found');
  // v0.1 倍速选项
  // 倍速下拉框
  const select = CE('select');
  // 0.5 倍速听谈话类节目太魔性了,是一个无用的选项,需要的话可以自己在下方添加<option value="0.5x">0.5x</option>
  select.innerHTML = `
    <option value="1x">1x</option>
    <option value="1.25x">1.25x</option>
    <option value="1.5x">1.5x</option>
    <option value="1.75x">1.75x</option>
    <option value="2x">2x</option>
    <option value="3x">3x</option>
  `;
  select.style = 'width: 72px; height: 28px; margin: 0 10px; padding: 0 4px; border-radius: 4px; border: 1px solid #ccc; font-size: 14px; color: #333; outline: none';
  panel.insertBefore(select, panel.children[0]);
  // 最后一次选择的倍速偏好,自动带入
  if (localStorage.getItem('xyzRate')) {
    const rate = parseFloat(localStorage.getItem('xyzRate')) || 1;
    audio.playbackRate = rate;
    select.value = rate + 'x';
  }
  // 选择倍速时,让倍速生效,并在 localStorage 中记录偏好,以便下次自动生效
  select.addEventListener('change', e => {
    const rate = parseFloat(e.target.value) || 1;
    audio.playbackRate = rate;
    localStorage.setItem('xyzRate', rate);
  });
  // v0.2 下载按钮
  // 下载按钮
  const download = CE('a');
  download.innerText = '下载音频';
  download.style = 'display: inline-block; width: 72px; margin: 0 75px 0 10px; text-align: left; color: var(--theme-color); font-size: 14px; text-decoration: none';
  download.href = audio.src;
  download.target = '_blank';
  const title = $('h1') && $('h1').innerText.trim();
  const fileName = audio.src.split('/').pop();
  const extName = fileName.split('.').pop();
  download.download = title ? `${title}.${extName}` : fileName;;
  panel.appendChild(download);
  // v0.3 循环播放
  // 循环播放复选框
  const loopLabel = CE('label');
  const loopBox = CE('input');
  const loopSpan = CE('span');
  loopLabel.style = 'margin: 0 10px; color: var(--theme-color); font-size: 14px';
  loopBox.type = 'checkbox';
  loopBox.style = 'display: inline-block; vertical-align: middle; margin-right: 4px; background: #fff; opacity: 0.15';
  loopSpan.style = 'display: inline-block; vertical-align: middle'
  loopSpan.innerText = '循环';
  loopLabel.appendChild(loopBox);
  loopLabel.appendChild(loopSpan);
  panel.insertBefore(loopLabel, panel.children[0]);
  // 切换循环播放时,使 audio.loop 生效
  loopBox.addEventListener('change', e => {
    audio.loop = e.target.checked;
    loopBox.style.opacity = e.target.checked ? 1 : 0.15;
  });
  // v0.4 二维码淡化
  const qrcode = $('main aside');
  if (qrcode) {
    qrcode.style.opacity = 0.08;
    qrcode.addEventListener('mouseenter', e => {
      e.target.style.opacity = 1;
    });
    qrcode.addEventListener('mouseleave', e => {
      e.target.style.opacity = 0.08;
    });
  }
  // v0.5 左右按键控制播放进度
  // 左右按键控制播放进度
  const btnLeft = $('.controls button[aria-label^="后退"]');
  const btnRight = $('.controls button[aria-label^="前进"]');
  document.addEventListener('keyup', e => {
    if (e.key === 'ArrowLeft') {
      btnLeft && btnLeft.click();
    } else if (e.key === 'ArrowRight') {
      btnRight && btnRight.click();
    }
  });
  // v0.6 调出单集列表页面隐藏着的播放面板
  if (/^\/podcast\//.test(location.pathname)) {
    $('section.wrap').style.transform = 'none';
    audio.onplay = () => {
      const rate = parseFloat(localStorage.getItem('xyzRate')) || 1;
      if (audio.playbackRate !== rate) audio.playbackRate = rate;
    };
  }
  // 解决在单集和列表之间切换时,功能失效的问题
  if (delay === 500) {
    history.pushState = () => init(150);
  }
  if ($('.podcast-title')) {
    $('.podcast-title').onclick = () => init(150);
  }
})(500);