Pomoc Pyload problem z pluginem Rapideo

Maverick23

System Engineer
Q Specialist
25 Listopad 2014
132
3
18
44
QNAP
TS-x70 Pro
Ethernet
802.11n (Wi-Fi 4)
Hejka,

Mam pytanko, gdzie znajdują się pliki różnych aplikacji na NAS-ie?
Potrzebuje dograć plugin do pyload i nie wiem gdzie tego szukać.

Tomek
 
Huraaa jest :) ... bez Was bym sobie nie poradził...dzięki chłopaki...może dlatego wcześniej nie było że bo na Off-a nie dawałem... :) ... ale wiecie pierwszy dzień mam NAS-a :)
Tylko coś jeszcze jest nie tak :) ... bo jak wrzucam linki to nic nie ściąga. W download są te pliki ale 15kb ważą. Dodam, że konto Rapideo mam aktywne.

Zauważyłem, że w pluginach Rapideo.pl hook activated zmienia się ciągle na Off.
 
aaa to ja myślałem, że to coś stabilnego jest :) ... zaraz pisze...co do logów to mam inny błąd, że nie może rozpakować pliku rar
abodyplanet.home.pl_screen1.jpg
 
Dodałeś to w jedno zadania pobierania ? Tj w jedną paczkę ? Bo jeśli ściagasz je osobno to ci nie rozpakuje.

Zależy ci na tej pluginie rapideo ? Bo właśnie ją poprawiam.

EDIT
Ok, ponieważ ta plugin pisany była chyba pod py 2.5 nie gra do końca z naszym qnapowskim 2.7
Aby poprawić ją musisz wyedytować plik RapideoPL.py w /hoster
szukasz wszystkich wystąpień
Kod:
except Exception as e:
i zmieniasz na
Kod:
except Exception, e:

lub pobierasz i podmieniasz ten plik z załącznika

Restartujesz pyload i śmiga
 
  • Lubię to
Reakcje: Paweł Tołoczko
Tak dla testu chciałem sprawdzić jak to ściąga, ale zaraz wrzucę wszystkie linki (cały film) i zobaczymy :)

Bardzo mi zależy :) ... zawsze sobie przez to pobieram :) ... więc jakbyś mógł to dopracować...
Ze wszystkimi plikami jest to samo. Pojawia się na moment w Active Downloads i potem znika.
 
bo pewnie masz pliki po 15 kilo ... patrz jak szybko pobrał paczki ....... niemożliwe w tak krótkim czasie
bo pewnie masz pliki po 15 kilo ... patrz jak szybko pobrał paczki ....... niemożliwe w tak krótkim czasie
 
Daj log ze startu pyload a nie jakieś śmiecie ze ściągania pliku z rapidu.net. Po każdym restarcie log zaczyna się od Starting pyLoad 0.4.9 a kończy pyLoad is up and running. Mnie interesuje co dostajesz pomiędzy tymi informacjami.
I staraj sie kopiować log w {code} bo z tych screenów ciężko czytać.

