diff --git a/modules/opensubtitles/__init__.py b/modules/opensubtitles/__init__.py new file mode 100644 index 00000000..853037d4 --- /dev/null +++ b/modules/opensubtitles/__init__.py @@ -0,0 +1,3 @@ +from .backend import OpensubtitlesBackend + +__all__ = ['OpensubtitlesBackend'] diff --git a/modules/opensubtitles/backend.py b/modules/opensubtitles/backend.py new file mode 100644 index 00000000..52f6fa6e --- /dev/null +++ b/modules/opensubtitles/backend.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010-2011 Julien Veyssier +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + +from weboob.capabilities.subtitle import ICapSubtitle +from weboob.tools.backend import BaseBackend + +from .browser import OpensubtitlesBrowser + +from urllib import quote_plus + +__all__ = ['OpensubtitlesBackend'] + + +class OpensubtitlesBackend(BaseBackend, ICapSubtitle): + NAME = 'opensubtitles' + MAINTAINER = u'Julien Veyssier' + EMAIL = 'julien.veyssier@aiur.fr' + VERSION = '0.f' + DESCRIPTION = 'Opensubtitles subtitle website' + LICENSE = 'AGPLv3+' + LANGUAGE_CONV = {'fr':'fre','en':'eng'} + BROWSER = OpensubtitlesBrowser + + def create_default_browser(self): + return self.create_browser() + + def get_subtitle(self, id): + return self.browser.get_subtitle(id) + + def get_subtitle_file(self, id): + subtitle = self.browser.get_subtitle(id) + if not subtitle: + return None + + return self.browser.openurl(subtitle.url.encode('utf-8')).read() + + def iter_subtitles(self, language, pattern): + if language not in self.LANGUAGE_CONV.keys(): + return [] + return self.browser.iter_subtitles(language,quote_plus(pattern.encode('utf-8'))) diff --git a/modules/opensubtitles/browser.py b/modules/opensubtitles/browser.py new file mode 100644 index 00000000..ad2c62a3 --- /dev/null +++ b/modules/opensubtitles/browser.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010-2011 Julien Veyssier +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + + +from weboob.tools.browser import BaseBrowser + +from .pages import SubtitlesPage, SearchPage + + +__all__ = ['OpensubtitlesBrowser'] + + +class OpensubtitlesBrowser(BaseBrowser): + DOMAIN = 'www.opensubtitles.org' + PROTOCOL = 'http' + ENCODING = 'utf-8' + USER_AGENT = BaseBrowser.USER_AGENTS['wget'] + PAGES = { + 'http://www.opensubtitles.org.*search2/sublanguageid.*moviename.*': SearchPage, + 'http://www.opensubtitles.org.*search/sublanguageid.*idmovie.*': SubtitlesPage, + 'http://www.opensubtitles.org.*search/imdbid.*/sublanguageid.*/moviename.*' : SubtitlesPage + } + LANGUAGE_CONV = {'fr':'fre','en':'eng'} + + def iter_subtitles(self, language, pattern): + lang = self.LANGUAGE_CONV[language] + self.location('http://www.opensubtitles.org/search2/sublanguageid-%s/moviename-%s' % (lang,pattern.encode('utf-8'))) + assert self.is_on_page(SearchPage) or self.is_on_page(SubtitlesPage) + return self.page.iter_subtitles(language,pattern) + + def get_subtitle(self, id): + ids = id.split('|') + id_movie = ids[0] + id_file = ids[1] + self.location('http://www.opensubtitles.org/search/sublanguageid-all/idmovie-%s' % id_movie) + assert self.is_on_page(SubtitlesPage) + return self.page.get_subtitle(id_file) diff --git a/modules/opensubtitles/test.py b/modules/opensubtitles/test.py new file mode 100644 index 00000000..6edb0026 --- /dev/null +++ b/modules/opensubtitles/test.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010-2011 Julien Veyssier +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + +from weboob.tools.test import BackendTest +from weboob.capabilities.base import NotLoaded + +import urllib +from random import choice + +class OpensubtitlesTest(BackendTest): + BACKEND = 'opensubtitles' + + def test_subtitle(self): + subtitles = list(self.backend.iter_subtitles('fr','spiderman')) + assert (len(subtitles) > 0) + for subtitle in subtitles: + path, qs = urllib.splitquery(subtitle.url) + assert path.endswith('.zip') + + # get the file of a random sub + if len(subtitles): + subtitle = choice(subtitles) + self.backend.get_subtitle_file(subtitle.id)