6 from base64 import encodestring
\r
7 from Components.ActionMap import ActionMap
\r
8 from Components.config import config, ConfigInteger, ConfigText, ConfigYesNo, ConfigClock, ConfigSubsection, getConfigListEntry
\r
9 from Components.ConfigList import ConfigListScreen
\r
10 from Components.Label import Label
\r
11 from Components.Language import language
\r
12 from Components.MenuList import MenuList
\r
13 from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
\r
14 from Components.ScrollLabel import ScrollLabel
\r
15 from container.decrypt import decrypt
\r
16 from enigma import eListboxPythonMultiContent, eTimer, gFont, RT_HALIGN_CENTER, RT_HALIGN_RIGHT
\r
17 from os import environ, listdir, remove
\r
18 from Plugins.Plugin import PluginDescriptor
\r
19 from Screens.ChoiceBox import ChoiceBox
\r
20 from Screens.MessageBox import MessageBox
\r
21 from Screens.Screen import Screen
\r
22 from Screens.VirtualKeyBoard import VirtualKeyBoard
\r
23 from time import localtime, sleep, strftime, time
\r
24 from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE, SCOPE_LANGUAGE, SCOPE_PLUGINS
\r
25 from Tools.Downloader import HTTPProgressDownloader
\r
26 from Tools.LoadPixmap import LoadPixmap
\r
27 from twisted.internet import reactor
\r
28 from twisted.python import failure
\r
29 from twisted.web.client import getPage
\r
30 from urlparse import urlparse, urlunparse
\r
31 import gettext, re, socket, urllib2
\r
33 ##############################################################################
\r
35 config.plugins.RSDownloader = ConfigSubsection()
\r
36 config.plugins.RSDownloader.onoff = ConfigYesNo(default=True)
\r
37 config.plugins.RSDownloader.username = ConfigText(default="", fixed_size=False)
\r
38 config.plugins.RSDownloader.password = ConfigText(default="", fixed_size=False)
\r
39 config.plugins.RSDownloader.lists_directory = ConfigText(default="/media/hdd/rs/lists/", fixed_size=False)
\r
40 config.plugins.RSDownloader.downloads_directory = ConfigText(default="/media/hdd/rs/downloads", fixed_size=False)
\r
41 config.plugins.RSDownloader.ignore_time = ConfigYesNo(default=False)
\r
42 config.plugins.RSDownloader.start_time = ConfigClock(default=time())
\r
43 config.plugins.RSDownloader.end_time = ConfigClock(default=time())
\r
44 config.plugins.RSDownloader.download_monday = ConfigYesNo(default=True)
\r
45 config.plugins.RSDownloader.download_tuesday = ConfigYesNo(default=True)
\r
46 config.plugins.RSDownloader.download_wednesday = ConfigYesNo(default=True)
\r
47 config.plugins.RSDownloader.download_thursday = ConfigYesNo(default=True)
\r
48 config.plugins.RSDownloader.download_friday = ConfigYesNo(default=True)
\r
49 config.plugins.RSDownloader.download_saturday = ConfigYesNo(default=True)
\r
50 config.plugins.RSDownloader.download_sunday = ConfigYesNo(default=True)
\r
51 config.plugins.RSDownloader.count_downloads = ConfigInteger(default=3, limits=(1, 6))
\r
52 config.plugins.RSDownloader.write_log = ConfigYesNo(default=True)
\r
53 config.plugins.RSDownloader.reconnect_fritz = ConfigYesNo(default=False)
\r
54 config.plugins.RSDownloader.autorestart_failed = ConfigYesNo(default=False)
\r
56 ##############################################################################
\r
59 lang = language.getLanguage()
\r
60 environ["LANGUAGE"] = lang[:2]
\r
61 gettext.bindtextdomain("enigma2", resolveFilename(SCOPE_LANGUAGE))
\r
62 gettext.textdomain("enigma2")
\r
63 gettext.bindtextdomain("RSDownloader", "%s%s"%(resolveFilename(SCOPE_PLUGINS), "Extensions/RSDownloader/locale/"))
\r
66 t = gettext.dgettext("RSDownloader", txt)
\r
68 t = gettext.gettext(txt)
\r
72 language.addCallback(localeInit)
\r
74 ##############################################################################
\r
76 def writeLog(message):
\r
77 if config.plugins.RSDownloader.write_log.value:
\r
79 f = open("/tmp/rapidshare.log", "a")
\r
80 f.write(strftime("%c", localtime(time())) + " - " + message + "\n")
\r
85 ##############################################################################
\r
89 parsed = urlparse(url)
\r
91 path = urlunparse(('','') + parsed[2:])
\r
92 host, port = parsed[1], 80
\r
94 username, host = host.split('@')
\r
96 username, password = username.split(':')
\r
103 host, port = host.split(':')
\r
107 return scheme, host, port, path, username, password
\r
109 class ProgressDownload:
\r
110 def __init__(self, url, outputfile, contextFactory=None, *args, **kwargs):
\r
111 scheme, host, port, path, username, password = _parse(url)
\r
112 if username and password:
\r
113 url = scheme + '://' + host + ':' + str(port) + path
\r
114 basicAuth = encodestring("%s:%s"%(username, password))
\r
115 authHeader = "Basic " + basicAuth.strip()
\r
116 AuthHeaders = {"Authorization": authHeader}
\r
117 if kwargs.has_key("headers"):
\r
118 kwargs["headers"].update(AuthHeaders)
\r
120 kwargs["headers"] = AuthHeaders
\r
121 self.factory = HTTPProgressDownloader(url, outputfile, *args, **kwargs)
\r
122 self.connection = reactor.connectTCP(host, port, self.factory)
\r
125 return self.factory.deferred
\r
128 self.connection.disconnect()
\r
130 def addProgress(self, progress_callback):
\r
131 self.factory.progress_callback = progress_callback
\r
133 ##############################################################################
\r
137 data = urllib2.urlopen(url)
\r
142 def post(url, data):
\r
144 return urllib2.urlopen(url, data).read()
\r
148 def matchGet(rex, string):
\r
149 match = re.search(rex, string)
\r
151 if len(match.groups()) == 0:
\r
152 return string[match.span()[0]:match.span()[1]]
\r
153 if len(match.groups()) == 1:
\r
154 return match.groups()[0]
\r
158 ##############################################################################
\r
160 def reconnect(host='fritz.box', port=49000):
\r
161 http_body = '\r\n'.join((
\r
162 '<?xml version="1.0" encoding="utf-8"?>',
\r
163 '<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">',
\r
165 ' <u:ForceTermination xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"/>',
\r
168 http_data = '\r\n'.join((
\r
169 'POST /upnp/control/WANIPConn1 HTTP/1.1',
\r
170 'Host: %s:%d'%(host, port),
\r
171 'SoapAction: urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination',
\r
172 'Content-Type: text/xml; charset="utf-8"',
\r
173 'Content-Length: %d'%len(http_body),
\r
177 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
\r
178 s.connect((host, port))
\r
184 ##############################################################################
\r
187 def __init__(self, url):
\r
188 writeLog("Adding: %s"%url)
\r
190 self.download = None
\r
191 self.downloading = False
\r
194 self.status = _("Waiting")
\r
195 self.name = self.url.split("/")[-1]
\r
196 self.finishCallbacks = []
\r
199 writeLog("Downloading: %s"%self.url)
\r
200 self.downloading = True
\r
203 username = config.plugins.RSDownloader.username.value
\r
204 password = config.plugins.RSDownloader.password.value
\r
205 if self.url.__contains__("rapidshare.com") and username == "" and password == "":
\r
206 writeLog("Free RS-Download: %s"%self.url)
\r
207 self.status = _("Checking")
\r
208 if config.plugins.RSDownloader.reconnect_fritz.value:
\r
211 data = get(self.url)
\r
212 url = matchGet('<form[^>]+action="([^"]+)', data)
\r
214 writeLog("Failed: %s"%self.url)
\r
215 self.httpFailed(True, "Failed to get download page url: %s"%self.url)
\r
217 data = post(url, "dl.start=Free")
\r
218 seconds = matchGet('var c=([0-9]+)', data)
\r
220 self.httpFailed(True, "Failed to get download page url: %s"%self.url)
\r
222 writeLog("Free RS-Download... must wait %s seconds: %s"%(seconds, self.url))
\r
223 self.status = "%s %s"%(_("Waiting"), seconds)
\r
224 url = matchGet('"dlf" action="([^"]+)', data)
\r
226 self.httpFailed(True, "Failed to get download page url: %s"%self.url)
\r
228 self.freeDownloadUrl = url
\r
229 self.freeDownloadTimer = eTimer()
\r
230 self.freeDownloadTimer.callback.append(self.freeDownloadStart)
\r
231 self.freeDownloadTimer.start((int(seconds) + 2) * 1000, 1)
232 elif self.url.__contains__("uploaded.to") or self.url.__contains__("ul.to"):
233 writeLog("Free Uploaded.to-Download: %s"%self.url)
\r
234 self.status = _("Checking")
\r
235 if config.plugins.RSDownloader.reconnect_fritz.value:
\r
239 tmp = re.search(r"Or wait (\d+) minutes", data)
241 minutes = tmp.group(1)
242 writeLog("Free Uploaded.to-Download... must wait %s minutes: %s"%(minutes, self.url))
243 self.status = "%s %s"%(_("Waiting"), minutes)
\r
244 self.freeDownloadTimer = eTimer()
\r
245 self.freeDownloadTimer.callback.append(self.start)
\r
246 self.freeDownloadTimer.start((int(minutes) + 1) * 60000, 1)
248 url = re.search(r".*<form name=\"download_form\" method=\"post\" action=\"(.*)\">", data).group(1)
249 self.name = re.search(r"<td><b>\s+(.+)\s", data).group(1) + re.search(r"</td><td>(\..+)</td></tr>", data).group(1)
\r
250 self.status = _("Downloading")
\r
251 self.download = ProgressDownload(url, ("%s/%s"%(config.plugins.RSDownloader.downloads_directory.value, self.name)).replace("//", "/"))
\r
252 self.download.addProgress(self.httpProgress)
\r
253 self.download.start().addCallback(self.httpFinished).addErrback(self.httpFailed)
\r
254 elif self.url.__contains__("youtube.com"):
\r
255 writeLog("Getting youtube video link: %s"%self.url)
\r
256 self.status = _("Checking")
\r
257 downloadLink = self.getYoutubeDownloadLink()
\r
259 self.status = _("Downloading")
\r
260 writeLog("Downloading video: %s"%downloadLink)
\r
261 req = urllib2.Request(downloadLink)
\r
262 url_handle = urllib2.urlopen(req)
\r
263 headers = url_handle.info()
\r
264 if headers.getheader("content-type") == "video/mp4":
\r
268 self.download = ProgressDownload(downloadLink, ("%s/%s.%s"%(config.plugins.RSDownloader.downloads_directory.value, self.name, ext)).replace("//", "/"))
\r
269 self.download.addProgress(self.httpProgress)
\r
270 self.download.start().addCallback(self.httpFinished).addErrback(self.httpFailed)
\r
272 self.httpFailed(True, "Failed to get video url: %s"%self.url)
\r
274 if self.url.__contains__("rapidshare.com"):
\r
275 url = self.url.replace("http://", "http://" + username + ":" + password + "@")
\r
278 self.status = _("Downloading")
\r
279 self.download = ProgressDownload(url, ("%s/%s"%(config.plugins.RSDownloader.downloads_directory.value, self.name)).replace("//", "/").replace(".html", ""))
\r
280 self.download.addProgress(self.httpProgress)
\r
281 self.download.start().addCallback(self.httpFinished).addErrback(self.httpFailed)
\r
283 def freeDownloadStart(self):
\r
284 self.status = _("Downloading")
\r
285 self.download = ProgressDownload(self.freeDownloadUrl, ("%s/%s"%(config.plugins.RSDownloader.downloads_directory.value, self.name)).replace("//", "/").replace(".html", ""))
\r
286 self.download.addProgress(self.httpProgress)
\r
287 self.download.start().addCallback(self.httpFinished).addErrback(self.httpFailed)
\r
291 self.downloading = False
\r
292 self.status = _("Waiting")
\r
294 writeLog("Stopping download: %s"%self.url)
\r
295 self.download.stop()
\r
297 def httpProgress(self, recvbytes, totalbytes):
\r
299 self.size = int((totalbytes / 1024) / 1024)
\r
300 self.progress = int(100.0 * float(recvbytes) / float(totalbytes))
\r
302 def httpFinished(self, string=None):
\r
303 if string is not None:
\r
304 writeLog("Failed: %s"%self.url)
\r
305 writeLog("Error: %s"%string)
\r
306 self.status = _("Checking")
\r
307 self.checkTimer = eTimer()
\r
308 self.checkTimer.callback.append(self.doCheckTimer)
\r
309 self.checkTimer.start(10000, 1)
\r
311 def doCheckTimer(self):
\r
312 if (self.size == 0) or (self.progress < 100):
\r
313 self.status = _("Failed")
\r
314 if config.plugins.RSDownloader.autorestart_failed.value:
\r
315 self.restartFailedTimer = eTimer()
\r
316 self.restartFailedTimer.callback.append(self.restartFailedCheck)
\r
317 self.restartFailedTimer.start(10000*60, 1)
\r
318 elif self.progress == 100:
\r
319 self.status = _("Finished")
320 writeLog("Finished: %s"%self.url)
\r
321 self.downloading = False
\r
322 self.execFinishCallbacks()
\r
324 def restartFailedCheck(self):
\r
325 if self.status == _("Failed"): # check if user didn't restart already
\r
326 self.download = None
\r
327 self.status = _("Waiting")
\r
329 def execFinishCallbacks(self):
\r
330 for x in self.finishCallbacks:
\r
333 def httpFailed(self, failure=None, error=""):
\r
336 error = failure.getErrorMessage()
\r
337 if error != "" and not error.startswith("[Errno 2]"):
\r
338 writeLog("Failed: %s"%self.url)
\r
339 writeLog("Error: %s"%error)
\r
340 self.status = _("Checking")
\r
341 self.checkTimer = eTimer()
\r
342 self.checkTimer.callback.append(self.doCheckTimer)
\r
343 self.checkTimer.start(10000, 1)
\r
345 def getYoutubeDownloadLink(self):
\r
347 html = get(self.url)
\r
349 isHDAvailable = False
\r
352 reonecat = re.compile(r'<title>(.+?)</title>', re.DOTALL)
\r
353 titles = reonecat.findall(html)
\r
355 self.name = titles[0]
\r
356 if self.name.startswith("YouTube - "):
\r
357 self.name = (self.name[10:]).replace("&", "&")
\r
358 if html.__contains__("isHDAvailable = true"):
\r
359 isHDAvailable = True
\r
360 for line in html.split('\n'):
\r
361 if 'swfArgs' in line:
\r
362 line = line.strip().split()
\r
365 if 'video_id' in thing:
\r
366 video_id = line[x+1][1:-2]
\r
367 elif '"t":' == thing:
\r
368 t = line[x+1][1:-2]
\r
371 if isHDAvailable == True:
\r
372 mrl = "http://www.youtube.com/get_video?video_id=%s&t=%s&fmt=22" % (video_id, t)
\r
374 mrl = "http://www.youtube.com/get_video?video_id=%s&t=%s&fmt=18" % (video_id, t)
\r
377 ##############################################################################
\r
380 def __init__(self):
\r
381 self.downloads = []
\r
382 self.checkTimer = eTimer()
\r
383 self.checkTimer.callback.append(self.startDownloading)
\r
384 self.checkTimer.start(5000*60, False)
\r
386 def mayDownload(self):
\r
387 if config.plugins.RSDownloader.onoff.value == False:
\r
388 writeLog("RS Downloader is turned off...")
\r
390 elif config.plugins.RSDownloader.ignore_time.value:
\r
393 start = config.plugins.RSDownloader.start_time.value
\r
394 end = config.plugins.RSDownloader.end_time.value
\r
397 if weekday == 0 and config.plugins.RSDownloader.download_monday.value == False:
\r
399 elif weekday == 1 and config.plugins.RSDownloader.download_tuesday.value == False:
\r
401 elif weekday == 2 and config.plugins.RSDownloader.download_wednesday.value == False:
\r
403 elif weekday == 3 and config.plugins.RSDownloader.download_thursday.value == False:
\r
405 elif weekday == 4 and config.plugins.RSDownloader.download_friday.value == False:
\r
407 elif weekday == 5 and config.plugins.RSDownloader.download_saturday.value == False:
\r
409 elif weekday == 6 and config.plugins.RSDownloader.download_sunday.value == False:
\r
414 hour_start = start[0]
\r
415 minute_start = start[1]
\r
417 minute_end = end[1]
\r
418 if start == end: # Same start and end-time
\r
420 elif hour_end < hour_start: # Different days!!!
\r
421 if hour_now > hour_start or hour_now < hour_end:
\r
423 elif hour_now == hour_start and minute_now > minute_start:
\r
425 elif hour_now == hour_end and minute_now < minute_end:
\r
429 elif hour_now > hour_start and hour_now < hour_end: # Same day...
\r
431 elif hour_now == hour_start and minute_now > minute_start: # Same day, same start-hour...
\r
433 elif hour_now == hour_end and minute_now < minute_end: # Same day, same end-hour...
\r
438 def allDownloadsFinished(self):
\r
440 for download in self.downloads:
\r
441 if (download.status != _("Failed")) and (download.status != _("Finished")):
\r
445 def startDownloading(self):
\r
446 if self.mayDownload() == True:
\r
447 if self.allDownloadsFinished() == True:
\r
450 for download in self.downloads:
\r
451 if download.downloading == True:
\r
452 downloadCount += 1 # Count the downloaded files
\r
453 if config.plugins.RSDownloader.username.value == "" and config.plugins.RSDownloader.password.value == "":
\r
454 if downloadCount < 1: # Allow one download if without account
\r
455 for download in self.downloads:
\r
456 if download.downloading == False and download.status.startswith(_("Waiting")):
\r
457 download.start() # Start first download in the list
\r
460 mayDownloadCount = config.plugins.RSDownloader.count_downloads.value - downloadCount
\r
461 for download in self.downloads:
\r
462 if download.downloading == False:
\r
463 if mayDownloadCount > 0 and download.status == _("Waiting"):
\r
465 mayDownloadCount -= 1
\r
467 def addDownload(self, url):
\r
469 for download in self.downloads:
\r
470 if download.url == url:
\r
475 download = RSDownload(url)
\r
476 download.finishCallbacks.append(self.cleanLists)
\r
477 self.downloads.append(download)
\r
480 def readLists(self):
\r
481 writeLog("Reading all lists...")
\r
482 path = config.plugins.RSDownloader.lists_directory.value
\r
483 if not path.endswith("/"):
\r
485 writeLog("Directory: " + path)
\r
487 file_list = listdir(path)
489 writeLog("Count of lists: " + str(len(file_list)))
\r
492 writeLog("Could not find any list!")
\r
493 for x in file_list:
\r
495 if list.endswith(".txt"):
\r
497 writeLog("Reading list %s..."%list)
\r
498 f = open(list, "r")
\r
501 if l.startswith("http://"):
\r
502 if (self.addDownload(l.replace("\n", "").replace("\r", ""))) == True:
\r
506 writeLog("Empty list or downloads already in download list: %s"%list)
\r
508 writeLog("Added %d files from list %s..."%(count, list))
\r
510 writeLog("Error while reading list %s!"%list)
\r
512 writeLog("No *.txt file: %s!"%list)
\r
514 def cleanLists(self):
\r
515 writeLog("Cleaning lists...")
\r
516 path = config.plugins.RSDownloader.lists_directory.value
\r
517 if not path.endswith("/"):
\r
520 file_list = listdir(path)
\r
524 finished_downloads = []
525 for download in self.downloads:
\r
526 if download.status == _("Finished"):
527 finished_downloads.append(download)
\r
528 for x in file_list:
\r
530 if list.endswith(".txt"):
\r
532 f = open(list, "r")
\r
535 for finished in finished_downloads:
\r
536 if content.__contains__(finished.url):
\r
537 content = content.replace(finished.url, "")
\r
538 content = content.replace("\n\n", "\n").replace("\r\r", "\r")
\r
539 f = open(list, "w")
\r
543 writeLog("Error while cleaning list %s!"%list)
\r
544 self.startDownloading()
\r
546 def removeDownload(self, url):
\r
548 for download in self.downloads:
\r
549 if download.url == url:
\r
552 tmp.append(download)
\r
554 self.downloads = tmp
\r
555 self.removeFromLists(url)
\r
557 def removeFromLists(self, url):
\r
558 path = config.plugins.RSDownloader.lists_directory.value
\r
559 if not path.endswith("/"):
\r
562 file_list = listdir(path)
\r
565 for x in file_list:
\r
568 f = open(list, "r")
\r
571 if content.__contains__(url):
\r
572 content = content.replace(url, "")
\r
573 content = content.replace("\n\n", "\n").replace("\r\r", "\r")
\r
574 f = open(list, "w")
\r
580 def clearFinishedDownload(self, url):
\r
582 for x in self.downloads:
\r
584 del self.downloads[idx]
\r
589 def clearFinishedDownloads(self):
\r
591 for download in self.downloads:
\r
592 if download.status != _("Finished"):
\r
593 tmp.append(download)
\r
595 self.downloads = tmp
\r
597 def deleteFailedDownloads(self):
\r
599 for download in self.downloads:
\r
600 if download.status == _("Failed"):
\r
601 self.removeFromLists(download.url)
\r
603 tmp.append(download)
\r
605 self.downloads = tmp
\r
607 def restartFailedDownloads(self):
\r
609 for download in self.downloads:
\r
610 if download.status == _("Failed"):
\r
611 download.download = None
\r
612 download.downloading = False
\r
613 download.progress = 0
\r
615 download.status = _("Waiting")
\r
616 tmp.append(download)
\r
618 self.downloads = tmp
\r
619 self.startDownloading()
\r
623 ##############################################################################
\r
625 class ChangedScreen(Screen):
\r
626 def __init__(self, session, parent=None):
\r
627 Screen.__init__(self, session, parent)
\r
628 self.onLayoutFinish.append(self.setScreenTitle)
\r
630 def setScreenTitle(self):
\r
631 self.setTitle(_("RS Downloader"))
\r
633 ##############################################################################
\r
635 class RSConfig(ConfigListScreen, ChangedScreen):
\r
637 <screen position="center,center" size="560,450" title="RS Downloader">
\r
638 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />
\r
639 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />
\r
640 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />
\r
641 <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />
\r
642 <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
\r
643 <widget name="config" position="0,45" size="560,400" scrollbarMode="showOnDemand" />
\r
646 def __init__(self, session):
\r
647 ChangedScreen.__init__(self, session)
\r
649 self["key_green"] = Label(_("Save"))
\r
651 ConfigListScreen.__init__(self, [
\r
652 getConfigListEntry(_("Download in the background:"), config.plugins.RSDownloader.onoff),
\r
653 getConfigListEntry(_("Username:"), config.plugins.RSDownloader.username),
\r
654 getConfigListEntry(_("Password:"), config.plugins.RSDownloader.password),
\r
655 getConfigListEntry(_("Lists directory:"), config.plugins.RSDownloader.lists_directory),
\r
656 getConfigListEntry(_("Downloads directory:"), config.plugins.RSDownloader.downloads_directory),
\r
657 getConfigListEntry(_("Ignore download times:"), config.plugins.RSDownloader.ignore_time),
\r
658 getConfigListEntry(_("Allow downloading on monday:"), config.plugins.RSDownloader.download_monday),
\r
659 getConfigListEntry(_("Allow downloading on tuesday:"), config.plugins.RSDownloader.download_tuesday),
\r
660 getConfigListEntry(_("Allow downloading on wednesday:"), config.plugins.RSDownloader.download_wednesday),
\r
661 getConfigListEntry(_("Allow downloading on thursday:"), config.plugins.RSDownloader.download_thursday),
\r
662 getConfigListEntry(_("Allow downloading on friday:"), config.plugins.RSDownloader.download_friday),
\r
663 getConfigListEntry(_("Allow downloading on saturday:"), config.plugins.RSDownloader.download_saturday),
\r
664 getConfigListEntry(_("Allow downloading on sunday:"), config.plugins.RSDownloader.download_sunday),
\r
665 getConfigListEntry(_("Don't download before:"), config.plugins.RSDownloader.start_time),
\r
666 getConfigListEntry(_("Don't download after:"), config.plugins.RSDownloader.end_time),
\r
667 getConfigListEntry(_("Maximal downloads:"), config.plugins.RSDownloader.count_downloads),
\r
668 getConfigListEntry(_("Write log:"), config.plugins.RSDownloader.write_log),
\r
669 getConfigListEntry(_("Reconnect fritz.Box before downloading:"), config.plugins.RSDownloader.reconnect_fritz),
\r
670 getConfigListEntry(_("Restart failed after 10 minutes:"), config.plugins.RSDownloader.autorestart_failed)])
\r
672 self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], {"green": self.save, "cancel": self.exit}, -1)
\r
675 for x in self["config"].list:
\r
680 for x in self["config"].list:
\r
684 ##############################################################################
\r
686 class RSSearch(Screen):
\r
688 <screen position="center,center" size="560,450" title="Searching... please wait!">
\r
689 <widget name="list" position="0,0" size="570,450" scrollbarMode="showOnDemand" />
\r
692 def __init__(self, session, searchFor):
\r
693 Screen.__init__(self, session)
\r
694 self.session = session
\r
696 self.searchFor = searchFor.replace(" ", "%2B")
\r
701 self["list"] = MenuList([])
\r
703 self["actions"] = ActionMap(["OkCancelActions", "InfobarChannelSelection"],
\r
705 "historyBack": self.previousPage,
\r
706 "historyNext": self.nextPage,
\r
707 "ok": self.okClicked,
\r
708 "cancel": self.close
\r
711 self.onLayoutFinish.append(self.search)
\r
713 def okClicked(self):
\r
714 if len(self.files) > 0:
\r
715 idx = self["list"].getSelectedIndex()
\r
716 url = self.files[idx]
\r
718 f = open(("%s/search.txt" % config.plugins.RSDownloader.lists_directory.value).replace("//", "/"), "a")
\r
719 f.write("%s\n"%url)
\r
721 self.session.open(MessageBox, (_("Added %s to the download-list.") % url), MessageBox.TYPE_INFO)
\r
723 self.session.open(MessageBox, (_("Error while adding %s to the download-list!") % url), MessageBox.TYPE_ERROR)
\r
726 getPage("http://rapidshare-search-engine.com/index-s_submit=Search&sformval=1&s_type=0&what=1&s=%s&start=%d.html"%(self.searchFor, self.curPage)).addCallback(self.searchCallback).addErrback(self.searchError)
\r
728 def searchCallback(self, html=""):
\r
732 if html.__contains__("Nothing found, sorry."):
\r
733 self.session.open(MessageBox, (_("Error while searching http://rapidshare-search-engine.com!\n\nError: Nothing found, sorry.")), MessageBox.TYPE_ERROR)
\r
734 self.instance.setTitle(_("Nothing found, sorry."))
\r
737 while tmp.__contains__("goPg('"):
\r
738 idx = tmp.index("goPg('")
\r
740 idx = tmp.index("'")
\r
741 pageNumber = tmp[:idx]
\r
744 pageNumber = int(pageNumber)
\r
745 if pageNumber > self.maxPage:
\r
746 self.maxPage = pageNumber
\r
750 self.instance.setTitle(_("Page %d / %d. Push < > to switch the page...")%(self.curPage, self.maxPage))
\r
752 while html.__contains__('title="Download"'):
\r
753 idx = html.index('title="Download"')
\r
755 idx = html.index('value="')
\r
756 html = html[idx+7:]
\r
757 idx = html.index('"')
\r
759 idx = html.index('http://rapidshare.com/')
\r
761 idx = html.index('"')
\r
766 urllist = url.split("/")
\r
767 idx = len(urllist) - 1
\r
768 name = urllist[idx]
\r
769 list.append("%s - %s"%(size, name))
\r
771 list.append("%s - %s"%(size, url))
\r
774 self["list"].setList(list)
\r
776 def searchError(self, error=""):
\r
777 self.session.open(MessageBox, (_("Error while searching http://rapidshare-search-engine.com!\n\nError: %s")%str(error)), MessageBox.TYPE_ERROR)
\r
779 def previousPage(self):
\r
780 if self.curPage > 1:
\r
782 self.instance.setTitle(_("Loading previous page... please wait!"))
\r
785 def nextPage(self):
\r
786 if self.curPage < self.maxPage:
\r
788 self.instance.setTitle(_("Loading next page... please wait!"))
\r
791 ##############################################################################
\r
793 class RSLogScreen(ChangedScreen):
\r
795 <screen position="center,center" size="560,450" title="RS Downloader">
\r
796 <widget name="label" position="0,0" size="560,450" font="Regular;20" />
\r
799 def __init__(self, session):
\r
800 ChangedScreen.__init__(self, session)
\r
803 f = open("/tmp/rapidshare.log")
\r
808 self["label"] = ScrollLabel(log)
\r
810 self["actions"] = ActionMap(["WizardActions"],
\r
813 "back": self.close,
\r
814 "up": self["label"].pageUp,
\r
815 "down": self["label"].pageDown,
\r
816 "left": self["label"].pageUp,
\r
817 "right": self["label"].pageDown
\r
820 ##############################################################################
\r
822 class RSContainerSelector(ChangedScreen):
\r
824 <screen position="center,center" size="560,450" title="RS Downloader">
\r
825 <widget name="list" position="0,0" size="560,450" />
\r
828 def __init__(self, session, list):
\r
829 ChangedScreen.__init__(self, session)
\r
830 self["list"] = MenuList(list)
\r
831 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.okClicked, "cancel": self.close}, -1)
\r
833 def okClicked(self):
\r
834 cur = self["list"].getCurrent()
\r
837 ##############################################################################
\r
839 class RSList(MenuList):
\r
840 def __init__(self, list):
\r
841 MenuList.__init__(self, list, False, eListboxPythonMultiContent)
\r
842 self.l.setItemHeight(25)
\r
843 self.l.setFont(0, gFont("Regular", 20))
\r
845 ##############################################################################
\r
847 def RSListEntry(download):
\r
849 res.append(MultiContentEntryText(pos=(0, 0), size=(170, 25), font=0, text=download.name))
\r
850 res.append(MultiContentEntryText(pos=(175, 0), size=(75, 25), font=0, text="%d%s"%(download.size, "MB"), flags=RT_HALIGN_CENTER))
\r
851 res.append(MultiContentEntryPixmapAlphaTest(pos=(260, 9), size=(84, 7), png=LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/progress_bg.png"))))
\r
852 res.append(MultiContentEntryPixmapAlphaTest(pos=(260, 10), size=(int(0.84 * download.progress), 5), png=LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/progress_small.png"))))
\r
853 res.append(MultiContentEntryText(pos=(360, 0), size=(60, 25), font=0, text="%d%s"%(download.progress, "%"), flags=RT_HALIGN_CENTER))
\r
854 res.append(MultiContentEntryText(pos=(420, 0), size=(140, 25), font=0, text=download.status, flags=RT_HALIGN_RIGHT))
\r
857 ##############################################################################
\r
859 class RSMain(ChangedScreen):
\r
861 <screen position="center,center" size="560,450" title="RS Downloader">
\r
862 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />
\r
863 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />
\r
864 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />
\r
865 <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />
\r
866 <ePixmap pixmap="skin_default/buttons/key_menu.png" position="10,420" size="35,25" transparent="1" alphatest="on" />
\r
867 <widget name="key_red" position="0,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
\r
868 <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
\r
869 <widget name="key_yellow" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
\r
870 <widget name="key_blue" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
\r
871 <widget name="key_menu" position="50,422" size="300,25" font="Regular;20" transparent="1" />
\r
872 <widget name="list" position="0,40" size="560,375" scrollbarMode="showNever" />
\r
875 def __init__(self, session):
\r
876 ChangedScreen.__init__(self, session)
\r
877 self.session = session
\r
879 self["key_red"] = Label(_("Delete"))
\r
880 self["key_green"] = Label(_("Search"))
\r
881 self["key_yellow"] = Label(_("Add"))
\r
882 self["key_blue"] = Label(_("Config"))
\r
883 self["key_menu"] = Label(_("Menu"))
\r
884 self["list"] = RSList([])
\r
886 self.refreshTimer = eTimer()
\r
887 self.refreshTimer.callback.append(self.updateList)
\r
889 self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "InfobarMenuActions"],
\r
891 "mainMenu": self.menu,
\r
892 "cancel": self.close,
\r
893 "red": self.delete,
\r
894 "green": self.search,
\r
895 "yellow": self.add,
\r
896 "blue": self.config
\r
899 self.onLayoutFinish.append(self.updateList)
\r
903 #TODO: Add sort list functions
\r
904 list.append((_("Delete download"), self.delete))
\r
905 list.append((_("Use search engine"), self.search))
\r
906 list.append((_("Add downloads from txt files"), self.add))
\r
907 list.append((_("Add files from container"), self.addContainer))
\r
908 list.append((_("Delete failed downloads"), self.deleteFailed))
\r
909 list.append((_("Restart failed downloads"), self.restartFailed))
\r
910 list.append((_("Clear finished downloads"), self.clearFinished))
\r
911 list.append((_("Show log"), self.showLog))
\r
912 list.append((_("Delete log"), self.deleteLog))
\r
913 list.append((_("Close plugin"), self.close))
\r
914 self.session.openWithCallback(self.menuCallback, ChoiceBox, title=_("Please choose a function..."), list=list)
\r
916 def menuCallback(self, callback=None):
\r
917 if callback is not None:
\r
920 def deleteFailed(self):
\r
921 rapidshare.deleteFailedDownloads()
\r
923 def restartFailed(self):
\r
924 rapidshare.restartFailedDownloads()
\r
926 def clearFinished(self):
\r
927 rapidshare.clearFinishedDownloads()
\r
930 self.session.open(RSLogScreen)
\r
932 def deleteLog(self):
\r
934 remove("/tmp/rapidshare.log")
\r
938 def updateList(self):
\r
940 for download in rapidshare.downloads:
\r
941 list.append(RSListEntry(download))
\r
942 self["list"].setList(list)
\r
943 self.refreshTimer.start(2000, 1)
\r
946 cur = self["list"].getCurrent()
\r
949 if cur.status == _("Finished"):
\r
950 rapidshare.clearFinishedDownload(cur.url)
\r
952 self.session.openWithCallback(self.deleteCallback, MessageBox, (_("Delete %s?")%cur.name))
\r
954 def deleteCallback(self, callback):
\r
956 rapidshare.removeDownload(self["list"].getCurrent()[0].url)
\r
957 self.refreshTimer.stop()
\r
961 self.session.openWithCallback(self.searchCallback, VirtualKeyBoard, title=_("Search http://rapidshare-search-engine.com for:"))
\r
963 def searchCallback(self, callback):
\r
964 if callback is not None and callback != "":
\r
965 self.session.openWithCallback(self.searchScreenCallback, RSSearch, callback)
\r
968 def searchScreenCallback(self):
\r
969 self.refreshTimer.stop()
\r
970 rapidshare.startDownloading()
\r
974 self.refreshTimer.stop()
\r
975 rapidshare.startDownloading()
\r
979 self.session.openWithCallback(self.configCallback, RSConfig)
\r
981 def configCallback(self):
\r
982 if config.plugins.RSDownloader.onoff.value:
\r
983 rapidshare.startDownloading()
\r
985 for download in rapidshare.downloads:
\r
986 if download.downloading:
\r
990 def addContainer(self):
\r
992 file_list = listdir(config.plugins.RSDownloader.lists_directory.value)
\r
996 for file in file_list:
\r
997 if file.lower().endswith(".ccf") or file.lower().endswith(".dlc") or file.lower().endswith(".rsdf"):
\r
1000 self.session.openWithCallback(self.addContainerCallback, RSContainerSelector, list)
\r
1002 def addContainerCallback(self, callback=None):
\r
1004 file = "%s/%s"%(config.plugins.RSDownloader.lists_directory.value, callback)
\r
1005 file = file.replace("//", "/")
\r
1006 links = decrypt(file)
\r
1008 f = open(("%s/%s.txt" % (config.plugins.RSDownloader.lists_directory.value, callback)).replace("//", "/"), "w")
\r
1009 for link in links:
\r
1010 if link.endswith(".html"):
\r
1012 elif link.endswith(".htm"):
\r
1014 f.write("%s\n"%link)
\r
1018 self.refreshTimer.stop()
\r
1019 rapidshare.startDownloading()
\r
1022 ##############################################################################
\r
1024 def autostart(reason, **kwargs):
\r
1026 rapidshare.startDownloading()
\r
1028 ##############################################################################
\r
1030 def main(session, **kwargs):
\r
1031 session.open(RSMain)
\r
1033 ##############################################################################
\r
1035 def Plugins(**kwargs):
\r
1037 PluginDescriptor(where=PluginDescriptor.WHERE_AUTOSTART, fnc=autostart),
\r
1038 PluginDescriptor(name=_("RS Downloader"), description=_("Download files from rapidshare"), where=[PluginDescriptor.WHERE_EXTENSIONSMENU, PluginDescriptor.WHERE_PLUGINMENU], icon="rs.png", fnc=main)]
\r