#!/usr/bin/env lua local curl = require 'lib.curl' local util = require 'lib.util' local attr = require 'lib.attr' -- [[ languages supported by subscene ]] -- local languages = { ['arabic'] = 2, ['bengali'] = 54, ['brazillian-portuguese'] = 4, ['chinese-bg-code'] = 7, ['czech'] = 9, ['danish'] = 10, ['dutch'] = 11, ['english'] = 13, ['farsipersian'] = 46, ['finnish'] = 17, ['french'] = 18, ['german'] = 19, ['greek'] = 21, ['hebrew'] = 22, ['indonesian'] = 44, ['italian'] = 26, ['japanese'] = 27, ['korean'] = 28, ['malay'] = 50, ['norwegian'] = 30, ['polish'] = 31, ['portuguese'] = 32, ['romanian'] = 33, ['spanish'] = 38, ['swedish'] = 39, ['thai'] = 40, ['turkish'] = 41, ['vietnamese'] = 45, ['albanian'] = 1, ['armenian'] = 73, ['azerbaijani'] = 55, ['basque'] = 74, ['belarusian'] = 68, ['big-5-code'] = 3, ['bosnian'] = 60, ['bulgarian'] = 5, ['bulgarian_english'] = 6, ['burmese'] = 61, ['cambodian_khmer'] = 79, ['catalan'] = 49, ['croatian'] = 8, ['dutch_english'] = 12, ['english_german'] = 15, ['esperanto'] = 47, ['estonian'] = 16, ['georgian'] = 62, ['greenlandic'] = 57, ['hindi'] = 51, ['hungarian'] = 23, ['hungarian_english'] = 24, ['icelandic'] = 25, ['kannada'] = 78, ['kinyarwanda'] = 81, ['kurdish'] = 52, ['latvian'] = 29, ['lithuanian'] = 43, ['macedonian'] = 48, ['malayalam'] = 64, ['manipuri'] = 65, ['mongolian'] = 72, ['nepali'] = 80, ['pashto'] = 67, ['punjabi'] = 66, ['russian'] = 34, ['serbian'] = 35, ['sinhala'] = 58, ['slovak'] = 36, ['slovenian'] = 37, ['somali'] = 70, ['sundanese'] = 76, ['swahili'] = 75, ['tagalog'] = 53, ['tamil'] = 59, ['telugu'] = 63, ['ukrainian'] = 56, ['urdu'] = 42, ['yoruba'] = 71, } local language = 'english' local domain = 'https://subscene.com' local headr = {['Cookie'] = 'LanguageFilter=' ..languages[language]} local tries = 10 local title_search = function (key) local url, args, fetch, hcode, title, rc url = domain .. '/subtitles/searchbytitle' args = { '--data-raw', 'query=' .. key } fetch, hcode = curl.get(url, headr, args, tries) title = fetch:match('href="/subtitles/[^"]*') if title then title = title:gsub('href="', domain) end rc = (hcode == 200 and title ~= nil) if hcode and not rc then util.error('subscene: title_search') end return title, rc end local id_fetch = function (title) local tab, id, name, fetch, hcode, iter, line fetch, hcode = curl.get(title, headr, nil, tries) tab = {} iter = fetch:gmatch('[^\n\r]+') while true do line = iter() if not line then break end id = line:match('/subtitles/[^/]*/[^/]*/%d*') if id then iter() iter() iter() iter() name = iter():match('%S[^\n\r]*%S') tab[name] = domain .. id id = nil end end if hcode and tab == {} then util.error('subscene: id_fetch') end return tab end local link_fetch = function (id) local fetch, hcode, link, rc fetch, hcode = curl.get(id, headr, nil, tries) rc = (hcode == 200) if rc then link = domain .. fetch:match('/subtitles/[%l_-]*%-text/[^"]*') end if hcode and not rc then util.error('subscene: link_fetch') end return link, rc end local search = function (path, out, name) local title, id, link, rc name = name or util.string_vid_path_to_name(path) title, rc = title_search(name) if not rc then return false end id = attr.fuzzy(name, id_fetch(title)) if not id then return false end link, rc = link_fetch(id) if not rc then return false end rc = curl.zip_link_to_file(link, headr, out, tries) if not rc then return false end return true end return { title_search = title_search, id_fetch = id_fetch, link_fetch = link_fetch, search = search, }