Streama批量管理媒体文件:Regex规则编写高级技巧
你是否还在为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. 处理多分隔符和冗余信息
问题:文件名包含多种分隔符(如-、[ ]、空格)和冗余标签(如720p、HDTV)。
解决方案:使用字符集[._-]匹配多种分隔符,通过(?:...)非捕获组忽略冗余内容。
规则示例:
^(?<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.mkv 和 Dune.(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(缺少分隔符,需调整规则)
高级应用:多规则组合与自动化流程
多规则协同策略
通过组合基础规则和特殊规则,覆盖复杂场景:
- 基础规则:处理标准命名格式(如
Name.Year.ext) - 特殊规则:处理非标准格式(如
Name - Year.ext、Name (Year) [Tag].ext)
配置示例(CustomRegex.yml):
Movies:
regex:
# 标准格式:Name.Year.ext
- ^(?<Name>.*?)._[._].*
# 带括号格式:Name (Year).ext
- ^(?<Name>.*?)[._]\((?<Year>\d{4})\)[._].*
# 中文格式:Name - Year.ext
- ^(?<Name>.*?) -[._].*
批量导入流程优化
- 规则测试:使用
BulkCreateService.matchMetaDataFromFiles()方法(BulkCreateService.groovy#L34)验证规则匹配结果。 - 批量导入:通过
bulkAddMediaFromFile()方法(BulkCreateService.groovy#L234)批量创建媒体条目。 - 错误处理:监控日志中
MATCHER_STATUS.NO_MATCH状态(BulkCreateService.groovy#L18),针对性优化未匹配文件的规则。
实战案例:从规则编写到批量导入
案例背景
用户需导入一批混合命名格式的媒体文件,包括:
- 电影:
Avatar.2009.720p.mkv、Titanic (1997).BD.mkv、星际穿越 - 2014.mkv - 剧集:
The.Big.Bang.Theory.S12E01.mkv、【绝命毒师】S05E10.1080p.mkv
规则编写与配置
- 电影Regex规则:
Movies:
regex:
- ^(?<Name>.*?)._[._].* # Avatar.2009.720p.mkv
- ^(?<Name>.*?)[._]\((?<Year>\d{4})\)[._].* # Titanic (1997).BD.mkv
- ^(?<Name>.*?) -[._].* # 星际穿越 - 2014.mkv
- 剧集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=05、Episode=10
总结与进阶方向
本文介绍了Streama中Regex规则的核心语法、高级编写技巧和实战案例,通过自定义CustomRegex.yml文件,可显著提升媒体文件的识别准确率。进阶学习方向:
- 正则性能优化:减少回溯(Backtracking),使用非贪婪匹配(
.*?)替代贪婪匹配(.*)。 - 动态规则生成:结合外部工具批量生成Regex规则,适应大规模媒体库管理。
- 社区规则共享:参与Streama社区,分享复杂场景的Regex解决方案。
行动步骤:
- 备份现有CustomRegex.yml文件
- 根据本文技巧编写测试规则
- 使用样例文件验证匹配效果
- 批量导入并监控日志优化规则
掌握Regex规则编写,让Streama成为你的私人媒体管理专家!如有疑问或优化建议,欢迎在社区讨论区分享经验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



