我一直以来都是用 plex 作为媒体库,但是有时候会遇到文件名无法识别导致不能入库 plex 的问题,电影资源还好,电视方面特别是动画类的经常遇到命名混乱导致无法自动识别。

Plexmatch 刮削文件

Plex 官方文档说可以添加一个 .plexmatch 文件手动识别,可以做到正确识别节目,也可以做到一些有意思的事,比如添加任意视频到指定节目:

于是我用 ChatGPT 写了一个 .bat 的命令,可以在 windows 下一键生成 .plexmatch 文件,利用 TMDB ID 来手动指定文件的刮削信息(这个只是告诉 Plex 这个视频是什么电视或者动画,刮削资源来自 Plex 的服务器)。

使用方法:

  1. 第一步:
    将代码复制到文本文档,保存,修改文件名为generate_plexmatch.bat​​(记得打开显示文件扩展名)

  2. 第二步:
    方法一:选中需要指定的文件,将文件拖到generate_plexmatch.bat​文件上。

    方法二:直接双击generate_plexmatch.bat​文件,自动查找文件夹内 .mkv.mp4 后缀的文件并生成识别文件。

    需要注意的是,命名是从SxxE01​开始,也就是选中的文件要从第一集开始,
    第 10.5 话这种在 TMDB 里属于第 0 季,需要分开生成。多个文件拖动的时候要都选中,然后鼠标放在第一集上拖动,因为鼠标在哪一集上就会从那一集开始排序。

  3. 第三步:
    手动输入 TMDB ID(tmdbid):TMDB 网页链接中的编号,例如:https://www.themoviedb.org/tv/84958-loki​,84958就是 TMDB ID。

    手动输入季号(season):默认为 01 季,具体怎么填写参照 TMDB 的信息,特典和 OVA 这些一般都是第 0 季,也就是 S00,但是这一部分比较混乱,不一定是从 S00E01 开始,一般需要生成 .plexmatch 文件后手动修改。

    手动输入起始集数(starting Episode):默认为 01,即留空为从 E01 开始计数,但是实际使用中我发现有时候 TMDB 会把普遍认为的第二季并入第一季,也就是第二季在 TMDB 中是从 S01E13 开始计数,所以设置了这个选项。如无特殊情况可直接回车,无需填写。
    任务完成后会在 1 秒后自动关闭窗口。

代码如下:

@echo off
setlocal EnableDelayedExpansion

set /p tmdbid=Please enter the TMDB ID:

REM 如果未输入内容,则将season设置为默认值01
set /p season=Please enter the season (default is 01): || set "season=01"

REM 新增起始值选项
set /p episode=Please enter the starting Episode (default is 01): || set "episode=01"
set /a count=!episode!

chcp 65001 > nul
echo tmdbid:!tmdbid!>> .plexmatch
echo season:!season!>> .plexmatch

REM 判断是否有文件拖入,如果没有则处理所在文件夹内的所有.mkv和.mp4格式文件
if "%~1"=="" (
    for %%a in (*.mkv *.mp4 *.ts) do (
        set "num=0!count!"
        set "filename=%%~nxa"
        echo ep:S!season!E!num:~-2!:!filename!>> .plexmatch
        set /a count+=1
    )
) else (
    REM 如果有文件拖入,则逐行读取拖放的文件名,并按格式输出到.plexmatch文件中
    for %%a in (%*) do (
        set "num=0!count!"
        set "filename=%%~nxa"
        echo ep:S!season!E!num:~-2!:!filename!>> .plexmatch
        set /a count+=1
    )
)

echo All files have been processed.
echo.
echo Preview of .plexmatch file:
type .plexmatch
echo.

echo All files have been processed. This window will close in 5 second.
ping -n 6 127.0.0.1 > nul

用这个方法也可以将任意视频添加到指定的电视节目里,比如为节目添加 OP 和 ED 视频,可以设置为(不要和 TMDB 的信息重复就行):

S00E01:OP.mkv
S00E02:ED.mkv 

添加为右键菜单一键处理

