This commit is contained in:
jxxghp 2024-04-10 11:44:14 +08:00
parent b3d57b868e
commit 765d37fd6a
10 changed files with 156 additions and 132 deletions

View File

@ -235,7 +235,7 @@ class SearchChain(ChainBase):
_match_torrents.append(torrent)
continue
# 未匹配
logger.warn(f'{torrent.site_name} - {torrent.title} 标题不匹配,识别名称:{media_names}')
logger.warn(f'{torrent.site_name} - {torrent.title} 标题不匹配,识别名称:{meta_names}')
# 匹配完成
logger.info(f"匹配完成,共匹配到 {len(_match_torrents)} 个资源")
self.progress.update(value=97,

View File

@ -16,7 +16,7 @@ class MetaAnime(MetaBase):
识别动漫
"""
_anime_no_words = ['CHS&CHT', 'MP4', 'GB MP4', 'WEB-DL']
_name_nostring_re = r"S\d{2}\s*-\s*S\d{2}|S\d{2}|\s+S\d{1,2}|EP?\d{2,4}\s*-\s*EP?\d{2,4}|EP?\d{2,4}|\s+EP?\d{1,4}"
_name_nostring_re = r"S\d{2}\s*-\s*S\d{2}|S\d{2}|\s+S\d{1,2}|EP?\d{2,4}\s*-\s*EP?\d{2,4}|EP?\d{2,4}|\s+EP?\d{1,4}|\s+GB"
def __init__(self, title: str, subtitle: str = None, isfile: bool = False):
super().__init__(title, subtitle, isfile)

View File

@ -67,9 +67,11 @@ class MetaBase(object):
# 副标题解析
_subtitle_flag = False
_title_episodel_re = r"Episode\s+(\d{1,4})"
_subtitle_season_re = r"(?<![全共]\s*)[第\s]+([0-9一二三四五六七八九十S\-]+)\s*季(?!\s*[全共])"
_subtitle_season_all_re = r"[全共]\s*([0-9一二三四五六七八九十]+)\s*季|([0-9一二三四五六七八九十]+)\s*季\s*全"
_subtitle_episode_re = r"(?<![全共]\s*)[第\s]+([0-9一二三四五六七八九十百零EP\-]+)\s*[集话話期幕](?!\s*[全共])"
_subtitle_episode_re = r"(?<![全共]\s*)[第\s]+([0-9一二三四五六七八九十百零EP]+)\s*[集话話期幕](?!\s*[全共])"
_subtitle_episode_between_re = r"[第]*\s*([0-9一二三四五六七八九十百零]+)\s*[集话話期幕]?\s*-\s*第*\s*([0-9一二三四五六七八九十百零]+)\s*[集话話期幕]"
_subtitle_episode_all_re = r"([0-9一二三四五六七八九十百零]+)\s*集\s*全|[全共]\s*([0-9一二三四五六七八九十百零]+)\s*[集话話期幕]"
def __init__(self, title: str, subtitle: str = None, isfile: bool = False):
@ -110,7 +112,39 @@ class MetaBase(object):
if not title_text:
return
title_text = f" {title_text} "
if re.search(r'[全第季集话話期幕]', title_text, re.IGNORECASE):
if re.search(r"%s" % self._title_episodel_re, title_text, re.IGNORECASE):
episode_str = re.search(r'%s' % self._title_episodel_re, title_text, re.IGNORECASE)
if episode_str:
try:
episode = int(episode_str.group(1))
except Exception as err:
logger.debug(f'识别集失败:{str(err)} - {traceback.format_exc()}')
return
if episode >= 10000:
return
if self.begin_episode is None:
self.begin_episode = episode
self.total_episode = 1
self.type = MediaType.TV
self._subtitle_flag = True
elif re.search(r'[全第季集话話期幕]', title_text, re.IGNORECASE):
# 全x季 x季全
season_all_str = re.search(r"%s" % self._subtitle_season_all_re, title_text, re.IGNORECASE)
if season_all_str:
season_all = season_all_str.group(1)
if not season_all:
season_all = season_all_str.group(2)
if season_all and self.begin_season is None and self.begin_episode is None:
try:
self.total_season = int(cn2an.cn2an(season_all.strip(), mode='smart'))
except Exception as err:
logger.debug(f'识别季失败:{str(err)} - {traceback.format_exc()}')
return
self.begin_season = 1
self.end_season = self.total_season
self.type = MediaType.TV
self._subtitle_flag = True
return
# 第x季
season_str = re.search(r'%s' % self._subtitle_season_re, title_text, re.IGNORECASE)
if season_str:
@ -146,6 +180,37 @@ class MetaBase(object):
self.total_season = (self.end_season - self.begin_season) + 1
self.type = MediaType.TV
self._subtitle_flag = True
# 第x-x集 第x集-x集
episode_between_str = re.search(r'%s' % self._subtitle_episode_between_re, title_text, re.IGNORECASE)
if episode_between_str:
episodes = episode_between_str.groups()
if episodes:
begin_episode = episodes[0]
end_episode = episodes[1]
else:
return
try:
begin_episode = int(cn2an.cn2an(begin_episode.strip(), mode='smart'))
end_episode = int(cn2an.cn2an(end_episode.strip(), mode='smart'))
except Exception as err:
logger.debug(f'识别集失败:{str(err)} - {traceback.format_exc()}')
return
if begin_episode and begin_episode >= 10000:
return
if end_episode and end_episode >= 10000:
return
if self.begin_episode is None and isinstance(begin_episode, int):
self.begin_episode = begin_episode
self.total_episode = 1
if self.begin_episode is not None \
and self.end_episode is None \
and isinstance(end_episode, int) \
and end_episode != self.begin_episode:
self.end_episode = end_episode
self.total_episode = (self.end_episode - self.begin_episode) + 1
self.type = MediaType.TV
self._subtitle_flag = True
return
# 第x集
episode_str = re.search(r'%s' % self._subtitle_episode_re, title_text, re.IGNORECASE)
if episode_str:
@ -181,6 +246,7 @@ class MetaBase(object):
self.total_episode = (self.end_episode - self.begin_episode) + 1
self.type = MediaType.TV
self._subtitle_flag = True
return
# x集全
episode_all_str = re.search(r'%s' % self._subtitle_episode_all_re, title_text, re.IGNORECASE)
if episode_all_str:
@ -197,22 +263,7 @@ class MetaBase(object):
self.end_episode = None
self.type = MediaType.TV
self._subtitle_flag = True
# 全x季 x季全
season_all_str = re.search(r"%s" % self._subtitle_season_all_re, title_text, re.IGNORECASE)
if season_all_str:
season_all = season_all_str.group(1)
if not season_all:
season_all = season_all_str.group(2)
if season_all and self.begin_season is None and self.begin_episode is None:
try:
self.total_season = int(cn2an.cn2an(season_all.strip(), mode='smart'))
except Exception as err:
logger.debug(f'识别季失败:{str(err)} - {traceback.format_exc()}')
return
self.begin_season = 1
self.end_season = self.total_season
self.type = MediaType.TV
self._subtitle_flag = True
return
@property
def season(self) -> str:

View File

@ -34,7 +34,7 @@ class MetaVideo(MetaBase):
_source_re = r"^BLURAY$|^HDTV$|^UHDTV$|^HDDVD$|^WEBRIP$|^DVDRIP$|^BDRIP$|^BLU$|^WEB$|^BD$|^HDRip$"
_effect_re = r"^REMUX$|^UHD$|^SDR$|^HDR\d*$|^DOLBY$|^DOVI$|^DV$|^3D$|^REPACK$"
_resources_type_re = r"%s|%s" % (_source_re, _effect_re)
_name_no_begin_re = r"^\[.+?]"
_name_no_begin_re = r"^[\[【].+?[\]】]"
_name_no_chinese_re = r".*版|.*字幕"
_name_se_words = ['', '', '', '', '', '', '']
_name_movie_words = ['剧场版', '劇場版', '电影版', '電影版']
@ -42,13 +42,13 @@ class MetaVideo(MetaBase):
r"|HBO$|\s+HBO|\d{1,2}th|\d{1,2}bit|NETFLIX|AMAZON|IMAX|^3D|\s+3D|^BBC\s+|\s+BBC|BBC$|DISNEY\+?|XXX|\s+DC$" \
r"|[第\s共]+[0-9一二三四五六七八九十\-\s]+季" \
r"|[第\s共]+[0-9一二三四五六七八九十百零\-\s]+[集话話]" \
r"|连载|日剧|美剧|电视剧|动画片|动漫|欧美|西德|日韩|超高清|高清|蓝光|翡翠台|梦幻天堂·龙网|★?\d*月?新番" \
r"|最终季|合集|[多中国英葡法俄日韩德意西印泰台港粤双文语简繁体特效内封官译外挂]+字幕|版本|出品|台版|港版|\w+字幕组" \
r"|连载|日剧|美剧|电视剧|动画片|动漫|欧美|西德|日韩|超高清|高清|无水印|下载|蓝光|翡翠台|梦幻天堂·龙网|★?\d*月?新番" \
r"|最终季|合集|[多中国英葡法俄日韩德意西印泰台港粤双文语简繁体特效内封官译外挂]+字幕|版本|出品|台版|港版|\w+字幕组|\w+字幕社" \
r"|未删减版|UNCUT$|UNRATE$|WITH EXTRAS$|RERIP$|SUBBED$|PROPER$|REPACK$|SEASON$|EPISODE$|Complete$|Extended$|Extended Version$" \
r"|S\d{2}\s*-\s*S\d{2}|S\d{2}|\s+S\d{1,2}|EP?\d{2,4}\s*-\s*EP?\d{2,4}|EP?\d{2,4}|\s+EP?\d{1,4}" \
r"|CD[\s.]*[1-9]|DVD[\s.]*[1-9]|DISK[\s.]*[1-9]|DISC[\s.]*[1-9]" \
r"|[248]K|\d{3,4}[PIX]+" \
r"|CD[\s.]*[1-9]|DVD[\s.]*[1-9]|DISK[\s.]*[1-9]|DISC[\s.]*[1-9]"
r"|CD[\s.]*[1-9]|DVD[\s.]*[1-9]|DISK[\s.]*[1-9]|DISC[\s.]*[1-9]|\s+GB"
_resources_pix_re = r"^[SBUHD]*(\d{3,4}[PI]+)|\d{3,4}X(\d{3,4})"
_resources_pix_re2 = r"(^[248]+K)"
_video_encode_re = r"^[HX]26[45]$|^AVC$|^HEVC$|^VC\d?$|^MPEG\d?$|^Xvid$|^DivX$|^HDR\d*$"

View File

@ -2,7 +2,7 @@ meta_cases = [{
"title": "The Long Season 2017 2160p WEB-DL H265 AAC-XXX",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "",
"en_name": "The Long Season",
"year": "2017",
@ -35,7 +35,7 @@ meta_cases = [{
"subtitle": "",
"target": {
"type": "电视剧",
"cn_name": "",
"cn_name": "欢迎来到实力至上主义的教室",
"en_name": "Youkoso Jitsuryoku Shijou Shugi No Kyoushitsu E",
"year": "",
"part": "",
@ -50,7 +50,7 @@ meta_cases = [{
"title": "National.Parks.Adventure.AKA.America.Wild:.National.Parks.Adventure.3D.2016.1080p.Blu-ray.AVC.TrueHD.7.1",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "",
"en_name": "National Parks Adventure",
"year": "2016",
@ -82,7 +82,7 @@ meta_cases = [{
"title": "哆啦A梦大雄的宇宙小战争 2021 (2022) - 1080p.mp4",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "哆啦A梦大雄的宇宙小战争 2021",
"en_name": "",
"year": "2022",
@ -98,7 +98,7 @@ meta_cases = [{
"title": "新精武门1991 (1991).mkv",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "新精武门1991",
"en_name": "",
"year": "1991",
@ -178,7 +178,7 @@ meta_cases = [{
"title": "Thor Love and Thunder (2022) [1080p] [WEBRip] [5.1]",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "",
"en_name": "Thor Love And Thunder",
"year": "2022",
@ -210,7 +210,7 @@ meta_cases = [{
"title": "钢铁侠2 (2010) 1080p AC3.mp4",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "钢铁侠2",
"en_name": "",
"year": "2010",
@ -226,7 +226,7 @@ meta_cases = [{
"title": "Wonder Woman 1984 2020 BluRay 1080p Atmos TrueHD 7.1 X264-EPiC",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "",
"en_name": "Wonder Woman 1984",
"year": "2020",
@ -338,7 +338,7 @@ meta_cases = [{
"title": "Nande Koko ni Sensei ga!? 2019 Blu-ray Remux 1080p AVC LPCM-7³ ACG",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "",
"en_name": "Nande Koko Ni Sensei Ga!?",
"year": "2019",
@ -547,7 +547,7 @@ meta_cases = [{
"subtitle": "",
"target": {
"type": "电视剧",
"cn_name": "",
"cn_name": "金装的薇尔梅",
"en_name": "Kinsou No Vermeil",
"year": "",
"part": "",
@ -578,7 +578,7 @@ meta_cases = [{
"title": "The Witch Part 2The Other One 2022 1080p WEB-DL AAC5.1 H264-tG1R0",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "",
"en_name": "The Witch Part 2The Other One",
"year": "2022",
@ -642,7 +642,7 @@ meta_cases = [{
"title": "教父3.The.Godfather.Part.III.1990.1080p.NF.WEBRip.H264.DDP5.1-PTerWEB.mkv",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "教父3",
"en_name": "The Godfather Part Iii",
"year": "1990",
@ -658,7 +658,7 @@ meta_cases = [{
"title": "A.Quiet.Place.Part.II.2020.1080p.UHD.BluRay.DD+7.1.DoVi.X265-PuTao",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "",
"en_name": "A Quiet Place Part Ii",
"year": "2020",
@ -723,7 +723,7 @@ meta_cases = [{
"subtitle": "",
"target": {
"type": "电视剧",
"cn_name": "",
"cn_name": "打工吧!魔王大人",
"en_name": "Hataraku Maou-Sama!!",
"year": "",
"part": "",
@ -738,7 +738,7 @@ meta_cases = [{
"title": "The Witch Part 2 The Other One 2022 1080p WEB-DL AAC5.1 H.264-tG1R0",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "",
"en_name": "The Witch Part 2 The Other One",
"year": "2022",
@ -754,7 +754,7 @@ meta_cases = [{
"title": "The 355 2022 BluRay 1080p DTS-HD MA5.1 X265.10bit-BeiTai",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "",
"en_name": "The 355",
"year": "2022",
@ -818,7 +818,7 @@ meta_cases = [{
"title": "2022.8.2.Twelve.Monkeys.1995.GBR.4K.REMASTERED.BluRay.1080p.X264.DTS [3.4 GB]",
"subtitle": "",
"target": {
"type": "电影",
"type": "未知",
"cn_name": "",
"en_name": "Twelve Monkeys",
"year": "1995",
@ -942,4 +942,68 @@ meta_cases = [{
"video_codec": "X264",
"audio_codec": "DD 5.1"
}
}, {
"title": "[Hall_of_C] 诛仙 Zhu Xian (Jade Dynasty) - Episode 19",
"subtitle": "",
"target": {
"type": "电视剧",
"cn_name": "诛仙",
"en_name": "Zhu Xian Jade Dynasty",
"year": "",
"part": "",
"season": "S01",
"episode": "E19",
"restype": "",
"pix": "",
"video_codec": "",
"audio_codec": ""
}
}, {
"title": "I Woke Up a Vampire S02 2023 2160p NF WEB-DL DDP5.1 Atmos H 265-HHWEB",
"subtitle": "醒来变成吸血鬼 第二季 | 全8集 | 4K | 类型: 喜剧/家庭/奇幻 | 导演: TommyLynch | 主演: NikoCeci/ZebastinBorjeau/安娜·阿劳约/KaileenAngelicChang/KrisSiddiqi",
"target": {
"type": "电视剧",
"cn_name": "",
"en_name": "I Woke Up A Vampire",
"year": "2023",
"part": "",
"season": "S02",
"episode": "",
"restype": "WEB-DL",
"pix": "2160p",
"video_codec": "H265",
"audio_codec": "DDP 5.1 Atmos"
}
}, {
"title": "Shadows of the Void S01 2024 1080p WEB-DL H264 AAC-HHWEB",
"subtitle": "虚无边境 | 第01-02集 | 1080p | 类型: 动画 | 导演: 巴西 | 主演: 山新/周一菡/皇贞季/Kenz/李佳怡 [内嵌中字]",
"target": {
"type": "电视剧",
"cn_name": "",
"en_name": "Shadows Of The Void",
"year": "2024",
"part": "",
"season": "S01",
"episode": "E01-E02",
"restype": "WEB-DL",
"pix": "1080p",
"video_codec": "H264",
"audio_codec": "AAC"
}
}, {
"title": "【极影字幕社】★1月新番 Metallic Rouge/金属口红 第13话 GB 1080P MP4字幕社招人内详",
"subtitle": "",
"target": {
"type": "电视剧",
"cn_name": "金属口红",
"en_name": "Metallic Rouge",
"year": "",
"part": "",
"season": "S01",
"episode": "E13",
"restype": "",
"pix": "1080p",
"video_codec": "",
"audio_codec": ""
}
}]

View File

@ -1,24 +1,12 @@
import unittest
from tests.test_cookiecloud import CookieCloudTest
from tests.test_filter import FilterTest
from tests.test_metainfo import MetaInfoTest
from tests.test_recognize import RecognizeTest
from tests.test_transfer import TransferTest
if __name__ == '__main__':
suite = unittest.TestSuite()
# 测试过滤器
suite.addTest(FilterTest('test_filter'))
# 测试名称识别
suite.addTest(MetaInfoTest('test_metainfo'))
# 测试媒体识别
suite.addTest(RecognizeTest('test_recognize'))
# 测试CookieCloud同步
suite.addTest(CookieCloudTest('test_cookiecloud'))
# 测试文件转移
suite.addTest(TransferTest('test_transfer'))
# 运行测试
runner = unittest.TextTestRunner()

View File

@ -1,17 +0,0 @@
# -*- coding: utf-8 -*-
from unittest import TestCase
from app.chain.site import SiteChain
class CookieCloudTest(TestCase):
def setUp(self) -> None:
pass
def tearDown(self) -> None:
pass
def test_cookiecloud(self):
result = SiteChain().sync_cookies()
self.assertTrue(result[0])

View File

@ -1,24 +0,0 @@
# -*- coding: utf-8 -*-
from unittest import TestCase
from app.core.context import TorrentInfo
from app.modules.filter import FilterModule
class FilterTest(TestCase):
def setUp(self) -> None:
pass
def tearDown(self) -> None:
pass
def test_filter(self):
torrent = TorrentInfo(title="The Wolf Children Ame and Yuki 2012 BluRay 1080p DTS-HDMA5.1 x265.10bit-CHD",
description="狼的孩子雨和雪/狼之子雨与雪/Okami kodomo no ame to yuki")
_filter = FilterModule()
_filter.init_module()
result = _filter.filter_torrents(rule_string="!BLU & 4K & CN > !BLU & 1080P & CN > !BLU & 4K > !BLU & 1080P",
torrent_list=[torrent])
self.assertEqual(len(result), 1)
self.assertEqual(result[0].pri_order, 97)

View File

@ -1,21 +0,0 @@
# -*- coding: utf-8 -*-
from unittest import TestCase
from app.chain.download import DownloadChain
from app.chain.media import MediaChain
from app.core.metainfo import MetaInfo
class RecognizeTest(TestCase):
def setUp(self) -> None:
pass
def tearDown(self) -> None:
pass
def test_recognize(self):
media_info = MediaChain().recognize_by_meta(MetaInfo("我和我的祖国 2019"))
self.assertEqual(media_info.tmdb_id, 612845)
exists = DownloadChain().get_no_exists_info(MetaInfo("我和我的祖国 2019"), media_info)
self.assertTrue(exists[0])

View File

@ -1,17 +0,0 @@
# -*- coding: utf-8 -*-
from unittest import TestCase
from app.chain.transfer import TransferChain
class TransferTest(TestCase):
def setUp(self) -> None:
pass
def tearDown(self) -> None:
pass
def test_transfer(self):
result = TransferChain().process()
self.assertTrue(result)