找回密码
 立即注册
查看: 2263|回复: 8

Chapter Renamer - 章节标题自动重命名工具

  • TA的每日心情
    无聊
    2023-3-18 18:33
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    23

    主题

    309

    回帖

    1056

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    406059
    Lambholl 发表于 2022-12-16 22:18:33 | 显示全部楼层 |阅读模式
    本帖最后由 Lambholl 于 2022-12-16 23:19 编辑

    为了满足我的强迫症需求,就写了这么一个工具,放到了 github 上:

    https://github.com/Lambholl/ChapterRenamer

    (暂且取名叫 LPSub Chapters Proceeder?

    用 python 写的,可以作为模块导入,也可以直接作为一个 gui 成品运行

    下面引用 ChatGPT 对这个代码的分析(因为 ChatGPT 的讲解非常通俗易懂,比我讲的肯定好懂)
    这段代码实现了一个Chapter类,它接收一个文本字符串作为初始化输入,并提取其中的信息。在这个类的初始化方法中,它使用正则表达式来匹配文本中的时间信息和章节名称,并将这些信息存储在对象的times和chapterNames属性中。该类还包含三个方法,分别为seekForOP,seekForED和rename。

    seekForOP方法用于在times属性中查找片头的位置。 seekForED方法用于在times属性中查找片尾的位置。 rename方法用于更新chapterNames属性,将片头(OP)和片尾(ED)的章节名称更新为"OP"和"ED",并将其他章节名称更新为"Part A","Part B"等。

    在这个类的初始化方法中,OP_range和ED_range参数是可选的,它们是两个包含两个数字的列表或元组,用于指定片头和片尾可能出现的时间范围。

    rename方法用于更新Chapter对象的chapterNames属性。它首先调用seekForOP和seekForED方法来查找片头(OP)和片尾(ED)的位置。然后,它使用一系列if和for循环语句来更新chapterNames属性。

    首先,它判断是否找到了片头(OP)。如果找到了,它将片头章节的章节名称更新为"OP"。然后,它再判断是否找到了片尾(ED)。如果找到了,它将片尾章节的章节名称更新为"ED"。然后,它使用for循环语句将其余的章节名称更新为"Part A","Part B"等。如果未找到片尾(ED),则rename方法会进行其他操作,将片尾之后的章节名称更新为"Preview",并将其余章节名称更新为"Part A","Part B"等。如果未找到片头(OP),则rename方法会进行其他操作,将片头之前的章节名称更新为"Avant",并将其余章节名称更新为"Part A","Part B"等。

    总之,rename方法使用一系列条件判断和循环语句来更新Chapter对象的chapterNames属性,以将片头(OP)和片尾(ED)的章节名称更新为"OP"和"ED",并将其他章节名称更新为"Part A","Part B"等。

    当我询问有没有优化的空间时:
    在这个代码的当前形式中,没有很多明显的优化空间。

    其中一个可能的优化是使用更紧凑的正则表达式来提取文本中的信息。例如,p1和p2正则表达式可以简化为:

    p1 = 'CHAPTER([0-9]+)=([0-9]+):([0-9]+):([0-9]+)\.([0-9]+)'
    p2 = 'CHAPTER([0-9]+)NAME=(.+)'

    可以改为:

    p1 = 'CHAPTER(\d+)=(\d+):(\d+):(\d+)\.(\d+)'
    p2 = 'CHAPTER(\d+)NAME=(.+)'

    这样可以减少代码的字符数,并使代码更易于阅读。

    另一个可能的优化是使用列表推导式或生成器表达式来简化某些循环。例如,在rename方法中,以下代码:

    for i in range(len(self.chapterNames)-self.OP-2):
        self.chapterNames[i+self.OP+1] = 'Part ' + chr(65+i)

    可以改为:

    self.chapterNames[self.OP+1:len(self.chapterNames)-1] = ['Part ' + chr(65+i) for i in range(len(self.chapterNames)-self.OP-2)]

    这样可以避免使用循环,并使代码更易于阅读。

    不过,这些优化并不是必需的,因为它们只是在少量情况下带来了微不足道的性能提升。在大多数情况下,这段代码都能够很好地运行。

    破事水 希望这个工具还是能有用


    因为很多原盘的章节文件里面的名称都是 Chapter 01, Chapter 02 这样,手动改成 Avant, OP, ED, Preview 这些又太麻烦了,因此写了这个工具,希望能有更多 Ripper 们能做好这个处理,也算是提升一点作品质量吧(
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-3-18 18:33
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    23

    主题

    309

    回帖

    1056

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    406059
    Lambholl  楼主| 发表于 2022-12-17 09:52:55 | 显示全部楼层
    这个的干扰因素首先来自章节之间的时长:
    这个是用时长来判断oped的 比如说默认值是87到93秒之间,那么如果有两段正片至今是这样的时长,也有可能被误识别;
    另外有一个更大的干扰因素,是第一集的op可能在结尾
    石头门的第一集op甚至在中间
    这些都是可能造成出错的因素 得手动检查
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-6 15:37
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    2

    主题

    353

    回帖

    42

    VC币

    荣誉会员

    Rank: 14Rank: 14Rank: 14Rank: 14

    积分
    142578

    活跃达人

    shadows 发表于 2022-12-16 22:57:07 | 显示全部楼层
    本帖最后由 shadows 于 2022-12-16 23:01 编辑

    ……感觉AI说的并不适合普通人理解

    实际上就是用户输入op、ed可能出现的时间范围,程序将包含了这个时间范围里的章节视为OP、ED,然后对所有章节名修改为"Avant"、"OP"、"Part A","PartB"、"Preview"这样的命名风格。(简略挑了一些代码看

    我觉得最大的问题在于不是直接对mkv文件处理,而是对txt文件处理,对普通用户不太实用?
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-3-18 18:33
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    23

    主题

    309

    回帖

    1056

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    406059
    Lambholl  楼主| 发表于 2022-12-16 23:02:10 | 显示全部楼层
    本帖最后由 Lambholl 于 2022-12-16 23:04 编辑
    shadows 发表于 2022-12-16 22:57
    ……感觉AI说的并不适合普通人理解

    实际上就是用户输入op、ed可能出现的时间范围,程序将包含了这个时间范 ...

    这可能确实是吧,因为他是把我写的时候思考的内容分析出来了(


    这个是给压制组用的,一般来说从 mpls 文件里面提取出的章节名称都是 Chapter 01, Chapter 02
    而按照我的风格,压制的时候是一定要改成 Avant OP ED Preview 这些的

    直接改 mkv 的我是肯定不会去写,也反对,因为这样会导致辅种辅不上
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-6 15:37
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    2

    主题

    353

    回帖

    42

    VC币

    荣誉会员

    Rank: 14Rank: 14Rank: 14Rank: 14

    积分
    142578

    活跃达人

    shadows 发表于 2022-12-16 23:09:02 | 显示全部楼层
    Lambholl 发表于 2022-12-16 23:02
    这可能确实是吧,因为他是把我写的时候思考的内容分析出来了(

    感觉见到的不少压制组没有做这方面的处理,看了几个组都是直接chapter N这样


    不过看的时候也没在意名字,自己看着第几节也大概能猜出来……
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-3-18 18:33
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    23

    主题

    309

    回帖

    1056

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    406059
    Lambholl  楼主| 发表于 2022-12-16 23:12:59 | 显示全部楼层
    shadows 发表于 2022-12-16 23:09
    感觉见到的不少压制组没有做这方面的处理,看了几个组都是直接chapter N这样

    因为做这个处理手动一个一个改太累了


    所以才写了这玩意 希望大家能用上 做好这个处理(
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-12-23 15:09
  • 签到天数: 42 天

    [LV.5]常住居民I

    5

    主题

    476

    回帖

    215

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    366700
    苏辰汐 发表于 2022-12-17 13:45:25 | 显示全部楼层
    本帖最后由 苏辰汐 于 2022-12-17 13:51 编辑

    其实除了面向压制者的用途外,还有个计划外的应用

    部分支持外部章节文件的播放器也可以因此受益
    例如:potplayer, mpc-hc( [Feature] External Chapters ), mpv( chapter-make-read.lua )
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-3-18 18:33
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    23

    主题

    309

    回帖

    1056

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    406059
    Lambholl  楼主| 发表于 2022-12-17 14:51:38 | 显示全部楼层
    苏辰汐 发表于 2022-12-17 13:45
    其实除了面向压制者的用途外,还有个计划外的应用

    部分支持外部章节文件的播放器也可以因此受益

    pot在哪里 我没看见诶

    点评

    https://github.com/fireattack/chapter_converter#potplayer-bookmark-format-pbf-pot  发表于 2022-12-17 15:17
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表