Repository: pyload/pyload

Issue:
XvidstageCom.py: The website has changed.
This commit shout make the plugin work again.



Discussion:
I've just noticed that Xvidstage.com uses XFileSharing Pro so you should develop this plugin extending that class.
See also #95 and #107.

I am working on it.

Ok. Please open a new request when you have the XFileSharingPro based plugin.


Resolving patch:
diff --git a/module/plugins/hooks/XFileSharingPro.py b/module/plugins/hooks/XFileSharingPro.py
--- a/module/plugins/hooks/XFileSharingPro.py
+++ b/module/plugins/hooks/XFileSharingPro.py
@@ -5,7 +5,7 @@
 
 class XFileSharingPro(Hook):
     __name__ = "XFileSharingPro"
-    __version__ = "0.04"
+    __version__ = "0.05"
     __type__ = "hook"
     __config__ = [ ("activated" , "bool" , "Activated"  , "True"),
                    ("loadDefault", "bool", "Include default (built-in) hoster list" , "True"),
@@ -14,57 +14,57 @@ class XFileSharingPro(Hook):
     __description__ = """Hoster URL pattern loader for the generic XFileSharingPro plugin"""
     __author_name__ = ("zoidberg")
     __author_mail__ = ("zoidberg@mujmail.cz")
-          
+
     def coreReady(self):
         self.loadPattern()
-      
-    def loadPattern(self):         
+
+    def loadPattern(self):
         hosterList = self.getConfigSet('includeList')
-        excludeList = self.getConfigSet('excludeList')         
-        
-        if self.getConfig('loadDefault'):        
+        excludeList = self.getConfigSet('excludeList')
+
+        if self.getConfig('loadDefault'):
             hosterList |= set((
             #WORKING HOSTERS:
             "aieshare.com", "asixfiles.com", "banashare.com", "cyberlocker.ch", "eyesfile.co", "eyesfile.com",
-            "fileband.com", "filedwon.com", "filedownloads.org", "hipfile.com", "kingsupload.com", "mlfat4arab.com", 
-            "netuploaded.com", "odsiebie.pl", "q4share.com", "ravishare.com", "uptobox.com", "verzend.be",  
-            #NOT TESTED:            
-            "bebasupload.com", "boosterking.com", "divxme.com", "filevelocity.com", "glumbouploads.com", "grupload.com", "heftyfile.com", 
+            "fileband.com", "filedwon.com", "filedownloads.org", "hipfile.com", "kingsupload.com", "mlfat4arab.com",
+            "netuploaded.com", "odsiebie.pl", "q4share.com", "ravishare.com", "uptobox.com", "verzend.be", "xvidstage.com",
+            #NOT TESTED:
+            "bebasupload.com", "boosterking.com", "divxme.com", "filevelocity.com", "glumbouploads.com", "grupload.com", "heftyfile.com",
             "host4desi.com", "laoupload.com", "linkzhost.com", "movreel.com", "rockdizfile.com", "limfile.com"
-            "share76.com", "sharebeast.com", "sharehut.com", "sharerun.com", "shareswift.com", "sharingonline.com", "6ybh-upload.com", 
-            "skipfile.com", "spaadyshare.com", "space4file.com", "uploadbaz.com", "uploadc.com", 
-            "uploaddot.com", "uploadfloor.com", "uploadic.com", "uploadville.com", "vidbull.com", "zalaa.com", 
+            "share76.com", "sharebeast.com", "sharehut.com", "sharerun.com", "shareswift.com", "sharingonline.com", "6ybh-upload.com",
+            "skipfile.com", "spaadyshare.com", "space4file.com", "uploadbaz.com", "uploadc.com",
+            "uploaddot.com", "uploadfloor.com", "uploadic.com", "uploadville.com", "vidbull.com", "zalaa.com",
             "zomgupload.com", "kupload.org", "movbay.org", "multishare.org", "omegave.org", "toucansharing.org", "uflinq.org",
             "banicrazy.info", "flowhot.info", "upbrasil.info", "shareyourfilez.biz", "bzlink.us", "cloudcache.cc", "fileserver.cc"
             "farshare.to", "filemaze.ws", "filehost.ws", "filestock.ru", "moidisk.ru", "4up.im", "100shared.com",
             #WRONG FILE NAME:
-            "sendmyway.com", "upchi.co.il", "180upload.com", 
+            "sendmyway.com", "upchi.co.il", "180upload.com",
             #NOT WORKING:
             "amonshare.com", "imageporter.com", "file4safe.com",
             #DOWN OR BROKEN:
             "ddlanime.com", "fileforth.com", "loombo.com", "goldfile.eu", "putshare.com"
-            ))             
-              
+            ))
+
         hosterList -= (excludeList)
         hosterList -= set(('', u''))
-        
+
         if not hosterList:
             self.unload()
             return
-                                            
+
         regexp = r"http://(?:[^/]*\.)?(%s)/\w{12}" % ("|".join(sorted(hosterList)).replace('.','\.'))
         #self.logDebug(regexp)
