From 31e1f3422883c317dba3c07febfff97aa5e2a23c Mon Sep 17 00:00:00 2001 From: Viren070 Date: Thu, 24 Jul 2025 14:19:20 +0100 Subject: [PATCH] fix: add custom handlers for 3 digit season numbers --- packages/core/src/parser/file.ts | 4 +-- packages/core/src/parser/ptt.ts | 55 ++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 packages/core/src/parser/ptt.ts diff --git a/packages/core/src/parser/file.ts b/packages/core/src/parser/file.ts index 2bae3a8c..157b6034 100644 --- a/packages/core/src/parser/file.ts +++ b/packages/core/src/parser/file.ts @@ -1,6 +1,6 @@ import { PARSE_REGEX } from './regex'; -import * as PTT from 'parse-torrent-title'; import { ParsedFile } from '../db'; +import ptt from './ptt'; function matchPattern( filename: string, @@ -22,7 +22,7 @@ function matchMultiplePatterns( class FileParser { static parse(filename: string): ParsedFile { - const parsed = PTT.parse(filename); + const parsed = ptt.parse(filename); // prevent the title from being parsed for info if (parsed.title && parsed.title.length > 4) { filename = filename.replace(parsed.title, '').trim(); diff --git a/packages/core/src/parser/ptt.ts b/packages/core/src/parser/ptt.ts new file mode 100644 index 00000000..a435d752 --- /dev/null +++ b/packages/core/src/parser/ptt.ts @@ -0,0 +1,55 @@ +import * as PTT from 'parse-torrent-title'; + +const array = (chain: (input: string) => number) => (input: string) => [ + chain ? chain(input) : input, +]; +const integer = (input: string) => parseInt(input, 10); + +const parser = new PTT.Parser(); +PTT.addDefaults(parser); +parser.addHandler( + 'seasons', + /(?:s)(\d{3})[. ]?[xх-]?[. ]?(?:e|x|х|ep|-|\.)[. ]?\d{1,4}(?:[abc]|v0?[1-4]|\D|$)/i, + array(integer) +); +parser.addHandler( + 'seasons', + /(?:so?|t)(\d{3})[. ]?[xх-]?[. ]?(?:e|x|х|ep|-|\.)[. ]?\d{1,4}(?:[abc]|v0?[1-4]|\D|$)/i, + array(integer) +); +parser.addHandler( + 'seasons', + /(?:(?:\bthe\W)?\bcomplete\W)?(?:saison|seizoen|sezon(?:SO?)?|stagione|season|series|temp(?:orada)?):?[. ]?(\d{3})/i, + array(integer) +); +parser.addHandler( + 'seasons', + /(?:(?:\bthe\W)?\bcomplete\W)?(?:\W|^)(\d{3})[. ]?(?:st|nd|rd|th)[. ]*season/i, + array(integer) +); +parser.addHandler( + 'seasons', + /(\d{3})(?:-?й)?[. _]?(?:[Сс]езон|sez(?:on)?)(?:\W?\D|$)/i, + array(integer) +); +parser.addHandler( + 'seasons', + /(?:\D|^)(\d{3})[Xxх]\d{1,3}(?:\D|$)/, + array(integer) +); +parser.addHandler('seasons', /[[(](\d{3})\.\d{1,3}[)\]]/, array(integer)); +parser.addHandler('seasons', /-\s?(\d{3})\.\d{2,3}\s?-/, array(integer)); +parser.addHandler('seasons', /^(\d{3})\.\d{2,3} - /, array(integer), { + skipIfBefore: ['year, source', 'resolution'], +}); + +parser.addHandler('seasons', /\bS(\d{3})E\d{1,2}\b/i, array(integer)); + +parser.addHandler('episodes', /\bS\d{3}E(\d{1,2})\b/i, array(integer)); +parser.addHandler( + 'episodes', + /(?:so?|t)\d{3}[. ]?[xх-]?[. ]?(?:e|x|х|ep)[. ]?(\d{1,4})(?:[abc]|v0?[1-4]|\D|$)/i, + array(integer) +); + +export default parser;