每次处理文件还得找到 generate_plexmatch.bat 文件和待处理文件实在麻烦,不过这一步骤还可以再精简:

  1. 将 generate_plexmatch.bat 批处理文件放到一个易于访问且不会被误删的位置,比如在文档文件夹中。

  2. 打开注册表编辑器(在 Windows 10 中,可以按 Win+R 组合键,输入 regedit 后回车打开)。在注册表编辑器中,找到路径:

    HKEY_CLASSES_ROOT\*\shell 
  3. 右键单击“shell”,在“shell”下新建一个项,比如 “Plexmatch”。

  4. 在“Plexmatch”下再新建一个项,命名为“command”。

  5. 右键点击“command”项右侧的,选择“修改”,将“数据值”设置为你创建的批处理文件的完整路径(比如 C:\Users\username\Document\generate_plexmatch.bat​​​)。例如:

    C:\Users\username\Document\generate_plexmatch.bat %1 
  6. 这个方法只能单选,但是会处理所在文件夹内所有文件

点击放大图片

​​

Plexignore 忽略文件

此外,有一些你不希望出现在 Plex 里的视频,可以用下面的命令保存为 .plexignore 后缀的文件。【plexignore官方文档】

# Ignore all files with "trailer" in the name
# *trailer*

# Ignore files with the extension ".cr2"
# *.cr2

# Ignore directories called "Modified"
# *Modified/*

# Ignore all ".tif" files in the "thumbnails" subdirectory
# *thumbnails/*.tif

映像特典/* 

使用方法在注释里,比如不想将《映像特典》这个文件夹里的视频显示在 Plex 里(有时候会自动识别错误到正片里去),就添加一句

映像特典/* 

命令行批处理自动生成.plexignore文件

1、BAT 批处理脚本

BAT 文件直接处理适用于本机存储,处理 SMB 挂载的请看方法 2。

@echo off
chcp 65001 > nul
echo /# Plex Media Server ignore file > "%~dp1.plexignore"
for %%A in (%*) do (
    if exist "%%A\\" (
        echo %%~nxA/* >> "%~dp1.plexignore"
    ) else (
        if exist "%%A" (
            echo %%~nxA >> "%~dp1.plexignore"
        )
    )
)

使用方法:

把要处理的文件和文件夹拖到generate_plexignore.bat 上,会自动在视频文件夹内生成.plexignore文件。

2、Python 脚本

处理 SMB 挂载的文件时会有一个 Bug,拖入文件会被识别成文件夹,生成的.plexignore文件中,文件后面也会出现/*

这是因为处理 SMB 挂载的文件夹中的文件时,批处理脚本无法正确识别这些文件的属性,从而误判为文件夹。

所以我们需要使用Python进行处理,这一步需要创建两个命令(generate_plexignore.batgenerate_plexignore.py):

先创建一个.txt文件,保存后修改文件名和后缀为generate_plexignore.bat

generate_plexignore.bat

@echo off
python "%~dp0generate_plexignore.py" %*
pause

generate_plexignore.py

import os
import sys

def update_plexignore(paths, output_dir):
    with open(os.path.join(output_dir, '.plexignore'), 'w') as file:
        file.write('/# Plex Media Server ignore file\n')
        for path in paths:
            if os.path.isdir(path):
                file.write(f"{os.path.basename(path)}/*\n")
            elif os.path.isfile(path):
                file.write(f"{os.path.basename(path)}\n")

if __name__ == "__main__":
    output_dir = os.path.dirname(os.path.abspath(sys.argv[1]))
    update_plexignore(sys.argv[1:], output_dir)

使用方法:

两个文件放在同一文件夹内,把要处理的文件和文件夹拖到generate_plexignore.bat 上,会自动在视频文件夹内生成.plexignore文件。

注:

有部分网友(@见风使舵)发现生成文件排序有问题,该网友提出以下修改方法,如遇到可以参考:

修改前:
REM 判断是否有文件拖入,如果没有则处理所在文件夹内的所有.mkv和.mp4格式文件
if "%~1"=="" (
for %%a in (*.mkv *.mp4 *.ts) do (
   set "num=0!count!"
   echo ep:S!season!E!num:~-2!:%%~nxa>> .plexmatch
   set /a count+=1
)
) else (

修改后:
REM 判断是否有文件拖入,如果没有则处理所在文件夹内的所有.mkv和.mp4格式文件
if "%~1"=="" (
    dir /b *.mkv *.mp4 | sort > temp.txt
    for /F "delims=" %%a in (temp.txt) do (
        set "num=0!count!"
        echo ep:S!season!E!num:~-2!:%%a>> .plexmatch
        set /a count+=1
    )
    del temp.txt
) else (