На nnm строка «Видео» не называет битность и HDR — они только в заголовке («[4K, HDR10, DV 8.1, 10-bit]»). - bit_depth: если в строке «Видео» нет, ищется в заголовке - «DV» считается Dolby Vision (\b не цепляет DVD/DVDRip) - профиль из «DV 8.1», «DV P7», «DoVi P5»; только реальные профили, «DV 10-bit» — не профиль - тесты: раздача nnm «В поисках Дори», DVDRip / DV 10-bit, DV P7 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
dc19fe6255
commit
3c42d2d4e2
2 files changed
+14
-3
No files matched your search
+6
-3
@@ -51,8 +51,10 @@ RE_FPS = re.compile(r"(?i)(?<![\d.,])(\d{2,3}(?:[.,]\d{1,6})?)\s*(?:fps|кадр
|
||||
RE_RATE = re.compile(r"(?i)(?<![\d.,xх×*])(?<![xх×*] )(\d{1,3}(?: \d{3})+|\d+)((?:[.,]\d+)?)\s*([kкmм])\s*(?:bps|bit|бит|b/[sсc])")
|
||||
RE_DEPTH = re.compile(r"(?i)(?<![\d.,])(8|10|12)\s*-?\s*(?:bits?|бит)(?!\s*/)")
|
||||
RE_DV_PROFILE = re.compile(r"(?i)dolby\s*vision[^/\n]{0,15}?profile\s*(\d+(?:\.\d+)?)|dvhe\.0?(\d+)")
|
||||
# сокращение в заголовке: «DV 8.1», «DV P7», «DoVi P5»; только реальные профили, «DV 10-bit» — не профиль
|
||||
RE_DV_SHORT = re.compile(r"(?i)\b(?:DV|DoVi)\s*(?:P|profile\s*)?([45789](?:\.[1-4])?)\b(?!\s*-?\s*bit)")
|
||||
HDR_FLAGS = [ # (шаблон, флаг) — что нашли, в этом порядке и отдаём
|
||||
(r"dolby\s*vision|\bDoVi\b", "Dolby Vision"),
|
||||
(r"dolby\s*vision|\bDoVi\b|\bDV\b", "Dolby Vision"), # «DV» из заголовка; \b не цепляет DVD/DVDRip
|
||||
(r"HDR10\+|HDR10\s*plus", "HDR10+"),
|
||||
(r"HDR10(?!\+|\s*plus)|SMPTE\s*ST\s*2086", "HDR10"),
|
||||
(r"\bHLG\b", "HLG"),
|
||||
@@ -107,8 +109,9 @@ def video_info(text: str, title: str = "") -> dict | None:
|
||||
size = RE_SIZE.search(src) or RE_SIZE.search(extra)
|
||||
width, height = (int(size.group(1)), int(size.group(2))) if size else (None, None)
|
||||
fps = RE_FPS.search(src)
|
||||
depth = RE_DEPTH.search(src)
|
||||
dv = RE_DV_PROFILE.search(src) or RE_DV_PROFILE.search("\n".join(_field(text, r"HDR\s*format")))
|
||||
depth = RE_DEPTH.search(src) or RE_DEPTH.search(title or "") # nnm: «10-bit» бывает только в заголовке
|
||||
dv = (RE_DV_PROFILE.search(src) or RE_DV_PROFILE.search("\n".join(_field(text, r"HDR\s*format")))
|
||||
or RE_DV_SHORT.search(src) or RE_DV_SHORT.search(title or ""))
|
||||
hdr = hdr_flags(src, *_field(text, r"HDR\s*format"), release_quality(text), title)
|
||||
return {
|
||||
"codec": codec,
|
||||
|
||||
@@ -420,6 +420,14 @@ check("видео: «5763 Mбит/с» — на деле килобиты", _rat
|
||||
check("видео: кадр 1920x800 — всё равно 1080p; fps 23.809523 целиком",
|
||||
(lambda v: v["resolution"] == "1080p" and v["fps"] == 23.809523)(video_info("Видео: AVC, 1920x800, 23.809523 fps, 1776 Kbps")))
|
||||
check("видео: строки «Видео» нет -> None", video_info("Аудио: AC3, 2 ch") is None)
|
||||
_vn = video_info("Видео: HEVC/H.265, 3840x2160, ~21.4 Mbps",
|
||||
"В поисках Дори / Finding Dory (2016) UHD BDRip [H.265/2160p] [4K, HDR10, DV 8.1, 10-bit]")
|
||||
check("видео nnm: 10-bit и «DV 8.1» только в заголовке -> bit_depth 10, Dolby Vision, профиль 8.1",
|
||||
(_vn["bit_depth"], _vn["hdr"], _vn["dv_profile"]) == (10, ["Dolby Vision", "HDR10"], "8.1"), str(_vn))
|
||||
check("видео: «DVDRip», «DV 10-bit» — не Dolby Vision-профиль",
|
||||
(lambda a, b: a["hdr"] == [] and a["dv_profile"] is None and b["dv_profile"] is None and b["bit_depth"] == 10)(
|
||||
video_info("Видео: XviD, 720x400", "Фильм [2001, DVDRip]"), video_info("Видео: HEVC, 3840x2160", "Фильм [DV 10-bit]")))
|
||||
check("видео: «DV P7» в заголовке -> профиль 7", video_info("Видео: HEVC, 3840x2160", "Film 2160p DV P7 HDR10")["dv_profile"] == "7")
|
||||
check("релиз: «18 x ~ 00:20:00» и список файлов — без duration_sec",
|
||||
release_info("Продолжительность: 18 x ~ 00:20:00")["duration_sec"] is None
|
||||
and release_info("Продолжительность: 01:31:25, 01:25:23")["duration_sec"] is None)
|
||||
|
||||
Reference in new issue
Block a user