Coś takiego powinieneś mieć
Kod:
806 16.12.2014 23:55:04 INFO Starting pyLoad 0.4.9
807 16.12.2014 23:55:04 INFO Using home directory: /share/CACHEDEV1_DATA/.qpkg/pyload/data
808 16.12.2014 23:55:05 INFO ExtractArchive: Activated UnRar
809 16.12.2014 23:55:05 ERROR Error importing UpdateManager: invalid syntax (UpdateManager.py, line 245)
810 16.12.2014 23:55:05 INFO Activated plugins: CaptchaTrader, ClickAndLoad, ExternalScripts, ExtractArchive, RapideoPl, UnSkipOnFail, XFileSharingPro
811 16.12.2014 23:55:05 INFO Deactivate plugins: AlldebridCom, BypassCaptcha, Captcha9kw, CaptchaBrotherhood, Checksum, DeathByCaptcha, DebridItaliaCom, DeleteFinished, DownloadScheduler, EasybytezCom, Ev0InFetcher, ExpertDecoders, FastixRu, FreeWayMe, HotFolder, IRCInterface, ImageTyperz, LinkdecrypterCom, LinksnappyCom, MegaDebridEu, MergeFiles, MultiHome, MultishareCz, MyfastfileCom, OverLoadMe, PremiumTo, PremiumizeMe, RPNetBiz, RealdebridCom, RehostTo, RestartFailed, RestartSlow, SimplyPremiumCom, SimplydebridCom, SkipRev, UnrestrictLi, WindowsPhoneToastNotify, XMPPInterface, ZeveraCom
812 16.12.2014 23:55:05 INFO Downloadtime: True
813 16.12.2014 23:55:05 INFO Starting ThriftBackend: 0.0.0.0:7227
814 16.12.2014 23:55:05 INFO Free space: 1.84 TiB
815 16.12.2014 23:55:05 INFO Starting builtin webserver: 0.0.0.0:8100
816 16.12.2014 23:55:05 INFO Activating Accounts...
817 16.12.2014 23:55:05 INFO Activating Plugins...
818 16.12.2014 23:55:05 INFO XFileSharingPro: Handling 33 hosters: 101shared.com, 4upfiles.com, amonshare.com, banicrazy.info, boosterking.com, eyesfile.ca, file4safe.com, fileband.com, filedwon.com, filemaze.ws, filenuke.com, filevice.com, host4desi.com, hostingbulk.com, laoupload.com, linestorage.com, linkzhost.com, mightyupload.com, ravishare.com, rd-fs.com, rockdizfile.com, sharebeast.com, sharerepo.com, sharesix.com, shareswift.com, thefile.me, uploadbaz.com, uploadc.com, verzend.be, vidbull.com, xvidstage.com, zalaa.com, zomgupload.com
819 16.12.2014 23:55:05 INFO XFileSharingPro: No crypter to handle
820 16.12.2014 23:55:06 INFO RapideoPl: Reloading supported hoster list
821 16.12.2014 23:55:06 INFO pyLoad is up and running
 
dobra moment już daje :)

Bash:
1 20.04.2011 12:14:28 INFO Using home directory: /share/HDA_DATA/.qpkg/pyload/data
2 20.04.2011 12:14:28 INFO HotFolder loaded, activated False
3 20.04.2011 12:14:28 INFO ExternalScripts loaded, activated True
4 20.04.2011 12:14:28 INFO UpdateManager loaded, activated True
5 20.04.2011 12:14:28 INFO UnRar loaded, activated False
6 20.04.2011 12:14:28 INFO ClickAndLoad loaded, activated True
7 20.04.2011 12:14:28 INFO IRCInterface loaded, activated False
8 20.04.2011 12:14:28 INFO CaptchaTrader loaded, activated True
9 20.04.2011 12:14:28 INFO Downloadtime: True
10 20.04.2011 12:14:29 INFO Starting ThriftBackend: 0.0.0.0:7227
11 20.04.2011 12:14:29 INFO Free space: 76.94 GiB
12 20.04.2011 12:14:30 INFO Starting builtin webserver: 0.0.0.0:8100
13 20.04.2011 12:14:32 INFO No Updates for pyLoad
14 20.04.2011 12:14:34 INFO New version of account|RapidshareCom.py : 0.20
15 20.04.2011 12:14:38 INFO New version of account|ShareCx.py : 0.10
16 20.04.2011 12:14:41 INFO New version of hoster|NetloadIn.py : 0.31
17 20.04.2011 12:14:47 INFO New version of hoster|RapidshareCom.py : 1.33
18 20.04.2011 12:14:51 INFO New version of hoster|ShareCx.py : 0.30
19 20.04.2011 12:14:54 INFO New version of hoster|UploadedTo.py : 0.51
20 20.04.2011 12:15:01 INFO *** Plugins have been updated, please restart pyLoad ***
21 20.04.2011 12:15:55 INFO shutting down...
22 20.04.2011 12:15:55 INFO Received Quit signal
23 16.12.2014 19:44:58 INFO Starting pyLoad 0.4.9
24 16.12.2014 19:44:58 INFO Using home directory: /share/CACHEDEV1_DATA/.qpkg/pyload/data
25 16.12.2014 19:44:59 INFO ExtractArchive: Activated UnRar
26 16.12.2014 19:44:59 INFO Activated plugins: CaptchaTrader, ClickAndLoad, ExternalScripts, ExtractArchive, UpdateManager
27 16.12.2014 19:44:59 INFO Deactivate plugins: Ev0InFetcher, HotFolder, IRCInterface, MergeFiles, MultiHome, MultishareCz, RealdebridCom, RehostTo, XMPPInterface
28 16.12.2014 19:44:59 INFO Downloadtime: True
29 16.12.2014 19:44:59 INFO Starting ThriftBackend: 0.0.0.0:7227
30 16.12.2014 19:44:59 INFO Starting builtin webserver: 0.0.0.0:8100
31 16.12.2014 19:44:59 INFO Free space: 7.13 TiB
32 16.12.2014 19:44:59 INFO Activating Accounts...
33 16.12.2014 19:44:59 INFO Activating Plugins...
34 16.12.2014 19:44:59 INFO pyLoad is up and running
 
