Added RS-Downloader plugin
authorNabil Hanna <ali@users.schwerkraft.elitedvb.net>
Mon, 10 Nov 2008 16:03:23 +0000 (16:03 +0000)
committerNabil Hanna <ali@users.schwerkraft.elitedvb.net>
Mon, 10 Nov 2008 16:03:23 +0000 (16:03 +0000)
18 files changed:
Makefile.am
configure.ac
rsdownloader/CONTROL/control [new file with mode: 0644]
rsdownloader/Makefile.am [new file with mode: 0644]
rsdownloader/src/FritzReconnect.py [new file with mode: 0644]
rsdownloader/src/Makefile.am [new file with mode: 0644]
rsdownloader/src/RS.py [new file with mode: 0644]
rsdownloader/src/RSConfig.py [new file with mode: 0644]
rsdownloader/src/RSDownloadBrowser.py [new file with mode: 0644]
rsdownloader/src/RSDownloader.py [new file with mode: 0644]
rsdownloader/src/RSListBrowser.py [new file with mode: 0644]
rsdownloader/src/RSLog.py [new file with mode: 0644]
rsdownloader/src/RSMain.py [new file with mode: 0644]
rsdownloader/src/RSProgress.py [new file with mode: 0644]
rsdownloader/src/__init__.py [new file with mode: 0644]
rsdownloader/src/maintainer.info [new file with mode: 0644]
rsdownloader/src/plugin.py [new file with mode: 0644]
rsdownloader/src/rs.png [new file with mode: 0644]

index fe8fb95..b017314 100644 (file)
@@ -1,2 +1,2 @@
 AUTOMAKE_OPTIONS = gnu
-SUBDIRS = antiscrollbar movietagger webinterface wirelesslan netcaster lastfm logomanager vlcplayer simplerss trafficinfo fritzcall webcamviewer emailclient autotimer epgrefresh werbezapper httpproxy startuptostandby imdb ofdb networkwizard movieretitle moviecut tageditor cdinfo unwetterzentrale youtubeplayer zaphistorybrowser passwordchanger autoresolution mosaic googlemaps
+SUBDIRS = antiscrollbar movietagger webinterface wirelesslan netcaster lastfm logomanager vlcplayer simplerss trafficinfo fritzcall webcamviewer emailclient autotimer epgrefresh werbezapper httpproxy startuptostandby imdb ofdb networkwizard movieretitle moviecut tageditor cdinfo unwetterzentrale youtubeplayer zaphistorybrowser passwordchanger autoresolution mosaic googlemaps rsdownloader
index 04b1753..2f0ef00 100644 (file)
@@ -154,4 +154,7 @@ mosaic/src/Makefile
 googlemaps/Makefile
 googlemaps/src/Makefile
 
+rsdownloader/Makefile
+rsdownloader/src/Makefile
+
 ])
diff --git a/rsdownloader/CONTROL/control b/rsdownloader/CONTROL/control
new file mode 100644 (file)
index 0000000..beb5afe
--- /dev/null
@@ -0,0 +1,10 @@
+Package: enigma2-plugin-extensions-rsdownloader
+Version: 1.0-r0
+Description: Allows user to download files from rapidshare in the background
+Architecture: all
+Section: extra
+Priority: optional
+Maintainer: Nabil Hanna <nabil1978@web.de>
+Homepage: http://code.google.com/p/enigma2
+Depends: enigma2(>2.5cvs20080413), twisted-web
+Source: http://enigma2-plugins.schwerkraft.elitedvb.net/
diff --git a/rsdownloader/Makefile.am b/rsdownloader/Makefile.am
new file mode 100644 (file)
index 0000000..308a09c
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS = src\r
diff --git a/rsdownloader/src/FritzReconnect.py b/rsdownloader/src/FritzReconnect.py
new file mode 100644 (file)
index 0000000..30a6c82
--- /dev/null
@@ -0,0 +1,28 @@
+import socket
+
+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()
+               return True
+       except:
+               return False
+
diff --git a/rsdownloader/src/Makefile.am b/rsdownloader/src/Makefile.am
new file mode 100644 (file)
index 0000000..90397ff
--- /dev/null
@@ -0,0 +1,4 @@
+installdir = /usr/lib/enigma2/python/Plugins/Extensions/RSDownloader\r
+\r
+install_PYTHON = *.py\r
+install_DATA = *.png *.info\r
diff --git a/rsdownloader/src/RS.py b/rsdownloader/src/RS.py
new file mode 100644 (file)
index 0000000..750001d
--- /dev/null
@@ -0,0 +1,235 @@
+##\r
+## RS Downloader\r
+## by AliAbdul\r
+##\r
+from enigma import eTimer
+from FritzReconnect import reconnect\r
+from os import listdir\r
+from RSConfig import config\r
+from RSDownloader import downloadPage, GET, POST, matchGet\r
+from RSLog import writeLog\r
+from time import localtime, sleep\r
+from Tools.Directories import fileExists\r
+\r
+##############################################################################\r
+\r
+class RS:\r
+       def __init__(self):\r
+               self.files = []\r
+               self.downloaded_files = []\r
+               self.failed_files = []\r
+               self.downloading_file = ""\r
+               \r
+               self.downloading = False\r
+               \r
+               self.downloadTimer = eTimer()\r
+               self.downloadTimer.timeout.get().append(self.download)
+               self.freeDownloadTimer = eTimer()\r
+               self.freeDownloadTimer.timeout.get().append(self.freeDownload)\r
+               self.reloadTimer = eTimer()\r
+               self.reloadTimer.timeout.get().append(self.startDownloading)\r
+\r
+       def addFile(self, file):\r
+               writeLog("Adding %s to download-list..." % file)\r
+               \r
+               if self.files.__contains__(file):\r
+                       writeLog("File %s is already in the download-list!" % file)\r
+               \r
+               elif self.downloaded_files.__contains__(file):\r
+                       writeLog("File %s already downloaded!" % file)\r
+               \r
+               elif self.downloading_file == file:\r
+                       writeLog("Already downloading %s!" % file)\r
+               \r
+               else:\r
+                       self.files.append(file)\r
+                       writeLog("Added %s to the downloads." % file)\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
+               \r
+               writeLog("Directory: " + path)\r
+               \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
+               \r
+               for x in file_list:\r
+                       list = path + x\r
+                       try:\r
+                               writeLog("Reading list %s..." % list)\r
+                               \r
+                               f = open(list, "r")\r
+                               for l in f:\r
+                                       if l.startswith("http://"):\r
+                                               self.addFile(l.replace("\n", "").replace("\r", ""))\r
+                               f.close()\r
+                       except:\r
+                               writeLog("Error while reading list %s!" % list)\r
+\r
+       def startDownloading(self):\r
+               self.reloadTimer.stop()\r
+               \r
+               mayDownload = self.mayDownload()\r
+               if mayDownload:\r
+                       self.downloading = True\r
+                       writeLog("Starting downloads...")\r
+                       self.readLists()\r
+                       self.downloadTimer.start(1, 1)\r
+                       return True\r
+               else:\r
+                       self.reloadTimer.start(5 * 60 * 1000, 1)\r
+                       return False\r
+\r
+       def download(self):\r
+               if len(self.files) > 0:\r
+                       writeLog("Getting next file...")\r
+                       self.downloading_file = self.files[0]\r
+                       del self.files[0]\r
+                       writeLog("Downloading file %s..." % self.downloading_file)\r
+                       \r
+                       username = config.plugins.RSDownloader.username.value\r
+                       password = config.plugins.RSDownloader.password.value
+                       freeRsDownload = False\r
+                       if username != "" and password != "":\r
+                               downloading_file = self.downloading_file.replace("http://", "http://" + username + ":" + password + "@")\r
+                       else:\r
+                               downloading_file = self.downloading_file
+                               if downloading_file.startswith("http://rapidshare.com"):
+                                       freeRsDownload = True\r
+                       \r
+                       path = config.plugins.RSDownloader.downloads_directory.value\r
+                       if not path.endswith("/"):\r
+                               path = path + "/"\r
+                       \r
+                       try:\r
+                               list = downloading_file.split("/")\r
+                               file = path + list[(len(list)-2)] + "_" + list[(len(list)-1)]\r
+                               file = file.replace(".html", "")\r
+                       except:\r
+                               file = downloading_file.replace(".html", "").replace("http://", "")\r
+                       writeLog("Local file: " + file)\r
+                       \r
+                       if fileExists(file):\r
+                               writeLog("File %s already exists! Downloading next one...")\r
+                               self.downloadTimer.start(1, 1)\r
+                       else:
+                               if freeRsDownload:
+                                       if config.plugins.RSDownloader.reconnect_fritz.value == True:
+                                               reconnect()
+                                               sleep(3)
+                                       data = GET(downloading_file)
+                                       url = matchGet('<form[^>]+action="([^"]+)', data)
+                                       if not url:
+                                               self.downloadError("Failed to get download page url")
+                                       else:
+                                               data = POST(url, "dl.start=Free")
+                                               seconds = matchGet('var c=([0-9]+)', data)
+                                               if not seconds:
+                                                       self.downloadError("Failed to get download page url")
+                                               else:
+                                                       writeLog("Free RS-download... must wait %s seconds!" % seconds)
+                                                       url = matchGet('"dlf" action="([^"]+)', data)
+                                                       if not url:
+                                                               self.downloadError("Failed to get download page url")
+                                                       else:
+                                                               self.freeDownloadUrl = url
+                                                               self.freeDownloadFile = file
+                                                               self.freeDownloadTimer.start((int(seconds) + 2) * 1000, 1)
+                               else:\r
+                                       downloadPage(downloading_file, file).addCallback(self.downloadCallback).addErrback(self.downloadError)\r
+               else:\r
+                       self.downloading_file = ""\r
+                       self.downloading = False\r
+                       writeLog("Empty list... everything done?")\r
+                       \r
+                       self.reloadTimer.start(5 * 60 * 1000, 1)
+
+       def freeDownload(self):
+               downloadPage(self.freeDownloadUrl, self.freeDownloadFile).addCallback(self.downloadCallback).addErrback(self.downloadError)\r
+\r
+       def downloadCallback(self, callback = None):\r
+               writeLog("File %s downloaded." % self.downloading_file)\r
+               \r
+               self.cleanLists(self.downloading_file)\r
+               \r
+               self.downloaded_files.append(self.downloading_file)\r
+               self.downloadTimer.start(1, 1)\r
+\r
+       def downloadError(self, error = None):\r
+               if error is not None:\r
+                       writeLog("Error while downloading: " + str(error))\r
+               \r
+               self.failed_files.append(self.downloading_file)\r
+               self.downloadTimer.start(1, 1)\r
+\r
+       def cleanLists(self, file):\r
+               writeLog("Cleaning lists...")\r
+               \r
+               path = config.plugins.RSDownloader.lists_directory.value\r
+               if not path.endswith("/"):\r
+                       path = path + "/"\r
+               \r
+               try:\r
+                       file_list = listdir(path)\r
+               except:\r
+                       file_list = []\r
+               \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
+                               \r
+                               if content.__contains__(file):\r
+                                       content = content.replace(file, "")\r
+                                       content = content.replace("\n\n", "\n")\r
+                                       \r
+                                       f = open(list, "w")\r
+                                       f.write(content)\r
+                                       f.close()\r
+                       except:\r
+                               writeLog("Error while cleaning list %s!" % list)\r
+\r
+       def mayDownload(self):\r
+               start = config.plugins.RSDownloader.start_time.value\r
+               end = config.plugins.RSDownloader.end_time.value\r
+               t = localtime()\r
+               \r
+               #print "====>Start:", str(start)\r
+               #print "====>End:", str(end)\r
+               #print "====>Now:", str(t)\r
+               \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
+               \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
+               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
+               \r
+               return False\r
+\r
+rapidshare = RS()\r
diff --git a/rsdownloader/src/RSConfig.py b/rsdownloader/src/RSConfig.py
new file mode 100644 (file)
index 0000000..f38a663
--- /dev/null
@@ -0,0 +1,63 @@
+##\r
+## RS Downloader\r
+## by AliAbdul\r
+##\r
+from Components.ActionMap import ActionMap\r
+from Components.config import config, ConfigText, ConfigYesNo, ConfigClock, ConfigSubsection, getConfigListEntry\r
+from Components.ConfigList import ConfigListScreen\r
+from Components.Label import Label\r
+from Screens.Screen import Screen\r
+from time import time\r
+\r
+##############################################################################\r
+\r
+config.plugins.RSDownloader  = ConfigSubsection()\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/cf/rs/lists/", fixed_size=False)\r
+config.plugins.RSDownloader.downloads_directory = ConfigText(default="/media/cf/rs/downloads", fixed_size=False)\r
+config.plugins.RSDownloader.start_time = ConfigClock(default = time())\r
+config.plugins.RSDownloader.end_time = ConfigClock(default = time())\r
+config.plugins.RSDownloader.write_log = ConfigYesNo(default = True)
+config.plugins.RSDownloader.reconnect_fritz = ConfigYesNo(default = False)\r
+\r
+##############################################################################\r
+\r
+class RSConfig(ConfigListScreen, Screen):\r
+       skin = """\r
+               <screen position="80,170" size="560,270" 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,220" scrollbarMode="showOnDemand" />\r
+               </screen>"""\r
+\r
+       def __init__(self, session):\r
+               Screen.__init__(self, session)\r
+               \r
+               self["key_green"] = Label(_("Save"))\r
+               \r
+               list = []\r
+               list.append(getConfigListEntry(_("Username:"), config.plugins.RSDownloader.username))\r
+               list.append(getConfigListEntry(_("Password:"), config.plugins.RSDownloader.password))\r
+               list.append(getConfigListEntry(_("Lists directory:"), config.plugins.RSDownloader.lists_directory))\r
+               list.append(getConfigListEntry(_("Downloads directory:"), config.plugins.RSDownloader.downloads_directory))\r
+               list.append(getConfigListEntry(_("Don't download before:"), config.plugins.RSDownloader.start_time))\r
+               list.append(getConfigListEntry(_("Don't download after:"), config.plugins.RSDownloader.end_time))\r
+               list.append(getConfigListEntry(_("Write log:"), config.plugins.RSDownloader.write_log))
+               list.append(getConfigListEntry(_("Reconnect fritz.Box before downloading:"), config.plugins.RSDownloader.reconnect_fritz))\r
+               ConfigListScreen.__init__(self, list)\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
diff --git a/rsdownloader/src/RSDownloadBrowser.py b/rsdownloader/src/RSDownloadBrowser.py
new file mode 100644 (file)
index 0000000..fdc2448
--- /dev/null
@@ -0,0 +1,23 @@
+##\r
+## RS Downloader\r
+## by AliAbdul\r
+##\r
+from Components.ActionMap import ActionMap\r
+from Components.FileList import FileList\r
+from Screens.Screen import Screen\r
+\r
+##############################################################################\r
+\r
+class RSDownloadBrowser(Screen):\r
+       skin = """\r
+               <screen position="80,100" size="560,400" title="RS Downloader">\r
+                       <widget name="list" position="0,0" size="560,395" scrollbarMode="showOnDemand" />\r
+               </screen>"""\r
+\r
+       def __init__(self, session, path):\r
+               Screen.__init__(self, session)\r
+               self["list"] = FileList(path, False)\r
+               self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.okClicked, "cancel": self.close}, -1)\r
+\r
+       def okClicked(self):\r
+               pass #don't do anything... only a small browser to view the downloaded files atm!\r
diff --git a/rsdownloader/src/RSDownloader.py b/rsdownloader/src/RSDownloader.py
new file mode 100644 (file)
index 0000000..70e08be
--- /dev/null
@@ -0,0 +1,89 @@
+##\r
+## RS Downloader\r
+## by AliAbdul\r
+##\r
+from base64 import encodestring\r
+from twisted.internet import reactor\r
+from twisted.web.client import HTTPDownloader\r
+from urlparse import urlparse, urlunparse
+import urllib2, re\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
+       \r
+       host, port = parsed[1], 80\r
+       \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
+       \r
+       if ':' in host:\r
+               host, port = host.split(':')\r
+               port = int(port)\r
+       \r
+       if path == "":\r
+               path = "/"\r
+       \r
+       return scheme, host, port, path, username, password\r
+\r
+def downloadPage(url, file, contextFactory=None, *args, **kwargs):\r
+       scheme, host, port, path, username, password = _parse(url)\r
+       \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
+               \r
+               if kwargs.has_key("headers"):\r
+                       kwargs["headers"].update(AuthHeaders)\r
+               else:\r
+                       kwargs["headers"] = AuthHeaders\r
+       \r
+       factory = HTTPDownloader(url, file, *args, **kwargs)\r
+       reactor.connectTCP(host, port, factory)\r
+       return factory.deferred
+\r
+##############################################################################
+
+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):
+       ret = False
+       
+       try:
+               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 match.groups()
+       except:
+               pass
+       
+       return ret
+
diff --git a/rsdownloader/src/RSListBrowser.py b/rsdownloader/src/RSListBrowser.py
new file mode 100644 (file)
index 0000000..80622df
--- /dev/null
@@ -0,0 +1,23 @@
+##\r
+## RS Downloader\r
+## by AliAbdul\r
+##\r
+from Components.ActionMap import ActionMap\r
+from Components.FileList import FileList\r
+from Screens.Screen import Screen\r
+\r
+##############################################################################\r
+\r
+class RSListBrowser(Screen):\r
+       skin = """\r
+               <screen position="80,100" size="560,400" title="RS Downloader">\r
+                       <widget name="list" position="0,0" size="560,395" scrollbarMode="showOnDemand" />\r
+               </screen>"""\r
+\r
+       def __init__(self, session, path):\r
+               Screen.__init__(self, session)\r
+               self["list"] = FileList(path, False, True, "^.*\.(txt)")\r
+               self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.okClicked, "cancel": self.close}, -1)\r
+\r
+       def okClicked(self):\r
+               pass #don't do anything... only a small browser to view the lists atm!\r
diff --git a/rsdownloader/src/RSLog.py b/rsdownloader/src/RSLog.py
new file mode 100644 (file)
index 0000000..82074d6
--- /dev/null
@@ -0,0 +1,30 @@
+##\r
+## RS Downloader\r
+## by AliAbdul\r
+##\r
+from RSConfig import config\r
+from time import strftime, time, localtime\r
+\r
+##############################################################################\r
+\r
+def writeLog(message):\r
+       mayWrite = config.plugins.RSDownloader.write_log.value\r
+       \r
+       if mayWrite:\r
+               log_file = "/tmp/rapidshare.log"\r
+               \r
+               try:\r
+                       f = open(log_file, "r")\r
+                       log = f.read()\r
+                       f.close()\r
+               except:\r
+                       log = ""\r
+               \r
+               log = log + strftime("%c", localtime(time())) + " - " + message + "\n"\r
+               \r
+               try:\r
+                       f = open(log_file, "w")\r
+                       f.write(log)\r
+                       f.close()\r
+               except:\r
+                       pass\r
diff --git a/rsdownloader/src/RSMain.py b/rsdownloader/src/RSMain.py
new file mode 100644 (file)
index 0000000..0940e3c
--- /dev/null
@@ -0,0 +1,88 @@
+##
+## RS Downloader
+## by AliAbdul
+##
+from Components.ActionMap import ActionMap
+from Components.MenuList import MenuList
+from os import path as os_path
+from RS import rapidshare
+from RSConfig import RSConfig, config
+from RSDownloadBrowser import RSDownloadBrowser
+from RSListBrowser import RSListBrowser
+from RSProgress import RSProgress
+from Screens.Console import Console
+from Screens.MessageBox import MessageBox
+from Screens.Screen import Screen
+
+##############################################################################
+
+class RSMain(Screen):
+       skin = """
+               <screen position="200,175" size="320,250" title="RS Downloader">
+                       <widget name="list" position="10,10" size="300,230" />
+               </screen>"""
+
+       def __init__(self, session, args = None):
+               Screen.__init__(self, session)
+               self.session = session
+               
+               self["list"] = MenuList([
+                       _("Start downloading..."),
+                       _("Show lists..."),
+                       _("Show downloads..."),
+                       _("Show progress..."),
+                       _("Edit configs..."),
+                       _("Show status..."),
+                       _("Show log..."),
+                       _("Delete log..."),
+                       _("Show info...")])
+               
+               self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.okClicked, "cancel": self.close}, -1)
+
+       def okClicked(self):
+               selected = self["list"].getCurrent()
+               if selected is not None:
+                       if selected == (_("Start downloading...")):
+                               if not rapidshare.downloading:
+                                       ret = rapidshare.startDownloading()
+                                       if ret:
+                                               self.session.open(MessageBox, _("Started downloading..."), MessageBox.TYPE_INFO)
+                                       else:
+                                               self.session.open(MessageBox, _("Could not start downloading!"), MessageBox.TYPE_ERROR)
+                               else:
+                                       self.session.open(MessageBox, _("Already downloading!"), MessageBox.TYPE_ERROR)
+                       
+                       elif selected == (_("Show lists...")):
+                               path = config.plugins.RSDownloader.lists_directory.value
+                               if os_path.exists(path):
+                                       self.session.open(RSListBrowser, path)
+                               else:
+                                       self.session.open(MessageBox, (_("Couldn't find the directory %s!") % path), MessageBox.TYPE_ERROR)
+                       
+                       elif selected == (_("Show downloads...")):
+                               path = config.plugins.RSDownloader.downloads_directory.value
+                               if os_path.exists(path):
+                                       self.session.open(RSDownloadBrowser, path)
+                               else:
+                                       self.session.open(MessageBox, (_("Couldn't find the directory %s!") % path), MessageBox.TYPE_ERROR)
+                       
+                       elif selected == (_("Show progress...")):
+                               self.session.open(RSProgress)
+                       
+                       elif selected == (_("Edit configs...")):
+                               self.session.open(RSConfig)
+                       
+                       elif selected == (_("Show status...")):
+                               if rapidshare.downloading:
+                                       self.session.open(MessageBox, (_("Downloading %s.") % rapidshare.downloading_file), MessageBox.TYPE_INFO)
+                               else:
+                                       self.session.open(MessageBox, _("Stopped!"), MessageBox.TYPE_INFO)
+                       
+                       elif selected == (_("Show log...")):
+                               self.session.open(Console, "RS Downloader", ["cat /tmp/rapidshare.log"])
+                       
+                       elif selected == (_("Delete log...")):
+                               self.session.open(Console, "RS Downloader", ["rm -f /tmp/rapidshare.log"])
+                       
+                       elif selected == (_("Show info...")):
+                               self.session.open(MessageBox, (_("RS Downloader\nby AliAbdul\n\nThis plugin allows you to download files from rapidshare in the background. You can use this plugin only with a rapidshare-account!")), MessageBox.TYPE_INFO)
diff --git a/rsdownloader/src/RSProgress.py b/rsdownloader/src/RSProgress.py
new file mode 100644 (file)
index 0000000..ef2abab
--- /dev/null
@@ -0,0 +1,60 @@
+##\r
+## RS Downloader\r
+## by AliAbdul\r
+##\r
+from Components.ActionMap import ActionMap\r
+from Components.Label import Label\r
+from Components.MenuList import MenuList\r
+from RS import rapidshare\r
+from Screens.Screen import Screen\r
+\r
+##############################################################################\r
+\r
+class RSProgress(Screen):\r
+       skin = """\r
+               <screen position="80,120" size="560,360" 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_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="list" position="10,45" size="540,300" scrollbarMode="showOnDemand" />\r
+               </screen>"""\r
+\r
+       def __init__(self, session):\r
+               Screen.__init__(self, session)\r
+               \r
+               self["key_red"] = Label(_("Downloading"))\r
+               self["key_green"] = Label(_("Files"))\r
+               self["key_yellow"] = Label(_("Downloaded"))\r
+               self["key_blue"] = Label(_("Failed"))\r
+               \r
+               self["list"] = MenuList(rapidshare.files)\r
+               \r
+               self["actions"] = ActionMap(["OkCancelActions", "ColorActions"],\r
+                       {\r
+                               "red": self.downloading,\r
+                               "green": self.files,\r
+                               "yellow": self.downloaded,\r
+                               "blue": self.failed,\r
+                               "cancel": self.close\r
+                       }, -1)\r
+\r
+       def downloading(self):\r
+               if rapidshare.downloading_file == "":\r
+                       list = []\r
+               else:\r
+                       list = [rapidshare.downloading_file]\r
+               self["list"].setList(list)\r
+\r
+       def files(self):\r
+               self["list"].setList(rapidshare.files)\r
+\r
+       def downloaded(self):\r
+               self["list"].setList(rapidshare.downloaded_files)\r
+\r
+       def failed(self):\r
+               self["list"].setList(rapidshare.failed_files)\r
diff --git a/rsdownloader/src/__init__.py b/rsdownloader/src/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/rsdownloader/src/maintainer.info b/rsdownloader/src/maintainer.info
new file mode 100644 (file)
index 0000000..152e5d1
--- /dev/null
@@ -0,0 +1,2 @@
+nabil1978@web.de
+RSDownloader
diff --git a/rsdownloader/src/plugin.py b/rsdownloader/src/plugin.py
new file mode 100644 (file)
index 0000000..f950883
--- /dev/null
@@ -0,0 +1,24 @@
+##\r
+## RS Downloader\r
+## by AliAbdul\r
+##\r
+from Plugins.Plugin import PluginDescriptor\r
+from RS import rapidshare\r
+from RSMain import RSMain\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 [PluginDescriptor(where=[PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc=autostart),\r
+                       PluginDescriptor(name=_("RS Downloader"), description=_("Download files from rapidshare in the background"), where=[PluginDescriptor.WHERE_EXTENSIONSMENU, PluginDescriptor.WHERE_PLUGINMENU], icon="rs.png", fnc=main)]\r
diff --git a/rsdownloader/src/rs.png b/rsdownloader/src/rs.png
new file mode 100644 (file)
index 0000000..5c233e5
Binary files /dev/null and b/rsdownloader/src/rs.png differ