modified: Makefile.am
[enigma2-plugins.git] / SubsDownloader2 / src / SourceCode / periscope / services / BierDopje / services.py
1 # -*- coding: utf-8 -*-\r
2 \r
3 #   This file is part of periscope.\r
4 #\r
5 #    periscope is free software; you can redistribute it and/or modify\r
6 #    it under the terms of the GNU Lesser General Public License as published by\r
7 #    the Free Software Foundation; either version 2 of the License, or\r
8 #    (at your option) any later version.\r
9 #\r
10 #    periscope is distributed in the hope that it will be useful,\r
11 #    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 #    GNU Lesser General Public License for more details.\r
14 #\r
15 #    You should have received a copy of the GNU Lesser General Public License\r
16 #    along with periscope; if not, write to the Free Software\r
17 #    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
18 \r
19 import urllib\r
20 import urllib2\r
21 import logging\r
22 import os\r
23 import pickle\r
24 from xml.dom import minidom\r
25 from Plugins.Extensions.SubsDownloader2.SourceCode.xbmc_subtitles.utilities import toOpenSubtitles_two\r
26 \r
27 from Plugins.Extensions.SubsDownloader2.SourceCode.periscope import SubtitleDatabase\r
28 \r
29 log = logging.getLogger(__name__)\r
30 \r
31 exceptions = {\r
32     'the office' : 10358,\r
33     'the office us' : 10358,\r
34     'greys anatomy' : 3733,\r
35     'sanctuary us' : 7904,\r
36     'human target 2010' : 12986,\r
37     'csi miami' : 2187,\r
38     'castle 2009' : 12708,\r
39     'chase 2010' : 14228,\r
40     'the defenders 2010' : 14225,\r
41     'hawaii five-0 2010' : 14211,\r
42 }\r
43 \r
44 class BierDopje(SubtitleDatabase.SubtitleDB):\r
45     url = "http://bierdopje.com/"\r
46     site_name = "BierDopje"\r
47 \r
48     def __init__(self, config, cache_folder_path):\r
49         super(BierDopje, self).__init__(None)\r
50         #http://api.bierdopje.com/23459DC262C0A742/GetShowByName/30+Rock\r
51         #http://api.bierdopje.com/23459DC262C0A742/GetAllSubsFor/94/5/1/en (30 rock, season 5, episode 1)\r
52         #key = '112C8204D6754A2A'\r
53         #key = '369C2ED4261DE9C3'\r
54         key = 'ED7DCFCDEC22045A' #SubsDownloader APIKey\r
55 \r
56         self.api = "http://api.bierdopje.com/%s/" %key\r
57         self.cache_path = os.path.join(cache_folder_path, "bierdopje.cache")\r
58         #self.cache_path = os.path.join(film_path.rsplit("/",1)[0], "bierdopje.cache")\r
59         if not os.path.exists(self.cache_path):\r
60             log.info("Creating cache file %s" % self.cache_path)\r
61             f = open(self.cache_path, 'w')\r
62             pickle.dump({'showids' : {}}, f)\r
63             f.close()\r
64         f = open(self.cache_path, 'r')\r
65         self.cache = pickle.load(f)\r
66         f.close()\r
67 \r
68     def process(self, filepath, langs):\r
69         ''' main method to call on the plugin, pass the filename and the wished \r
70         languages and it will query the subtitles source '''\r
71         fname = self.getFileName(filepath)\r
72         temp_lang = []\r
73         \r
74         #Convert subtitle language to plugin requirements\r
75         temp_lang = []\r
76         for x in langs:\r
77             if x == "All":\r
78                 temp_lang = []\r
79                 break\r
80             elif x == "None":\r
81                 pass\r
82             else:\r
83                 temp_lang.append(toOpenSubtitles_two(str(x)))\r
84         langs = temp_lang    \r
85          #Convert subtitle language to plugin requirements\r
86          \r
87         try:\r
88             subs = self.query(fname, langs)\r
89             print str(subs)\r
90             \r
91             \r
92             if not subs and fname.rfind(".[") > 0:\r
93                 # Try to remove the [VTV] or [EZTV] at the end of the file\r
94                 teamless_filename = fname[0 : fname.rfind(".[")]\r
95                 subs = self.query(teamless_filename, langs)\r
96                 return subs\r
97             else:\r
98                 return subs\r
99         except Exception, e:\r
100             log.exception("Error raised by plugin")\r
101             return []\r
102             \r
103     #def createFile(self, subtitle):\r
104     def createFile(self, subtitle, filename):\r
105         '''get the URL of the sub, download it and return the path to the created file'''\r
106         sublink = subtitle["link"]\r
107         #subpath = subtitle["filename"].rsplit(".", 1)[0] + '.srt'\r
108         subpath = filename.rsplit(".", 1)[0] + '.srt'\r
109         self.downloadFile(sublink, subpath)\r
110         return subpath\r
111     \r
112     def query(self, token, langs=None):\r
113         ''' makes a query and returns info (link, lang) about found subtitles'''\r
114         guessedData = self.guessFileData(token)\r
115         if "tvshow" != guessedData['type'] :\r
116             return []\r
117         elif langs and not set(langs).intersection((['en', 'nl'])): # lang is given but does not include nl or en\r
118             return []\r
119             \r
120         if not langs :\r
121             availableLangs = ['nl', 'en']\r
122         else :\r
123             availableLangs = list(set(langs).intersection((['en', 'nl'])))\r
124         log.debug("possible langs : %s " % availableLangs)\r
125 \r
126         sublinks = []\r
127         \r
128         # Query the show to get the show id\r
129         showName = guessedData['name'].lower()\r
130         if exceptions.has_key(showName):\r
131             show_id = exceptions.get(showName)\r
132         elif self.cache['showids'].has_key(showName):\r
133             show_id = self.cache['showids'].get(showName)\r
134         else :\r
135             getShowId_url = "%sGetShowByName/%s" %(self.api, urllib.quote(showName))\r
136             log.debug("Looking for show Id @ %s" % getShowId_url)\r
137             page = urllib2.urlopen(getShowId_url)\r
138             dom = minidom.parse(page)\r
139             if not dom or len(dom.getElementsByTagName('showid')) == 0 :\r
140                 page.close()\r
141                 return []\r
142             show_id = dom.getElementsByTagName('showid')[0].firstChild.data\r
143             self.cache['showids'][showName] = show_id\r
144             f = open(self.cache_path, 'w')\r
145             pickle.dump(self.cache, f)\r
146             f.close()\r
147             page.close()\r
148         \r
149         # Query the episode to get the subs\r
150         for lang in availableLangs :\r
151             getAllSubs_url = "%sGetAllSubsFor/%s/%s/%s/%s" %(self.api, show_id, guessedData['season'], guessedData['episode'], lang)\r
152             log.debug("Looking for subs @ %s" %getAllSubs_url)\r
153             page = urllib2.urlopen(getAllSubs_url)\r
154             dom = minidom.parse(page)\r
155             page.close()\r
156             for sub in dom.getElementsByTagName('result'):\r
157                 release = sub.getElementsByTagName('filename')[0].firstChild.data\r
158                 if release.endswith(".srt"):\r
159                     release = release[:-4]\r
160                 dllink = sub.getElementsByTagName('downloadlink')[0].firstChild.data\r
161                 log.debug("Release found : %s" % release.lower())\r
162                 log.debug("Searching for : %s" % token.lower())\r
163                 if release.lower() == token.lower():\r
164                     result = {}\r
165                     result["release"] = release\r
166                     result["link"] = dllink\r
167                     result["page"] = dllink\r
168                     result["lang"] = lang\r
169                     sublinks.append(result)\r
170             \r
171         return sublinks\r