No dobra ale coś ty mi dał ? Od 19.44 nie zrestartowałeś aplikacji ? Czy masz strefę czasową z Nowego Jorku ?
Wg tego co wkleiłeś nie masz nawet wtyczki rapideo....

OK, idę spać. Wyślij mi na PW log po ostatnim restarcie aby nie śmiecić na forum, bo sprawa jest już rozwiązana i można byłoby wątek zamknąć na pierwszej stronie. Rano ci odpiszę co masz nie tak.
 
Sorki, ale nie wiem jak tu się PW wysyła na tym forum, szukałem 10 minut.

Podaje tu.

Bash:
Reversed:   Lines per page: all 20 34 40 100
855 17.12.2014 00:15:21 INFO Decrypting starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part04.rar - Rapidu.net
856 17.12.2014 00:15:23 INFO Decrypting starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part05.rar - Rapidu.net
857 17.12.2014 00:15:25 INFO Decrypting starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part06.rar - Rapidu.net
858 17.12.2014 00:15:27 INFO Decrypting starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part07.rar - Rapidu.net
859 17.12.2014 00:15:29 INFO Decrypting starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part08.rar - Rapidu.net
860 17.12.2014 00:15:31 INFO Decrypting starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part09.rar - Rapidu.net
861 17.12.2014 00:15:33 INFO Decrypting starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part10.rar - Rapidu.net
862 17.12.2014 00:15:35 INFO Download starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part01.rar - Rapidu.net
863 17.12.2014 00:15:36 INFO Download finished: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part01.rar
864 17.12.2014 00:15:37 INFO Download starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part02.rar - Rapidu.net
865 17.12.2014 00:15:38 INFO Download finished: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part02.rar
866 17.12.2014 00:15:39 INFO Download starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part03.rar - Rapidu.net
867 17.12.2014 00:15:40 INFO Download finished: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part03.rar
868 17.12.2014 00:15:41 INFO Download starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part04.rar - Rapidu.net
869 17.12.2014 00:15:42 INFO Download finished: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part04.rar
870 17.12.2014 00:15:43 INFO Download starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part05.rar - Rapidu.net
871 17.12.2014 00:15:44 INFO Download finished: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part05.rar
872 17.12.2014 00:15:45 INFO Download starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part06.rar - Rapidu.net
873 17.12.2014 00:15:46 INFO Download finished: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part06.rar
874 17.12.2014 00:15:47 INFO Download starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part07.rar - Rapidu.net
875 17.12.2014 00:15:48 INFO Download finished: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part07.rar
876 17.12.2014 00:15:49 INFO Download starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part08.rar - Rapidu.net
877 17.12.2014 00:15:50 INFO Download finished: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part08.rar
878 17.12.2014 00:15:51 INFO Download starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part09.rar - Rapidu.net
879 17.12.2014 00:15:52 INFO Download finished: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part09.rar
880 17.12.2014 00:15:53 INFO Download starts: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part10.rar - Rapidu.net
881 17.12.2014 00:15:54 INFO Download finished: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part10.rar
882 17.12.2014 00:15:54 INFO Package finished: proba
883 17.12.2014 00:15:54 INFO ExtractArchive: Package proba queued for later extracting
884 17.12.2014 00:15:54 INFO ExtractArchive: Check package proba
885 17.12.2014 00:15:54 INFO ExtractArchive: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part01.rar | Extract to Downloads/proba/
886 17.12.2014 00:15:54 ERROR ExtractArchive: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part01.rar | Archive Error | Empty Archive
887 17.12.2014 00:15:54 ERROR ExtractArchive: Iron.Man.3.2013.MULTi.1080p.BluRay.x264-ELiTE.part01.rar | Extract failed
888 17.12.2014 00:22:33 INFO shutting down...
889 17.12.2014 00:22:34 INFO Received Quit signal
890 17.12.2014 00:24:13 INFO Starting pyLoad 0.4.9
891 17.12.2014 00:24:13 INFO Using home directory: /share/CACHEDEV1_DATA/.qpkg/pyload/data
892 17.12.2014 00:24:13 INFO ExtractArchive: Activated UnRar
893 17.12.2014 00:24:13 WARNING Failed activating RapideoPl
894 17.12.2014 00:24:13 ERROR Error importing UpdateManager: invalid syntax (UpdateManager.py, line 245)
895 17.12.2014 00:24:13 INFO Activated plugins: CaptchaTrader, ClickAndLoad, ExternalScripts, ExtractArchive, UnSkipOnFail, XFileSharingPro
896 17.12.2014 00:24:13 INFO Deactivate plugins: AlldebridCom, BypassCaptcha, Captcha9kw, CaptchaBrotherhood, Checksum, DeathByCaptcha, DebridItaliaCom, DeleteFinished, DownloadScheduler, EasybytezCom, Ev0InFetcher, ExpertDecoders, FastixRu, FreeWayMe, HotFolder, IRCInterface, ImageTyperz, LinkdecrypterCom, LinksnappyCom, MegaDebridEu, MergeFiles, MultiHome, MultishareCz, MyfastfileCom, OverLoadMe, PremiumTo, PremiumizeMe, RPNetBiz, RealdebridCom, RehostTo, RestartFailed, RestartSlow, SimplyPremiumCom, SimplydebridCom, SkipRev, UnrestrictLi, WindowsPhoneToastNotify, XMPPInterface, ZeveraCom
897 17.12.2014 00:24:13 INFO Downloadtime: True
898 17.12.2014 00:24:13 INFO Starting ThriftBackend: 0.0.0.0:7227
899 17.12.2014 00:24:13 INFO Free space: 7.11 TiB
900 17.12.2014 00:24:13 INFO Starting builtin webserver: 0.0.0.0:8100
901 17.12.2014 00:24:13 INFO Activating Accounts...
902 17.12.2014 00:24:14 INFO Activating Plugins...
903 17.12.2014 00:24:14 INFO XFileSharingPro: Handling 33 hosters: 101shared.com, 4upfiles.com, amonshare.com, banicrazy.info, boosterking.com, eyesfile.ca, file4safe.com, fileband.com, filedwon.com, filemaze.ws, filenuke.com, filevice.com, host4desi.com, hostingbulk.com, laoupload.com, linestorage.com, linkzhost.com, mightyupload.com, ravishare.com, rd-fs.com, rockdizfile.com, sharebeast.com, sharerepo.com, sharesix.com, shareswift.com, thefile.me, uploadbaz.com, uploadc.com, verzend.be, vidbull.com, xvidstage.com, zalaa.com, zomgupload.com
904 17.12.2014 00:24:14 INFO XFileSharingPro: No crypter to handle
905 17.12.2014 00:24:14 INFO pyLoad is up and running
 
