#!/usr/bin/env lua local curl = require 'lib.curl' local util = require 'lib.util' local attr = require 'lib.attr' -- [[ 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 tries = 10 local ids_fetch = function (page) local iter, no_name, line, id, name, tab tab = {} no_name = 0 iter = page:gmatch('[^\n\r]+') while true do line = iter() if not line then break end id = line:match('/en/subtitles/%d*') if id then id = id:match('%d+$') line = iter() -- movie if line:find('%.%.%.$') then -- name cuts off... name = line:gsub('"[^"]*$', '') name = name:match('[^"]+$') else name = line:gsub('
]+$') end if not name then line = iter() if line:find('^%[S%d%dE%d%d%]$') then -- it's a series line = iter() if line:find('%.%.%.$') then name = line:gsub('^.*title="', '') name = name:match('[^"]+') else name = line:match('[^<]+') end else -- no name name = tostring(no_name) no_name = no_name + 1 end end tab[name] = id end end return tab end local search_ohash = function (ohash, name) local fetch, hcode, url, id url = domain .. '/en' .. '/search/sublanguageid-' .. languages[language] .. '/moviehash-' .. ohash fetch, hcode = curl.get(url, nil, nil, tries) id = attr.fuzzy(name, ids_fetch(fetch)) if hcode and not id then util.error('opensubtitles: search_ohash failed') end if id then return domain .. '/en/subtitleserve/sub/' .. id end end local search_filesize = function (filesize, name) local fetch, hcode, url, id, a a = attr.build(name) url = domain .. '/en' .. '/search/sublanguageid-' .. languages[language] if a.season and a.episode then url = url .. '/season-' .. a.season .. '/episode-' .. a.episode end url = url .. '/moviebytesize-' .. filesize fetch, hcode = curl.get(url, nil, nil, tries) if not hcode then return nil end id = attr.fuzzy(name, ids_fetch(fetch)) if hcode and not id then util.error('opensubtitles: search_filesize failed') end if id then return domain .. '/en/subtitleserve/sub/' .. id end end local search = function (path, out, info) local ohash, link, name name = info.name or util.string_vid_path_to_name(path) if util.file_exists(path) then ohash = util.opensubtitles_hash(path) link = search_ohash(ohash, name) end if not link then link = search_filesize(info.filesize, name) end if link then return curl.zip_link_to_file(link, nil, out, tries) end end return { search_ohash = search_ohash, search_filesize = search_filesize, search = search }