File size: 1,766 Bytes
0bfe2e3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { ParsedNameData } from '@aiostreams/types';
import { PARSE_REGEX } from './regex';
import * as PTT from 'parse-torrent-title';

function matchPattern(
  filename: string,
  patterns: Record<string, RegExp>
): string {
  return (
    Object.entries(patterns).find(([_, pattern]) =>
      pattern.test(filename)
    )?.[0] ?? 'Unknown'
  );
}

function matchMultiplePatterns(
  filename: string,
  patterns: Record<string, RegExp>
): string[] {
  return Object.entries(patterns)
    .filter(([_, pattern]) => pattern.test(filename))
    .map(([tag]) => tag);
}

function getMatchingPattern(filename: string, pattern: RegExp): string {
  const match = filename.match(pattern);
  return match ? match[1] : 'Unknown';
}

export function parseFilename(filename: string): ParsedNameData {
  const resolution = matchPattern(filename, PARSE_REGEX.resolutions);
  const quality = matchPattern(filename, PARSE_REGEX.qualities);
  const encode = matchPattern(filename, PARSE_REGEX.encodes);
  const visualTags = matchMultiplePatterns(filename, PARSE_REGEX.visualTags);
  const audioTags = matchMultiplePatterns(filename, PARSE_REGEX.audioTags);
  const languages = matchMultiplePatterns(filename, PARSE_REGEX.languages);
  // const releaseGroup = getMatchingPattern(filename, PARSE_REGEX.releaseGroup);

  const parsed = PTT.parse(filename);
  const releaseGroup = parsed.group || 'Unknown';
  const title = parsed.title;
  const year = parsed.year ? parsed.year.toString() : undefined;
  const season = parsed.season;
  const seasons = parsed.seasons;
  const episode = parsed.episode;

  return {
    resolution,
    quality,
    languages,
    encode,
    audioTags,
    visualTags,
    releaseGroup,
    title,
    year,
    season,
    seasons,
    episode,
  };
}