Oj ciężko, ciężko.....

Nie wiem co tam namieszałeś, więc od początku.
1) Usuń całkowicie aplikację pyload z QTS.
2) Usuń folder pyload z /....DATA/.qpkg/
3) Zainstaluj ponownie pyload.
4) Pozostaw aplikację uruchomioną na kilka minut. Będzie się aktualizowała z git'a i poprosi o restart (odświeżaj co chwilę stronę i śledź logi).
5) Po restarcie ponownie śledź logi bo może znowu pobierać nowe pluginy. Jeśli nic już się nie będzie działo w logach to znaczy że masz najnowszą wersję. Zrestartuj ją.
6) Pobierz z rapideo ich paczkę i skopiuj ją wg instrukcji. Tylko podmień ten jeden plik który ci edytowałem (zwróć uwagę gdzie ma być ten plik, wszystkie się nazywają RapideoPL.py a ten edytowany dajesz w /hoster).
7) Nic nie dłub i nie ściągaj ! Tylko zrestartuj pyload.
8) Po restarcie zgodnie z instrukcją uaktywnij wtyczkę i uzupełnij swoje dane w account.
9) Zrestartuj pyload i patrz w logi.

albo daj ssh do serwera to ci to ustawię bo się tu zarżniemy.
 
  • Lubię to
