This repository was archived by the owner on Mar 20, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.ts
More file actions
78 lines (69 loc) · 3.39 KB
/
index.ts
File metadata and controls
78 lines (69 loc) · 3.39 KB
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { DownloadedFile, MovieList, SubtitleList, type SubtitleOptions } from "./src/utils/download";
import fetchOpenSubtitlesCom from "./src/download/opensubtitles.com";
import fetchOpenSubtitlesOrg from "./src/download/opensubtitles.org";
import fetchMovieSubtitlesOrg from "./src/download/moviesubtitles.org";
import fetchMoviesubtitlesrtCom from "./src/download/moviesubtitlesrt.com";
import fetchISubtitlesOrg from "./src/download/isubtitles.org";
import fetchPodnapisiNet from "./src/download/podnapisi.net";
import fetchSubdlCom from "./src/download/subdl.com";
import fetchMySubsCo from "./src/download/my-subs.co";
import fetchSubsourceNet from "./src/download/subsource.net";
import fetchTvSubtitlesNet from "./src/download/tvsubtitles.net";
import fetchYifySubtitlesCh from "./src/download/yifysubtitles.ch";
import fetchSubtitlecatCom from "./src/download/subtitlecat.com";
import { search, sortKind, type FullOptions } from "fast-fuzzy";
export type Fetcher = (query: string, options: SubtitleOptions) => Promise<MovieList[]>;
export const FetchOpenSubtitlesCom: Fetcher = fetchOpenSubtitlesCom;
export const FetchOpenSubtitlesOrg: Fetcher = fetchOpenSubtitlesOrg;
export const FetchMovieSubtitlesOrg: Fetcher = fetchMovieSubtitlesOrg;
export const FetchMoviesubtitlesrtCom: Fetcher = fetchMoviesubtitlesrtCom;
export const FetchISubtitlesOrg: Fetcher = fetchISubtitlesOrg;
export const FetchPodnapisiNet: Fetcher = fetchPodnapisiNet;
export const FetchSubdlCom: Fetcher = fetchSubdlCom;
export const FetchMySubsCo: Fetcher = fetchMySubsCo;
export const FetchSubsourceNet: Fetcher = fetchSubsourceNet;
export const FetchTvSubtitlesNet: Fetcher = fetchTvSubtitlesNet;
export const FetchYifySubtitlesCh: Fetcher = fetchYifySubtitlesCh;
export const FetchSubtitlecatCom: Fetcher = fetchSubtitlecatCom;
export interface DownloadOptions {
movieListQuery: string;
movieListSorter: FullOptions<MovieList>;
subtitleListQuery: string;
subtitleListSorter: FullOptions<SubtitleList>;
}
export const ErrNoMovies = new Error("No movies found");
export const ErrNoSubtitles = new Error("No subtitles found");
// throws ErrNoMovies if no movies found
// throws ErrNoSubtitles if no subtitles found
export async function Download(
query: string,
searchOptions: SubtitleOptions,
getter: Fetcher,
downloadOptions: DownloadOptions,
): Promise<DownloadedFile> {
let movieList = await getter(query, searchOptions);
if (movieList.length === 0) throw ErrNoMovies;
if (downloadOptions.movieListQuery) {
movieList = search(downloadOptions.movieListQuery, movieList, Object.assign(downloadOptions.movieListSorter ?? searchOptions.searchOptions ?? {}, {
ignoreCase: true,
ignoreSymbols: true,
normalizeWhitespace: true,
sortBy: sortKind.bestMatch,
keySelector(item: MovieList) {return item.title;},
threshold: 0,
}));
}
let subtitleList = await movieList[0].toSubtitleLinks();
if (subtitleList.length === 0) throw ErrNoSubtitles;
if (downloadOptions.subtitleListQuery) {
subtitleList = search(downloadOptions.subtitleListQuery, subtitleList, Object.assign(downloadOptions.subtitleListSorter ?? searchOptions.searchOptions ?? {}, {
ignoreCase: true,
ignoreSymbols: true,
normalizeWhitespace: true,
sortBy: sortKind.bestMatch,
keySelector(item: SubtitleList) {return item.info.filename!;},
threshold: 0,
}));
}
return await subtitleList[0].download();
}