Streama批量管理媒体文件:Regex规则编写高级技巧

Streama批量管理媒体文件:Regex规则编写高级技巧

【免费下载链接】streama Self hosted streaming media server. https://docs.streama-project.com/ 【免费下载链接】streama 项目地址: https://gitcode.com/gh_mirrors/st/streama

你是否还在为Streama媒体服务器中杂乱的文件命名而烦恼?手动整理电影和剧集文件不仅耗时,还容易出错。本文将带你掌握Regex(正则表达式)规则编写的高级技巧,通过自定义规则实现媒体文件的自动化识别与分类,让批量管理效率提升10倍。读完本文后,你将能够:编写精准匹配不同命名格式的Regex规则、解决特殊文件名识别难题、通过自定义配置实现个性化批量管理。

Regex规则在Streama中的应用基础

Streama通过Regex规则解析文件名中的关键信息(如标题、年份、季数、集数等),并自动匹配TMDB(The Movie Database)的元数据。系统默认提供了基础规则,但面对复杂的命名场景时,自定义Regex规则成为提升识别准确率的关键。

默认规则解析

Streama的核心Regex处理逻辑位于grails-app/services/streama/BulkCreateService.groovy文件中,定义了电影和剧集的默认匹配规则:

  • 电影默认规则(第15行):
    ^(?<Name>.*)[_.]\(\d{4}\).*
    匹配格式如Inception.2010.720p.mkv的文件,提取名称(Name)和年份信息。

  • 剧集默认规则(第16行):
    ^(?<Name>.+)[._]S(?<Season>\d{2})E(?<Episode>\d{2,3}).*
    匹配格式如Game.of.Thrones.S01E05.mkv的文件,提取名称(Name)、季数(Season)和集数(Episode)。

自定义规则配置文件

用户可通过CustomRegex.yml文件覆盖默认规则,实现个性化解析。该文件采用YAML格式,支持为电影(Movies)和剧集(Shows)分别定义多个规则:

Movies:
  regex:
    - ^(?<Name>.*?)._[._].*
    - ^(?<Name>.*?)[._]\((?<Year>\d{4})\).*
Shows:
  regex:
    - ^(?<Name>.+?)[._]S(?<Season>\d{2})E(?<Episode>\d{2,3})[._].*
    - ^(?<Name>.+?)[._]\[S(?<Season>\d{2})E(?<Episode>\d{2,3})\].*

Regex规则编写高级技巧

命名捕获组规范

Streama通过命名捕获组(Named Capturing Groups)提取关键信息,必须严格使用以下预定义名称:

  • 电影Name(名称)、Year(年份)
  • 剧集Name(名称)、Season(季数)、Episode(集数)

示例:解析包含年份的电影文件名
^(?<Name>.+?)._[._].*

  • (?<Name>.+?):非贪婪匹配名称(避免包含分隔符)
  • [._]:匹配点或下划线分隔符
  • (?<Year>\d{4}):精确匹配4位年份数字

常见场景解决方案

1. 处理多分隔符和冗余信息

问题:文件名包含多种分隔符(如-[ ]、空格)和冗余标签(如720pHDTV)。
解决方案:使用字符集[._-]匹配多种分隔符,通过(?:...)非捕获组忽略冗余内容。

规则示例
^(?<Name>.+?)[._-]S(?<Season>\d{2})E(?<Episode>\d{2})[._-]?(?:720p|1080p|HDTV)?.*
匹配文件:Breaking.Bad-S02E08-720p.mkv

2. 支持多种年份格式

问题:年份可能用括号包裹(如(2023))或直接跟随名称(如2023)。
解决方案:通过分支条件(|)支持多种格式。

规则示例
^(?<Name>.*?)._|\((?<Year>\d{4})\))[._].*
匹配文件:Dune.2021.mkvDune.(2021).mkv

3. 处理中文和特殊字符

问题:文件名包含中文或特殊符号(如)。
解决方案:使用Unicode属性类\p{L}匹配任意语言字符。

规则示例
^(?<Name>[\p{L}\s]+?)::[._].*
匹配文件:流浪地球:2019.BD.mkv