-        
+
         dict = self.core.pluginManager.hosterPlugins['XFileSharingPro']
         dict["pattern"] = regexp
         dict["re"] = re.compile(regexp)
         self.logDebug("Pattern loaded - handling %d hosters" % len(hosterList))
-        
+
     def getConfigSet(self, option):
         s = self.getConfig(option).lower().replace('|',',').replace(';',',')
         return set([x.strip() for x in s.split(',')])
-        
+
     def unload(self):
         dict = self.core.pluginManager.hosterPlugins['XFileSharingPro']
         dict["pattern"] = r"^unmatchable$"
-        dict["re"] = re.compile(r"^unmatchable$")
\ No newline at end of file
+        dict["re"] = re.compile(r"^unmatchable$")
diff --git a/module/plugins/hoster/XvidstageCom.py b/module/plugins/hoster/XvidstageCom.py
deleted file mode 100644
--- a/module/plugins/hoster/XvidstageCom.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 3 of the License,
-    or (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-    See the GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, see <http://www.gnu.org/licenses/>.
-
-    @author: 4Christopher
-"""
-
-import re
-import HTMLParser
-
-from module.plugins.Hoster import Hoster
-from module.network.RequestFactory import getURL
-
-
-def setup(self):
-    self.wantReconnect = False
-    self.resumeDownload = True
-    self.multiDL = True
-
-
-def getInfo(urls):
-    result = []
-
-    for url in urls:
-        result.append(parseFileInfo(url, getInfoMode=True))
-    yield result
-
-
-def parseFileInfo(url, getInfoMode=False):
-    html = getURL(url)
-    info = {"name": url, "size": 0, "status": 3}
-    try:
-        info['name'] = re.search(r'(?:Filename|Dateiname):</b></td><td nowrap[^>]*?>(.*?)<', html).group(1)
-        info['size'] = re.search(r'(?:Size|Größe):</b></td><td>.*? <small>\((\d+?) bytes\)', html).group(1)
-    except: ## The file is offline
-        info['status'] = 1
-    else:
-        info['status'] = 2
-
-    if getInfoMode:
-        return info['name'], info['size'], info['status'], url
-    else:
-        return info['name'], info['size'], info['status'], html
-
-
-class XvidstageCom(Hoster):
-    __name__ = 'XvidstageCom'
-    __version__ = '0.4'
-    __pattern__ = r'http://(?:www.)?xvidstage.com/(?P<id>[0-9A-Za-z]+)'
-    __type__ = 'hoster'
-    __description__ = """A Plugin that allows you to download files from http://xvidstage.com"""
-    __author_name__ = ('4Christopher')
-    __author_mail__ = ('4Christopher@gmx.de')
-
-
-    def process(self, pyfile):
-        pyfile.name, pyfile.size, pyfile.status, self.html = parseFileInfo(pyfile.url)
-        self.logDebug('Name: %s' % pyfile.name)
-        if pyfile.status == 1: ## offline
-            self.offline()
-        self.id = re.search(self.__pattern__, pyfile.url).group('id')
-
-        wait_sec = int(re.search(r'countdown_str">.+?>(\d+?)<', self.html).group(1))
-        self.setWait(wait_sec, reconnect=False)
-        self.logDebug('Waiting %d seconds before submitting the captcha' % wait_sec)
-        self.wait()
-
-        rand = re.search(r'<input type="hidden" name="rand" value="(.*?)">', self.html).group(1)
-        self.logDebug('rand: %s, id: %s' % (rand, self.id))
-        self.html = self.req.load(pyfile.url,
-                                  post={'op': 'download2', 'id': self.id, 'rand': rand, 'code': self.get_captcha()})
-        file_url = re.search(r'<a href="(?P<url>.*?)">(?P=url)</a>', self.html).group('url')
-        try:
-            hours_file_available = int(
-                re.search(r'This direct link will be available for your IP next (?P<hours>\d+?) hours',
-                          self.html).group('hours'))
-            self.logDebug(
-                'You have %d hours to download this file with your current IP address.' % hours_file_available)
-        except:
-            self.logDebug('Failed')
-        self.logDebug('Download file: %s' % file_url)
-        self.download(file_url)
-        check = self.checkDownload({'empty': re.compile(r'^$')})
-
-        if check == 'empty':
-            self.logInfo('Downloaded File was empty')
-        # self.retry()
-
-    def get_captcha(self):
-        ## <span style='position:absolute;padding-left:7px;padding-top:6px;'>&#49; …
-        cap_chars = {}
-        for pad_left, char in re.findall(r"position:absolute;padding-left:(\d+?)px;.*?;'>(.*?)<", self.html):
-            cap_chars[int(pad_left)] = char
-
-        h = HTMLParser.HTMLParser()
-        ## Sorting after padding-left
-        captcha = ''
-        for pad_left in sorted(cap_chars):
-            captcha += h.unescape(cap_chars[pad_left])
-
-        self.logDebug('The captcha is: %s' % captcha)
-        return captcha


Test patch: