summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2011-06-12 13:13:20 +0200
committerGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2011-06-12 13:13:20 +0200
commit6a86b735fb9723239f4d109e2a2985b7782807dc (patch)
treeeca7ced4fb3dd300611fc831c0eccb9a5536a64c
parentcomment out filemanager (diff)
downloadpyload-6a86b735fb9723239f4d109e2a2985b7782807dc.tar.xz
erniebs fixes, ul lifetime fix
-rw-r--r--module/Utils.py25
-rw-r--r--module/plugins/AccountManager.py12
-rw-r--r--module/plugins/accounts/UploadedTo.py30
-rw-r--r--module/plugins/accounts/X7To.py13
-rw-r--r--module/plugins/container/RSDF.py24
-rw-r--r--module/plugins/hoster/FreakshareCom.py282
6 files changed, 213 insertions, 173 deletions
diff --git a/module/Utils.py b/module/Utils.py
index 4605aaf75..e6e40c956 100644
--- a/module/Utils.py
+++ b/module/Utils.py
@@ -15,6 +15,7 @@ def chmod(*args):
except:
pass
+
def decode(string):
""" decode string with utf if possible """
try:
@@ -22,6 +23,7 @@ def decode(string):
except:
return string
+
def removeChars(string, repl):
""" removes all chars in repl from string"""
if type(string) == str:
@@ -29,13 +31,14 @@ def removeChars(string, repl):
elif type(string) == unicode:
return string.translate(dict([(ord(s), None) for s in repl]))
+
def save_join(*args):
""" joins a path, encoding aware """
paths = []
for i, path in enumerate(args):
# remove : for win comp, but not for first segment
if i:
- path = path.replace(":","")
+ path = path.replace(":", "")
path = decode(path)
@@ -43,6 +46,7 @@ def save_join(*args):
paths.append(tmp)
return join(*paths)
+
def compare_time(start, end):
start = map(int, start)
end = map(int, end)
@@ -55,6 +59,7 @@ def compare_time(start, end):
elif start < now and end < now and start > end: return True
else: return False
+
def formatSize(size):
"""formats size of bytes"""
size = int(size)
@@ -65,9 +70,11 @@ def formatSize(size):
steps += 1
return "%.2f %s" % (size, sizes[steps])
+
def freeSpace(folder):
if os.name == "nt":
import ctypes
+
free_bytes = ctypes.c_ulonglong(0)
ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(folder), None, None, ctypes.pointer(free_bytes))
return free_bytes.value
@@ -77,8 +84,9 @@ def freeSpace(folder):
s = statvfs(folder)
return s.f_bsize * s.f_bavail
-def uniqify(seq, idfun=None):
- # order preserving
+
+def uniqify(seq, idfun=None):
+# order preserving
if idfun is None:
def idfun(x): return x
seen = {}
@@ -93,6 +101,7 @@ def uniqify(seq, idfun=None):
result.append(item)
return result
+
def parseFileSize(string): #returns bytes
string = string.strip().lower()
p = re.compile(r"(\d+[\.,]\d+)(.*)")
@@ -110,6 +119,16 @@ def parseFileSize(string): #returns bytes
return 0
+
+def lock(func):
+ def new(*args):
+ args[0].lock.acquire()
+ res = func(*args)
+ args[0].lock.release()
+ return res
+
+ return new
+
if __name__ == "__main__":
print freeSpace(".")
diff --git a/module/plugins/AccountManager.py b/module/plugins/AccountManager.py
index e4c858a43..94af7cd82 100644
--- a/module/plugins/AccountManager.py
+++ b/module/plugins/AccountManager.py
@@ -20,12 +20,13 @@
from os.path import exists
from shutil import copy
+from threading import Lock
+
from module.PullEvents import AccountUpdateEvent
-from module.utils import chmod
+from module.utils import chmod, lock
ACC_VERSION = 1
-########################################################################
class AccountManager():
"""manages all accounts"""
@@ -37,6 +38,7 @@ class AccountManager():
self.accounts = {} # key = ( plugin )
self.plugins = {}
+ self.lock = Lock()
self.initAccountPlugins()
@@ -138,7 +140,7 @@ class AccountManager():
for name in self.core.pluginManager.getAccountPlugins():
self.accounts[name] = {}
- #----------------------------------------------------------------------
+ @lock
def updateAccount(self, plugin , user, password=None, options={}):
"""add or update account"""
if self.accounts.has_key(plugin):
@@ -149,7 +151,7 @@ class AccountManager():
self.saveAccounts()
if updated: p.scheduleRefresh(user, force=False)
- #----------------------------------------------------------------------
+ @lock
def removeAccount(self, plugin, user):
"""remove account"""
@@ -159,7 +161,7 @@ class AccountManager():
self.saveAccounts()
-
+ @lock
def getAccountInfos(self, force=True, refresh=False):
data = {}
diff --git a/module/plugins/accounts/UploadedTo.py b/module/plugins/accounts/UploadedTo.py
index 5fcc77498..6852e5243 100644
--- a/module/plugins/accounts/UploadedTo.py
+++ b/module/plugins/accounts/UploadedTo.py
@@ -30,27 +30,33 @@ class UploadedTo(Account):
__author_mail__ = ("mkaay@mkaay.de")
def loadAccountInfo(self, user, req):
- html = req.load("http://uploaded.to/me", cookies=True)
- premium = '<a href="me#premium"><em>Premium</em>' in html
+ req.load("http://uploaded.to/language/en")
+ html = req.load("http://uploaded.to/me")
- if premium:
- raw_traffic = re.search(r'<th colspan="2"><b class="cB">([^<]+)', html).group(1)
- raw_valid = re.search(r"<td>Duration:</td>\s*<th>([^<]+)", html, re.MULTILINE).group(1)
- raw_valid = re.findall(r"\d+", raw_valid)
+ premium = '<a href="me#premium"><em>Premium</em>' in html or '<em>Premium</em></th>' in html
- traffic = int(self.parseTraffic(raw_traffic))
+ if premium:
+ #raw_traffic = re.search(r'<th colspan="2"><b class="cB">([^<]+)', html).group(1)
+ raw_valid = re.search(r"<td>Duration:</td>\s*<th>([^<]+)", html, re.MULTILINE).group(1).strip()
- validuntil = time() + 24 * 60 * 60 * int(raw_valid[0]) + 60 * 60 * int(raw_valid[1])
+ if raw_valid == "unlimited":
+ validuntil = -1
+ else:
+ raw_valid = re.findall(r"\d+", raw_valid)
+ validuntil = time() + 24 * 60 * 60 * int(raw_valid[0]) + 60 * 60 * int(raw_valid[1])
- return {"validuntil":validuntil, "trafficleft":traffic, "maxtraffic":50*1024*1024}
+
+ return {"validuntil":validuntil, "trafficleft": -1}
else:
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"], "_" : ""})
- if "User and password do not match!" in page:
- self.wrongPassword()
req.load("http://uploaded.to/language/en")
req.cj.setCookie("uploaded.to", "lang", "en")
+
+ page = req.load("http://uploaded.to/io/login", post={ "id" : user, "pw" : data["password"], "_" : ""})
+
+ if "User and password do not match!" in page:
+ self.wrongPassword()
diff --git a/module/plugins/accounts/X7To.py b/module/plugins/accounts/X7To.py
index abfb13e5e..8c2bf245a 100644
--- a/module/plugins/accounts/X7To.py
+++ b/module/plugins/accounts/X7To.py
@@ -33,8 +33,17 @@ class X7To(Account):
def loadAccountInfo(self, user, req):
page = req.load("http://www.x7.to/my")
- valid = re.search("Premium-Mitglied bis ([0-9]*-[0-9]*-[0-9]*)", page, re.IGNORECASE).group(1)
- valid = int(mktime(strptime(valid, "%Y-%m-%d")))
+ validCheck = re.search("Premium-Mitglied bis ([0-9]*-[0-9]*-[0-9]*)", page, re.IGNORECASE)
+ if validCheck:
+ valid = validCheck.group(1)
+ valid = int(mktime(strptime(valid, "%Y-%m-%d")))
+ else:
+ validCheck = re.search("Premium member until ([0-9]*-[0-9]*-[0-9]*)", page, re.IGNORECASE)
+ if validCheck:
+ valid = validCheck.group(1)
+ valid = int(mktime(strptime(valid, "%Y-%m-%d")))
+ else:
+ valid = 0
trafficleft = re.search(r'<em style="white-space:nowrap">([\d]*[,]?[\d]?[\d]?) (KB|MB|GB)</em>', page, re.IGNORECASE)
if trafficleft:
diff --git a/module/plugins/container/RSDF.py b/module/plugins/container/RSDF.py
index 93e2d717b..ea5cd67f2 100644
--- a/module/plugins/container/RSDF.py
+++ b/module/plugins/container/RSDF.py
@@ -3,6 +3,7 @@
import base64
import binascii
+import re
from module.plugins.Container import Container
@@ -31,17 +32,18 @@ class RSDF(Container):
rsdf = open(infile, 'r')
data = rsdf.read()
- data = binascii.unhexlify(''.join(data.split()))
- data = data.splitlines()
+ rsdf.close()
- links = []
- for link in data:
- link = base64.b64decode(link)
- link = obj.decrypt(link)
- decryptedUrl = link.replace('CCF: ', '')
- links.append(decryptedUrl)
+ if re.search(r"<title>404 - Not Found</title>", data) is None:
+ data = binascii.unhexlify(''.join(data.split()))
+ data = data.splitlines()
- rsdf.close()
+ links = []
+ for link in data:
+ link = base64.b64decode(link)
+ link = obj.decrypt(link)
+ decryptedUrl = link.replace('CCF: ', '')
+ links.append(decryptedUrl)
- self.log.debug("%s: adding package %s with %d links" % (self.__name__,pyfile.package().name,len(links)))
- self.packages.append((pyfile.package().name, links))
+ self.log.debug("%s: adding package %s with %d links" % (self.__name__,pyfile.package().name,len(links)))
+ self.packages.append((pyfile.package().name, links))
diff --git a/module/plugins/hoster/FreakshareCom.py b/module/plugins/hoster/FreakshareCom.py
index 1c4e04dee..d795147a6 100644
--- a/module/plugins/hoster/FreakshareCom.py
+++ b/module/plugins/hoster/FreakshareCom.py
@@ -1,141 +1,143 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import re
-from module.plugins.Hoster import Hoster
-from module.plugins.ReCaptcha import ReCaptcha
-
-class FreakshareCom(Hoster):
- __name__ = "FreakshareCom"
- __type__ = "hoster"
- __pattern__ = r"http://(?:www\.)?freakshare\.(net|com)/files/\S*?/"
- __version__ = "0.33"
- __description__ = """Freakshare.com Download Hoster"""
- __author_name__ = ("sitacuisses","spoob","mkaay")
- __author_mail__ = ("sitacuisses@yahoo.de","spoob@pyload.org","mkaay@mkaay.de")
-
- def setup(self):
- self.html = None
- self.wantReconnect = False
- self.multiDL = False
- self.req_opts = []
-
- def process(self, pyfile):
- self.pyfile = pyfile
- pyfile.url = pyfile.url.replace("freakshare.net/","freakshare.com/")
-
- if self.account:
- self.html = self.load(pyfile.url, cookies=False)
- pyfile.name = self.get_file_name()
- self.download(pyfile.url)
-
- else:
- self.prepare()
- self.get_file_url()
-
- self.download(self.pyfile.url, post=self.req_opts)
-
-
- def prepare(self):
- pyfile = self.pyfile
-
- self.wantReconnect = False
-
- self.download_html()
-
- if not self.file_exists():
- self.offline()
-
- self.setWait( self.get_waiting_time() )
-
- pyfile.name = self.get_file_name()
-
- self.wait()
-
- return True
-
- def download_html(self):
- self.html = self.load(self.pyfile.url, cookies=True)
-
- def get_file_url(self):
- """ returns the absolute downloadable filepath
- """
- if self.html is None:
- self.download_html()
- if not self.wantReconnect:
- self.req_opts = self.get_download_options() # get the Post options for the Request
- #file_url = self.pyfile.url
- #return file_url
- else:
- self.offline()
-
- def get_file_name(self):
- if self.html is None:
- self.download_html()
- if not self.wantReconnect:
- file_name = re.search(r"<h1\sclass=\"box_heading\"\sstyle=\"text-align:center\;\">([^ ]+)", self.html).group(1)
- return file_name
- else:
- return self.pyfile.url
-
- def get_waiting_time(self):
- if self.html is None:
- self.download_html()
-
- if "Der Traffic f\xc3\xbcr heute ist verbraucht!" in self.html or "Your Traffic is used up for today" in self.html:
- self.wantReconnect = True
- return 24*3600
-
- if re.search(r"This file does not exist!", self.html) is not None:
- self.offline()
-
- timestring = re.search('\s*var\sdownloadWait\s=\s(\d*);', self.html).group(1)
- if timestring:
- sec = int(timestring) + 1 #add 1 sec as tenths of seconds are cut off
- else:
- sec = 0
- return sec
-
- def file_exists(self):
- """ returns True or False
- """
- if self.html is None:
- self.download_html()
- if re.search(r"Sorry, this Download doesnt exist anymore", self.html) is not None:
- return False
- else:
- return True
-
- def get_download_options(self):
- re_envelope = re.search(r".*?value=\"Free\sDownload\".*?\n*?(.*?<.*?>\n*)*?\n*\s*?</form>", self.html).group(0) #get the whole request
- to_sort = re.findall(r"<input\stype=\"hidden\"\svalue=\"(.*?)\"\sname=\"(.*?)\"\s\/>", re_envelope)
- request_options = []
-
- for item in to_sort: #Name value pairs are output reversed from regex, so we reorder them
- request_options.append((item[1], item[0]))
-
- herewego = self.load(self.pyfile.url, None, request_options, cookies=True) # the actual download-Page
-
- # comment this in, when it doesnt work
- # with open("DUMP__FS_.HTML", "w") as fp:
- # fp.write(herewego)
-
- to_sort = re.findall(r"<input\stype=\".*?\"\svalue=\"(\S*?)\".*?name=\"(\S*?)\"\s.*?\/>", herewego)
- request_options = []
-
- # comment this in, when it doesnt work as well
- #print "\n\n%s\n\n" % ";".join(["%s=%s" % x for x in to_sort])
-
- for item in to_sort: #Same as above
- request_options.append((item[1], item[0]))
-
- challenge = re.search(r"http://api\.recaptcha\.net/challenge\?k=([0-9A-Za-z]+)", herewego)
-
- if challenge:
- re_captcha = ReCaptcha(self)
- challenge, result = re_captcha.challenge(challenge.group(1))
-
- request_options.append(("recaptcha_challenge_field", challenge))
- request_options.append(("recaptcha_response_field", result))
-
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import re
+from module.plugins.Hoster import Hoster
+from module.plugins.ReCaptcha import ReCaptcha
+
+class FreakshareCom(Hoster):
+ __name__ = "FreakshareCom"
+ __type__ = "hoster"
+ __pattern__ = r"http://(?:www\.)?freakshare\.(net|com)/files/\S*?/"
+ __version__ = "0.33"
+ __description__ = """Freakshare.com Download Hoster"""
+ __author_name__ = ("sitacuisses","spoob","mkaay")
+ __author_mail__ = ("sitacuisses@yahoo.de","spoob@pyload.org","mkaay@mkaay.de")
+
+ def setup(self):
+ self.html = None
+ self.wantReconnect = False
+ self.multiDL = False
+ self.req_opts = []
+
+ def process(self, pyfile):
+ self.pyfile = pyfile
+ pyfile.url = pyfile.url.replace("freakshare.net/","freakshare.com/")
+
+ if self.account:
+ self.html = self.load(pyfile.url, cookies=False)
+ pyfile.name = self.get_file_name()
+ self.download(pyfile.url)
+
+ else:
+ self.prepare()
+ self.get_file_url()
+
+ self.download(self.pyfile.url, post=self.req_opts)
+
+
+ def prepare(self):
+ pyfile = self.pyfile
+
+ self.wantReconnect = False
+
+ self.download_html()
+
+ if not self.file_exists():
+ self.offline()
+
+ self.setWait( self.get_waiting_time() )
+
+ pyfile.name = self.get_file_name()
+
+ self.wait()
+
+ return True
+
+ def download_html(self):
+ self.html = self.load(self.pyfile.url)
+
+ def get_file_url(self):
+ """ returns the absolute downloadable filepath
+ """
+ if self.html is None:
+ self.download_html()
+ if not self.wantReconnect:
+ self.req_opts = self.get_download_options() # get the Post options for the Request
+ #file_url = self.pyfile.url
+ #return file_url
+ else:
+ self.offline()
+
+ def get_file_name(self):
+ if self.html is None:
+ self.download_html()
+ if not self.wantReconnect:
+ file_name = re.search(r"<h1\sclass=\"box_heading\"\sstyle=\"text-align:center\;\">([^ ]+)", self.html).group(1)
+ return file_name
+ else:
+ return self.pyfile.url
+
+ def get_waiting_time(self):
+ if self.html is None:
+ self.download_html()
+
+ if "Der Traffic f\xc3\xbcr heute ist verbraucht!" in self.html or "Your Traffic is used up for today" in self.html:
+ self.wantReconnect = True
+ return 24*3600
+
+ if re.search(r"This file does not exist!", self.html) is not None:
+ self.offline()
+ timestring = re.search('\s*var\sdownloadWait\s=\s(\d*);', self.html)
+ if timestring:
+ return int(timestring.group(1)) + 1 #add 1 sec as tenths of seconds are cut off
+ timestring = re.search('\s*var\stime\s=\s(\d*)[.0];', self.html)
+ if timestring:
+ return int(timestring.group(1)) + 1 #add 1 sec as tenths of seconds are cut off
+ else:
+ return 60
+
+
+ def file_exists(self):
+ """ returns True or False
+ """
+ if self.html is None:
+ self.download_html()
+ if re.search(r"Sorry, this Download doesnt exist anymore", self.html) is not None:
+ return False
+ else:
+ return True
+
+ def get_download_options(self):
+ re_envelope = re.search(r".*?value=\"Free\sDownload\".*?\n*?(.*?<.*?>\n*)*?\n*\s*?</form>", self.html).group(0) #get the whole request
+ to_sort = re.findall(r"<input\stype=\"hidden\"\svalue=\"(.*?)\"\sname=\"(.*?)\"\s\/>", re_envelope)
+ request_options = []
+
+ for item in to_sort: #Name value pairs are output reversed from regex, so we reorder them
+ request_options.append((item[1], item[0]))
+
+ herewego = self.load(self.pyfile.url, None, request_options) # the actual download-Page
+
+ # comment this in, when it doesnt work
+ # with open("DUMP__FS_.HTML", "w") as fp:
+ # fp.write(herewego)
+
+ to_sort = re.findall(r"<input\stype=\".*?\"\svalue=\"(\S*?)\".*?name=\"(\S*?)\"\s.*?\/>", herewego)
+ request_options = []
+
+ # comment this in, when it doesnt work as well
+ #print "\n\n%s\n\n" % ";".join(["%s=%s" % x for x in to_sort])
+
+ for item in to_sort: #Same as above
+ request_options.append((item[1], item[0]))
+
+ challenge = re.search(r"http://api\.recaptcha\.net/challenge\?k=([0-9A-Za-z]+)", herewego)
+
+ if challenge:
+ re_captcha = ReCaptcha(self)
+ challenge, result = re_captcha.challenge(challenge.group(1))
+
+ request_options.append(("recaptcha_challenge_field", challenge))
+ request_options.append(("recaptcha_response_field", result))
+
return request_options \ No newline at end of file