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
301 if self.progress == 100:
\r
302 writeLog("Finished: %s"%self.url)
\r
303 self.status = _("Finished")
\r
304 self.execFinishCallbacks()
\r
306 def httpFinished(self, string=""):
\r
307 if string is not None:
\r
308 writeLog("Failed: %s"%self.url)
\r
309 writeLog("Error: %s"%string)
\r
310 self.status = _("Checking")
\r
311 self.checkTimer = eTimer()
\r
312 self.checkTimer.callback.append(self.doCheckTimer)
\r
313 self.checkTimer.start(10000, 1)
\r
315 def doCheckTimer(self):
\r
317 self.status = _("Failed")
\r
318 if config.plugins.RSDownloader.autorestart_failed.value:
\r
319 self.restartFailedTimer = eTimer()
\r
320 self.restartFailedTimer.callback.append(self.restartFailedCheck)
\r
321 self.restartFailedTimer.start(10000*60, 1)
\r
322 elif self.progress == 100:
\r
323 self.status = _("Finished")
\r
324 self.downloading = False
\r
325 self.execFinishCallbacks()
\r
327 def restartFailedCheck(self):
\r
328 if self.status == _("Failed"): # check if user didn't restart already
\r
329 self.download = None
\r
330 self.status = _("Waiting")
\r
332 def execFinishCallbacks(self):
\r
333 for x in self.finishCallbacks:
\r
336 def httpFailed(self, failure=None, error=""):
\r
339 error = failure.getErrorMessage()
\r
340 if error != "" and not error.startswith("[Errno 2]"):
\r
341 writeLog("Failed: %s"%self.url)
\r
342 writeLog("Error: %s"%error)
\r
343 self.status = _("Checking")
\r
344 self.checkTimer = eTimer()
\r
345 self.checkTimer.callback.append(self.doCheckTimer)
\r
346 self.checkTimer.start(10000, 1)
\r
348 def getYoutubeDownloadLink(self):
\r
350 html = get(self.url)
\r
352 isHDAvailable = False
\r
355 reonecat = re.compile(r'<title>(.+?)</title>', re.DOTALL)
\r
356 titles = reonecat.findall(html)
\r
358 self.name = titles[0]
\r
359 if self.name.startswith("YouTube - "):
\r
360 self.name = (self.name[10:]).replace("&", "&")
\r
361 if html.__contains__("isHDAvailable = true"):
\r
362 isHDAvailable = True
\r
363 for line in html.split('\n'):
\r
364 if 'swfArgs' in line:
\r
365 line = line.strip().split()
\r
368 if 'video_id' in thing:
\r
369 video_id = line[x+1][1:-2]
\r
370 elif '"t":' == thing:
\r
371 t = line[x+1][1:-2]
\r
374 if isHDAvailable == True:
\r
375 mrl = "http://www.youtube.com/get_video?video_id=%s&t=%s&fmt=22" % (video_id, t)
\r
377 mrl = "http://www.youtube.com/get_video?video_id=%s&t=%s&fmt=18" % (video_id, t)
\r
380 ##############################################################################
\r
383 def __init__(self):
\r
384 self.downloads = []
\r
385 self.checkTimer = eTimer()
\r
386 self.checkTimer.callback.append(self.startDownloading)
\r
387 self.checkTimer.start(5000*60, False)
\r
389 def mayDownload(self):
\r
390 if config.plugins.RSDownloader.onoff.value == False:
\r
391 writeLog("RS Downloader is turned off...")
\r
393 elif config.plugins.RSDownloader.ignore_time.value:
\r
396 start = config.plugins.RSDownloader.start_time.value
\r
397 end = config.plugins.RSDownloader.end_time.value
\r
400 if weekday == 0 and config.plugins.RSDownloader.download_monday.value == False:
\r
402 elif weekday == 1 and config.plugins.RSDownloader.download_tuesday.value == False:
\r
404 elif weekday == 2 and config.plugins.RSDownloader.download_wednesday.value == False:
\r
406 elif weekday == 3 and config.plugins.RSDownloader.download_thursday.value == False:
\r
408 elif weekday == 4 and config.plugins.RSDownloader.download_friday.value == False:
\r
410 elif weekday == 5 and config.plugins.RSDownloader.download_saturday.value == False:
\r
412 elif weekday == 6 and config.plugins.RSDownloader.download_sunday.value == False:
\r
417 hour_start = start[0]
\r
418 minute_start = start[1]
\r
420 minute_end = end[1]
\r
421 if start == end: # Same start and end-time
\r
423 elif hour_end < hour_start: # Different days!!!
\r
424 if hour_now > hour_start or hour_now < hour_end:
\r
426 elif hour_now == hour_start and minute_now > minute_start:
\r
428 elif hour_now == hour_end and minute_now < minute_end:
\r
432 elif hour_now > hour_start and hour_now < hour_end: # Same day...
\r
434 elif hour_now == hour_start and minute_now > minute_start: # Same day, same start-hour...
\r
436 elif hour_now == hour_end and minute_now < minute_end: # Same day, same end-hour...
\r
441 def allDownloadsFinished(self):
\r
443 for download in self.downloads:
\r
444 if (download.status != _("Failed")) and (download.status != _("Finished")):
\r
448 def startDownloading(self):
\r
449 if self.mayDownload() == True:
\r
450 if self.allDownloadsFinished() == True:
\r
453 for download in self.downloads:
\r
454 if download.downloading == True:
\r
455 downloadCount += 1 # Count the downloaded files
\r
456 if config.plugins.RSDownloader.username.value == "" and config.plugins.RSDownloader.password.value == "":
\r
457 if downloadCount < 1: # Allow one download if without account
\r
458 for download in self.downloads:
\r
459 if download.downloading == False and download.status.startswith(_("Waiting")):
\r
460 download.start() # Start first download in the list
\r
463 mayDownloadCount = config.plugins.RSDownloader.count_downloads.value - downloadCount
\r
464 for download in self.downloads:
\r
465 if download.downloading == False:
\r
466 if mayDownloadCount > 0 and download.status == _("Waiting"):
\r
468 mayDownloadCount -= 1
\r
470 def addDownload(self, url):
\r
472 for download in self.downloads:
\r
473 if download.url == url:
\r
478 download = RSDownload(url)
\r
479 download.finishCallbacks.append(self.cleanLists)
\r
480 self.downloads.append(download)
\r
483 def readLists(self):
\r
484 writeLog("Reading all lists...")
\r
485 path = config.plugins.RSDownloader.lists_directory.value
\r
486 if not path.endswith("/"):
\r
488 writeLog("Directory: " + path)
\r
490 file_list = listdir(path)
\r
491 writeLog("Count of lists: " + str(len(file_list)))
\r
494 writeLog("Could not find any list!")
\r
495 for x in file_list:
\r
497 if list.endswith(".txt"):
\r
499 writeLog("Reading list %s..."%list)
\r
500 f = open(list, "r")
\r
503 if l.startswith("http://"):
\r
504 if (self.addDownload(l.replace("\n", "").replace("\r", ""))) == True:
\r
508 writeLog("Empty list or downloads already in download list: %s"%list)
\r
510 writeLog("Added %d files from list %s..."%(count, list))
\r
512 writeLog("Error while reading list %s!"%list)
\r
514 writeLog("No *.txt file: %s!"%list)
\r
516 def cleanLists(self):
\r
517 writeLog("Cleaning lists...")
\r
518 path = config.plugins.RSDownloader.lists_directory.value
\r
519 if not path.endswith("/"):
\r
522 file_list = listdir(path)
\r
526 finished_downloads = []
527 for download in self.downloads:
\r
528 if download.status == _("Finished"):
529 finished_downloads.append(download)
\r
530 for x in file_list:
\r
532 if list.endswith(".txt"):
\r
534 f = open(list, "r")
\r
537 for finished in finished_downloads:
\r
538 if content.__contains__(finished.url):
\r
539 content = content.replace(finished.url, "")
\r
540 content = content.replace("\n\n", "\n").replace("\r\r", "\r")
\r
541 f = open(list, "w")
\r
545 writeLog("Error while cleaning list %s!"%list)
\r
546 self.startDownloading()
\r
548 def removeDownload(self, url):
\r
550 for download in self.downloads:
\r
551 if download.url == url:
\r
554 tmp.append(download)
\r
556 self.downloads = tmp
\r
557 self.removeFromLists(url)
\r
559 def removeFromLists(self, url):
\r
560 path = config.plugins.RSDownloader.lists_directory.value
\r
561 if not path.endswith("/"):
\r
564 file_list = listdir(path)
\r
567 for x in file_list:
\r
570 f = open(list, "r")
\r
573 if content.__contains__(url):
\r
574 content = content.replace(url, "")
\r
575 content = content.replace("\n\n", "\n").replace("\r\r", "\r")
\r
576 f = open(list, "w")
\r
582 def clearFinishedDownload(self, url):
\r
584 for x in self.downloads:
\r
586 del self.downloads[idx]
\r
591 def clearFinishedDownloads(self):
\r
593 for download in self.downloads:
\r
594 if download.status != _("Finished"):
\r
595 tmp.append(download)
\r
597 self.downloads = tmp
\r
599 def deleteFailedDownloads(self):
\r
601 for download in self.downloads:
\r
602 if download.status == _("Failed"):
\r
603 self.removeFromLists(download.url)
\r
605 tmp.append(download)
\r
607 self.downloads = tmp
\r
609 def restartFailedDownloads(self):
\r
611 for download in self.downloads:
\r
612 if download.status == _("Failed"):
\r
613 download.download = None
\r
614 download.downloading = False
\r
615 download.progress = 0
\r
617 download.status = _("Waiting")
\r
618 tmp.append(download)
\r
620 self.downloads = tmp
\r
621 self.startDownloading()
\r
625 ##############################################################################
\r
627 class ChangedScreen(Screen):
\r
628 def __init__(self, session, parent=None):
\r
629 Screen.__init__(self, session, parent)
\r
630 self.onLayoutFinish.append(self.setScreenTitle)
\r
632 def setScreenTitle(self):
\r
633 self.setTitle(_("RS Downloader"))
\r
635 ##############################################################################
\r
637 class RSConfig(ConfigListScreen, ChangedScreen):
\r
639 <screen position="center,center" size="560,450" title="RS Downloader">
\r
640 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />
\r
641 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />
\r
642 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />
\r
643 <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />
\r
644 <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
\r
645 <widget name="config" position="0,45" size="560,400" scrollbarMode="showOnDemand" />
\r
648 def __init__(self, session):
\r
649 ChangedScreen.__init__(self, session)
\r
651 self["key_green"] = Label(_("Save"))
\r
653 ConfigListScreen.__init__(self, [
\r
654 getConfigListEntry(_("Download in the background:"), config.plugins.RSDownloader.onoff),
\r
655 getConfigListEntry(_("Username:"), config.plugins.RSDownloader.username),
\r
656 getConfigListEntry(_("Password:"), config.plugins.RSDownloader.password),
\r
657 getConfigListEntry(_("Lists directory:"), config.plugins.RSDownloader.lists_directory),
\r
658 getConfigListEntry(_("Downloads directory:"), config.plugins.RSDownloader.downloads_directory),
\r
659 getConfigListEntry(_("Ignore download times:"), config.plugins.RSDownloader.ignore_time),
\r
660 getConfigListEntry(_("Allow downloading on monday:"), config.plugins.RSDownloader.download_monday),
\r
661 getConfigListEntry(_("Allow downloading on tuesday:"), config.plugins.RSDownloader.download_tuesday),
\r
662 getConfigListEntry(_("Allow downloading on wednesday:"), config.plugins.RSDownloader.download_wednesday),
\r
663 getConfigListEntry(_("Allow downloading on thursday:"), config.plugins.RSDownloader.download_thursday),
\r
664 getConfigListEntry(_("Allow downloading on friday:"), config.plugins.RSDownloader.download_friday),
\r
665 getConfigListEntry(_("Allow downloading on saturday:"), config.plugins.RSDownloader.download_saturday),
\r
666 getConfigListEntry(_("Allow downloading on sunday:"), config.plugins.RSDownloader.download_sunday),
\r
667 getConfigListEntry(_("Don't download before:"), config.plugins.RSDownloader.start_time),
\r
668 getConfigListEntry(_("Don't download after:"), config.plugins.RSDownloader.end_time),
\r
669 getConfigListEntry(_("Maximal downloads:"), config.plugins.RSDownloader.count_downloads),
\r
670 getConfigListEntry(_("Write log:"), config.plugins.RSDownloader.write_log),
\r
671 getConfigListEntry(_("Reconnect fritz.Box before downloading:"), config.plugins.RSDownloader.reconnect_fritz),
\r
672 getConfigListEntry(_("Restart failed after 10 minutes:"), config.plugins.RSDownloader.autorestart_failed)])
\r
674 self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], {"green": self.save, "cancel": self.exit}, -1)
\r
677 for x in self["config"].list:
\r
682 for x in self["config"].list:
\r
686 ##############################################################################
\r
688 class RSSearch(Screen):
\r
690 <screen position="center,center" size="560,450" title="Searching... please wait!">
\r
691 <widget name="list" position="0,0" size="570,450" scrollbarMode="showOnDemand" />
\r
694 def __init__(self, session, searchFor):
\r
695 Screen.__init__(self, session)
\r
696 self.session = session
\r
698 self.searchFor = searchFor.replace(" ", "%2B")
\r
703 self["list"] = MenuList([])
\r
705 self["actions"] = ActionMap(["OkCancelActions", "InfobarChannelSelection"],
\r
707 "historyBack": self.previousPage,
\r
708 "historyNext": self.nextPage,
\r
709 "ok": self.okClicked,
\r
710 "cancel": self.close
\r
713 self.onLayoutFinish.append(self.search)
\r
715 def okClicked(self):
\r
716 if len(self.files) > 0:
\r
717 idx = self["list"].getSelectedIndex()
\r
718 url = self.files[idx]
\r
720 f = open(("%s/search.txt" % config.plugins.RSDownloader.lists_directory.value).replace("//", "/"), "a")
\r
721 f.write("%s\n"%url)
\r
723 self.session.open(MessageBox, (_("Added %s to the download-list.") % url), MessageBox.TYPE_INFO)
\r
725 self.session.open(MessageBox, (_("Error while adding %s to the download-list!") % url), MessageBox.TYPE_ERROR)
\r
728 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
730 def searchCallback(self, html=""):
\r
734 if html.__contains__("Nothing found, sorry."):
\r
735 self.session.open(MessageBox, (_("Error while searching http://rapidshare-search-engine.com!\n\nError: Nothing found, sorry.")), MessageBox.TYPE_ERROR)
\r
736 self.instance.setTitle(_("Nothing found, sorry."))
\r
739 while tmp.__contains__("goPg('"):
\r
740 idx = tmp.index("goPg('")
\r
742 idx = tmp.index("'")
\r
743 pageNumber = tmp[:idx]
\r
746 pageNumber = int(pageNumber)
\r
747 if pageNumber > self.maxPage:
\r
748 self.maxPage = pageNumber
\r
752 self.instance.setTitle(_("Page %d / %d. Push < > to switch the page...")%(self.curPage, self.maxPage))
\r
754 while html.__contains__('title="Download"'):
\r
755 idx = html.index('title="Download"')
\r
757 idx = html.index('value="')
\r
758 html = html[idx+7:]
\r
759 idx = html.index('"')
\r
761 idx = html.index('http://rapidshare.com/')
\r
763 idx = html.index('"')
\r
768 urllist = url.split("/")
\r
769 idx = len(urllist) - 1
\r
770 name = urllist[idx]
\r
771 list.append("%s - %s"%(size, name))
\r
773 list.append("%s - %s"%(size, url))
\r
776 self["list"].setList(list)
\r
778 def searchError(self, error=""):
\r
779 self.session.open(MessageBox, (_("Error while searching http://rapidshare-search-engine.com!\n\nError: %s")%str(error)), MessageBox.TYPE_ERROR)
\r
781 def previousPage(self):
\r
782 if self.curPage > 1:
\r
784 self.instance.setTitle(_("Loading previous page... please wait!"))
\r
787 def nextPage(self):
\r
788 if self.curPage < self.maxPage:
\r
790 self.instance.setTitle(_("Loading next page... please wait!"))
\r
793 ##############################################################################
\r
795 class RSLogScreen(ChangedScreen):
\r
797 <screen position="center,center" size="560,450" title="RS Downloader">
\r
798 <widget name="label" position="0,0" size="560,450" font="Regular;20" />
\r
801 def __init__(self, session):
\r
802 ChangedScreen.__init__(self, session)
\r
805 f = open("/tmp/rapidshare.log")
\r
810 self["label"] = ScrollLabel(log)
\r
812 self["actions"] = ActionMap(["WizardActions"],
\r
815 "back": self.close,
\r
816 "up": self["label"].pageUp,
\r
817 "down": self["label"].pageDown,
\r
818 "left": self["label"].pageUp,
\r
819 "right": self["label"].pageDown
\r
822 ##############################################################################
\r
824 class RSContainerSelector(ChangedScreen):
\r
826 <screen position="center,center" size="560,450" title="RS Downloader">
\r
827 <widget name="list" position="0,0" size="560,450" />
\r
830 def __init__(self, session, list):
\r
831 ChangedScreen.__init__(self, session)
\r
832 self["list"] = MenuList(list)
\r
833 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.okClicked, "cancel": self.close}, -1)
\r
835 def okClicked(self):
\r
836 cur = self["list"].getCurrent()
\r
839 ##############################################################################
\r
841 class RSList(MenuList):
\r
842 def __init__(self, list):
\r
843 MenuList.__init__(self, list, False, eListboxPythonMultiContent)
\r
844 self.l.setItemHeight(25)
\r
845 self.l.setFont(0, gFont("Regular", 20))
\r
847 ##############################################################################
\r
849 def RSListEntry(download):
\r
851 res.append(MultiContentEntryText(pos=(0, 0), size=(170, 25), font=0, text=download.name))
\r
852 res.append(MultiContentEntryText(pos=(175, 0), size=(75, 25), font=0, text="%d%s"%(download.size, "MB"), flags=RT_HALIGN_CENTER))
\r
853 res.append(MultiContentEntryPixmapAlphaTest(pos=(260, 9), size=(84, 7), png=LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/progress_bg.png"))))
\r
854 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
855 res.append(MultiContentEntryText(pos=(360, 0), size=(60, 25), font=0, text="%d%s"%(download.progress, "%"), flags=RT_HALIGN_CENTER))
\r
856 res.append(MultiContentEntryText(pos=(420, 0), size=(140, 25), font=0, text=download.status, flags=RT_HALIGN_RIGHT))
\r
859 ##############################################################################
\r
861 class RSMain(ChangedScreen):
\r
863 <screen position="center,center" size="560,450" title="RS Downloader">
\r
864 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />
\r
865 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />
\r
866 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />
\r
867 <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />
\r
868 <ePixmap pixmap="skin_default/buttons/key_menu.png" position="10,420" size="35,25" transparent="1" alphatest="on" />
\r
869 <widget name="key_red" position="0,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
\r
870 <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
\r
871 <widget name="key_yellow" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
\r
872 <widget name="key_blue" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
\r
873 <widget name="key_menu" position="50,422" size="300,25" font="Regular;20" transparent="1" />
\r
874 <widget name="list" position="0,40" size="560,375" scrollbarMode="showNever" />
\r
877 def __init__(self, session):
\r
878 ChangedScreen.__init__(self, session)
\r
879 self.session = session
\r
881 self["key_red"] = Label(_("Delete"))
\r
882 self["key_green"] = Label(_("Search"))
\r
883 self["key_yellow"] = Label(_("Add"))
\r
884 self["key_blue"] = Label(_("Config"))
\r
885 self["key_menu"] = Label(_("Menu"))
\r
886 self["list"] = RSList([])
\r
888 self.refreshTimer = eTimer()
\r
889 self.refreshTimer.callback.append(self.updateList)
\r
891 self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "InfobarMenuActions"],
\r
893 "mainMenu": self.menu,
\r
894 "cancel": self.close,
\r
895 "red": self.delete,
\r
896 "green": self.search,
\r
897 "yellow": self.add,
\r
898 "blue": self.config
\r
901 self.onLayoutFinish.append(self.updateList)
\r
905 #TODO: Add sort list functions
\r
906 list.append((_("Delete download"), self.delete))
\r
907 list.append((_("Use search engine"), self.search))
\r
908 list.append((_("Add downloads from txt files"), self.add))
\r
909 list.append((_("Add files from container"), self.addContainer))
\r
910 list.append((_("Delete failed downloads"), self.deleteFailed))
\r
911 list.append((_("Restart failed downloads"), self.restartFailed))
\r
912 list.append((_("Clear finished downloads"), self.clearFinished))
\r
913 list.append((_("Show log"), self.showLog))
\r
914 list.append((_("Delete log"), self.deleteLog))
\r
915 list.append((_("Close plugin"), self.close))
\r
916 self.session.openWithCallback(self.menuCallback, ChoiceBox, title=_("Please choose a function..."), list=list)
\r
918 def menuCallback(self, callback=None):
\r
919 if callback is not None:
\r
922 def deleteFailed(self):
\r
923 rapidshare.deleteFailedDownloads()
\r
925 def restartFailed(self):
\r
926 rapidshare.restartFailedDownloads()
\r
928 def clearFinished(self):
\r
929 rapidshare.clearFinishedDownloads()
\r
932 self.session.open(RSLogScreen)
\r
934 def deleteLog(self):
\r
936 remove("/tmp/rapidshare.log")
\r
940 def updateList(self):
\r
942 for download in rapidshare.downloads:
\r
943 list.append(RSListEntry(download))
\r
944 self["list"].setList(list)
\r
945 self.refreshTimer.start(2000, 1)
\r
948 cur = self["list"].getCurrent()
\r
951 if cur.status == _("Finished"):
\r
952 rapidshare.clearFinishedDownload(cur.url)
\r
954 self.session.openWithCallback(self.deleteCallback, MessageBox, (_("Delete %s?")%cur.name))
\r
956 def deleteCallback(self, callback):
\r
958 rapidshare.removeDownload(self["list"].getCurrent()[0].url)
\r
959 self.refreshTimer.stop()
\r
963 self.session.openWithCallback(self.searchCallback, VirtualKeyBoard, title=_("Search http://rapidshare-search-engine.com for:"))
\r
965 def searchCallback(self, callback):
\r
966 if callback is not None and callback != "":
\r
967 self.session.openWithCallback(self.searchScreenCallback, RSSearch, callback)
\r
970 def searchScreenCallback(self):
\r
971 self.refreshTimer.stop()
\r
972 rapidshare.startDownloading()
\r
976 self.refreshTimer.stop()
\r
977 rapidshare.startDownloading()
\r
981 self.session.openWithCallback(self.configCallback, RSConfig)
\r
983 def configCallback(self):
\r
984 if config.plugins.RSDownloader.onoff.value:
\r
985 rapidshare.startDownloading()
\r
987 for download in rapidshare.downloads:
\r
988 if download.downloading:
\r
992 def addContainer(self):
\r
994 file_list = listdir(config.plugins.RSDownloader.lists_directory.value)
\r
998 for file in file_list:
\r
999 if file.lower().endswith(".ccf") or file.lower().endswith(".dlc") or file.lower().endswith(".rsdf"):
\r
1002 self.session.openWithCallback(self.addContainerCallback, RSContainerSelector, list)
\r
1004 def addContainerCallback(self, callback=None):
\r
1006 file = "%s/%s"%(config.plugins.RSDownloader.lists_directory.value, callback)
\r
1007 file = file.replace("//", "/")
\r
1008 links = decrypt(file)
\r
1010 f = open(("%s/%s.txt" % (config.plugins.RSDownloader.lists_directory.value, callback)).replace("//", "/"), "w")
\r
1011 for link in links:
\r
1012 if link.endswith(".html"):
\r
1014 elif link.endswith(".htm"):
\r
1016 f.write("%s\n"%link)
\r
1020 self.refreshTimer.stop()
\r
1021 rapidshare.startDownloading()
\r
1024 ##############################################################################
\r
1026 def autostart(reason, **kwargs):
\r
1028 rapidshare.startDownloading()
\r
1030 ##############################################################################
\r
1032 def main(session, **kwargs):
\r
1033 session.open(RSMain)
\r
1035 ##############################################################################
\r
1037 def Plugins(**kwargs):
\r
1039 PluginDescriptor(where=PluginDescriptor.WHERE_AUTOSTART, fnc=autostart),
\r
1040 PluginDescriptor(name=_("RS Downloader"), description=_("Download files from rapidshare"), where=[PluginDescriptor.WHERE_EXTENSIONSMENU, PluginDescriptor.WHERE_PLUGINMENU], icon="rs.png", fnc=main)]
\r