diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/opensubtitles.lua | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/server/opensubtitles.lua b/server/opensubtitles.lua new file mode 100644 index 0000000..9a5def4 --- /dev/null +++ b/server/opensubtitles.lua @@ -0,0 +1,169 @@ +#!/usr/bin/env lua + +local curl = require 'lib/curl' +local util = require 'lib/util' + +-- [[ languages supported by opensubtitles ]] -- +local languages = { + ['english'] = 'eng', + ['abkhazian'] = 'abk', + ['afrikaans'] = 'afr', + ['albanian'] = 'alb', + ['arabic'] = 'ara', + ['aragonese'] = 'arg', + ['armenian'] = 'arm', + ['assamese'] = 'asm', + ['asturian'] = 'ast', + ['azerbaijani'] = 'aze', + ['basque'] = 'baq', + ['belarusian'] = 'bel', + ['bengali'] = 'ben', + ['bosnian'] = 'bos', + ['breton'] = 'bre', + ['bulgarian'] = 'bul', + ['burmese'] = 'bur', + ['catalan'] = 'cat', + ['chinese (simplified)'] = 'chi', + ['chinese (traditional)'] = 'zht', + ['chinese bilingual'] = 'zhe', + ['croatian'] = 'hrv', + ['czech'] = 'cze', + ['danish'] = 'dan', + ['dari'] = 'prs', + ['dutch'] = 'dut', + ['esperanto'] = 'epo', + ['estonian'] = 'est', + ['extremaduran'] = 'ext', + ['finnish'] = 'fin', + ['french'] = 'fre', + ['gaelic'] = 'gla', + ['galician'] = 'glg', + ['georgian'] = 'geo', + ['german'] = 'ger', + ['greek'] = 'ell', + ['hebrew'] = 'heb', + ['hindi'] = 'hin', + ['hungarian'] = 'hun', + ['icelandic'] = 'ice', + ['igbo'] = 'ibo', + ['indonesian'] = 'ind', + ['interlingua'] = 'ina', + ['irish'] = 'gle', + ['italian'] = 'ita', + ['japanese'] = 'jpn', + ['kannada'] = 'kan', + ['kazakh'] = 'kaz', + ['khmer'] = 'khm', + ['korean'] = 'kor', + ['kurdish'] = 'kur', + ['latvian'] = 'lav', + ['lithuanian'] = 'lit', + ['luxembourgish'] = 'ltz', + ['macedonian'] = 'mac', + ['malay'] = 'may', + ['malayalam'] = 'mal', + ['manipuri'] = 'mni', + ['marathi'] = 'mar', + ['mongolian'] = 'mon', + ['montenegrin'] = 'mne', + ['navajo'] = 'nav', + ['nepali'] = 'nep', + ['northern sami'] = 'sme', + ['norwegian'] = 'nor', + ['occitan'] = 'oci', + ['odia'] = 'ori', + ['persian'] = 'per', + ['polish'] = 'pol', + ['portuguese'] = 'por', + ['portuguese (br)'] = 'pob', + ['portuguese (mz)'] = 'pom', + ['pushto'] = 'pus', + ['romanian'] = 'rum', + ['russian'] = 'rus', + ['santali'] = 'sat', + ['serbian'] = 'scc', + ['sindhi'] = 'snd', + ['sinhalese'] = 'sin', + ['slovak'] = 'slo', + ['slovenian'] = 'slv', + ['somali'] = 'som', + ['spanish'] = 'spa', + ['spanish (eu)'] = 'spn', + ['spanish (la)'] = 'spl', + ['swahili'] = 'swa', + ['swedish'] = 'swe', + ['syriac'] = 'syr', + ['tagalog'] = 'tgl', + ['tamil'] = 'tam', + ['tatar'] = 'tat', + ['telugu'] = 'tel', + ['thai'] = 'tha', + ['toki pona'] = 'tok', + ['turkish'] = 'tur', + ['turkmen'] = 'tuk', + ['ukrainian'] = 'ukr', + ['urdu'] = 'urd', + ['uzbek'] = 'uzb', + ['vietnamese'] = 'vie', + ['welsh'] = 'wel', +} + + +local language = 'english' +local domain = 'https://www.opensubtitles.org' +local retries = 10 + +local search_ohash = function (ohash) + local fetch, tries, hcode, url, id + + url = domain .. '/en' .. '/search/sublanguageid-' .. + languages[language] .. '/moviehash-' .. ohash + tries = 0 + repeat + fetch, hcode = curl.get(url, nil, nil) + tries = tries + 1 + until hcode == 200 or tries > retries + + id = fetch:match('/en/subtitleserve/sub/[^\n]*\n[^\n]*iduser%-0') + if id then + id = id:match('/en/subtitleserve/sub/%d*') + end + + if id then + return domain .. id + end +end + +local sub_fetch = function(link, out) + local tries, hcode, zip, zcode + + tries = 0 + zip = os.tmpname() + + repeat + _, hcode = curl.get(link, nil, '-o ' .. zip) + tries = tries + 1 + until hcode == 200 or tries > retries + + if hcode == 200 then + zcode = util.zip_ext_first(zip, out) + end + os.remove(zip) + + return (hcode == 200) and zcode +end + +local search = function (path, out) + local ohash, link + + ohash = util.opensubtitles_hash(path) + link = search_ohash(ohash) + if link then + return sub_fetch(link, out) + end +end + +return { + search_ohash = search_ohash, + search = search +} |