Reakcje: Paweł Tołoczko
Zrobiłem to wszystko krok po kroku i teraz śmiga :)

Przy uruchamianiu pojawia się tylko w logu jeden błąd
Kod:
 17.12.2014 02:04:38 ERROR Error importing UpdateManager: invalid syntax (UpdateManager.py, line 245)

Też to masz?
 
Tak, ale nie ty go spowodowałeś to błąd w pyload po aktualizacji.

Wejdź, do /hooks i wyedytuj ten plik (UpdateManager.py). Usuń wszystko i przekopiuj to co podałem. Oczywiście pamiętaj o zrestartowaniu.

Kod:
# -*- coding: utf-8 -*-

from __future__ import with_statement

import re
import sys

from operator import itemgetter
from os import path, remove, stat

from module.network.RequestFactory import getURL
from module.plugins.Hook import Expose, Hook, threaded
from module.utils import save_join


class UpdateManager(Hook):
    __name__    = "UpdateManager"
    __type__    = "hook"
    __version__ = "0.42"

    __config__ = [("activated"    , "bool"                         , "Activated"                                     , True              ),
                  ("mode"         , "pyLoad + plugins;plugins only", "Check updates for"                             , "pyLoad + plugins"),
                  ("interval"     , "int"                          , "Check interval in hours"                       , 8                 ),
                  ("autorestart"  , "bool"                         , "Automatically restart pyLoad when required"    , True              ),
                  ("reloadplugins", "bool"                         , "Monitor plugins for code changes in debug mode", True              ),
                  ("nodebugupdate", "bool"                         , "Don't check for updates in debug mode"         , True              )]

    __description__ = """ Check for updates """
    __license__     = "GPLv3"
    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")]


    # event_list = ["pluginConfigChanged"]

    SERVER_URL   = "http://updatemanager.pyload.org"
    VERSION      = re.compile(r'__version__.*=.*("|\')([\d.]+)')
    MIN_INTERVAL = 3 * 60 * 60  #: 3h minimum check interval (value is in seconds)


    def pluginConfigChanged(self, plugin, name, value):
        if name == "interval":
            interval = value * 60 * 60
            if self.MIN_INTERVAL <= interval != self.interval:
                self.core.scheduler.removeJob(self.cb)
                self.interval = interval
                self.initPeriodical()
            else:
                self.logDebug("Invalid interval value, kept current")

        elif name == "reloadplugins":
            if self.cb2:
                self.core.scheduler.removeJob(self.cb2)
            if value is True and self.core.debug:
                self.periodical2()


    def coreReady(self):
        self.pluginConfigChanged(self.__name__, "interval", self.getConfig("interval"))
        x = lambda: self.pluginConfigChanged(self.__name__, "reloadplugins", self.getConfig("reloadplugins"))
        self.core.scheduler.addJob(10, x, threaded=False)


    def unload(self):
        self.pluginConfigChanged(self.__name__, "reloadplugins", False)


    def setup(self):
        self.cb2      = None
        self.interval = self.MIN_INTERVAL
        self.updating = False
        self.info     = {'pyload': False, 'version': None, 'plugins': False}
        self.mtimes   = {}  #: store modification time for each plugin


    def periodical2(self):
        if not self.updating:
            self.autoreloadPlugins()

        self.cb2 = self.core.scheduler.addJob(4, self.periodical2, threaded=False)


    @Expose
    def autoreloadPlugins(self):
        """ reload and reindex all modified plugins """
        modules = filter(
            lambda m: m and (m.__name__.startswith("module.plugins.") or
                             m.__name__.startswith("userplugins.")) and
                             m.__name__.count(".") >= 2, sys.modules.itervalues()
        )

        reloads = []

        for m in modules:
            root, type, name = m.__name__.rsplit(".", 2)
            id = (type, name)
            if type in self.core.pluginManager.plugins:
                f = m.__file__.replace(".pyc", ".py")
                if not path.isfile(f):
                    continue

                mtime = stat(f).st_mtime

                if id not in self.mtimes:
                    self.mtimes[id] = mtime
                elif self.mtimes[id] < mtime:
                    reloads.append(id)
                    self.mtimes[id] = mtime

        return True if self.core.pluginManager.reloadPlugins(reloads) else False


    def periodical(self):
        if not self.info['pyload'] and not (self.getConfig("nodebugupdate") and self.core.debug):
            self.updateThread()


    def server_request(self):
        try:
            return getURL(self.SERVER_URL, get={'v': self.core.api.getServerVersion()}).splitlines()
        except:
            self.logWarning(_("Unable to contact server to get updates"))


    @threaded
    def updateThread(self):
        self.updating = True

        status = self.update(onlyplugin=self.getConfig("mode") == "plugins only")

        if status is 2 and self.getConfig("autorestart"):
            self.core.api.restart()
        else:
            self.updating = False


    @Expose
    def updatePlugins(self):
        """ simple wrapper for calling plugin update quickly """
        return self.update(onlyplugin=True)


    @Expose
    def update(self, onlyplugin=False):
        """ check for updates """
        data = self.server_request()

        if not data:
            exitcode = 0

        elif data[0] == "None":
            self.logInfo(_("No new pyLoad version available"))
            updates = data[1:]
            exitcode = self._updatePlugins(updates)

        elif onlyplugin:
            exitcode = 0

        else:
            newversion = data[0]
            self.logInfo(_("***  New pyLoad Version %s available  ***") % newversion)
            self.logInfo(_("***  Get it here: https://github.com/pyload/pyload/releases  ***"))
            exitcode = 3
            self.info['pyload'] = True
            self.info['version'] = newversion

        return exitcode  #: 0 = No plugins updated; 1 = Plugins updated; 2 = Plugins updated, but restart required; 3 = No plugins updated, new pyLoad version available


    def _updatePlugins(self, updates):
        """ check for plugin updates """

        if self.info['plugins']:
            return False  #: plugins were already updated

        exitcode = 0
        updated  = []

        url    = updates[0]
        schema = updates[1].split('|')

        if "BLACKLIST" in updates:
            blacklist = updates[updates.index('BLACKLIST') + 1:]
            updates   = updates[2:updates.index('BLACKLIST')]
        else:
            blacklist = None
            updates   = updates[2:]

        upgradable  = [dict(zip(schema, x.split('|'))) for x in updates]
        blacklisted = [(x.split('|')[0], x.split('|')[1].rsplit('.', 1)[0]) for x in blacklist] if blacklist else []

        if blacklist:
            # Protect UpdateManager from self-removing
            try:
                blacklisted.remove(("hook", "UpdateManager"))
            except:
                pass

            for t, n in blacklisted:
                for idx, plugin in enumerate(upgradable):
                    if n == plugin['name'] and t == plugin['type']:
                        upgradable.pop(idx)
                        break

            for t, n in self.removePlugins(sorted(blacklisted)):
                self.logInfo(_("Removed blacklisted plugin [%(type)s] %(name)s") % {
                    'type': t,
                    'name': n,
                })

        for plugin in sorted(upgradable, key=itemgetter("type", "name")):
            filename = plugin['name']
            prefix   = plugin['type']
            version  = plugin['version']

            if filename.endswith(".pyc"):
                name = filename[:filename.find("_")]
            else:
                name = filename.replace(".py", "")

            #@TODO: obsolete after 0.4.10
            if prefix.endswith("s"):
                type = prefix[:-1]
            else:
                type = prefix

            plugins = getattr(self.core.pluginManager, "%sPlugins" % type)

            oldver = float(plugins[name]['v']) if name in plugins else None
            newver = float(version)

            if not oldver:
                msg = "New plugin: [%(type)s] %(name)s (v%(newver).2f)"
            elif newver > oldver:
                msg = "New version of plugin: [%(type)s] %(name)s (v%(oldver).2f -> v%(newver).2f)"
            else:
                continue

            self.logInfo(_(msg) % {'type'  : type,
                                   'name'  : name,
                                   'oldver': oldver,
                                   'newver': newver})
            try:
                content = getURL(url % plugin)
                m = self.VERSION.search(content)

                if m and m.group(2) == version:
                    with open(save_join("userplugins", prefix, filename), "wb") as f:
                        f.write(content)

                    updated.append((prefix, name))
                else:
                    raise Exception, _("Version mismatch")

            except Exception, e:
                self.logError(_("Error updating plugin: %s") % filename, str(e))

        if updated:
            reloaded = self.core.pluginManager.reloadPlugins(updated)
            if reloaded:
                self.logInfo(_("Plugins updated and reloaded"))
                exitcode = 1
            else:
                self.logInfo(_("*** Plugins have been updated, but need a pyLoad restart to be reloaded ***"))
                self.info['plugins'] = True
                exitcode = 2
        else:
            self.logInfo(_("No plugin updates available"))

        return exitcode  #: 0 = No plugins updated; 1 = Plugins updated; 2 = Plugins updated, but restart required


    @Expose
    def removePlugins(self, type_plugins):
        """ delete plugins from disk """

        if not type_plugins:
            return

        self.logDebug("Requested deletion of plugins: %s" % type_plugins)

        removed = []

        for type, name in type_plugins:
            err = False
            file = name + ".py"

            for root in ("userplugins", path.join(pypath, "module", "plugins")):

                filename = save_join(root, type, file)
                try:
                    remove(filename)
                except Exception, e:
                    self.logDebug("Error removing: %s" % path.basename(filename), str(e))
                    err = True

                filename += "c"
                if path.isfile(filename):
                    try:
                        if type == "hook":
                            self.manager.deactivateHook(name)
                        remove(filename)
                    except Exception, e:
                        self.logDebug("Error removing: %s" % path.basename(filename), str(e))
                        err = True

            if not err:
                id = (type, name)
                removed.append(id)

        return removed  #: return a list of the plugins successfully removed