From efee017fb2b3a4cac09233cd01d816d9100a5db5 Mon Sep 17 00:00:00 2001
From: RaNaN <Mast3rRaNaN@hotmail.de>
Date: Wed, 25 May 2011 20:37:32 +0200
Subject: rehost plugin, fixed some account management issues

---
 module/plugins/Account.py              | 82 +++++++++++++++++++++++----------
 module/plugins/AccountManager.py       |  7 +--
 module/plugins/accounts/RehostTo.py    | 37 +++++++++++++++
 module/plugins/accounts/UploadedTo.py  |  2 +-
 module/plugins/hooks/RealdebridCom.py  |  2 +-
 module/plugins/hooks/RehostTo.py       | 84 ++++++++++++++++++++++++++++++++++
 module/plugins/hoster/RealdebridCom.py |  2 +-
 module/plugins/hoster/RehostTo.py      | 37 +++++++++++++++
 8 files changed, 222 insertions(+), 31 deletions(-)
 create mode 100644 module/plugins/accounts/RehostTo.py
 create mode 100644 module/plugins/hooks/RehostTo.py
 create mode 100644 module/plugins/hoster/RehostTo.py

(limited to 'module/plugins')

diff --git a/module/plugins/Account.py b/module/plugins/Account.py
index 2d4642411..c5d7930e9 100644
--- a/module/plugins/Account.py
+++ b/module/plugins/Account.py
@@ -17,7 +17,6 @@
     @author: mkaay
 """
 
-import re
 from random import choice
 from time import time
 from traceback import print_exc
@@ -27,6 +26,7 @@ from module.utils import compare_time, parseFileSize
 class WrongPassword(Exception):
     pass
 
+
 class Account():
     __name__ = "Account"
     __version__ = "0.2"
@@ -37,7 +37,10 @@ class Account():
 
     # after that time [in minutes] pyload will relogin the account
     login_timeout = 600
-    
+    # account data will be reloaded after this time
+    info_threshold = 600
+
+
     def __init__(self, manager, accounts):
         self.manager = manager
         self.core = manager.core
@@ -45,6 +48,10 @@ class Account():
         self.infos = {} # cache for account information
         self.timestamps = {}
         self.setAccounts(accounts)
+        self.setup()
+
+    def setup(self):
+        pass
 
     def login(self, user, data, req):
         pass
@@ -55,51 +62,67 @@ class Account():
             self.login(user, data, req)
             self.timestamps[user] = time()
         except WrongPassword:
-            self.core.log.warning(_("Could not login with %(plugin)s account %(user)s | %(msg)s") % {"plugin": self.__name__, "user": user, "msg": _("Wrong Password")})
+            self.core.log.warning(
+                _("Could not login with %(plugin)s account %(user)s | %(msg)s") % {"plugin": self.__name__, "user": user
+                                                                                   , "msg": _("Wrong Password")})
             data["valid"] = False
 
         except Exception, e:
-            self.core.log.warning(_("Could not login with %(plugin)s account %(user)s | %(msg)s") % {"plugin" :self.__name__, "user": user, "msg": e})
+            self.core.log.warning(
+                _("Could not login with %(plugin)s account %(user)s | %(msg)s") % {"plugin": self.__name__, "user": user
+                                                                                   , "msg": e})
             data["valid"] = False
             if self.core.debug:
                 print_exc()
         finally:
             if req: req.close()
-    
+
     def relogin(self, user):
         req = self.getAccountRequest(user)
         if req:
             req.cj.clear()
             req.close()
+        if self.infos.has_key(user):
+            del self.infos[user] #delete old information
+
         self._login(user, self.accounts[user])
-    
+
     def setAccounts(self, accounts):
         self.accounts = accounts
         for user, data in self.accounts.iteritems():
             self._login(user, data)
             self.infos[user] = {}
-    
+
     def updateAccounts(self, user, password=None, options={}):
+        """ updates account and return true if anything changed """
+        
         if self.accounts.has_key(user):
+            self.accounts[user]["valid"] = True #do not remove or accounts will not login
             if password:
                 self.accounts[user]["password"] = password
+                self.relogin(user)
+                return True
             if options:
+                before = self.accounts[user]["options"]
                 self.accounts[user]["options"].update(options)
-            self.accounts[user]["valid"] = True
+                return self.accounts[user]["options"] != before
         else:
-            self.accounts[user] = {"password" : password, "options": options, "valid": True}
+            self.accounts[user] = {"password": password, "options": options, "valid": True}
+            self._login(user, self.accounts[user])
+            return True
 
-        self._login(user, self.accounts[user])
-    
     def removeAccount(self, user):
         if self.accounts.has_key(user):
             del self.accounts[user]
         if self.infos.has_key(user):
             del self.infos[user]
-    
+        if self.timestamps.has_key(user):
+            del self.timestamps[user]
+
     def getAccountInfo(self, name, force=False):
         """ return dict with infos, do not overwrite this method! """
         data = Account.loadAccountInfo(self, name)
+
         if force or not self.infos.has_key(name):
             self.core.log.debug("Get %s Account Info for %s" % (self.__name__, name))
             req = self.getAccountRequest(name)
@@ -114,11 +137,15 @@ class Account():
             if req: req.close()
 
             self.core.log.debug("Account Info: %s" % str(infos))
+
+            infos["timestamp"] = time()
             self.infos[name] = infos
+        elif self.infos[name].has_key("timestamp") and self.infos[name]["timestamp"] + self.info_threshold * 60 < time():
+            self.scheduleRefresh(name)
 
         data.update(self.infos[name])
         return data
-    
+
     def isPremium(self, user):
         info = self.getAccountInfo(user)
         return info["premium"]
@@ -133,12 +160,13 @@ class Account():
             "trafficleft": None, # in kb, -1 for unlimited
             "maxtraffic": None,
             "premium": True, #useful for free accounts
+            "timestamp": 0, #time this info was retrieved
             "type": self.__name__,
-        }
+            }
 
     def getAllAccounts(self, force=False):
         return [self.getAccountInfo(user, force) for user, data in self.accounts.iteritems()]
-    
+
     def getAccountRequest(self, user=None):
         if not user:
             user, data = self.selectAccount()
@@ -163,7 +191,7 @@ class Account():
     def selectAccount(self):
         """ returns an valid account name and data"""
         usable = []
-        for user,data in self.accounts.iteritems():
+        for user, data in self.accounts.iteritems():
             if not data["valid"]: continue
 
             if data["options"].has_key("time") and data["options"]["time"]:
@@ -184,15 +212,14 @@ class Account():
                     if self.infos[user]["trafficleft"] == 0:
                         continue
 
-
             usable.append((user, data))
 
         if not usable: return None, None
         return choice(usable)
-    
+
     def canUse(self):
         return False if self.selectAccount() == (None, None) else True
-    
+
     def parseTraffic(self, string): #returns kbyte
         return parseFileSize(string) / 1024
 
@@ -201,16 +228,25 @@ class Account():
 
     def empty(self, user):
         if self.infos.has_key(user):
-            self.core.log.warning(_("%(plugin)s Account %(user)s has not enough traffic, checking again in 30min") % {"plugin" : self.__name__, "user": user})
+            self.core.log.warning(_("%(plugin)s Account %(user)s has not enough traffic, checking again in 30min") % {
+                "plugin": self.__name__, "user": user})
+
             self.infos[user].update({"trafficleft": 0})
-            self.core.scheduler.addJob(30*60, self.getAccountInfo, [user])
+            self.scheduleRefresh(user, 30 * 60)
 
     def expired(self, user):
         if self.infos.has_key(user):
-            self.core.log.warning(_("%(plugin)s Account %(user)s is expired, checking again in 1h") % {"plugin" : self.__name__, "user": user})
+            self.core.log.warning(
+                _("%(plugin)s Account %(user)s is expired, checking again in 1h") % {"plugin": self.__name__,
+                                                                                     "user": user})
+
             self.infos[user].update({"validuntil": time() - 1})
-            self.core.scheduler.addJob(60*60, self.getAccountInfo, [user])
+            self.scheduleRefresh(user, 60 * 60)
 
+    def scheduleRefresh(self, user, time=0, force=True):
+        """ add task to refresh account info to sheduler """
+        self.core.log.debug("Scheduled Account refresh for %s:%s in %s seconds." % (self.__name__, user, time))
+        self.core.scheduler.addJob(time, self.getAccountInfo, [user, force])
 
     def checkLogin(self, user):
         """ checks if user is still logged in """
diff --git a/module/plugins/AccountManager.py b/module/plugins/AccountManager.py
index 7299ff643..e4c858a43 100644
--- a/module/plugins/AccountManager.py
+++ b/module/plugins/AccountManager.py
@@ -143,12 +143,11 @@ class AccountManager():
         """add or update account"""
         if self.accounts.has_key(plugin):
             p = self.getAccountPlugin(plugin)
-            p.updateAccounts(user, password, options)
+            updated = p.updateAccounts(user, password, options)
             #since accounts is a ref in plugin self.accounts doesnt need to be updated here
                     
             self.saveAccounts()
-            p.getAllAccounts(force=True)
-            self.core.scheduler.addJob(0, self.core.accountManager.getAccountInfos)
+            if updated: p.scheduleRefresh(user, force=False)
                 
     #----------------------------------------------------------------------
     def removeAccount(self, plugin, user):
@@ -159,8 +158,6 @@ class AccountManager():
             p.removeAccount(user)
 
             self.saveAccounts()
-            p.getAllAccounts(force=True)
-            self.core.scheduler.addJob(0, self.core.accountManager.getAccountInfos)
 
             
     def getAccountInfos(self, force=True, refresh=False):
diff --git a/module/plugins/accounts/RehostTo.py b/module/plugins/accounts/RehostTo.py
new file mode 100644
index 000000000..e1cb2668f
--- /dev/null
+++ b/module/plugins/accounts/RehostTo.py
@@ -0,0 +1,37 @@
+from module.plugins.Account import Account
+
+
+class RehostTo(Account):
+    __name__ = "RehostTo"
+    __version__ = "0.1"
+    __type__ = "account"
+    __description__ = """Rehost.to account plugin"""
+    __author_name__ = ("RaNaN")
+    __author_mail__ = ("RaNaN@pyload.org")
+
+
+    def loadAccountInfo(self, user, req):
+
+        data = self.getAccountData(user)
+        page = req.load("http://rehost.to/api.php?cmd=login&user=%s&pass=%s" % (user, data["password"]))
+        data = [x.split("=") for x in page.split(",")]
+        ses = data[0][1]
+        long_ses = data[1][1]
+
+        page = req.load("http://rehost.to/api.php?cmd=get_premium_credits&long_ses=%s" % long_ses)
+        traffic, valid = page.split(",")
+
+        account_info = {"trafficleft": int(traffic) * 1024,
+                        "validuntil": int(valid),
+                        "long_ses": long_ses,
+                        "ses": ses}
+
+        return account_info
+
+    def login(self, user, data, req):
+        page = req.load("http://rehost.to/api.php?cmd=login&user=%s&pass=%s" % (user, data["password"]))
+
+        if "Login failed." in page:
+            self.wrongPassword()
+
+
diff --git a/module/plugins/accounts/UploadedTo.py b/module/plugins/accounts/UploadedTo.py
index 63092a3cb..5fcc77498 100644
--- a/module/plugins/accounts/UploadedTo.py
+++ b/module/plugins/accounts/UploadedTo.py
@@ -45,7 +45,7 @@ class UploadedTo(Account):
 
             return {"validuntil":validuntil, "trafficleft":traffic, "maxtraffic":50*1024*1024}
         else:
-            return {"premium" : False}
+            return {"premium" : False, "validuntil" : -1}
 
     def login(self, user, data, req):
         page = req.load("http://uploaded.to/io/login", post={ "id" : user, "pw" : data["password"], "_" : ""})
diff --git a/module/plugins/hooks/RealdebridCom.py b/module/plugins/hooks/RealdebridCom.py
index e42ab42af..e415f8e05 100644
--- a/module/plugins/hooks/RealdebridCom.py
+++ b/module/plugins/hooks/RealdebridCom.py
@@ -56,7 +56,7 @@ class RealdebridCom(Hook):
         module = self.core.pluginManager.getPlugin("RealdebridCom")
         klass = getattr(module, "RealdebridCom")
         #inject real debrid plugin
-        self.core.log.debug("Real-Debrid: Supported Hosters: %s" % ", ".join(sorted(supported)))
+        self.core.log.debug("Real-Debrid: Overwritten Hosters: %s" % ", ".join(sorted(supported)))
         for hoster in supported:
             dict = self.core.pluginManager.hosterPlugins[hoster]
             dict["new_module"] = module
diff --git a/module/plugins/hooks/RehostTo.py b/module/plugins/hooks/RehostTo.py
new file mode 100644
index 000000000..324ef9b91
--- /dev/null
+++ b/module/plugins/hooks/RehostTo.py
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+import re
+
+from module.network.RequestFactory import getURL
+from module.plugins.Hook import Hook
+
+from module.utils import removeChars
+
+class RehostTo(Hook):
+    __name__ = "RehostTo"
+    __version__ = "0.4"
+    __type__ = "hook"
+
+    __config__ = [("activated", "bool", "Activated", "False")]
+
+    __description__ = """rehost.to hook plugin"""
+    __author_name__ = ("RaNaN")
+    __author_mail__ = ("RaNaN@pyload.org")
+
+    interval = 0
+    hosters = []
+
+    replacements = [("freakshare.net", "freakshare.com")]
+
+    def getHostersCached(self):
+        if not self.hosters:
+
+            page = getURL("http://rehost.to/api.php?cmd=get_supported_och_dl&long_ses=%s" % self.long_ses)
+
+            self.hosters = [x.strip() for x in page.replace("\"", "").split(",")]
+
+            for rep in self.replacements:
+                if rep[0] in self.hosters:
+                    self.hosters.remove(rep[0])
+                    self.hosters.append(rep[1])
+
+        return self.hosters
+
+    def coreReady(self):
+
+        self.account = self.core.accountManager.getAccountPlugin("RehostTo")
+
+        user = self.account.selectAccount()[0]
+
+        if not user:
+            self.log.error("Rehost.to: "+ _("Please add your rehost.to account first and restart pyLoad"))
+            return
+
+        data = self.account.getAccountInfo(user)
+        self.ses = data["ses"]
+        self.long_ses = data["long_ses"]
+
+        pluginMap = {}
+        for name in self.core.pluginManager.hosterPlugins.keys():
+            pluginMap[name.lower()] = name
+
+        supported = []
+        new_supported = []
+
+        for hoster in self.getHostersCached():
+            name = removeChars(hoster.lower(), "-.")
+
+            if pluginMap.has_key(name):
+                supported.append(pluginMap[name])
+            else:
+                new_supported.append(hoster)
+
+        module = self.core.pluginManager.getPlugin("RehostTo")
+        klass = getattr(module, "RehostTo")
+        #inject real debrid plugin
+        self.core.log.debug("Rehost.to: Overwritten Hosters: %s" % ", ".join(sorted(supported)))
+        for hoster in supported:
+            dict = self.core.pluginManager.hosterPlugins[hoster]
+            dict["new_module"] = module
+            dict["new_name"] = "RehostTo"
+
+        self.core.log.debug("Rehost.to: New Hosters: %s" % ", ".join(sorted(new_supported)))
+
+        #create new regexp
+        regexp = r".*(%s).*" % "|".join([klass.__pattern__] + [x.replace(".", "\\.") for x in new_supported])
+
+        dict = self.core.pluginManager.hosterPlugins["RehostTo"]
+        dict["pattern"] = regexp
+        dict["re"] = re.compile(regexp)
\ No newline at end of file
diff --git a/module/plugins/hoster/RealdebridCom.py b/module/plugins/hoster/RealdebridCom.py
index dc5b9098b..5db81b713 100644
--- a/module/plugins/hoster/RealdebridCom.py
+++ b/module/plugins/hoster/RealdebridCom.py
@@ -24,7 +24,7 @@ class RealdebridCom(Hoster):
 
     def process(self, pyfile):
         if not self.account:
-            self.log.error(_("Please enter your Real-debrid account"))
+            self.log.error(_("Please enter your Real-debrid account or deactivate this plugin"))
             self.fail("No Real-debrid account provided")
 
         self.log.debug("Real-Debrid: Old URL: %s" % pyfile.url)
diff --git a/module/plugins/hoster/RehostTo.py b/module/plugins/hoster/RehostTo.py
new file mode 100644
index 000000000..2755facb7
--- /dev/null
+++ b/module/plugins/hoster/RehostTo.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import re
+from urllib import quote, unquote
+from module.plugins.Hoster import Hoster
+
+class RehostTo(Hoster):
+    __name__ = "RehostTo"
+    __version__ = "0.1"
+    __type__ = "hoster"
+
+    __pattern__ = r"https?://.*rehost.to\..*"
+    __description__ = """rehost.com hoster plugin"""
+    __author_name__ = ("RaNaN")
+    __author_mail__ = ("RaNaN@pyload.org")
+
+    def getFilename(self, url):
+        return unquote(url.rsplit("/", 1)[1])
+
+    def setup(self):
+        self.chunkLimit = 3
+        self.resumeDownload = True
+
+    def process(self, pyfile):
+        if not self.account:
+            self.log.error(_("Please enter your rehost.to account or deactivate this plugin"))
+            self.fail("No rehost.to account provided")
+
+        data = self.account.getAccountInfo(self.user)
+        long_ses = data["long_ses"]
+
+        self.log.debug("Rehost.to: Old URL: %s" % pyfile.url)
+        new_url = "http://rehost.to/process_download.php?user=cookie&pass=%s&dl=%s" % (long_ses, quote(pyfile.url, ""))
+
+
+        self.download(new_url, disposition=True)
\ No newline at end of file
-- 
cgit v1.2.3