-##
-## RS Downloader
-## by AliAbdul
-##
-##
-from base64 import encodestring
-from Components.ActionMap import ActionMap
-from Components.config import config, ConfigInteger, ConfigText, ConfigYesNo, ConfigClock, ConfigSubsection, getConfigListEntry
-from Components.ConfigList import ConfigListScreen
-from Components.Label import Label
-from Components.Language import language
-from Components.MenuList import MenuList
-from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
-from Components.ScrollLabel import ScrollLabel
-from decrypt import decrypt
-from enigma import eListboxPythonMultiContent, eTimer, gFont, RT_HALIGN_CENTER, RT_HALIGN_RIGHT
-from os import environ, listdir, remove
-from Plugins.Plugin import PluginDescriptor
-from Screens.ChoiceBox import ChoiceBox
-from Screens.MessageBox import MessageBox
-from Screens.Screen import Screen
-from Screens.VirtualKeyBoard import VirtualKeyBoard
-from time import localtime, sleep, strftime, time
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE, SCOPE_LANGUAGE, SCOPE_PLUGINS
-from Tools.Downloader import HTTPProgressDownloader
-from Tools.LoadPixmap import LoadPixmap
-from twisted.internet import reactor
-from twisted.python import failure
-from twisted.web.client import getPage
-from urlparse import urlparse, urlunparse
-import gettext, re, socket, urllib2
-
-##############################################################################
-
-config.plugins.RSDownloader = ConfigSubsection()
-config.plugins.RSDownloader.onoff = ConfigYesNo(default=True)
-config.plugins.RSDownloader.username = ConfigText(default="", fixed_size=False)
-config.plugins.RSDownloader.password = ConfigText(default="", fixed_size=False)
-config.plugins.RSDownloader.lists_directory = ConfigText(default="/media/hdd/rs/lists/", fixed_size=False)
-config.plugins.RSDownloader.downloads_directory = ConfigText(default="/media/hdd/rs/downloads", fixed_size=False)
-config.plugins.RSDownloader.ignore_time = ConfigYesNo(default=False)
-config.plugins.RSDownloader.start_time = ConfigClock(default=time())
-config.plugins.RSDownloader.end_time = ConfigClock(default=time())
-config.plugins.RSDownloader.download_monday = ConfigYesNo(default=True)
-config.plugins.RSDownloader.download_tuesday = ConfigYesNo(default=True)
-config.plugins.RSDownloader.download_wednesday = ConfigYesNo(default=True)
-config.plugins.RSDownloader.download_thursday = ConfigYesNo(default=True)
-config.plugins.RSDownloader.download_friday = ConfigYesNo(default=True)
-config.plugins.RSDownloader.download_saturday = ConfigYesNo(default=True)
-config.plugins.RSDownloader.download_sunday = ConfigYesNo(default=True)
-config.plugins.RSDownloader.count_downloads = ConfigInteger(default=3, limits=(1, 6))
-config.plugins.RSDownloader.write_log = ConfigYesNo(default=True)
-config.plugins.RSDownloader.reconnect_fritz = ConfigYesNo(default=False)
-config.plugins.RSDownloader.autorestart_failed = ConfigYesNo(default=False)
-
-##############################################################################
-
-def localeInit():
- lang = language.getLanguage()
- environ["LANGUAGE"] = lang[:2]
- gettext.bindtextdomain("enigma2", resolveFilename(SCOPE_LANGUAGE))
- gettext.textdomain("enigma2")
- gettext.bindtextdomain("RSDownloader", "%s%s"%(resolveFilename(SCOPE_PLUGINS), "Extensions/RSDownloader/locale/"))
-
-def _(txt):
- t = gettext.dgettext("RSDownloader", txt)
- if t == txt:
- t = gettext.gettext(txt)
- return t
-
-localeInit()
-language.addCallback(localeInit)
-
-##############################################################################
-
-def writeLog(message):
- if config.plugins.RSDownloader.write_log.value:
- try:
- f = open("/tmp/rapidshare.log", "a")
- f.write(strftime("%c", localtime(time())) + " - " + message + "\n")
- f.close()
- except:
- pass
-
-##############################################################################
-
-def _parse(url):
- url = url.strip()
- parsed = urlparse(url)
- scheme = parsed[0]
- path = urlunparse(('','') + parsed[2:])
- host, port = parsed[1], 80
- if '@' in host:
- username, host = host.split('@')
- if ':' in username:
- username, password = username.split(':')
- else:
- password = ""
- else:
- username = ""
- password = ""
- if ':' in host:
- host, port = host.split(':')
- port = int(port)
- if path == "":
- path = "/"
- return scheme, host, port, path, username, password
-
-class ProgressDownload:
- def __init__(self, url, outputfile, contextFactory=None, *args, **kwargs):
- scheme, host, port, path, username, password = _parse(url)
- if username and password:
- url = scheme + '://' + host + ':' + str(port) + path
- basicAuth = encodestring("%s:%s"%(username, password))
- authHeader = "Basic " + basicAuth.strip()
- AuthHeaders = {"Authorization": authHeader}
- if kwargs.has_key("headers"):
- kwargs["headers"].update(AuthHeaders)
- else:
- kwargs["headers"] = AuthHeaders
- self.factory = HTTPProgressDownloader(url, outputfile, *args, **kwargs)
- self.connection = reactor.connectTCP(host, port, self.factory)
-
- def start(self):
- return self.factory.deferred
-
- def stop(self):
- self.connection.disconnect()
-
- def addProgress(self, progress_callback):
- self.factory.progress_callback = progress_callback
-
-##############################################################################
-
-def get(url):
- try:
- data = urllib2.urlopen(url)
- return data.read()
- except:
- return ""
-
-def post(url, data):
- try:
- return urllib2.urlopen(url, data).read()
- except:
- return ""
-
-def matchGet(rex, string):
- match = re.search(rex, string)
- if match:
- if len(match.groups()) == 0:
- return string[match.span()[0]:match.span()[1]]
- if len(match.groups()) == 1:
- return match.groups()[0]
- else:
- return False
-
-##############################################################################
-
-def reconnect(host='fritz.box', port=49000):
- http_body = '\r\n'.join((
- '<?xml version="1.0" encoding="utf-8"?>',
- '<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">',
- ' <s:Body>',
- ' <u:ForceTermination xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"/>',
- ' </s:Body>',
- '</s:Envelope>'))
- http_data = '\r\n'.join((
- 'POST /upnp/control/WANIPConn1 HTTP/1.1',
- 'Host: %s:%d'%(host, port),
- 'SoapAction: urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination',
- 'Content-Type: text/xml; charset="utf-8"',
- 'Content-Length: %d'%len(http_body),
- '',
- http_body))
- try:
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((host, port))
- s.send(http_data)
- s.close()
- except:
- pass
-
-##############################################################################
-
-class RSDownload:
- def __init__(self, url):
- writeLog("Adding: %s"%url)
- self.url = url
- self.download = None
- self.downloading = False
- self.progress = 0
- self.size = 0
- self.status = _("Waiting")
- self.name = self.url.split("/")[-1]
-
- self.freeDownloadUrl = ""
- self.freeDownloadTimer = eTimer()
- self.freeDownloadTimer.callback.append(self.freeDownloadStart)
- self.checkTimer = eTimer()
- self.checkTimer.callback.append(self.doCheckTimer)
- self.restartFailedTimer = eTimer()
- self.restartFailedTimer.callback.append(self.restartFailedCheck)
-
- self.finishCallbacks = []
-
- def start(self):
- writeLog("Downloading: %s"%self.url)
- self.downloading = True
- self.progress = 0
- self.size = 0
- username = config.plugins.RSDownloader.username.value
- password = config.plugins.RSDownloader.password.value
- if self.url.__contains__("rapidshare.com") and username == "" and password == "":
- writeLog("Free RS-Download: %s"%self.url)
- self.status = _("Checking")
- if config.plugins.RSDownloader.reconnect_fritz.value:
- reconnect()
- sleep(3)
- data = get(self.url)
- url = matchGet('<form[^>]+action="([^"]+)', data)
- if not url:
- writeLog("Failed: %s"%self.url)
- self.httpFailed(True, "Failed to get download page url: %s"%self.url)
- else:
- data = post(url, "dl.start=Free")
- seconds = matchGet('var c=([0-9]+)', data)
- if not seconds:
- self.httpFailed(True, "Failed to get download page url: %s"%self.url)
- else:
- writeLog("Free RS-download... must wait %s seconds: %s"%(seconds, self.url))
- self.status = "%s %s"%(_("Waiting"), seconds)
- url = matchGet('"dlf" action="([^"]+)', data)
- if not url:
- self.httpFailed(True, "Failed to get download page url: %s"%self.url)
- else:
- self.freeDownloadUrl = url
- self.freeDownloadTimer.start((int(seconds) + 2) * 1000, 1)
- elif self.url.__contains__("youtube.com"):
- writeLog("Getting youtube video link: %s"%self.url)
- self.status = _("Checking")
- downloadLink = self.getYoutubeDownloadLink()
- if downloadLink:
- self.status = _("Downloading")
- writeLog("Downloading video: %s"%downloadLink)
- req = urllib2.Request(downloadLink)
- url_handle = urllib2.urlopen(req)
- headers = url_handle.info()
- if headers.getheader("content-type") == "video/mp4":
- ext = "mp4"
- else:
- ext = "flv"
- self.download = ProgressDownload(downloadLink, ("%s/%s.%s"%(config.plugins.RSDownloader.downloads_directory.value, self.name, ext)).replace("//", "/"))
- self.download.addProgress(self.httpProgress)
- self.download.start().addCallback(self.httpFinished).addErrback(self.httpFailed)
- else:
- self.httpFailed(True, "Failed to get video url: %s"%self.url)
- else:
- if self.url.__contains__("rapidshare.com"):
- url = self.url.replace("http://", "http://" + username + ":" + password + "@")
- else:
- url = self.url
- self.status = _("Downloading")
- self.download = ProgressDownload(url, ("%s/%s"%(config.plugins.RSDownloader.downloads_directory.value, self.name)).replace("//", "/").replace(".html", ""))
- self.download.addProgress(self.httpProgress)
- self.download.start().addCallback(self.httpFinished).addErrback(self.httpFailed)
-
- def freeDownloadStart(self):
- self.status = _("Downloading")
- self.download = ProgressDownload(self.freeDownloadUrl, ("%s/%s"%(config.plugins.RSDownloader.downloads_directory.value, self.name)).replace("//", "/").replace(".html", ""))
- self.download.addProgress(self.httpProgress)
- self.download.start().addCallback(self.httpFinished).addErrback(self.httpFailed)
-
- def stop(self):
- self.progress = 0
- self.downloading = False
- self.status = _("Waiting")
- if self.download:
- writeLog("Stopping download: %s"%self.url)
- self.download.stop()
-
- def httpProgress(self, recvbytes, totalbytes):
- if self.size == 0:
- self.size = int((totalbytes / 1024) / 1024)
- self.progress = int(100.0 * float(recvbytes) / float(totalbytes))
- if self.progress == 100:
- writeLog("Finished: %s"%self.url)
- self.status = _("Finished")
- self.execFinishCallbacks()
-
- def httpFinished(self, string=""):
- if string is not None:
- writeLog("Failed: %s"%self.url)
- writeLog("Error: %s"%string)
- self.status = _("Checking")
- self.checkTimer.start(10000, 1)
-
- def doCheckTimer(self):
- if self.size == 0:
- self.status = _("Failed")
- if config.plugins.RSDownloader.autorestart_failed.value:
- self.restartFailedTimer.start(10000*60, 1)
- elif self.progress == 100:
- self.status = _("Finished")
- self.downloading = False
- self.execFinishCallbacks()
-
- def restartFailedCheck(self):
- if self.status == _("Failed"): # check if user didn't restart already
- self.download = None
- self.status = _("Waiting")
-
- def execFinishCallbacks(self):
- for x in self.finishCallbacks:
- x()
-
- def httpFailed(self, failure=None, error=""):
- if failure:
- if error == "":
- error = failure.getErrorMessage()
- if error != "" and not error.startswith("[Errno 2]"):
- writeLog("Failed: %s"%self.url)
- writeLog("Error: %s"%error)
- self.status = _("Checking")
- self.checkTimer.start(10000, 1)
-
- def getYoutubeDownloadLink(self):
- mrl = None
- html = get(self.url)
- if html != "":
- isHDAvailable = False
- video_id = None
- t = None
- reonecat = re.compile(r'<title>(.+?)</title>', re.DOTALL)
- titles = reonecat.findall(html)
- if titles:
- self.name = titles[0]
- if self.name.startswith("YouTube - "):
- self.name = (self.name[10:]).replace("&", "&")
- if html.__contains__("isHDAvailable = true"):
- isHDAvailable = True
- for line in html.split('\n'):
- if 'swfArgs' in line:
- line = line.strip().split()
- x = 0
- for thing in line:
- if 'video_id' in thing:
- video_id = line[x+1][1:-2]
- elif '"t":' == thing:
- t = line[x+1][1:-2]
- x += 1
- if video_id and t:
- if isHDAvailable == True:
- mrl = "http://www.youtube.com/get_video?video_id=%s&t=%s&fmt=22" % (video_id, t)
- else:
- mrl = "http://www.youtube.com/get_video?video_id=%s&t=%s&fmt=18" % (video_id, t)
- return mrl
-
-##############################################################################
-
-class RS:
- def __init__(self):
- self.downloads = []
- self.checkTimer = eTimer()
- self.checkTimer.callback.append(self.startDownloading)
- self.checkTimer.start(5000*60, False)
-
- def mayDownload(self):
- if config.plugins.RSDownloader.onoff.value == False:
- writeLog("RS Downloader is turned off...")
- return False
- elif config.plugins.RSDownloader.ignore_time.value:
- return True
- else:
- start = config.plugins.RSDownloader.start_time.value
- end = config.plugins.RSDownloader.end_time.value
- t = localtime()
- weekday = t[6]
- if weekday == 0 and config.plugins.RSDownloader.download_monday.value == False:
- return False
- elif weekday == 1 and config.plugins.RSDownloader.download_tuesday.value == False:
- return False
- elif weekday == 2 and config.plugins.RSDownloader.download_wednesday.value == False:
- return False
- elif weekday == 3 and config.plugins.RSDownloader.download_thursday.value == False:
- return False
- elif weekday == 4 and config.plugins.RSDownloader.download_friday.value == False:
- return False
- elif weekday == 5 and config.plugins.RSDownloader.download_saturday.value == False:
- return False
- elif weekday == 6 and config.plugins.RSDownloader.download_sunday.value == False:
- return False
- else:
- hour_now = t[3]
- minute_now = t[4]
- hour_start = start[0]
- minute_start = start[1]
- hour_end = end[0]
- minute_end = end[1]
- if start == end: # Same start and end-time
- return True
- elif hour_end < hour_start: # Different days!!!
- if hour_now > hour_start or hour_now < hour_end:
- return True
- elif hour_now == hour_start and minute_now > minute_start:
- return True
- elif hour_now == hour_end and minute_now < minute_end:
- return True
- else:
- return False
- elif hour_now > hour_start and hour_now < hour_end: # Same day...
- return True
- elif hour_now == hour_start and minute_now > minute_start: # Same day, same start-hour...
- return True
- elif hour_now == hour_end and minute_now < minute_end: # Same day, same end-hour...
- return True
- else:
- return False
-
- def allDownloadsFinished(self):
- allDone = True
- for download in self.downloads:
- if (download.status != _("Failed")) and (download.status != _("Finished")):
- allDone = False
- return allDone
-
- def startDownloading(self):
- if self.mayDownload() == True:
- if self.allDownloadsFinished() == True:
- self.readLists()
- downloadCount = 0
- for download in self.downloads:
- if download.downloading == True:
- downloadCount += 1 # Count the downloaded files
- if config.plugins.RSDownloader.username.value == "" and config.plugins.RSDownloader.password.value == "":
- if downloadCount < 1: # Allow one download if without account
- for download in self.downloads:
- if download.downloading == False and download.status.startswith(_("Waiting")):
- download.start() # Start first download in the list
- break
- else:
- mayDownloadCount = config.plugins.RSDownloader.count_downloads.value - downloadCount
- for download in self.downloads:
- if download.downloading == False:
- if mayDownloadCount > 0 and download.status == _("Waiting"):
- download.start()
- mayDownloadCount -= 1
-
- def addDownload(self, url):
- error = False
- for download in self.downloads:
- if download.url == url:
- error = True
- if error:
- return False
- else:
- download = RSDownload(url)
- download.finishCallbacks.append(self.cleanLists)
- self.downloads.append(download)
- return True
-
- def readLists(self):
- writeLog("Reading all lists...")
- path = config.plugins.RSDownloader.lists_directory.value
- if not path.endswith("/"):
- path = path + "/"
- writeLog("Directory: " + path)
- try:
- file_list = listdir(path)
- writeLog("Count of lists: " + str(len(file_list)))
- except:
- file_list = []
- writeLog("Could not find any list!")
- for x in file_list:
- list = path + x
- if list.endswith(".txt"):
- try:
- writeLog("Reading list %s..."%list)
- f = open(list, "r")
- count = 0
- for l in f:
- if l.startswith("http://"):
- if (self.addDownload(l.replace("\n", "").replace("\r", ""))) == True:
- count += 1
- f.close()
- if count == 0:
- writeLog("Empty list or downloads already in download list: %s"%list)
- else:
- writeLog("Added %d files from list %s..."%(count, list))
- except:
- writeLog("Error while reading list %s!"%list)
- else:
- writeLog("No *.txt file: %s!"%list)
-
- def cleanLists(self):
- writeLog("Cleaning lists...")
- path = config.plugins.RSDownloader.lists_directory.value
- if not path.endswith("/"):
- path = path + "/"
- try:
- file_list = listdir(path)
- except:
- file_list = []
- for x in file_list:
- list = path + x
- try:
- f = open(list, "r")
- content = f.read()
- f.close()
- for download in self.downloads:
- if download.status == _("Finished") and content.__contains__(download.url):
- content = content.replace(download.url, "")
- content = content.replace("\n\n", "\n").replace("\r\r", "\r")
- f = open(list, "w")
- f.write(content)
- f.close()
- except:
- writeLog("Error while cleaning list %s!"%list)
- self.startDownloading()
-
- def removeDownload(self, url):
- tmp = []
- for download in self.downloads:
- if download.url == url:
- download.stop()
- else:
- tmp.append(download)
- del self.downloads
- self.downloads = tmp
- self.removeFromLists(url)
-
- def removeFromLists(self, url):
- path = config.plugins.RSDownloader.lists_directory.value
- if not path.endswith("/"):
- path = path + "/"
- try:
- file_list = listdir(path)
- except:
- file_list = []
- for x in file_list:
- list = path + x
- try:
- f = open(list, "r")
- content = f.read()
- f.close()
- if content.__contains__(url):
- content = content.replace(url, "")
- content = content.replace("\n\n", "\n").replace("\r\r", "\r")
- f = open(list, "w")
- f.write(content)
- f.close()
- except:
- pass
-
- def clearFinishedDownload(self, url):
- idx = 0
- for x in self.downloads:
- if x.url == url:
- del self.downloads[idx]
- break
- else:
- idx += 1
-
- def clearFinishedDownloads(self):
- tmp = []
- for download in self.downloads:
- if download.status != _("Finished"):
- tmp.append(download)
- del self.downloads
- self.downloads = tmp
-
- def deleteFailedDownloads(self):
- tmp = []
- for download in self.downloads:
- if download.status == _("Failed"):
- self.removeFromLists(download.url)
- else:
- tmp.append(download)
- del self.downloads
- self.downloads = tmp
-
- def restartFailedDownloads(self):
- tmp = []
- for download in self.downloads:
- if download.status == _("Failed"):
- download.download = None
- download.downloading = False
- download.progress = 0
- download.size = 0
- download.status = _("Waiting")
- tmp.append(download)
- del self.downloads
- self.downloads = tmp
- self.startDownloading()
-
-rapidshare = RS()
-
-##############################################################################
-
-class ChangedScreen(Screen):
- def __init__(self, session, parent=None):
- Screen.__init__(self, session, parent)
- self.onLayoutFinish.append(self.setScreenTitle)
-
- def setScreenTitle(self):
- self.setTitle(_("RS Downloader"))
-
-##############################################################################
-
-class RSConfig(ConfigListScreen, ChangedScreen):
- skin = """
- <screen position="center,center" size="560,450" title="RS Downloader">
- <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />
- <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
- <widget name="config" position="0,45" size="560,400" scrollbarMode="showOnDemand" />
- </screen>"""
-
- def __init__(self, session):
- ChangedScreen.__init__(self, session)
-
- self["key_green"] = Label(_("Save"))
-
- ConfigListScreen.__init__(self, [
- getConfigListEntry(_("Download in the background:"), config.plugins.RSDownloader.onoff),
- getConfigListEntry(_("Username:"), config.plugins.RSDownloader.username),
- getConfigListEntry(_("Password:"), config.plugins.RSDownloader.password),
- getConfigListEntry(_("Lists directory:"), config.plugins.RSDownloader.lists_directory),
- getConfigListEntry(_("Downloads directory:"), config.plugins.RSDownloader.downloads_directory),
- getConfigListEntry(_("Ignore download times:"), config.plugins.RSDownloader.ignore_time),
- getConfigListEntry(_("Allow downloading on monday:"), config.plugins.RSDownloader.download_monday),
- getConfigListEntry(_("Allow downloading on tuesday:"), config.plugins.RSDownloader.download_tuesday),
- getConfigListEntry(_("Allow downloading on wednesday:"), config.plugins.RSDownloader.download_wednesday),
- getConfigListEntry(_("Allow downloading on thursday:"), config.plugins.RSDownloader.download_thursday),
- getConfigListEntry(_("Allow downloading on friday:"), config.plugins.RSDownloader.download_friday),
- getConfigListEntry(_("Allow downloading on saturday:"), config.plugins.RSDownloader.download_saturday),
- getConfigListEntry(_("Allow downloading on sunday:"), config.plugins.RSDownloader.download_sunday),
- getConfigListEntry(_("Don't download before:"), config.plugins.RSDownloader.start_time),
- getConfigListEntry(_("Don't download after:"), config.plugins.RSDownloader.end_time),
- getConfigListEntry(_("Maximal downloads:"), config.plugins.RSDownloader.count_downloads),
- getConfigListEntry(_("Write log:"), config.plugins.RSDownloader.write_log),
- getConfigListEntry(_("Reconnect fritz.Box before downloading:"), config.plugins.RSDownloader.reconnect_fritz),
- getConfigListEntry(_("Restart failed after 10 minutes:"), config.plugins.RSDownloader.autorestart_failed)])
-
- self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], {"green": self.save, "cancel": self.exit}, -1)
-
- def save(self):
- for x in self["config"].list:
- x[1].save()
- self.close()
-
- def exit(self):
- for x in self["config"].list:
- x[1].cancel()
- self.close()
-
-##############################################################################
-
-class RSSearch(Screen):
- skin = """
- <screen position="center,center" size="560,450" title="Searching... please wait!">
- <widget name="list" position="0,0" size="570,450" scrollbarMode="showOnDemand" />
- </screen>"""
-
- def __init__(self, session, searchFor):
- Screen.__init__(self, session)
- self.session = session
-
- self.searchFor = searchFor.replace(" ", "%2B")
- self.maxPage = 1
- self.curPage = 1
- self.files = []
-
- self["list"] = MenuList([])
-
- self["actions"] = ActionMap(["OkCancelActions", "InfobarChannelSelection"],
- {
- "historyBack": self.previousPage,
- "historyNext": self.nextPage,
- "ok": self.okClicked,
- "cancel": self.close
- }, -1)
-
- self.onLayoutFinish.append(self.search)
-
- def okClicked(self):
- if len(self.files) > 0:
- idx = self["list"].getSelectedIndex()
- url = self.files[idx]
- try:
- f = open(("%s/search.txt" % config.plugins.RSDownloader.lists_directory.value).replace("//", "/"), "a")
- f.write("%s\n"%url)
- f.close()
- self.session.open(MessageBox, (_("Added %s to the download-list.") % url), MessageBox.TYPE_INFO)
- except:
- self.session.open(MessageBox, (_("Error while adding %s to the download-list!") % url), MessageBox.TYPE_ERROR)
-
- def search(self):
- 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)
-
- def searchCallback(self, html=""):
- list = []
- files = []
-
- if html.__contains__("Nothing found, sorry."):
- self.session.open(MessageBox, (_("Error while searching http://rapidshare-search-engine.com!\n\nError: Nothing found, sorry.")), MessageBox.TYPE_ERROR)
- self.instance.setTitle(_("Nothing found, sorry."))
- else:
- tmp = html
- while tmp.__contains__("goPg('"):
- idx = tmp.index("goPg('")
- tmp = tmp[idx+6:]
- idx = tmp.index("'")
- pageNumber = tmp[:idx]
-
- try:
- pageNumber = int(pageNumber)
- if pageNumber > self.maxPage:
- self.maxPage = pageNumber
- except:
- pass
-
- self.instance.setTitle(_("Page %d / %d. Push < > to switch the page...")%(self.curPage, self.maxPage))
-
- while html.__contains__('title="Download"'):
- idx = html.index('title="Download"')
- html = html[idx:]
- idx = html.index('value="')
- html = html[idx+7:]
- idx = html.index('"')
- size = html[:idx]
- idx = html.index('http://rapidshare.com/')
- html = html[idx:]
- idx = html.index('"')
- url = html[:idx]
-
- files.append(url)
- try:
- urllist = url.split("/")
- idx = len(urllist) - 1
- name = urllist[idx]
- list.append("%s - %s"%(size, name))
- except:
- list.append("%s - %s"%(size, url))
-
- self.files = files
- self["list"].setList(list)
-
- def searchError(self, error=""):
- self.session.open(MessageBox, (_("Error while searching http://rapidshare-search-engine.com!\n\nError: %s")%str(error)), MessageBox.TYPE_ERROR)
-
- def previousPage(self):
- if self.curPage > 1:
- self.curPage -= 1
- self.instance.setTitle(_("Loading previous page... please wait!"))
- self.search()
-
- def nextPage(self):
- if self.curPage < self.maxPage:
- self.curPage += 1
- self.instance.setTitle(_("Loading next page... please wait!"))
- self.search()
-
-##############################################################################
-
-class RSLogScreen(ChangedScreen):
- skin = """
- <screen position="center,center" size="560,450" title="RS Downloader">
- <widget name="label" position="0,0" size="560,450" font="Regular;20" />
- </screen>"""
-
- def __init__(self, session):
- ChangedScreen.__init__(self, session)
-
- try:
- f = open("/tmp/rapidshare.log")
- log = f.read()
- f.close()
- except:
- log = ""
- self["label"] = ScrollLabel(log)
-
- self["actions"] = ActionMap(["WizardActions"],
- {
- "ok": self.close,
- "back": self.close,
- "up": self["label"].pageUp,
- "down": self["label"].pageDown,
- "left": self["label"].pageUp,
- "right": self["label"].pageDown
- }, -1)
-
-##############################################################################
-
-class RSContainerSelector(ChangedScreen):
- skin = """
- <screen position="center,center" size="560,450" title="RS Downloader">
- <widget name="list" position="0,0" size="560,450" />
- </screen>"""
-
- def __init__(self, session, list):
- ChangedScreen.__init__(self, session)
- self["list"] = MenuList(list)
- self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.okClicked, "cancel": self.close}, -1)
-
- def okClicked(self):
- cur = self["list"].getCurrent()
- self.close(cur)
-
-##############################################################################
-
-class RSList(MenuList):
- def __init__(self, list):
- MenuList.__init__(self, list, False, eListboxPythonMultiContent)
- self.l.setItemHeight(25)
- self.l.setFont(0, gFont("Regular", 20))
-
-##############################################################################
-
-def RSListEntry(download):
- res = [(download)]
- res.append(MultiContentEntryText(pos=(0, 0), size=(170, 25), font=0, text=download.name))
- res.append(MultiContentEntryText(pos=(175, 0), size=(75, 25), font=0, text="%d%s"%(download.size, "MB"), flags=RT_HALIGN_CENTER))
- res.append(MultiContentEntryPixmapAlphaTest(pos=(260, 9), size=(84, 7), png=LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/progress_bg.png"))))
- 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"))))
- res.append(MultiContentEntryText(pos=(360, 0), size=(60, 25), font=0, text="%d%s"%(download.progress, "%"), flags=RT_HALIGN_CENTER))
- res.append(MultiContentEntryText(pos=(420, 0), size=(140, 25), font=0, text=download.status, flags=RT_HALIGN_RIGHT))
- return res
-
-##############################################################################
-
-class RSMain(ChangedScreen):
- skin = """
- <screen position="center,center" size="560,450" title="RS Downloader">
- <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/key_menu.png" position="10,420" size="35,25" transparent="1" alphatest="on" />
- <widget name="key_red" position="0,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
- <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
- <widget name="key_yellow" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
- <widget name="key_blue" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
- <widget name="key_menu" position="50,422" size="300,25" font="Regular;20" transparent="1" />
- <widget name="list" position="0,40" size="560,375" scrollbarMode="showNever" />
- </screen>"""
-
- def __init__(self, session):
- ChangedScreen.__init__(self, session)
- self.session = session
-
- self["key_red"] = Label(_("Delete"))
- self["key_green"] = Label(_("Search"))
- self["key_yellow"] = Label(_("Add"))
- self["key_blue"] = Label(_("Config"))
- self["key_menu"] = Label(_("Menu"))
- self["list"] = RSList([])
-
- self.refreshTimer = eTimer()
- self.refreshTimer.callback.append(self.updateList)
-
- self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "InfobarMenuActions"],
- {
- "mainMenu": self.menu,
- "cancel": self.close,
- "red": self.delete,
- "green": self.search,
- "yellow": self.add,
- "blue": self.config
- }, prio=-1)
-
- self.onLayoutFinish.append(self.updateList)
-
- def menu(self):
- list = []
- #TODO: Add sort list functions
- list.append((_("Delete download"), self.delete))
- list.append((_("Use search engine"), self.search))
- list.append((_("Add downloads from txt files"), self.add))
- list.append((_("Add files from container"), self.addContainer))
- list.append((_("Delete failed downloads"), self.deleteFailed))
- list.append((_("Restart failed downloads"), self.restartFailed))
- list.append((_("Clear finished downloads"), self.clearFinished))
- list.append((_("Show log"), self.showLog))
- list.append((_("Delete log"), self.deleteLog))
- list.append((_("Close plugin"), self.close))
- self.session.openWithCallback(self.menuCallback, ChoiceBox, title=_("Please choose a function..."), list=list)
-
- def menuCallback(self, callback=None):
- if callback is not None:
- callback[1]()
-
- def deleteFailed(self):
- rapidshare.deleteFailedDownloads()
-
- def restartFailed(self):
- rapidshare.restartFailedDownloads()
-
- def clearFinished(self):
- rapidshare.clearFinishedDownloads()
-
- def showLog(self):
- self.session.open(RSLogScreen)
-
- def deleteLog(self):
- try:
- remove("/tmp/rapidshare.log")
- except:
- pass
-
- def updateList(self):
- list = []
- for download in rapidshare.downloads:
- list.append(RSListEntry(download))
- self["list"].setList(list)
- self.refreshTimer.start(2000, 1)
-
- def delete(self):
- cur = self["list"].getCurrent()
- if cur:
- cur = cur[0]
- if cur.status == _("Finished"):
- rapidshare.clearFinishedDownload(cur.url)
- else:
- self.session.openWithCallback(self.deleteCallback, MessageBox, (_("Delete %s?")%cur.name))
-
- def deleteCallback(self, callback):
- if callback:
- rapidshare.removeDownload(self["list"].getCurrent()[0].url)
- self.refreshTimer.stop()
- self.updateList()
-
- def search(self):
- self.session.openWithCallback(self.searchCallback, VirtualKeyBoard, title=_("Search http://rapidshare-search-engine.com for:"))
-
- def searchCallback(self, callback):
- if callback is not None and callback != "":
- self.session.openWithCallback(self.searchScreenCallback, RSSearch, callback)
-
-
- def searchScreenCallback(self):
- self.refreshTimer.stop()
- rapidshare.startDownloading()
- self.updateList()
-
- def add(self):
- self.refreshTimer.stop()
- rapidshare.startDownloading()
- self.updateList()
-
- def config(self):
- self.session.openWithCallback(self.configCallback, RSConfig)
-
- def configCallback(self):
- if config.plugins.RSDownloader.onoff.value:
- rapidshare.startDownloading()
- else:
- for download in rapidshare.downloads:
- if download.downloading:
- download.stop()
- self.updateList()
-
- def addContainer(self):
- try:
- file_list = listdir(config.plugins.RSDownloader.lists_directory.value)
- except:
- file_list = []
- list = []
- for file in file_list:
- if file.lower().endswith(".ccf") or file.lower().endswith(".dlc") or file.lower().endswith(".rsdf"):
- list.append(file)
- list.sort()
- self.session.openWithCallback(self.addContainerCallback, RSContainerSelector, list)
-
- def addContainerCallback(self, callback=None):
- if callback:
- file = "%s/%s"%(config.plugins.RSDownloader.lists_directory.value, callback)
- file = file.replace("//", "/")
- links = decrypt(file)
- try:
- f = open(("%s/%s.txt" % (config.plugins.RSDownloader.lists_directory.value, callback)).replace("//", "/"), "w")
- for link in links:
- if link.endswith(".html"):
- link = link[:-5]
- elif link.endswith(".htm"):
- link = link[:-4]
- f.write("%s\n"%link)
- f.close()
- except:
- pass
- self.refreshTimer.stop()
- rapidshare.startDownloading()
- self.updateList()
-
-##############################################################################
-
-def autostart(reason, **kwargs):
- if reason == 0:
- rapidshare.startDownloading()
-
-##############################################################################
-
-def main(session, **kwargs):
- session.open(RSMain)
-
-##############################################################################
-
-def Plugins(**kwargs):
- return [
- PluginDescriptor(where=PluginDescriptor.WHERE_AUTOSTART, fnc=autostart),
- PluginDescriptor(name=_("RS Downloader"), description=_("Download files from rapidshare"), where=[PluginDescriptor.WHERE_EXTENSIONSMENU, PluginDescriptor.WHERE_PLUGINMENU], icon="rs.png", fnc=main)]
-
+##\r
+## RS Downloader\r
+## by AliAbdul\r
+##\r
+##\r
+from base64 import encodestring\r
+from Components.ActionMap import ActionMap\r
+from Components.config import config, ConfigInteger, ConfigText, ConfigYesNo, ConfigClock, ConfigSubsection, getConfigListEntry\r
+from Components.ConfigList import ConfigListScreen\r
+from Components.Label import Label\r
+from Components.Language import language\r
+from Components.MenuList import MenuList\r
+from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest\r
+from Components.ScrollLabel import ScrollLabel\r
+from container.decrypt import decrypt\r
+from enigma import eListboxPythonMultiContent, eTimer, gFont, RT_HALIGN_CENTER, RT_HALIGN_RIGHT\r
+from os import environ, listdir, remove\r
+from Plugins.Plugin import PluginDescriptor\r
+from Screens.ChoiceBox import ChoiceBox\r
+from Screens.MessageBox import MessageBox\r
+from Screens.Screen import Screen\r
+from Screens.VirtualKeyBoard import VirtualKeyBoard\r
+from time import localtime, sleep, strftime, time\r
+from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE, SCOPE_LANGUAGE, SCOPE_PLUGINS\r
+from Tools.Downloader import HTTPProgressDownloader\r
+from Tools.LoadPixmap import LoadPixmap\r
+from twisted.internet import reactor\r
+from twisted.python import failure\r
+from twisted.web.client import getPage\r
+from urlparse import urlparse, urlunparse\r
+import gettext, re, socket, urllib2\r
+\r
+##############################################################################\r
+\r
+config.plugins.RSDownloader = ConfigSubsection()\r
+config.plugins.RSDownloader.onoff = ConfigYesNo(default=True)\r
+config.plugins.RSDownloader.username = ConfigText(default="", fixed_size=False)\r
+config.plugins.RSDownloader.password = ConfigText(default="", fixed_size=False)\r
+config.plugins.RSDownloader.lists_directory = ConfigText(default="/media/hdd/rs/lists/", fixed_size=False)\r
+config.plugins.RSDownloader.downloads_directory = ConfigText(default="/media/hdd/rs/downloads", fixed_size=False)\r
+config.plugins.RSDownloader.ignore_time = ConfigYesNo(default=False)\r
+config.plugins.RSDownloader.start_time = ConfigClock(default=time())\r
+config.plugins.RSDownloader.end_time = ConfigClock(default=time())\r
+config.plugins.RSDownloader.download_monday = ConfigYesNo(default=True)\r
+config.plugins.RSDownloader.download_tuesday = ConfigYesNo(default=True)\r
+config.plugins.RSDownloader.download_wednesday = ConfigYesNo(default=True)\r
+config.plugins.RSDownloader.download_thursday = ConfigYesNo(default=True)\r
+config.plugins.RSDownloader.download_friday = ConfigYesNo(default=True)\r
+config.plugins.RSDownloader.download_saturday = ConfigYesNo(default=True)\r
+config.plugins.RSDownloader.download_sunday = ConfigYesNo(default=True)\r
+config.plugins.RSDownloader.count_downloads = ConfigInteger(default=3, limits=(1, 6))\r
+config.plugins.RSDownloader.write_log = ConfigYesNo(default=True)\r
+config.plugins.RSDownloader.reconnect_fritz = ConfigYesNo(default=False)\r
+config.plugins.RSDownloader.autorestart_failed = ConfigYesNo(default=False)\r
+\r
+##############################################################################\r
+\r
+def localeInit():\r
+ lang = language.getLanguage()\r
+ environ["LANGUAGE"] = lang[:2]\r
+ gettext.bindtextdomain("enigma2", resolveFilename(SCOPE_LANGUAGE))\r
+ gettext.textdomain("enigma2")\r
+ gettext.bindtextdomain("RSDownloader", "%s%s"%(resolveFilename(SCOPE_PLUGINS), "Extensions/RSDownloader/locale/"))\r
+\r
+def _(txt):\r
+ t = gettext.dgettext("RSDownloader", txt)\r
+ if t == txt:\r
+ t = gettext.gettext(txt)\r
+ return t\r
+\r
+localeInit()\r
+language.addCallback(localeInit)\r
+\r
+##############################################################################\r
+\r
+def writeLog(message):\r
+ if config.plugins.RSDownloader.write_log.value:\r
+ try:\r
+ f = open("/tmp/rapidshare.log", "a")\r
+ f.write(strftime("%c", localtime(time())) + " - " + message + "\n")\r
+ f.close()\r
+ except:\r
+ pass\r
+\r
+##############################################################################\r
+\r
+def _parse(url):\r
+ url = url.strip()\r
+ parsed = urlparse(url)\r
+ scheme = parsed[0]\r
+ path = urlunparse(('','') + parsed[2:])\r
+ host, port = parsed[1], 80\r
+ if '@' in host:\r
+ username, host = host.split('@')\r
+ if ':' in username:\r
+ username, password = username.split(':')\r
+ else:\r
+ password = ""\r
+ else:\r
+ username = ""\r
+ password = ""\r
+ if ':' in host:\r
+ host, port = host.split(':')\r
+ port = int(port)\r
+ if path == "":\r
+ path = "/"\r
+ return scheme, host, port, path, username, password\r
+\r
+class ProgressDownload:\r
+ def __init__(self, url, outputfile, contextFactory=None, *args, **kwargs):\r
+ scheme, host, port, path, username, password = _parse(url)\r
+ if username and password:\r
+ url = scheme + '://' + host + ':' + str(port) + path\r
+ basicAuth = encodestring("%s:%s"%(username, password))\r
+ authHeader = "Basic " + basicAuth.strip()\r
+ AuthHeaders = {"Authorization": authHeader}\r
+ if kwargs.has_key("headers"):\r
+ kwargs["headers"].update(AuthHeaders)\r
+ else:\r
+ kwargs["headers"] = AuthHeaders\r
+ self.factory = HTTPProgressDownloader(url, outputfile, *args, **kwargs)\r
+ self.connection = reactor.connectTCP(host, port, self.factory)\r
+\r
+ def start(self):\r
+ return self.factory.deferred\r
+\r
+ def stop(self):\r
+ self.connection.disconnect()\r
+\r
+ def addProgress(self, progress_callback):\r
+ self.factory.progress_callback = progress_callback\r
+\r
+##############################################################################\r
+\r
+def get(url):\r
+ try:\r
+ data = urllib2.urlopen(url)\r
+ return data.read()\r
+ except:\r
+ return ""\r
+ \r
+def post(url, data):\r
+ try:\r
+ return urllib2.urlopen(url, data).read()\r
+ except:\r
+ return ""\r
+\r
+def matchGet(rex, string):\r
+ match = re.search(rex, string)\r
+ if match:\r
+ if len(match.groups()) == 0:\r
+ return string[match.span()[0]:match.span()[1]]\r
+ if len(match.groups()) == 1:\r
+ return match.groups()[0]\r
+ else:\r
+ return False\r
+\r
+##############################################################################\r
+\r
+def reconnect(host='fritz.box', port=49000):\r
+ http_body = '\r\n'.join((\r
+ '<?xml version="1.0" encoding="utf-8"?>',\r
+ '<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">',\r
+ ' <s:Body>',\r
+ ' <u:ForceTermination xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"/>',\r
+ ' </s:Body>',\r
+ '</s:Envelope>'))\r
+ http_data = '\r\n'.join((\r
+ 'POST /upnp/control/WANIPConn1 HTTP/1.1',\r
+ 'Host: %s:%d'%(host, port),\r
+ 'SoapAction: urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination',\r
+ 'Content-Type: text/xml; charset="utf-8"',\r
+ 'Content-Length: %d'%len(http_body),\r
+ '',\r
+ http_body))\r
+ try:\r
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\r
+ s.connect((host, port))\r
+ s.send(http_data)\r
+ s.close()\r
+ except:\r
+ pass\r
+\r
+##############################################################################\r
+\r
+class RSDownload:\r
+ def __init__(self, url):\r
+ writeLog("Adding: %s"%url)\r
+ self.url = url\r
+ self.download = None\r
+ self.downloading = False\r
+ self.progress = 0\r
+ self.size = 0\r
+ self.status = _("Waiting")\r
+ self.name = self.url.split("/")[-1]\r
+ \r
+ self.freeDownloadUrl = ""\r
+ self.freeDownloadTimer = eTimer()\r
+ self.freeDownloadTimer.callback.append(self.freeDownloadStart)\r
+ self.checkTimer = eTimer()\r
+ self.checkTimer.callback.append(self.doCheckTimer)\r
+ self.restartFailedTimer = eTimer()\r
+ self.restartFailedTimer.callback.append(self.restartFailedCheck)\r
+ \r
+ self.finishCallbacks = []\r
+\r
+ def start(self):\r
+ writeLog("Downloading: %s"%self.url)\r
+ self.downloading = True\r
+ self.progress = 0\r
+ self.size = 0\r
+ username = config.plugins.RSDownloader.username.value\r
+ password = config.plugins.RSDownloader.password.value\r
+ if self.url.__contains__("rapidshare.com") and username == "" and password == "":\r
+ writeLog("Free RS-Download: %s"%self.url)\r
+ self.status = _("Checking")\r
+ if config.plugins.RSDownloader.reconnect_fritz.value:\r
+ reconnect()\r
+ sleep(3)\r
+ data = get(self.url)\r
+ url = matchGet('<form[^>]+action="([^"]+)', data)\r
+ if not url:\r
+ writeLog("Failed: %s"%self.url)\r
+ self.httpFailed(True, "Failed to get download page url: %s"%self.url)\r
+ else:\r
+ data = post(url, "dl.start=Free")\r
+ seconds = matchGet('var c=([0-9]+)', data)\r
+ if not seconds:\r
+ self.httpFailed(True, "Failed to get download page url: %s"%self.url)\r
+ else:\r
+ writeLog("Free RS-download... must wait %s seconds: %s"%(seconds, self.url))\r
+ self.status = "%s %s"%(_("Waiting"), seconds)\r
+ url = matchGet('"dlf" action="([^"]+)', data)\r
+ if not url:\r
+ self.httpFailed(True, "Failed to get download page url: %s"%self.url)\r
+ else:\r
+ self.freeDownloadUrl = url\r
+ self.freeDownloadTimer.start((int(seconds) + 2) * 1000, 1)\r
+ elif self.url.__contains__("youtube.com"):\r
+ writeLog("Getting youtube video link: %s"%self.url)\r
+ self.status = _("Checking")\r
+ downloadLink = self.getYoutubeDownloadLink()\r
+ if downloadLink:\r
+ self.status = _("Downloading")\r
+ writeLog("Downloading video: %s"%downloadLink)\r
+ req = urllib2.Request(downloadLink)\r
+ url_handle = urllib2.urlopen(req)\r
+ headers = url_handle.info()\r
+ if headers.getheader("content-type") == "video/mp4":\r
+ ext = "mp4"\r
+ else:\r
+ ext = "flv"\r
+ self.download = ProgressDownload(downloadLink, ("%s/%s.%s"%(config.plugins.RSDownloader.downloads_directory.value, self.name, ext)).replace("//", "/"))\r
+ self.download.addProgress(self.httpProgress)\r
+ self.download.start().addCallback(self.httpFinished).addErrback(self.httpFailed)\r
+ else:\r
+ self.httpFailed(True, "Failed to get video url: %s"%self.url)\r
+ else:\r
+ if self.url.__contains__("rapidshare.com"):\r
+ url = self.url.replace("http://", "http://" + username + ":" + password + "@")\r
+ else:\r
+ url = self.url\r
+ self.status = _("Downloading")\r
+ self.download = ProgressDownload(url, ("%s/%s"%(config.plugins.RSDownloader.downloads_directory.value, self.name)).replace("//", "/").replace(".html", ""))\r
+ self.download.addProgress(self.httpProgress)\r
+ self.download.start().addCallback(self.httpFinished).addErrback(self.httpFailed)\r
+\r
+ def freeDownloadStart(self):\r
+ self.status = _("Downloading")\r
+ self.download = ProgressDownload(self.freeDownloadUrl, ("%s/%s"%(config.plugins.RSDownloader.downloads_directory.value, self.name)).replace("//", "/").replace(".html", ""))\r
+ self.download.addProgress(self.httpProgress)\r
+ self.download.start().addCallback(self.httpFinished).addErrback(self.httpFailed)\r
+\r
+ def stop(self):\r
+ self.progress = 0\r
+ self.downloading = False\r
+ self.status = _("Waiting")\r
+ if self.download:\r
+ writeLog("Stopping download: %s"%self.url)\r
+ self.download.stop()\r
+\r
+ def httpProgress(self, recvbytes, totalbytes):\r
+ if self.size == 0:\r
+ self.size = int((totalbytes / 1024) / 1024)\r
+ self.progress = int(100.0 * float(recvbytes) / float(totalbytes))\r
+ if self.progress == 100:\r
+ writeLog("Finished: %s"%self.url)\r
+ self.status = _("Finished")\r
+ self.execFinishCallbacks()\r
+\r
+ def httpFinished(self, string=""):\r
+ if string is not None:\r
+ writeLog("Failed: %s"%self.url)\r
+ writeLog("Error: %s"%string)\r
+ self.status = _("Checking")\r
+ self.checkTimer.start(10000, 1)\r
+\r
+ def doCheckTimer(self):\r
+ if self.size == 0:\r
+ self.status = _("Failed")\r
+ if config.plugins.RSDownloader.autorestart_failed.value:\r
+ self.restartFailedTimer.start(10000*60, 1)\r
+ elif self.progress == 100:\r
+ self.status = _("Finished")\r
+ self.downloading = False\r
+ self.execFinishCallbacks()\r
+\r
+ def restartFailedCheck(self):\r
+ if self.status == _("Failed"): # check if user didn't restart already\r
+ self.download = None\r
+ self.status = _("Waiting")\r
+\r
+ def execFinishCallbacks(self):\r
+ for x in self.finishCallbacks:\r
+ x()\r
+\r
+ def httpFailed(self, failure=None, error=""):\r
+ if failure:\r
+ if error == "":\r
+ error = failure.getErrorMessage()\r
+ if error != "" and not error.startswith("[Errno 2]"):\r
+ writeLog("Failed: %s"%self.url)\r
+ writeLog("Error: %s"%error)\r
+ self.status = _("Checking")\r
+ self.checkTimer.start(10000, 1)\r
+\r
+ def getYoutubeDownloadLink(self):\r
+ mrl = None\r
+ html = get(self.url)\r
+ if html != "":\r
+ isHDAvailable = False\r
+ video_id = None\r
+ t = None\r
+ reonecat = re.compile(r'<title>(.+?)</title>', re.DOTALL)\r
+ titles = reonecat.findall(html)\r
+ if titles:\r
+ self.name = titles[0]\r
+ if self.name.startswith("YouTube - "):\r
+ self.name = (self.name[10:]).replace("&", "&")\r
+ if html.__contains__("isHDAvailable = true"):\r
+ isHDAvailable = True\r
+ for line in html.split('\n'):\r
+ if 'swfArgs' in line:\r
+ line = line.strip().split()\r
+ x = 0\r
+ for thing in line:\r
+ if 'video_id' in thing:\r
+ video_id = line[x+1][1:-2]\r
+ elif '"t":' == thing:\r
+ t = line[x+1][1:-2]\r
+ x += 1\r
+ if video_id and t:\r
+ if isHDAvailable == True:\r
+ mrl = "http://www.youtube.com/get_video?video_id=%s&t=%s&fmt=22" % (video_id, t)\r
+ else:\r
+ mrl = "http://www.youtube.com/get_video?video_id=%s&t=%s&fmt=18" % (video_id, t)\r
+ return mrl\r
+\r
+##############################################################################\r
+\r
+class RS:\r
+ def __init__(self):\r
+ self.downloads = []\r
+ self.checkTimer = eTimer()\r
+ self.checkTimer.callback.append(self.startDownloading)\r
+ self.checkTimer.start(5000*60, False)\r
+\r
+ def mayDownload(self):\r
+ if config.plugins.RSDownloader.onoff.value == False:\r
+ writeLog("RS Downloader is turned off...")\r
+ return False\r
+ elif config.plugins.RSDownloader.ignore_time.value:\r
+ return True\r
+ else:\r
+ start = config.plugins.RSDownloader.start_time.value\r
+ end = config.plugins.RSDownloader.end_time.value\r
+ t = localtime()\r
+ weekday = t[6]\r
+ if weekday == 0 and config.plugins.RSDownloader.download_monday.value == False:\r
+ return False\r
+ elif weekday == 1 and config.plugins.RSDownloader.download_tuesday.value == False:\r
+ return False\r
+ elif weekday == 2 and config.plugins.RSDownloader.download_wednesday.value == False:\r
+ return False\r
+ elif weekday == 3 and config.plugins.RSDownloader.download_thursday.value == False:\r
+ return False\r
+ elif weekday == 4 and config.plugins.RSDownloader.download_friday.value == False:\r
+ return False\r
+ elif weekday == 5 and config.plugins.RSDownloader.download_saturday.value == False:\r
+ return False\r
+ elif weekday == 6 and config.plugins.RSDownloader.download_sunday.value == False:\r
+ return False\r
+ else:\r
+ hour_now = t[3]\r
+ minute_now = t[4]\r
+ hour_start = start[0]\r
+ minute_start = start[1]\r
+ hour_end = end[0]\r
+ minute_end = end[1]\r
+ if start == end: # Same start and end-time\r
+ return True\r
+ elif hour_end < hour_start: # Different days!!!\r
+ if hour_now > hour_start or hour_now < hour_end:\r
+ return True\r
+ elif hour_now == hour_start and minute_now > minute_start:\r
+ return True\r
+ elif hour_now == hour_end and minute_now < minute_end:\r
+ return True\r
+ else:\r
+ return False\r
+ elif hour_now > hour_start and hour_now < hour_end: # Same day...\r
+ return True\r
+ elif hour_now == hour_start and minute_now > minute_start: # Same day, same start-hour...\r
+ return True\r
+ elif hour_now == hour_end and minute_now < minute_end: # Same day, same end-hour...\r
+ return True\r
+ else:\r
+ return False\r
+\r
+ def allDownloadsFinished(self):\r
+ allDone = True\r
+ for download in self.downloads:\r
+ if (download.status != _("Failed")) and (download.status != _("Finished")):\r
+ allDone = False\r
+ return allDone\r
+\r
+ def startDownloading(self):\r
+ if self.mayDownload() == True:\r
+ if self.allDownloadsFinished() == True:\r
+ self.readLists()\r
+ downloadCount = 0\r
+ for download in self.downloads:\r
+ if download.downloading == True:\r
+ downloadCount += 1 # Count the downloaded files\r
+ if config.plugins.RSDownloader.username.value == "" and config.plugins.RSDownloader.password.value == "":\r
+ if downloadCount < 1: # Allow one download if without account\r
+ for download in self.downloads:\r
+ if download.downloading == False and download.status.startswith(_("Waiting")):\r
+ download.start() # Start first download in the list\r
+ break\r
+ else:\r
+ mayDownloadCount = config.plugins.RSDownloader.count_downloads.value - downloadCount\r
+ for download in self.downloads:\r
+ if download.downloading == False:\r
+ if mayDownloadCount > 0 and download.status == _("Waiting"):\r
+ download.start()\r
+ mayDownloadCount -= 1\r
+\r
+ def addDownload(self, url):\r
+ error = False\r
+ for download in self.downloads:\r
+ if download.url == url:\r
+ error = True\r
+ if error:\r
+ return False\r
+ else:\r
+ download = RSDownload(url)\r
+ download.finishCallbacks.append(self.cleanLists)\r
+ self.downloads.append(download)\r
+ return True\r
+\r
+ def readLists(self):\r
+ writeLog("Reading all lists...")\r
+ path = config.plugins.RSDownloader.lists_directory.value\r
+ if not path.endswith("/"):\r
+ path = path + "/"\r
+ writeLog("Directory: " + path)\r
+ try:\r
+ file_list = listdir(path)\r
+ writeLog("Count of lists: " + str(len(file_list)))\r
+ except:\r
+ file_list = []\r
+ writeLog("Could not find any list!")\r
+ for x in file_list:\r
+ list = path + x\r
+ if list.endswith(".txt"):\r
+ try:\r
+ writeLog("Reading list %s..."%list)\r
+ f = open(list, "r")\r
+ count = 0\r
+ for l in f:\r
+ if l.startswith("http://"):\r
+ if (self.addDownload(l.replace("\n", "").replace("\r", ""))) == True:\r
+ count += 1\r
+ f.close()\r
+ if count == 0:\r
+ writeLog("Empty list or downloads already in download list: %s"%list)\r
+ else:\r
+ writeLog("Added %d files from list %s..."%(count, list))\r
+ except:\r
+ writeLog("Error while reading list %s!"%list)\r
+ else:\r
+ writeLog("No *.txt file: %s!"%list)\r
+\r
+ def cleanLists(self):\r
+ writeLog("Cleaning lists...")\r
+ path = config.plugins.RSDownloader.lists_directory.value\r
+ if not path.endswith("/"):\r
+ path = path + "/"\r
+ try:\r
+ file_list = listdir(path)\r
+ except:\r
+ file_list = []\r
+ for x in file_list:\r
+ list = path + x\r
+ try:\r
+ f = open(list, "r")\r
+ content = f.read()\r
+ f.close()\r
+ for download in self.downloads:\r
+ if download.status == _("Finished") and content.__contains__(download.url):\r
+ content = content.replace(download.url, "")\r
+ content = content.replace("\n\n", "\n").replace("\r\r", "\r")\r
+ f = open(list, "w")\r
+ f.write(content)\r
+ f.close()\r
+ except:\r
+ writeLog("Error while cleaning list %s!"%list)\r
+ self.startDownloading()\r
+\r
+ def removeDownload(self, url):\r
+ tmp = []\r
+ for download in self.downloads:\r
+ if download.url == url:\r
+ download.stop()\r
+ else:\r
+ tmp.append(download)\r
+ del self.downloads\r
+ self.downloads = tmp\r
+ self.removeFromLists(url)\r
+\r
+ def removeFromLists(self, url):\r
+ path = config.plugins.RSDownloader.lists_directory.value\r
+ if not path.endswith("/"):\r
+ path = path + "/"\r
+ try:\r
+ file_list = listdir(path)\r
+ except:\r
+ file_list = []\r
+ for x in file_list:\r
+ list = path + x\r
+ try:\r
+ f = open(list, "r")\r
+ content = f.read()\r
+ f.close()\r
+ if content.__contains__(url):\r
+ content = content.replace(url, "")\r
+ content = content.replace("\n\n", "\n").replace("\r\r", "\r")\r
+ f = open(list, "w")\r
+ f.write(content)\r
+ f.close()\r
+ except:\r
+ pass\r
+\r
+ def clearFinishedDownload(self, url):\r
+ idx = 0\r
+ for x in self.downloads:\r
+ if x.url == url:\r
+ del self.downloads[idx]\r
+ break\r
+ else:\r
+ idx += 1\r
+\r
+ def clearFinishedDownloads(self):\r
+ tmp = []\r
+ for download in self.downloads:\r
+ if download.status != _("Finished"):\r
+ tmp.append(download)\r
+ del self.downloads\r
+ self.downloads = tmp\r
+\r
+ def deleteFailedDownloads(self):\r
+ tmp = []\r
+ for download in self.downloads:\r
+ if download.status == _("Failed"):\r
+ self.removeFromLists(download.url)\r
+ else:\r
+ tmp.append(download)\r
+ del self.downloads\r
+ self.downloads = tmp\r
+\r
+ def restartFailedDownloads(self):\r
+ tmp = []\r
+ for download in self.downloads:\r
+ if download.status == _("Failed"):\r
+ download.download = None\r
+ download.downloading = False\r
+ download.progress = 0\r
+ download.size = 0\r
+ download.status = _("Waiting")\r
+ tmp.append(download)\r
+ del self.downloads\r
+ self.downloads = tmp\r
+ self.startDownloading()\r
+\r
+rapidshare = RS()\r
+\r
+##############################################################################\r
+\r
+class ChangedScreen(Screen):\r
+ def __init__(self, session, parent=None):\r
+ Screen.__init__(self, session, parent)\r
+ self.onLayoutFinish.append(self.setScreenTitle)\r
+\r
+ def setScreenTitle(self):\r
+ self.setTitle(_("RS Downloader"))\r
+\r
+##############################################################################\r
+\r
+class RSConfig(ConfigListScreen, ChangedScreen):\r
+ skin = """\r
+ <screen position="center,center" size="560,450" title="RS Downloader">\r
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />\r
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />\r
+ <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />\r
+ <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />\r
+ <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />\r
+ <widget name="config" position="0,45" size="560,400" scrollbarMode="showOnDemand" />\r
+ </screen>"""\r
+\r
+ def __init__(self, session):\r
+ ChangedScreen.__init__(self, session)\r
+ \r
+ self["key_green"] = Label(_("Save"))\r
+ \r
+ ConfigListScreen.__init__(self, [\r
+ getConfigListEntry(_("Download in the background:"), config.plugins.RSDownloader.onoff),\r
+ getConfigListEntry(_("Username:"), config.plugins.RSDownloader.username),\r
+ getConfigListEntry(_("Password:"), config.plugins.RSDownloader.password),\r
+ getConfigListEntry(_("Lists directory:"), config.plugins.RSDownloader.lists_directory),\r
+ getConfigListEntry(_("Downloads directory:"), config.plugins.RSDownloader.downloads_directory),\r
+ getConfigListEntry(_("Ignore download times:"), config.plugins.RSDownloader.ignore_time),\r
+ getConfigListEntry(_("Allow downloading on monday:"), config.plugins.RSDownloader.download_monday),\r
+ getConfigListEntry(_("Allow downloading on tuesday:"), config.plugins.RSDownloader.download_tuesday),\r
+ getConfigListEntry(_("Allow downloading on wednesday:"), config.plugins.RSDownloader.download_wednesday),\r
+ getConfigListEntry(_("Allow downloading on thursday:"), config.plugins.RSDownloader.download_thursday),\r
+ getConfigListEntry(_("Allow downloading on friday:"), config.plugins.RSDownloader.download_friday),\r
+ getConfigListEntry(_("Allow downloading on saturday:"), config.plugins.RSDownloader.download_saturday),\r
+ getConfigListEntry(_("Allow downloading on sunday:"), config.plugins.RSDownloader.download_sunday),\r
+ getConfigListEntry(_("Don't download before:"), config.plugins.RSDownloader.start_time),\r
+ getConfigListEntry(_("Don't download after:"), config.plugins.RSDownloader.end_time),\r
+ getConfigListEntry(_("Maximal downloads:"), config.plugins.RSDownloader.count_downloads),\r
+ getConfigListEntry(_("Write log:"), config.plugins.RSDownloader.write_log),\r
+ getConfigListEntry(_("Reconnect fritz.Box before downloading:"), config.plugins.RSDownloader.reconnect_fritz),\r
+ getConfigListEntry(_("Restart failed after 10 minutes:"), config.plugins.RSDownloader.autorestart_failed)])\r
+ \r
+ self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], {"green": self.save, "cancel": self.exit}, -1)\r
+\r
+ def save(self):\r
+ for x in self["config"].list:\r
+ x[1].save()\r
+ self.close()\r
+\r
+ def exit(self):\r
+ for x in self["config"].list:\r
+ x[1].cancel()\r
+ self.close()\r
+\r
+##############################################################################\r
+\r
+class RSSearch(Screen):\r
+ skin = """\r
+ <screen position="center,center" size="560,450" title="Searching... please wait!">\r
+ <widget name="list" position="0,0" size="570,450" scrollbarMode="showOnDemand" />\r
+ </screen>"""\r
+\r
+ def __init__(self, session, searchFor):\r
+ Screen.__init__(self, session)\r
+ self.session = session\r
+ \r
+ self.searchFor = searchFor.replace(" ", "%2B")\r
+ self.maxPage = 1\r
+ self.curPage = 1\r
+ self.files = []\r
+ \r
+ self["list"] = MenuList([])\r
+ \r
+ self["actions"] = ActionMap(["OkCancelActions", "InfobarChannelSelection"],\r
+ {\r
+ "historyBack": self.previousPage,\r
+ "historyNext": self.nextPage,\r
+ "ok": self.okClicked,\r
+ "cancel": self.close\r
+ }, -1)\r
+ \r
+ self.onLayoutFinish.append(self.search)\r
+\r
+ def okClicked(self):\r
+ if len(self.files) > 0:\r
+ idx = self["list"].getSelectedIndex()\r
+ url = self.files[idx]\r
+ try:\r
+ f = open(("%s/search.txt" % config.plugins.RSDownloader.lists_directory.value).replace("//", "/"), "a")\r
+ f.write("%s\n"%url)\r
+ f.close()\r
+ self.session.open(MessageBox, (_("Added %s to the download-list.") % url), MessageBox.TYPE_INFO)\r
+ except:\r
+ self.session.open(MessageBox, (_("Error while adding %s to the download-list!") % url), MessageBox.TYPE_ERROR)\r
+\r
+ def search(self):\r
+ 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
+\r
+ def searchCallback(self, html=""):\r
+ list = []\r
+ files = []\r
+ \r
+ if html.__contains__("Nothing found, sorry."):\r
+ self.session.open(MessageBox, (_("Error while searching http://rapidshare-search-engine.com!\n\nError: Nothing found, sorry.")), MessageBox.TYPE_ERROR)\r
+ self.instance.setTitle(_("Nothing found, sorry."))\r
+ else:\r
+ tmp = html\r
+ while tmp.__contains__("goPg('"):\r
+ idx = tmp.index("goPg('")\r
+ tmp = tmp[idx+6:]\r
+ idx = tmp.index("'")\r
+ pageNumber = tmp[:idx]\r
+ \r
+ try:\r
+ pageNumber = int(pageNumber)\r
+ if pageNumber > self.maxPage:\r
+ self.maxPage = pageNumber\r
+ except:\r
+ pass\r
+ \r
+ self.instance.setTitle(_("Page %d / %d. Push < > to switch the page...")%(self.curPage, self.maxPage))\r
+ \r
+ while html.__contains__('title="Download"'):\r
+ idx = html.index('title="Download"')\r
+ html = html[idx:]\r
+ idx = html.index('value="')\r
+ html = html[idx+7:]\r
+ idx = html.index('"')\r
+ size = html[:idx]\r
+ idx = html.index('http://rapidshare.com/')\r
+ html = html[idx:]\r
+ idx = html.index('"')\r
+ url = html[:idx]\r
+ \r
+ files.append(url) \r
+ try:\r
+ urllist = url.split("/")\r
+ idx = len(urllist) - 1\r
+ name = urllist[idx]\r
+ list.append("%s - %s"%(size, name))\r
+ except:\r
+ list.append("%s - %s"%(size, url))\r
+ \r
+ self.files = files\r
+ self["list"].setList(list)\r
+\r
+ def searchError(self, error=""):\r
+ self.session.open(MessageBox, (_("Error while searching http://rapidshare-search-engine.com!\n\nError: %s")%str(error)), MessageBox.TYPE_ERROR)\r
+\r
+ def previousPage(self):\r
+ if self.curPage > 1:\r
+ self.curPage -= 1\r
+ self.instance.setTitle(_("Loading previous page... please wait!"))\r
+ self.search()\r
+\r
+ def nextPage(self):\r
+ if self.curPage < self.maxPage:\r
+ self.curPage += 1\r
+ self.instance.setTitle(_("Loading next page... please wait!"))\r
+ self.search()\r
+\r
+##############################################################################\r
+\r
+class RSLogScreen(ChangedScreen):\r
+ skin = """\r
+ <screen position="center,center" size="560,450" title="RS Downloader">\r
+ <widget name="label" position="0,0" size="560,450" font="Regular;20" />\r
+ </screen>"""\r
+\r
+ def __init__(self, session):\r
+ ChangedScreen.__init__(self, session)\r
+ \r
+ try:\r
+ f = open("/tmp/rapidshare.log")\r
+ log = f.read()\r
+ f.close()\r
+ except:\r
+ log = ""\r
+ self["label"] = ScrollLabel(log)\r
+ \r
+ self["actions"] = ActionMap(["WizardActions"],\r
+ {\r
+ "ok": self.close,\r
+ "back": self.close,\r
+ "up": self["label"].pageUp,\r
+ "down": self["label"].pageDown,\r
+ "left": self["label"].pageUp,\r
+ "right": self["label"].pageDown\r
+ }, -1)\r
+\r
+##############################################################################\r
+\r
+class RSContainerSelector(ChangedScreen):\r
+ skin = """\r
+ <screen position="center,center" size="560,450" title="RS Downloader">\r
+ <widget name="list" position="0,0" size="560,450" />\r
+ </screen>"""\r
+\r
+ def __init__(self, session, list):\r
+ ChangedScreen.__init__(self, session)\r
+ self["list"] = MenuList(list)\r
+ self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.okClicked, "cancel": self.close}, -1)\r
+\r
+ def okClicked(self):\r
+ cur = self["list"].getCurrent()\r
+ self.close(cur)\r
+\r
+##############################################################################\r
+\r
+class RSList(MenuList):\r
+ def __init__(self, list):\r
+ MenuList.__init__(self, list, False, eListboxPythonMultiContent)\r
+ self.l.setItemHeight(25)\r
+ self.l.setFont(0, gFont("Regular", 20))\r
+\r
+##############################################################################\r
+\r
+def RSListEntry(download):\r
+ res = [(download)]\r
+ res.append(MultiContentEntryText(pos=(0, 0), size=(170, 25), font=0, text=download.name))\r
+ res.append(MultiContentEntryText(pos=(175, 0), size=(75, 25), font=0, text="%d%s"%(download.size, "MB"), flags=RT_HALIGN_CENTER))\r
+ res.append(MultiContentEntryPixmapAlphaTest(pos=(260, 9), size=(84, 7), png=LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/progress_bg.png"))))\r
+ 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
+ res.append(MultiContentEntryText(pos=(360, 0), size=(60, 25), font=0, text="%d%s"%(download.progress, "%"), flags=RT_HALIGN_CENTER))\r
+ res.append(MultiContentEntryText(pos=(420, 0), size=(140, 25), font=0, text=download.status, flags=RT_HALIGN_RIGHT))\r
+ return res\r
+\r
+##############################################################################\r
+\r
+class RSMain(ChangedScreen):\r
+ skin = """\r
+ <screen position="center,center" size="560,450" title="RS Downloader">\r
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />\r
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />\r
+ <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />\r
+ <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />\r
+ <ePixmap pixmap="skin_default/buttons/key_menu.png" position="10,420" size="35,25" transparent="1" alphatest="on" />\r
+ <widget name="key_red" position="0,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />\r
+ <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />\r
+ <widget name="key_yellow" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />\r
+ <widget name="key_blue" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />\r
+ <widget name="key_menu" position="50,422" size="300,25" font="Regular;20" transparent="1" />\r
+ <widget name="list" position="0,40" size="560,375" scrollbarMode="showNever" />\r
+ </screen>"""\r
+\r
+ def __init__(self, session):\r
+ ChangedScreen.__init__(self, session)\r
+ self.session = session\r
+ \r
+ self["key_red"] = Label(_("Delete"))\r
+ self["key_green"] = Label(_("Search"))\r
+ self["key_yellow"] = Label(_("Add"))\r
+ self["key_blue"] = Label(_("Config"))\r
+ self["key_menu"] = Label(_("Menu"))\r
+ self["list"] = RSList([])\r
+ \r
+ self.refreshTimer = eTimer()\r
+ self.refreshTimer.callback.append(self.updateList)\r
+ \r
+ self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "InfobarMenuActions"],\r
+ {\r
+ "mainMenu": self.menu,\r
+ "cancel": self.close,\r
+ "red": self.delete,\r
+ "green": self.search,\r
+ "yellow": self.add,\r
+ "blue": self.config\r
+ }, prio=-1)\r
+ \r
+ self.onLayoutFinish.append(self.updateList)\r
+\r
+ def menu(self):\r
+ list = []\r
+ #TODO: Add sort list functions\r
+ list.append((_("Delete download"), self.delete))\r
+ list.append((_("Use search engine"), self.search))\r
+ list.append((_("Add downloads from txt files"), self.add))\r
+ list.append((_("Add files from container"), self.addContainer))\r
+ list.append((_("Delete failed downloads"), self.deleteFailed))\r
+ list.append((_("Restart failed downloads"), self.restartFailed))\r
+ list.append((_("Clear finished downloads"), self.clearFinished))\r
+ list.append((_("Show log"), self.showLog))\r
+ list.append((_("Delete log"), self.deleteLog))\r
+ list.append((_("Close plugin"), self.close))\r
+ self.session.openWithCallback(self.menuCallback, ChoiceBox, title=_("Please choose a function..."), list=list)\r
+\r
+ def menuCallback(self, callback=None):\r
+ if callback is not None:\r
+ callback[1]()\r
+\r
+ def deleteFailed(self):\r
+ rapidshare.deleteFailedDownloads()\r
+\r
+ def restartFailed(self):\r
+ rapidshare.restartFailedDownloads()\r
+\r
+ def clearFinished(self):\r
+ rapidshare.clearFinishedDownloads()\r
+\r
+ def showLog(self):\r
+ self.session.open(RSLogScreen)\r
+\r
+ def deleteLog(self):\r
+ try:\r
+ remove("/tmp/rapidshare.log")\r
+ except:\r
+ pass\r
+\r
+ def updateList(self):\r
+ list = []\r
+ for download in rapidshare.downloads:\r
+ list.append(RSListEntry(download))\r
+ self["list"].setList(list)\r
+ self.refreshTimer.start(2000, 1)\r
+\r
+ def delete(self):\r
+ cur = self["list"].getCurrent()\r
+ if cur:\r
+ cur = cur[0]\r
+ if cur.status == _("Finished"):\r
+ rapidshare.clearFinishedDownload(cur.url)\r
+ else:\r
+ self.session.openWithCallback(self.deleteCallback, MessageBox, (_("Delete %s?")%cur.name))\r
+\r
+ def deleteCallback(self, callback):\r
+ if callback:\r
+ rapidshare.removeDownload(self["list"].getCurrent()[0].url)\r
+ self.refreshTimer.stop()\r
+ self.updateList()\r
+\r
+ def search(self):\r
+ self.session.openWithCallback(self.searchCallback, VirtualKeyBoard, title=_("Search http://rapidshare-search-engine.com for:"))\r
+\r
+ def searchCallback(self, callback):\r
+ if callback is not None and callback != "":\r
+ self.session.openWithCallback(self.searchScreenCallback, RSSearch, callback)\r
+\r
+\r
+ def searchScreenCallback(self):\r
+ self.refreshTimer.stop()\r
+ rapidshare.startDownloading()\r
+ self.updateList()\r
+\r
+ def add(self):\r
+ self.refreshTimer.stop()\r
+ rapidshare.startDownloading()\r
+ self.updateList()\r
+\r
+ def config(self):\r
+ self.session.openWithCallback(self.configCallback, RSConfig)\r
+\r
+ def configCallback(self):\r
+ if config.plugins.RSDownloader.onoff.value:\r
+ rapidshare.startDownloading()\r
+ else:\r
+ for download in rapidshare.downloads:\r
+ if download.downloading:\r
+ download.stop()\r
+ self.updateList()\r
+\r
+ def addContainer(self):\r
+ try:\r
+ file_list = listdir(config.plugins.RSDownloader.lists_directory.value)\r
+ except:\r
+ file_list = []\r
+ list = []\r
+ for file in file_list:\r
+ if file.lower().endswith(".ccf") or file.lower().endswith(".dlc") or file.lower().endswith(".rsdf"):\r
+ list.append(file)\r
+ list.sort()\r
+ self.session.openWithCallback(self.addContainerCallback, RSContainerSelector, list)\r
+\r
+ def addContainerCallback(self, callback=None):\r
+ if callback:\r
+ file = "%s/%s"%(config.plugins.RSDownloader.lists_directory.value, callback)\r
+ file = file.replace("//", "/")\r
+ links = decrypt(file)\r
+ try:\r
+ f = open(("%s/%s.txt" % (config.plugins.RSDownloader.lists_directory.value, callback)).replace("//", "/"), "w")\r
+ for link in links:\r
+ if link.endswith(".html"):\r
+ link = link[:-5]\r
+ elif link.endswith(".htm"):\r
+ link = link[:-4]\r
+ f.write("%s\n"%link)\r
+ f.close()\r
+ except:\r
+ pass\r
+ self.refreshTimer.stop()\r
+ rapidshare.startDownloading()\r
+ self.updateList()\r
+\r
+##############################################################################\r
+\r
+def autostart(reason, **kwargs):\r
+ if reason == 0:\r
+ rapidshare.startDownloading()\r
+\r
+##############################################################################\r
+\r
+def main(session, **kwargs):\r
+ session.open(RSMain)\r
+\r
+##############################################################################\r
+\r
+def Plugins(**kwargs):\r
+ return [\r
+ PluginDescriptor(where=PluginDescriptor.WHERE_AUTOSTART, fnc=autostart),\r
+ PluginDescriptor(name=_("RS Downloader"), description=_("Download files from rapidshare"), where=[PluginDescriptor.WHERE_EXTENSIONSMENU, PluginDescriptor.WHERE_PLUGINMENU], icon="rs.png", fnc=main)]\r
+\r