规则优先级与调试

当定义多个规则时,Streama按顺序尝试匹配(BulkCreateService.groovy#L39-L41),因此应将精确规则放在前面。推荐使用在线工具(如Regex101)测试规则,输入样例文件名验证匹配结果:

测试用例

  • 成功匹配:The.Matrix.Resurrections.2021.1080p.mkv
  • 失败案例:Matrix 4 2021.mkv(缺少分隔符,需调整规则)

高级应用:多规则组合与自动化流程

多规则协同策略

通过组合基础规则和特殊规则,覆盖复杂场景:

  1. 基础规则:处理标准命名格式(如Name.Year.ext
  2. 特殊规则:处理非标准格式(如Name - Year.extName (Year) [Tag].ext

配置示例CustomRegex.yml):

Movies:
  regex:
    # 标准格式:Name.Year.ext
    - ^(?<Name>.*?)._[._].*
    # 带括号格式:Name (Year).ext
    - ^(?<Name>.*?)[._]\((?<Year>\d{4})\)[._].*
    # 中文格式:Name - Year.ext
    - ^(?<Name>.*?) -[._].*

批量导入流程优化

  1. 规则测试:使用BulkCreateService.matchMetaDataFromFiles()方法(BulkCreateService.groovy#L34)验证规则匹配结果。
  2. 批量导入:通过bulkAddMediaFromFile()方法(BulkCreateService.groovy#L234)批量创建媒体条目。
  3. 错误处理:监控日志中MATCHER_STATUS.NO_MATCH状态(BulkCreateService.groovy#L18),针对性优化未匹配文件的规则。

实战案例:从规则编写到批量导入

案例背景

用户需导入一批混合命名格式的媒体文件,包括:

  • 电影:Avatar.2009.720p.mkvTitanic (1997).BD.mkv星际穿越 - 2014.mkv
  • 剧集:The.Big.Bang.Theory.S12E01.mkv【绝命毒师】S05E10.1080p.mkv

规则编写与配置

  1. 电影Regex规则
Movies:
  regex:
    - ^(?<Name>.*?)._[._].*          # Avatar.2009.720p.mkv
    - ^(?<Name>.*?)[._]\((?<Year>\d{4})\)[._].*      # Titanic (1997).BD.mkv
    - ^(?<Name>.*?) -[._].*          # 星际穿越 - 2014.mkv
  1. 剧集Regex规则
Shows:
  regex:
    - ^(?<Name>.+?)[._]S(?<Season>\d{2})E(?<Episode>\d{2,3})[._].*  # The.Big.Bang.Theory.S12E01.mkv
    - ^【(?<Name>.+?)】S(?<Season>\d{2})E(?<Episode>\d{2,3})[._].*   # 【绝命毒师】S05E10.1080p.mkv

导入效果验证

通过Streama管理界面查看匹配结果,所有文件均成功提取元数据:

  • 电影《星际穿越》匹配Name=星际穿越Year=2014
  • 剧集《绝命毒师》匹配Name=绝命毒师Season=05Episode=10

总结与进阶方向

本文介绍了Streama中Regex规则的核心语法、高级编写技巧和实战案例,通过自定义CustomRegex.yml文件,可显著提升媒体文件的识别准确率。进阶学习方向:

  1. 正则性能优化:减少回溯(Backtracking),使用非贪婪匹配(.*?)替代贪婪匹配(.*)。
  2. 动态规则生成:结合外部工具批量生成Regex规则,适应大规模媒体库管理。
  3. 社区规则共享:参与Streama社区,分享复杂场景的Regex解决方案。

行动步骤

  1. 备份现有CustomRegex.yml文件
  2. 根据本文技巧编写测试规则
  3. 使用样例文件验证匹配效果
  4. 批量导入并监控日志优化规则

掌握Regex规则编写,让Streama成为你的私人媒体管理专家!如有疑问或优化建议,欢迎在社区讨论区分享经验。

【免费下载链接】streama Self hosted streaming media server. https://docs.streama-project.com/ 【免费下载链接】streama 项目地址: https://gitcode.com/gh_mirrors/st/streama

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值