系统支持两种文件命名方式,并根据不同情况智能处理:
- 格式1:
数字 + 标题.扩展名
(例如:01-第一章.mp3
) - 格式2:
标题 + 数字.扩展名
(例如:第一集01.mp3
) - 系统优先使用文件名开头的数字作为剧集编号
- 直接使用描述性文件名(例如:
简介.mp3
) - 系统会根据文件的创建时间和大小自动生成唯一的排序值
- 保留完整的文件名作为标题(不含扩展名)
可以通过全局环境变量或每个播客的配置文件来控制标题显示方式:
-
完整模式(默认):保留原始文件名(不含扩展名)
01-简介.mp3 → "01-简介" 第01期.mp3 → "第01期" 简介01.mp3 → "简介01"
-
清理模式:移除数字和分隔符(仅对带序号的文件有效)
01-简介.mp3 → "简介" 第01期.mp3 → "第期" 简介01.mp3 → "简介"
{
"title": "播客标题",
"description": "播客描述",
"author": "作者名称",
"email": "[email protected]",
"language": "zh-cn",
"category": "Technology",
"explicit": false,
"websiteUrl": "https://example.com",
"titleFormat": "clean",
"useMTime": false
}
- title:播客的标题
- description:播客的描述
- author:作者名称
- email:联系邮箱
- language:语言代码,遵循 RFC 5646 标准
- category:播客分类
- explicit:是否包含限制级内容
- websiteUrl:相关网站地址
- titleFormat:标题格式化方式,支持 clean(清理后的标题)和 full(完整文件名)
- useMTime:时间管理策略,支持两种策略:
- false:默认策略,带序号的文件使用基准日期加上序号生成发布时间,不带序号的文件使用文件的实际创建时间作为发布时间
- true:始终使用文件的创建时间作为发布时间,适用于所有文件(无论是否有序号)
系统支持多种从文件名中提取剧集序号的策略:
-
前缀匹配(优先使用)
- 从文件名开头查找数字
- 示例:
001-科技早知道.mp3
→ 序号: 1 - 示例:
123_人工智能简史.mp3
→ 序号: 123
-
后缀匹配(次优先级)
- 从文件扩展名前查找数字
- 示例:
科技早知道_001.mp3
→ 序号: 1 - 示例:
人工智能简史-123.mp3
→ 序号: 123
在 podcast.json 中可以配置以下策略:
-
首个数字
{ "episodeNumberStrategy": "first" }
- 从左到右扫描,使用第一个数字
- 示例:
zk01科技新闻08期.mp3
→ 序号: 1
-
最后数字
{ "episodeNumberStrategy": "last" }
- 从右到左扫描,使用最后一个数字
- 示例:
zk01科技新闻08期.mp3
→ 序号: 8
-
自定义正则表达式
{ "episodeNumberStrategy": { "pattern": "第(\\d+)期" } }
- 使用自定义正则表达式精确匹配
- 示例:
科技新闻第01期.mp3
→ 序号: 1
📝 注意:
- 不配置时默认使用前缀匹配策略
- 自定义正则表达式必须包含一个捕获组 ()
- 如果提取失败会自动回退到默认策略
系统提供两种时间管理策略,可以通过 podcast.json
中的 useMTime
配置项来控制:
-
默认策略(
useMTime: false
):- 带序号的文件:
- 使用基准日期(2024-12-18)加上序号生成发布时间
- 序号越小,发布时间越早
- 例如:
01-简介.mp3
的发布时间会早于02-正文.mp3
- 不带序号的文件:
- 使用文件的实际创建时间作为发布时间
- 使用文件创建时间和大小生成唯一的排序值
- 保持文件的自然时间顺序
- 带序号的文件:
-
文件时间策略(
useMTime: true
):- 始终使用文件的创建时间作为发布时间
- 适用于所有文件(无论是否有序号)
- 完全基于文件系统的时间戳
- 配置示例:
{ "title": "我的播客", "description": "播客描述", "useMTime": true }
📝 提示:
- 如果您希望完全依赖文件的创建时间来确定发布顺序,请设置
useMTime: true
- 如果您希望通过文件名序号来控制发布顺序,请使用默认设置或设置
useMTime: false
- 此配置可以针对每个播客单独设置,不同播客可以使用不同的策略
系统提供标准的URL访问方式:
http://[服务器地址]/audio/[播客目录名]/[音频文件名]
RSS Feed 访问地址:
http://[服务器地址]/feeds/[播客目录名].xml
📝 注意:
- 播客目录名就是您的音频文件夹名称
- 确保文件夹名称不包含特殊字符
- URL中的所有中文和特殊字符会被自动编码
-
环境要求
- Node.js 14.0 或更高版本
- NPM 6.0 或更高版本
- 准备音频文件目录
-
安装配置
# 克隆项目 git clone https://github.com/your-repo/folder2podcast.git cd folder2podcast # 安装依赖 npm install # 配置环境变量(可选) export AUDIO_DIR=/path/to/audiobooks export PORT=3000
-
启动服务
# 开发模式 npm run start:dev # 或指定配置启动 AUDIO_DIR=/path/to/audiobooks PORT=3000 npm run start:dev
-
验证服务
- 访问管理面板:
http://localhost:3000/podcasts
- 确认音频文件可访问
- 测试播客订阅功能
- 访问管理面板:
- 访问
/podcasts
获取所有可用播客列表 - 返回每个播客的详细信息,包括标题、描述、订阅地址等
- 支持中文路径和英文别名双重访问
- Feed URL包含完整的访问地址,可直接用于播客订阅
- 播客封面:
/audio/播客名称/cover.jpg
- 音频文件:
/audio/播客名称/episode.mp3
- 默认资源:
/image/default-cover.jpg
- 每个播客系列独立文件夹
- 使用数字前缀确保正确排序
- 添加清晰的文件描述
- 配置合适的播客信息
- 控制单个文件夹的文件数量
- 使用英文别名提高兼容性
- 添加合适大小的封面图片(推荐使用正方形图片)
- 使用只读挂载保护音频文件
- 避免在文件名中使用特殊字符
- 定期备份配置文件
在最新版本中,我们对静态资源的路径进行了调整,以提高资源管理的灵活性和可维护性。以下是主要的更改:
- 所有静态资源(如 CSS、JavaScript 和图片)现在位于
assets
目录下。 - 访问静态资源的路径已更改为:
- CSS 文件:
/web/styles.css
- JavaScript 文件:
/web/app.js
- 封面图片:
/audio/{podcast_dir}/cover.jpg
- CSS 文件:
- API 路由生成的 URL 现在指向新的静态资源路径。例如,获取播客封面图片的 URL 现在为:
/audio/{podcast_dir}/cover.jpg
- Dockerfile 已更新,以确保静态资源和源代码正确复制到容器中。请确保在构建 Docker 镜像时使用最新的 Dockerfile。
- 在进行任何部署之前,请确保在本地和 Docker 容器中进行全面的测试,验证所有功能是否正常工作。
- 请确保在使用新的路径时,更新所有相关的代码和配置文件。
assets/
├── web/ # Web 界面相关文件
│ ├── index.html
│ ├── styles.css
│ └── app.js
├── image/ # 图片资源
│ └── default-cover.jpg
Folder2Podcast RSS 采用了零侵入设计模式,这意味着:
- 🔒 只读访问 - 应用只需要音频文件夹的读取权限
- 📁 原始文件保护 - 不会修改任何原始音频文件或文件夹结构
- 🔄 状态隔离 - 所有生成的文件(如 feed.xml)存储在独立的
.feeds
目录
- 🛡️ 权限隔离 - 使用独立的存储空间管理应用状态
- 📊 缓存优化 - feed 文件生成和缓存策略的优化
- 🔍 智能监控 - 文件系统变化的高效监测
- 使用只读模式挂载音频文件夹
- 定期清理
.feeds
目录下的缓存文件 - 监控系统资源使用情况