From eb61d1bb0a30fd32f99b93f847346c610fbc91d2 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sat, 15 Nov 2014 07:26:01 +0100 Subject: Update plugins after merging --- pyload/plugins/Plugin.py | 8 +- pyload/plugins/account/AlldebridCom.py | 2 +- pyload/plugins/account/BayfilesCom.py | 2 +- pyload/plugins/account/BillionuploadsCom.py | 2 +- pyload/plugins/account/BitshareCom.py | 2 +- pyload/plugins/account/CatShareNet.py | 56 ++++ pyload/plugins/account/CramitIn.py | 2 +- pyload/plugins/account/CzshareCom.py | 2 +- pyload/plugins/account/DebridItaliaCom.py | 2 +- pyload/plugins/account/DepositfilesCom.py | 2 +- pyload/plugins/account/EasybytezCom.py | 2 +- pyload/plugins/account/EuroshareEu.py | 2 +- pyload/plugins/account/FastixRu.py | 2 +- pyload/plugins/account/FastshareCz.py | 4 +- pyload/plugins/account/File4safeCom.py | 2 +- pyload/plugins/account/FileParadoxIn.py | 2 +- pyload/plugins/account/FilecloudIo.py | 2 +- pyload/plugins/account/FilefactoryCom.py | 2 +- pyload/plugins/account/FilejungleCom.py | 2 +- pyload/plugins/account/FileomCom.py | 2 +- pyload/plugins/account/FilerNet.py | 2 +- pyload/plugins/account/FilerioCom.py | 2 +- pyload/plugins/account/FilesMailRu.py | 2 +- pyload/plugins/account/FileserveCom.py | 2 +- pyload/plugins/account/FourSharedCom.py | 2 +- pyload/plugins/account/FreakshareCom.py | 2 +- pyload/plugins/account/FreeWayMe.py | 2 +- pyload/plugins/account/FshareVn.py | 2 +- pyload/plugins/account/Ftp.py | 5 +- pyload/plugins/account/HellshareCz.py | 2 +- pyload/plugins/account/Http.py | 5 +- pyload/plugins/account/HugefilesNet.py | 2 +- pyload/plugins/account/HundredEightyUploadCom.py | 2 +- pyload/plugins/account/JunocloudMe.py | 16 + pyload/plugins/account/Keep2shareCc.py | 69 +++++ pyload/plugins/account/LetitbitNet.py | 2 +- pyload/plugins/account/LinestorageCom.py | 16 + pyload/plugins/account/LinksnappyCom.py | 2 +- pyload/plugins/account/LomafileCom.py | 2 +- pyload/plugins/account/MegaDebridEu.py | 2 +- pyload/plugins/account/MegaRapidCz.py | 59 ++++ pyload/plugins/account/MegasharesCom.py | 2 +- pyload/plugins/account/MovReelCom.py | 2 +- pyload/plugins/account/MultishareCz.py | 2 +- pyload/plugins/account/MyfastfileCom.py | 2 +- pyload/plugins/account/NetloadIn.py | 2 +- pyload/plugins/account/NosuploadCom.py | 2 +- pyload/plugins/account/NovafileCom.py | 2 +- pyload/plugins/account/NowVideoAt.py | 56 ++++ pyload/plugins/account/OboomCom.py | 2 +- pyload/plugins/account/OneFichierCom.py | 2 +- pyload/plugins/account/OverLoadMe.py | 2 +- pyload/plugins/account/PremiumTo.py | 2 +- pyload/plugins/account/PremiumizeMe.py | 2 +- pyload/plugins/account/QuickshareCz.py | 2 +- pyload/plugins/account/RPNetBiz.py | 2 +- pyload/plugins/account/RapidfileshareNet.py | 18 ++ pyload/plugins/account/RapidgatorNet.py | 2 +- pyload/plugins/account/RapidshareCom.py | 2 +- pyload/plugins/account/RarefileNet.py | 2 +- pyload/plugins/account/RealdebridCom.py | 2 +- pyload/plugins/account/RehostTo.py | 2 +- pyload/plugins/account/RyushareCom.py | 2 +- pyload/plugins/account/SecureUploadEu.py | 2 +- pyload/plugins/account/SendmywayCom.py | 2 +- pyload/plugins/account/ShareonlineBiz.py | 2 +- pyload/plugins/account/SimplyPremiumCom.py | 2 +- pyload/plugins/account/SimplydebridCom.py | 2 +- pyload/plugins/account/StahnuTo.py | 2 +- pyload/plugins/account/StreamcloudEu.py | 2 +- pyload/plugins/account/TurbobitNet.py | 2 +- pyload/plugins/account/TusfilesNet.py | 2 +- pyload/plugins/account/UlozTo.py | 2 +- pyload/plugins/account/UnrestrictLi.py | 2 +- pyload/plugins/account/UploadcCom.py | 16 + pyload/plugins/account/UploadedTo.py | 2 +- pyload/plugins/account/UploadheroCom.py | 2 +- pyload/plugins/account/UploadingCom.py | 4 +- pyload/plugins/account/UptoboxCom.py | 2 +- pyload/plugins/account/VidPlayNet.py | 2 +- pyload/plugins/account/XFileSharingPro.py | 30 ++ pyload/plugins/account/YibaishiwuCom.py | 2 +- pyload/plugins/account/ZeveraCom.py | 2 +- pyload/plugins/addon/Checksum.py | 2 +- pyload/plugins/addon/ClickAndLoad.py | 2 +- pyload/plugins/addon/DeleteFinished.py | 2 +- pyload/plugins/addon/DownloadScheduler.py | 2 +- pyload/plugins/addon/ExternalScripts.py | 2 +- pyload/plugins/addon/ExtractArchive.py | 2 +- pyload/plugins/addon/HotFolder.py | 6 +- pyload/plugins/addon/IRCInterface.py | 2 +- pyload/plugins/addon/MergeFiles.py | 2 +- pyload/plugins/addon/MultiHome.py | 2 +- pyload/plugins/addon/RestartFailed.py | 2 +- pyload/plugins/addon/UnSkipOnFail.py | 2 +- pyload/plugins/addon/WindowsPhoneToastNotify.py | 2 +- pyload/plugins/base/Account.py | 305 ------------------- pyload/plugins/base/Addon.py | 150 ---------- pyload/plugins/base/Captcha.py | 49 --- pyload/plugins/base/Container.py | 64 ---- pyload/plugins/base/Crypter.py | 107 ------- pyload/plugins/base/Hook.py | 166 ----------- pyload/plugins/base/Hoster.py | 21 -- pyload/plugins/base/OCR.py | 314 -------------------- pyload/plugins/base/__init__.py | 0 pyload/plugins/captcha/AdsCaptcha.py | 26 +- pyload/plugins/captcha/ReCaptcha.py | 28 +- pyload/plugins/captcha/SolveMedia.py | 20 +- pyload/plugins/container/CCF.py | 2 +- pyload/plugins/container/LinkList.py | 2 +- pyload/plugins/container/RSDF.py | 4 +- pyload/plugins/crypter/ChipDe.py | 2 +- pyload/plugins/crypter/CzshareComFolder.py | 2 +- pyload/plugins/crypter/DDLMusicOrg.py | 2 +- pyload/plugins/crypter/DailymotionBatch.py | 2 +- pyload/plugins/crypter/Dereferer.py | 2 +- pyload/plugins/crypter/DontKnowMe.py | 2 +- pyload/plugins/crypter/DuckCryptInfo.py | 2 +- pyload/plugins/crypter/DuploadOrgFolder.py | 2 +- pyload/plugins/crypter/EasybytezComFolder.py | 2 +- pyload/plugins/crypter/EmbeduploadCom.py | 2 +- pyload/plugins/crypter/FileserveComFolder.py | 2 +- pyload/plugins/crypter/FilesonicComFolder.py | 15 + pyload/plugins/crypter/FiredriveComFolder.py | 2 +- pyload/plugins/crypter/FourChanOrg.py | 2 +- pyload/plugins/crypter/GooGl.py | 2 +- pyload/plugins/crypter/HoerbuchIn.py | 2 +- pyload/plugins/crypter/HotfileComFolder.py | 16 + pyload/plugins/crypter/JunocloudMeFolder.py | 20 ++ pyload/plugins/crypter/LetitbitNetFolder.py | 2 +- pyload/plugins/crypter/LinkCryptWs.py | 341 +++++++++++++++++++++ pyload/plugins/crypter/LinkSaveIn.py | 2 +- pyload/plugins/crypter/LinkdecrypterCom.py | 2 +- pyload/plugins/crypter/LixIn.py | 2 +- pyload/plugins/crypter/MediafireComFolder.py | 2 +- pyload/plugins/crypter/MegaRapidCzFolder.py | 20 ++ pyload/plugins/crypter/MegauploadComFolder.py | 15 + pyload/plugins/crypter/MultiloadCz.py | 2 +- pyload/plugins/crypter/NCryptIn.py | 2 +- pyload/plugins/crypter/OneKhDe.py | 2 +- pyload/plugins/crypter/QuickshareCzFolder.py | 2 +- pyload/plugins/crypter/RapidfileshareNetFolder.py | 20 ++ pyload/plugins/crypter/RelinkUs.py | 2 +- pyload/plugins/crypter/SafelinkingNet.py | 2 +- pyload/plugins/crypter/SexuriaCom.py | 94 ++++++ pyload/plugins/crypter/ShareLinksBiz.py | 2 +- pyload/plugins/crypter/SharingmatrixComFolder.py | 15 + pyload/plugins/crypter/TusfilesNetFolder.py | 2 +- pyload/plugins/crypter/UlozToFolder.py | 2 +- pyload/plugins/crypter/UploadedToFolder.py | 2 +- pyload/plugins/crypter/WuploadComFolder.py | 15 + pyload/plugins/crypter/XFileSharingProFolder.py | 47 +++ pyload/plugins/crypter/XupPl.py | 2 +- pyload/plugins/crypter/YoutubeBatch.py | 2 +- pyload/plugins/hook/BypassCaptcha.py | 2 +- pyload/plugins/hook/Captcha9kw.py | 2 +- pyload/plugins/hook/CaptchaBrotherhood.py | 2 +- pyload/plugins/hook/DeathByCaptcha.py | 2 +- pyload/plugins/hook/ExpertDecoders.py | 2 +- pyload/plugins/hook/ImageTyperz.py | 2 +- pyload/plugins/hook/LinkdecrypterCom.py | 2 +- pyload/plugins/hook/XFileSharingPro.py | 2 +- pyload/plugins/hoster/AlldebridCom.py | 2 +- pyload/plugins/hoster/BasePlugin.py | 2 +- pyload/plugins/hoster/BillionuploadsCom.py | 2 +- pyload/plugins/hoster/CramitIn.py | 2 +- pyload/plugins/hoster/DailymotionCom.py | 2 +- pyload/plugins/hoster/DebridItaliaCom.py | 2 +- pyload/plugins/hoster/EasybytezCom.py | 2 +- pyload/plugins/hoster/EnteruploadCom.py | 18 ++ pyload/plugins/hoster/FastixRu.py | 2 +- pyload/plugins/hoster/FileParadoxIn.py | 2 +- pyload/plugins/hoster/FileSharkPl.py | 137 +++++++++ pyload/plugins/hoster/FileomCom.py | 2 +- pyload/plugins/hoster/FilerioCom.py | 2 +- pyload/plugins/hoster/FilesMailRu.py | 2 +- pyload/plugins/hoster/FileserveCom.py | 2 +- pyload/plugins/hoster/FileshareInUa.py | 2 +- pyload/plugins/hoster/FilesonicCom.py | 19 ++ pyload/plugins/hoster/FiredriveCom.py | 2 +- pyload/plugins/hoster/FreakshareCom.py | 2 +- pyload/plugins/hoster/FreeWayMe.py | 2 +- pyload/plugins/hoster/Ftp.py | 2 +- pyload/plugins/hoster/GamefrontCom.py | 2 +- pyload/plugins/hoster/HugefilesNet.py | 2 +- pyload/plugins/hoster/HundredEightyUploadCom.py | 2 +- pyload/plugins/hoster/JunocloudMe.py | 29 ++ pyload/plugins/hoster/Keep2shareCc.py | 118 ++++++++ pyload/plugins/hoster/KickloadCom.py | 18 ++ pyload/plugins/hoster/LinksnappyCom.py | 2 +- pyload/plugins/hoster/LomafileCom.py | 2 +- pyload/plugins/hoster/MegaCoNz.py | 144 +++++++++ pyload/plugins/hoster/MegaDebridEu.py | 2 +- pyload/plugins/hoster/MegaRapidCz.py | 71 +++++ pyload/plugins/hoster/MegacrypterCom.py | 2 +- pyload/plugins/hoster/MegauploadCom.py | 18 ++ pyload/plugins/hoster/MegavideoCom.py | 19 ++ pyload/plugins/hoster/MovReelCom.py | 2 +- pyload/plugins/hoster/MyfastfileCom.py | 2 +- pyload/plugins/hoster/MyvideoDe.py | 2 +- pyload/plugins/hoster/NahrajCz.py | 18 ++ pyload/plugins/hoster/NetloadIn.py | 2 +- pyload/plugins/hoster/NosuploadCom.py | 2 +- pyload/plugins/hoster/NovafileCom.py | 2 +- pyload/plugins/hoster/NowVideoAt.py | 44 +++ pyload/plugins/hoster/OboomCom.py | 2 +- pyload/plugins/hoster/OronCom.py | 19 ++ pyload/plugins/hoster/OverLoadMe.py | 2 +- pyload/plugins/hoster/PandaplaNet.py | 18 ++ pyload/plugins/hoster/PornhostCom.py | 2 +- pyload/plugins/hoster/PornhubCom.py | 2 +- pyload/plugins/hoster/PremiumTo.py | 2 +- pyload/plugins/hoster/PremiumizeMe.py | 2 +- pyload/plugins/hoster/PrzeklejPl.py | 18 ++ pyload/plugins/hoster/RPNetBiz.py | 2 +- pyload/plugins/hoster/RapidfileshareNet.py | 31 ++ pyload/plugins/hoster/RapidshareCom.py | 2 +- pyload/plugins/hoster/RarefileNet.py | 2 +- pyload/plugins/hoster/RealdebridCom.py | 2 +- pyload/plugins/hoster/RedtubeCom.py | 2 +- pyload/plugins/hoster/RehostTo.py | 2 +- pyload/plugins/hoster/RyushareCom.py | 2 +- pyload/plugins/hoster/SecureUploadEu.py | 2 +- pyload/plugins/hoster/SendmywayCom.py | 2 +- pyload/plugins/hoster/ShareonlineBiz.py | 2 +- pyload/plugins/hoster/ShareplaceCom.py | 2 +- pyload/plugins/hoster/SharingmatrixCom.py | 19 ++ pyload/plugins/hoster/SimplyPremiumCom.py | 2 +- pyload/plugins/hoster/SimplydebridCom.py | 2 +- pyload/plugins/hoster/SockshareCom.py | 2 +- pyload/plugins/hoster/SoundcloudCom.py | 2 +- pyload/plugins/hoster/StorageTo.py | 18 ++ pyload/plugins/hoster/StreamCz.py | 2 +- pyload/plugins/hoster/StreamcloudEu.py | 2 +- pyload/plugins/hoster/TusfilesNet.py | 2 +- pyload/plugins/hoster/UnrestrictLi.py | 2 +- pyload/plugins/hoster/UpleaCom.py | 60 ++++ pyload/plugins/hoster/UploadboxCom.py | 18 ++ pyload/plugins/hoster/UploadedTo.py | 2 +- pyload/plugins/hoster/UploadhereCom.py | 18 ++ pyload/plugins/hoster/UploadkingCom.py | 18 ++ pyload/plugins/hoster/UptoboxCom.py | 2 +- pyload/plugins/hoster/VeehdCom.py | 2 +- pyload/plugins/hoster/VidPlayNet.py | 2 +- pyload/plugins/hoster/WebshareCz.py | 2 +- pyload/plugins/hoster/XHamsterCom.py | 2 +- pyload/plugins/hoster/XVideosCom.py | 2 +- pyload/plugins/hoster/Xdcc.py | 2 +- pyload/plugins/hoster/YoupornCom.py | 2 +- pyload/plugins/hoster/YourfilesTo.py | 2 +- pyload/plugins/hoster/YoutubeCom.py | 2 +- pyload/plugins/hoster/ZDF.py | 2 +- pyload/plugins/hoster/ZeveraCom.py | 2 +- pyload/plugins/internal/Account.py | 305 +++++++++++++++++++ pyload/plugins/internal/Addon.py | 166 +++++++++++ pyload/plugins/internal/Captcha.py | 51 ++++ pyload/plugins/internal/Container.py | 64 ++++ pyload/plugins/internal/Crypter.py | 107 +++++++ pyload/plugins/internal/DeadCrypter.py | 2 +- pyload/plugins/internal/DeadHoster.py | 2 +- pyload/plugins/internal/Hoster.py | 21 ++ pyload/plugins/internal/MultiHoster.py | 4 +- pyload/plugins/internal/OCR.py | 314 ++++++++++++++++++++ pyload/plugins/internal/SimpleCrypter.py | 6 +- pyload/plugins/internal/SimpleHoster.py | 4 +- pyload/plugins/internal/UpdateManager.py | 2 +- pyload/plugins/internal/XFSAccount.py | 122 ++++++++ pyload/plugins/internal/XFSCrypter.py | 29 ++ pyload/plugins/internal/XFSHoster.py | 345 ++++++++++++++++++++++ pyload/plugins/internal/XFSPAccount.py | 96 ------ pyload/plugins/internal/XFSPHoster.py | 54 ---- pyload/plugins/ocr/GigasizeCom.py | 2 +- pyload/plugins/ocr/LinksaveIn.py | 2 +- pyload/plugins/ocr/NetloadIn.py | 2 +- pyload/plugins/ocr/ShareonlineBiz.py | 2 +- 275 files changed, 3632 insertions(+), 1584 deletions(-) create mode 100644 pyload/plugins/account/CatShareNet.py create mode 100644 pyload/plugins/account/JunocloudMe.py create mode 100644 pyload/plugins/account/Keep2shareCc.py create mode 100644 pyload/plugins/account/LinestorageCom.py create mode 100644 pyload/plugins/account/MegaRapidCz.py create mode 100644 pyload/plugins/account/NowVideoAt.py create mode 100644 pyload/plugins/account/RapidfileshareNet.py create mode 100644 pyload/plugins/account/UploadcCom.py create mode 100644 pyload/plugins/account/XFileSharingPro.py delete mode 100644 pyload/plugins/base/Account.py delete mode 100644 pyload/plugins/base/Addon.py delete mode 100644 pyload/plugins/base/Captcha.py delete mode 100644 pyload/plugins/base/Container.py delete mode 100644 pyload/plugins/base/Crypter.py delete mode 100644 pyload/plugins/base/Hook.py delete mode 100644 pyload/plugins/base/Hoster.py delete mode 100644 pyload/plugins/base/OCR.py delete mode 100644 pyload/plugins/base/__init__.py create mode 100644 pyload/plugins/crypter/FilesonicComFolder.py create mode 100644 pyload/plugins/crypter/HotfileComFolder.py create mode 100644 pyload/plugins/crypter/JunocloudMeFolder.py create mode 100644 pyload/plugins/crypter/LinkCryptWs.py create mode 100644 pyload/plugins/crypter/MegaRapidCzFolder.py create mode 100644 pyload/plugins/crypter/MegauploadComFolder.py create mode 100644 pyload/plugins/crypter/RapidfileshareNetFolder.py create mode 100644 pyload/plugins/crypter/SexuriaCom.py create mode 100644 pyload/plugins/crypter/SharingmatrixComFolder.py create mode 100644 pyload/plugins/crypter/WuploadComFolder.py create mode 100644 pyload/plugins/crypter/XFileSharingProFolder.py create mode 100644 pyload/plugins/hoster/EnteruploadCom.py create mode 100644 pyload/plugins/hoster/FileSharkPl.py create mode 100644 pyload/plugins/hoster/FilesonicCom.py create mode 100644 pyload/plugins/hoster/JunocloudMe.py create mode 100644 pyload/plugins/hoster/Keep2shareCc.py create mode 100644 pyload/plugins/hoster/KickloadCom.py create mode 100644 pyload/plugins/hoster/MegaCoNz.py create mode 100644 pyload/plugins/hoster/MegaRapidCz.py create mode 100644 pyload/plugins/hoster/MegauploadCom.py create mode 100644 pyload/plugins/hoster/MegavideoCom.py create mode 100644 pyload/plugins/hoster/NahrajCz.py create mode 100644 pyload/plugins/hoster/NowVideoAt.py create mode 100644 pyload/plugins/hoster/OronCom.py create mode 100644 pyload/plugins/hoster/PandaplaNet.py create mode 100644 pyload/plugins/hoster/PrzeklejPl.py create mode 100644 pyload/plugins/hoster/RapidfileshareNet.py create mode 100644 pyload/plugins/hoster/SharingmatrixCom.py create mode 100644 pyload/plugins/hoster/StorageTo.py create mode 100644 pyload/plugins/hoster/UpleaCom.py create mode 100644 pyload/plugins/hoster/UploadboxCom.py create mode 100644 pyload/plugins/hoster/UploadhereCom.py create mode 100644 pyload/plugins/hoster/UploadkingCom.py create mode 100644 pyload/plugins/internal/Account.py create mode 100644 pyload/plugins/internal/Addon.py create mode 100644 pyload/plugins/internal/Captcha.py create mode 100644 pyload/plugins/internal/Container.py create mode 100644 pyload/plugins/internal/Crypter.py create mode 100644 pyload/plugins/internal/Hoster.py create mode 100644 pyload/plugins/internal/OCR.py create mode 100644 pyload/plugins/internal/XFSAccount.py create mode 100644 pyload/plugins/internal/XFSCrypter.py create mode 100644 pyload/plugins/internal/XFSHoster.py delete mode 100644 pyload/plugins/internal/XFSPAccount.py delete mode 100644 pyload/plugins/internal/XFSPHoster.py (limited to 'pyload/plugins') diff --git a/pyload/plugins/Plugin.py b/pyload/plugins/Plugin.py index c59d64911..a4b4cf74e 100644 --- a/pyload/plugins/Plugin.py +++ b/pyload/plugins/Plugin.py @@ -16,7 +16,7 @@ from itertools import islice from traceback import print_exc from urlparse import urlparse -from module.utils import fs_decode, fs_encode, html_unescape, save_join, save_path +from pyload.utils import fs_decode, fs_encode, html_unescape, safe_join def chunks(iterable, size): it = iter(iterable) @@ -100,7 +100,7 @@ class Base(object): :param value: :return: """ - self.core.config.setPlugin(self.__name__, option, value) + self.core.config.setPlugin(self.__name__, option, value) #: Deprecated method @@ -154,7 +154,7 @@ class Plugin(Base): __type__ = "hoster" __version__ = "0.07" - __pattern__ = None + __pattern__ = r'^unmatchable$' __config__ = [] #: [("name", "type", "desc", "default")] __description__ = """Base plugin""" @@ -541,7 +541,7 @@ class Plugin(Base): from inspect import currentframe frame = currentframe() - framefile = save_join("tmp", self.__name__, "%s_line%s.dump.html" % (frame.f_back.f_code.co_name, frame.f_back.f_lineno)) + framefile = safe_join("tmp", self.__name__, "%s_line%s.dump.html" % (frame.f_back.f_code.co_name, frame.f_back.f_lineno)) try: if not exists(join("tmp", self.__name__)): makedirs(join("tmp", self.__name__)) diff --git a/pyload/plugins/account/AlldebridCom.py b/pyload/plugins/account/AlldebridCom.py index daf844a40..d4770426b 100644 --- a/pyload/plugins/account/AlldebridCom.py +++ b/pyload/plugins/account/AlldebridCom.py @@ -8,7 +8,7 @@ from urllib import urlencode from BeautifulSoup import BeautifulSoup -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class AlldebridCom(Account): diff --git a/pyload/plugins/account/BayfilesCom.py b/pyload/plugins/account/BayfilesCom.py index 85dba44fb..34163d0cc 100644 --- a/pyload/plugins/account/BayfilesCom.py +++ b/pyload/plugins/account/BayfilesCom.py @@ -2,7 +2,7 @@ from time import time -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/BillionuploadsCom.py b/pyload/plugins/account/BillionuploadsCom.py index 11af36591..b1f621ecb 100644 --- a/pyload/plugins/account/BillionuploadsCom.py +++ b/pyload/plugins/account/BillionuploadsCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class BillionuploadsCom(XFSAccount): diff --git a/pyload/plugins/account/BitshareCom.py b/pyload/plugins/account/BitshareCom.py index d35f3ce29..44b2818cf 100644 --- a/pyload/plugins/account/BitshareCom.py +++ b/pyload/plugins/account/BitshareCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class BitshareCom(Account): diff --git a/pyload/plugins/account/CatShareNet.py b/pyload/plugins/account/CatShareNet.py new file mode 100644 index 000000000..30a2691da --- /dev/null +++ b/pyload/plugins/account/CatShareNet.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- + +import re + +from time import mktime, strptime + +from pyload.plugins.internal.Account import Account + + +class CatShareNet(Account): + __name__ = "CatShareNet" + __type__ = "account" + __version__ = "0.01" + + __description__ = """CatShareNet account plugin""" + __license__ = "GPLv3" + __authors__ = [("prOq", None)] + + + PREMIUM_PATTERN = r'class="nav-collapse collapse pull-right">[\s\w<>=-."/:]*\sz.\s*
  • .*\s*(.*?)[\s\w<>/]*href="/logout"' + VALID_UNTIL_PATTERN = r'
    [\s\w<>=-":;]*.*?(.*?)' + + + def loadAccountInfo(self, user, req): + premium = False + validuntil = -1 + + html = req.load("http://catshare.net/", decode=True) + + try: + m = re.search(self.PREMIUM_PATTERN, html) + if "Premium" in m.group(1): + premium = True + except: + pass + + try: + m = re.search(self.VALID_UNTIL_PATTERN, html) + expiredate = m.group(1) + if "-" not in expiredate: + validuntil = mktime(strptime(expiredate, "%d.%m.%Y")) + except: + pass + + return {'premium': premium, 'trafficleft': -1, 'validuntil': validuntil} + + + def login(self, user, data, req): + html = req.load("http://catshare.net/login", + post={'user_email': user, + 'user_password': data['password'], + 'remindPassword': 0, + 'user[submit]': "Login"}) + + if not 'Wyloguj' in html: + self.wrongPassword() diff --git a/pyload/plugins/account/CramitIn.py b/pyload/plugins/account/CramitIn.py index a9e2274a2..42b7cc7b2 100644 --- a/pyload/plugins/account/CramitIn.py +++ b/pyload/plugins/account/CramitIn.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class CramitIn(XFSAccount): diff --git a/pyload/plugins/account/CzshareCom.py b/pyload/plugins/account/CzshareCom.py index 54163c425..786832e8d 100644 --- a/pyload/plugins/account/CzshareCom.py +++ b/pyload/plugins/account/CzshareCom.py @@ -3,7 +3,7 @@ from time import mktime, strptime import re -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class CzshareCom(Account): diff --git a/pyload/plugins/account/DebridItaliaCom.py b/pyload/plugins/account/DebridItaliaCom.py index cdeb0a9f1..30ed9fb1c 100644 --- a/pyload/plugins/account/DebridItaliaCom.py +++ b/pyload/plugins/account/DebridItaliaCom.py @@ -3,7 +3,7 @@ import re import time -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class DebridItaliaCom(Account): diff --git a/pyload/plugins/account/DepositfilesCom.py b/pyload/plugins/account/DepositfilesCom.py index 47d720322..df3ebe4f2 100644 --- a/pyload/plugins/account/DepositfilesCom.py +++ b/pyload/plugins/account/DepositfilesCom.py @@ -4,7 +4,7 @@ import re from time import strptime, mktime -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class DepositfilesCom(Account): diff --git a/pyload/plugins/account/EasybytezCom.py b/pyload/plugins/account/EasybytezCom.py index f368840ef..b1fb6a213 100644 --- a/pyload/plugins/account/EasybytezCom.py +++ b/pyload/plugins/account/EasybytezCom.py @@ -4,7 +4,7 @@ import re from time import mktime, strptime, gmtime -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount from pyload.utils import parseFileSize diff --git a/pyload/plugins/account/EuroshareEu.py b/pyload/plugins/account/EuroshareEu.py index e3ed51464..5ec543433 100644 --- a/pyload/plugins/account/EuroshareEu.py +++ b/pyload/plugins/account/EuroshareEu.py @@ -3,7 +3,7 @@ from time import mktime, strptime import re -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class EuroshareEu(Account): diff --git a/pyload/plugins/account/FastixRu.py b/pyload/plugins/account/FastixRu.py index 6dacb8b11..96db443b7 100644 --- a/pyload/plugins/account/FastixRu.py +++ b/pyload/plugins/account/FastixRu.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/FastshareCz.py b/pyload/plugins/account/FastshareCz.py index 1a7dff4b1..b61d6b23f 100644 --- a/pyload/plugins/account/FastshareCz.py +++ b/pyload/plugins/account/FastshareCz.py @@ -2,8 +2,8 @@ import re -from pyload.plugins.base.Account import Account -from module.utils import parseFileSize +from pyload.plugins.internal.Account import Account +from pyload.utils import parseFileSize class FastshareCz(Account): diff --git a/pyload/plugins/account/File4safeCom.py b/pyload/plugins/account/File4safeCom.py index 20053d895..42b67e08f 100644 --- a/pyload/plugins/account/File4safeCom.py +++ b/pyload/plugins/account/File4safeCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class File4safeCom(XFSAccount): diff --git a/pyload/plugins/account/FileParadoxIn.py b/pyload/plugins/account/FileParadoxIn.py index c12d99d6a..cee7bec2f 100644 --- a/pyload/plugins/account/FileParadoxIn.py +++ b/pyload/plugins/account/FileParadoxIn.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class FileParadoxIn(XFSAccount): diff --git a/pyload/plugins/account/FilecloudIo.py b/pyload/plugins/account/FilecloudIo.py index 0d5126fc0..b52521093 100644 --- a/pyload/plugins/account/FilecloudIo.py +++ b/pyload/plugins/account/FilecloudIo.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/FilefactoryCom.py b/pyload/plugins/account/FilefactoryCom.py index 7eedb59a1..0d7c1ff0e 100644 --- a/pyload/plugins/account/FilefactoryCom.py +++ b/pyload/plugins/account/FilefactoryCom.py @@ -5,7 +5,7 @@ from time import mktime, strptime from pycurl import REFERER -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class FilefactoryCom(Account): diff --git a/pyload/plugins/account/FilejungleCom.py b/pyload/plugins/account/FilejungleCom.py index c8b7bb655..8abb89788 100644 --- a/pyload/plugins/account/FilejungleCom.py +++ b/pyload/plugins/account/FilejungleCom.py @@ -3,7 +3,7 @@ import re from time import mktime, strptime -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class FilejungleCom(Account): diff --git a/pyload/plugins/account/FileomCom.py b/pyload/plugins/account/FileomCom.py index 7c743f56a..04f503b3b 100644 --- a/pyload/plugins/account/FileomCom.py +++ b/pyload/plugins/account/FileomCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class FileomCom(XFSAccount): diff --git a/pyload/plugins/account/FilerNet.py b/pyload/plugins/account/FilerNet.py index 193dd6eb3..f9b5efdd3 100644 --- a/pyload/plugins/account/FilerNet.py +++ b/pyload/plugins/account/FilerNet.py @@ -3,7 +3,7 @@ import re import time -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class FilerNet(Account): diff --git a/pyload/plugins/account/FilerioCom.py b/pyload/plugins/account/FilerioCom.py index 4c6755293..27d8df13f 100644 --- a/pyload/plugins/account/FilerioCom.py +++ b/pyload/plugins/account/FilerioCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class FilerioCom(XFSAccount): diff --git a/pyload/plugins/account/FilesMailRu.py b/pyload/plugins/account/FilesMailRu.py index c8d8d9270..bfd9d7ffb 100644 --- a/pyload/plugins/account/FilesMailRu.py +++ b/pyload/plugins/account/FilesMailRu.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class FilesMailRu(Account): diff --git a/pyload/plugins/account/FileserveCom.py b/pyload/plugins/account/FileserveCom.py index 773fc9117..5a014ab03 100644 --- a/pyload/plugins/account/FileserveCom.py +++ b/pyload/plugins/account/FileserveCom.py @@ -2,7 +2,7 @@ from time import mktime, strptime -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/FourSharedCom.py b/pyload/plugins/account/FourSharedCom.py index 766998ccc..110572faa 100644 --- a/pyload/plugins/account/FourSharedCom.py +++ b/pyload/plugins/account/FourSharedCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/FreakshareCom.py b/pyload/plugins/account/FreakshareCom.py index 742ede902..12c5277a6 100644 --- a/pyload/plugins/account/FreakshareCom.py +++ b/pyload/plugins/account/FreakshareCom.py @@ -4,7 +4,7 @@ import re from time import strptime, mktime -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class FreakshareCom(Account): diff --git a/pyload/plugins/account/FreeWayMe.py b/pyload/plugins/account/FreeWayMe.py index 2c48d54f4..db879c052 100644 --- a/pyload/plugins/account/FreeWayMe.py +++ b/pyload/plugins/account/FreeWayMe.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/FshareVn.py b/pyload/plugins/account/FshareVn.py index b449018bc..ee8aacaf9 100644 --- a/pyload/plugins/account/FshareVn.py +++ b/pyload/plugins/account/FshareVn.py @@ -4,7 +4,7 @@ from time import mktime, strptime from pycurl import REFERER import re -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class FshareVn(Account): diff --git a/pyload/plugins/account/Ftp.py b/pyload/plugins/account/Ftp.py index 90a8a8768..d439512ce 100644 --- a/pyload/plugins/account/Ftp.py +++ b/pyload/plugins/account/Ftp.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class Ftp(Account): @@ -13,4 +13,5 @@ class Ftp(Account): __authors__ = [("zoidberg", "zoidberg@mujmail.cz")] - login_timeout = info_threshold = -1 #: Unlimited + login_timeout = -1 #: Unlimited + info_threshold = -1 #: Unlimited diff --git a/pyload/plugins/account/HellshareCz.py b/pyload/plugins/account/HellshareCz.py index cd02c8462..1b93cf77d 100644 --- a/pyload/plugins/account/HellshareCz.py +++ b/pyload/plugins/account/HellshareCz.py @@ -3,7 +3,7 @@ import re import time -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class HellshareCz(Account): diff --git a/pyload/plugins/account/Http.py b/pyload/plugins/account/Http.py index 3f3d4d66f..8c0aeb2e4 100644 --- a/pyload/plugins/account/Http.py +++ b/pyload/plugins/account/Http.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class Http(Account): @@ -13,4 +13,5 @@ class Http(Account): __authors__ = [("zoidberg", "zoidberg@mujmail.cz")] - login_timeout = info_threshold = -1 #: Unlimited + login_timeout = -1 #: Unlimited + info_threshold = -1 #: Unlimited diff --git a/pyload/plugins/account/HugefilesNet.py b/pyload/plugins/account/HugefilesNet.py index 5da3bbc37..242ae118c 100644 --- a/pyload/plugins/account/HugefilesNet.py +++ b/pyload/plugins/account/HugefilesNet.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class HugefilesNet(XFSAccount): diff --git a/pyload/plugins/account/HundredEightyUploadCom.py b/pyload/plugins/account/HundredEightyUploadCom.py index 39f91a8af..89d779e52 100644 --- a/pyload/plugins/account/HundredEightyUploadCom.py +++ b/pyload/plugins/account/HundredEightyUploadCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class HundredEightyUploadCom(XFSAccount): diff --git a/pyload/plugins/account/JunocloudMe.py b/pyload/plugins/account/JunocloudMe.py new file mode 100644 index 000000000..14fe8ddd7 --- /dev/null +++ b/pyload/plugins/account/JunocloudMe.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.XFSAccount import XFSAccount + + +class JunocloudMe(XFSAccount): + __name__ = "JunocloudMe" + __type__ = "account" + __version__ = "0.02" + + __description__ = """Junocloud.me account plugin""" + __license__ = "GPLv3" + __authors__ = [("guidobelix", "guidobelix@hotmail.it")] + + + HOSTER_DOMAIN = "junocloud.me" diff --git a/pyload/plugins/account/Keep2shareCc.py b/pyload/plugins/account/Keep2shareCc.py new file mode 100644 index 000000000..af870cfd0 --- /dev/null +++ b/pyload/plugins/account/Keep2shareCc.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- + +import re + +from time import gmtime, mktime, strptime + +from pyload.plugins.internal.Account import Account + + +class Keep2shareCc(Account): + __name__ = "Keep2shareCc" + __type__ = "account" + __version__ = "0.02" + + __description__ = """Keep2share.cc account plugin""" + __license__ = "GPLv3" + __authors__ = [("aeronaut", "aeronaut@pianoguy.de")] + + + VALID_UNTIL_PATTERN = r'Premium expires: (.+?)' + TRAFFIC_LEFT_PATTERN = r'Available traffic \(today\):(.+?)' + + LOGIN_FAIL_PATTERN = r'Please fix the following input errors' + + + def loadAccountInfo(self, user, req): + validuntil = None + trafficleft = None + premium = None + + html = req.load("http://keep2share.cc/site/profile.html", decode=True) + + m = re.search(self.VALID_UNTIL_PATTERN, html) + if m: + expiredate = m.group(1).strip() + self.logDebug("Expire date: " + expiredate) + + try: + validuntil = mktime(strptime(expiredate, "%Y.%m.%d")) + + except Exception, e: + self.logError(e) + + else: + if validuntil > mktime(gmtime()): + premium = True + else: + premium = False + validuntil = None + + m = re.search(self.TRAFFIC_LEFT_PATTERN, html) + if m: + try: + trafficleft = self.parseTraffic(m.group(1)) + + except Exception, e: + self.logError(e) + + return {'validuntil': validuntil, 'trafficleft': trafficleft, 'premium': premium} + + + def login(self, user, data, req): + req.cj.setCookie(".keep2share.cc", "lang", "en") + + html = req.load("http://keep2share.cc/login.html", + post={'LoginForm[username]': user, 'LoginForm[password]': data['password']}) + + if re.search(self.LOGIN_FAIL_PATTERN, html): + self.wrongPassword() diff --git a/pyload/plugins/account/LetitbitNet.py b/pyload/plugins/account/LetitbitNet.py index 41823418d..5bf6de00c 100644 --- a/pyload/plugins/account/LetitbitNet.py +++ b/pyload/plugins/account/LetitbitNet.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account # from pyload.utils import json_loads, json_dumps diff --git a/pyload/plugins/account/LinestorageCom.py b/pyload/plugins/account/LinestorageCom.py new file mode 100644 index 000000000..351d66d48 --- /dev/null +++ b/pyload/plugins/account/LinestorageCom.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.XFSAccount import XFSAccount + + +class LinestorageCom(XFSAccount): + __name__ = "LinestorageCom" + __type__ = "account" + __version__ = "0.02" + + __description__ = """Linestorage.com account plugin""" + __license__ = "GPLv3" + __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] + + + HOSTER_DOMAIN = "linestorage.com" diff --git a/pyload/plugins/account/LinksnappyCom.py b/pyload/plugins/account/LinksnappyCom.py index 912c2b4cb..028465522 100644 --- a/pyload/plugins/account/LinksnappyCom.py +++ b/pyload/plugins/account/LinksnappyCom.py @@ -2,7 +2,7 @@ from hashlib import md5 -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/LomafileCom.py b/pyload/plugins/account/LomafileCom.py index cfd21679c..937b24fae 100644 --- a/pyload/plugins/account/LomafileCom.py +++ b/pyload/plugins/account/LomafileCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class LomafileCom(XFSAccount): diff --git a/pyload/plugins/account/MegaDebridEu.py b/pyload/plugins/account/MegaDebridEu.py index 50f24b83d..3db0caa35 100644 --- a/pyload/plugins/account/MegaDebridEu.py +++ b/pyload/plugins/account/MegaDebridEu.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/MegaRapidCz.py b/pyload/plugins/account/MegaRapidCz.py new file mode 100644 index 000000000..a75e313ff --- /dev/null +++ b/pyload/plugins/account/MegaRapidCz.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- + +import re + +from time import mktime, strptime +from pyload.plugins.internal.Account import Account + + +class MegaRapidCz(Account): + __name__ = "MegaRapidCz" + __type__ = "account" + __version__ = "0.34" + + __description__ = """MegaRapid.cz account plugin""" + __license__ = "GPLv3" + __authors__ = [("MikyWoW", "mikywow@seznam.cz"), + ("zoidberg", "zoidberg@mujmail.cz")] + + + login_timeout = 60 + + LIMITDL_PATTERN = ur'Max. počet paralelních stahování: (\d+)' + VALID_UNTIL_PATTERN = ur'Paušální stahování aktivní. Vyprší (.*?)' + TRAFFIC_LEFT_PATTERN = r'Kredit(.*?) GiB' + + + def loadAccountInfo(self, user, req): + html = req.load("http://megarapid.cz/mujucet/", decode=True) + + m = re.search(self.LIMITDL_PATTERN, html) + if m: + data = self.getAccountData(user) + data['options']['limitDL'] = [int(m.group(1))] + + m = re.search(self.VALID_UNTIL_PATTERN, html) + if m: + validuntil = mktime(strptime(m.group(1), "%d.%m.%Y - %H:%M")) + return {"premium": True, "trafficleft": -1, "validuntil": validuntil} + + m = re.search(self.TRAFFIC_LEFT_PATTERN, html) + if m: + trafficleft = float(m.group(1)) * (1 << 20) + return {"premium": True, "trafficleft": trafficleft, "validuntil": -1} + + return {"premium": False, "trafficleft": None, "validuntil": None} + + + def login(self, user, data, req): + htm = req.load("http://megarapid.cz/prihlaseni/") + if "Heslo:" in htm: + start = htm.index('id="inp_hash" name="hash" value="') + htm = htm[start + 33:] + hashes = htm[0:32] + htm = req.load("http://megarapid.cz/prihlaseni/", + post={"hash": hashes, + "login": user, + "pass1": data['password'], + "remember": 0, + "sbmt": u"Přihlásit"}) diff --git a/pyload/plugins/account/MegasharesCom.py b/pyload/plugins/account/MegasharesCom.py index 5931e4e7e..b2f439b45 100644 --- a/pyload/plugins/account/MegasharesCom.py +++ b/pyload/plugins/account/MegasharesCom.py @@ -3,7 +3,7 @@ import re from time import mktime, strptime -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class MegasharesCom(Account): diff --git a/pyload/plugins/account/MovReelCom.py b/pyload/plugins/account/MovReelCom.py index 6128cddc8..7a00af5d3 100644 --- a/pyload/plugins/account/MovReelCom.py +++ b/pyload/plugins/account/MovReelCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class MovReelCom(XFSAccount): diff --git a/pyload/plugins/account/MultishareCz.py b/pyload/plugins/account/MultishareCz.py index 9eb0b50b2..9dc5b1ff0 100644 --- a/pyload/plugins/account/MultishareCz.py +++ b/pyload/plugins/account/MultishareCz.py @@ -2,7 +2,7 @@ import re -from module.plugins.Account import Account +from pyload.plugins.internal.Account import Account class MultishareCz(Account): diff --git a/pyload/plugins/account/MyfastfileCom.py b/pyload/plugins/account/MyfastfileCom.py index 33cc3a694..acc09ad8b 100644 --- a/pyload/plugins/account/MyfastfileCom.py +++ b/pyload/plugins/account/MyfastfileCom.py @@ -2,7 +2,7 @@ from time import time -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/NetloadIn.py b/pyload/plugins/account/NetloadIn.py index 2d6ae6eea..6e780225a 100644 --- a/pyload/plugins/account/NetloadIn.py +++ b/pyload/plugins/account/NetloadIn.py @@ -3,7 +3,7 @@ import re from time import time -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class NetloadIn(Account): diff --git a/pyload/plugins/account/NosuploadCom.py b/pyload/plugins/account/NosuploadCom.py index e523ee2f4..9c11699ec 100644 --- a/pyload/plugins/account/NosuploadCom.py +++ b/pyload/plugins/account/NosuploadCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class NosuploadCom(XFSAccount): diff --git a/pyload/plugins/account/NovafileCom.py b/pyload/plugins/account/NovafileCom.py index ab61bf0fc..cb3a639f5 100644 --- a/pyload/plugins/account/NovafileCom.py +++ b/pyload/plugins/account/NovafileCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSAccount import XFSAccount +from pyload.plugins.internal.XFSAccount import XFSAccount class NovafileCom(XFSAccount): diff --git a/pyload/plugins/account/NowVideoAt.py b/pyload/plugins/account/NowVideoAt.py new file mode 100644 index 000000000..7af8bc4bc --- /dev/null +++ b/pyload/plugins/account/NowVideoAt.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- + +import re + +from time import gmtime, mktime, strptime + +from pyload.plugins.internal.Account import Account + + +class NowVideoAt(Account): + __name__ = "NowVideoAt" + __type__ = "account" + __version__ = "0.01" + + __description__ = """NowVideo.at account plugin""" + __license__ = "GPLv3" + __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] + + + VALID_UNTIL_PATTERN = r'>Your premium membership expires on: (.+?)<' + + + def loadAccountInfo(self, user, req): + validuntil = None + trafficleft = -1 + premium = None + + html = req.load("http://www.nowvideo.at/premium.php") + + m = re.search(self.VALID_UNTIL_PATTERN, html) + if m: + expiredate = m.group(1).strip() + self.logDebug("Expire date: " + expiredate) + + try: + validuntil = mktime(strptime(expiredate, "%Y-%b-%d")) + + except Exception, e: + self.logError(e) + + else: + if validuntil > mktime(gmtime()): + premium = True + else: + premium = False + validuntil = -1 + + return {"validuntil": validuntil, "trafficleft": trafficleft, "premium": premium} + + + def login(self, user, data, req): + html = req.load("http://www.nowvideo.at/login.php", + post={'user': user, 'pass': data['password']}) + + if ">Invalid login details" is html: + self.wrongPassword() diff --git a/pyload/plugins/account/OboomCom.py b/pyload/plugins/account/OboomCom.py index 71663bc3f..4f7f476e2 100644 --- a/pyload/plugins/account/OboomCom.py +++ b/pyload/plugins/account/OboomCom.py @@ -5,7 +5,7 @@ import time from beaker.crypto.pbkdf2 import PBKDF2 from pyload.utils import json_loads -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class OboomCom(Account): diff --git a/pyload/plugins/account/OneFichierCom.py b/pyload/plugins/account/OneFichierCom.py index 857fd20b5..7f1140e67 100644 --- a/pyload/plugins/account/OneFichierCom.py +++ b/pyload/plugins/account/OneFichierCom.py @@ -6,7 +6,7 @@ from time import strptime, mktime from pycurl import REFERER -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class OneFichierCom(Account): diff --git a/pyload/plugins/account/OverLoadMe.py b/pyload/plugins/account/OverLoadMe.py index d011cf063..cda4bc82f 100644 --- a/pyload/plugins/account/OverLoadMe.py +++ b/pyload/plugins/account/OverLoadMe.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/PremiumTo.py b/pyload/plugins/account/PremiumTo.py index 2943ba41c..f7a00e194 100644 --- a/pyload/plugins/account/PremiumTo.py +++ b/pyload/plugins/account/PremiumTo.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account class PremiumTo(Account): diff --git a/pyload/plugins/account/PremiumizeMe.py b/pyload/plugins/account/PremiumizeMe.py index 4071e0ad2..5f972ca8b 100644 --- a/pyload/plugins/account/PremiumizeMe.py +++ b/pyload/plugins/account/PremiumizeMe.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/QuickshareCz.py b/pyload/plugins/account/QuickshareCz.py index 18af5f736..40bf9d06d 100644 --- a/pyload/plugins/account/QuickshareCz.py +++ b/pyload/plugins/account/QuickshareCz.py @@ -2,7 +2,7 @@ import re -from module.plugins.Account import Account +from pyload.plugins.internal.Account import Account class QuickshareCz(Account): diff --git a/pyload/plugins/account/RPNetBiz.py b/pyload/plugins/account/RPNetBiz.py index 442355a8c..417ca14a4 100644 --- a/pyload/plugins/account/RPNetBiz.py +++ b/pyload/plugins/account/RPNetBiz.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Account import Account +from pyload.plugins.internal.Account import Account from pyload.utils import json_loads diff --git a/pyload/plugins/account/RapidfileshareNet.py b/pyload/plugins/account/RapidfileshareNet.py new file mode 100644 index 000000000..503c731fe --- /dev/null +++ b/pyload/plugins/account/RapidfileshareNet.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.XFSAccount import XFSAccount + + +class RapidfileshareNet(XFSAccount): + __name__ = "RapidfileshareNet" + __type__ = "account" + __version__ = "0.05" + + __description__ = """Rapidfileshare.net account plugin""" + __license__ = "GPLv3" + __authors__ = [("guidobelix", "guidobelix@hotmail.it")] + + + HOSTER_DOMAIN = "rapidfileshare.net" + + TRAFFIC_LEFT_PATTERN = r'>Traffic available today:
    .*?bgcolor="#EFEFEF">(?P.*?)', flags=re.I | re.S) + PATTERN_DL_LINK_PAGE = re.compile(r'"(dl_links_\d+_\d+\.html)"', flags=re.I) + PATTERN_REDIRECT_LINKS = re.compile(r'value="(http://sexuria\.com/out\.php\?id=\d+\&part=\d+\&link=\d+)" readonly', flags=re.I) + + + def decrypt(self, pyfile): + # Init + self.pyfile = pyfile + self.package = pyfile.package() + + # Get package links + package_name, self.links, folder_name, package_pwd = self.decryptLinks(self.pyfile.url) + self.packages = [(package_name, self.links, folder_name)] + + + def decryptLinks(self, url): + linklist = [] + name = self.package.name + folder = self.package.folder + password = None + + if re.match(self.PATTERN_SUPPORTED_MAIN, url): + # Processing main page + html = self.load(url) + links = re.findall(self.PATTERN_DL_LINK_PAGE, html) + for link in links: + linklist.append("http://sexuria.com/v1/" + link) + + elif re.match(self.PATTERN_SUPPORTED_REDIRECT, url): + # Processing direct redirect link (out.php), redirecting to main page + id = re.search(self.PATTERN_SUPPORTED_REDIRECT, url).group('ID') + if id: + linklist.append("http://sexuria.com/v1/Pornos_Kostenlos_liebe_%s.html" % id) + + elif re.match(self.PATTERN_SUPPORTED_CRYPT, url): + # Extract info from main file + id = re.search(self.PATTERN_SUPPORTED_CRYPT, url).group('ID') + html = self.load("http://sexuria.com/v1/Pornos_Kostenlos_info_%s.html" % id, decode=True) + + title = re.search(self.PATTERN_TITLE, html).group('TITLE').strip() + if title: + name = folder = title + self.logDebug("Package info found, name [%s] and folder [%s]" % (name, folder)) + + pwd = re.search(self.PATTERN_PASSWORD, html).group('PWD') + if pwd: + password = pwd.strip() + self.logDebug("Password info [%s] found" % password) + + # Process link (dl_link) + html = self.load(url) + links = re.findall(self.PATTERN_REDIRECT_LINKS, html) + if len(links) == 0: + self.LogError("Broken for link %s" % link) + else: + for link in links: + link = link.replace("http://sexuria.com/", "http://www.sexuria.com/") + finallink = self.load(link, just_header=True)['location'] + if not finallink or "sexuria.com/" in finallink: + self.LogError("Broken for link %s" % link) + else: + linklist.append(finallink) + + # Debug log + self.logDebug("%d supported links" % len(linklist)) + for i, link in enumerate(linklist): + self.logDebug("Supported link %d, %s" % (i + 1, link)) + + return name, linklist, folder, password diff --git a/pyload/plugins/crypter/ShareLinksBiz.py b/pyload/plugins/crypter/ShareLinksBiz.py index 0c646eda8..7aa5dd17b 100644 --- a/pyload/plugins/crypter/ShareLinksBiz.py +++ b/pyload/plugins/crypter/ShareLinksBiz.py @@ -5,7 +5,7 @@ import binascii import re from Crypto.Cipher import AES -from pyload.plugins.base.Crypter import Crypter +from pyload.plugins.internal.Crypter import Crypter class ShareLinksBiz(Crypter): diff --git a/pyload/plugins/crypter/SharingmatrixComFolder.py b/pyload/plugins/crypter/SharingmatrixComFolder.py new file mode 100644 index 000000000..a8ab3226a --- /dev/null +++ b/pyload/plugins/crypter/SharingmatrixComFolder.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadCrypter import DeadCrypter + + +class SharingmatrixComFolder(DeadCrypter): + __name__ = "SharingmatrixComFolder" + __type__ = "crypter" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?sharingmatrix\.com/folder/\w+' + + __description__ = """Sharingmatrix.com folder decrypter plugin""" + __license__ = "GPLv3" + __authors__ = [("zoidberg", "zoidberg@mujmail.cz")] diff --git a/pyload/plugins/crypter/TusfilesNetFolder.py b/pyload/plugins/crypter/TusfilesNetFolder.py index e8da59736..8ca1ada00 100644 --- a/pyload/plugins/crypter/TusfilesNetFolder.py +++ b/pyload/plugins/crypter/TusfilesNetFolder.py @@ -4,7 +4,7 @@ import math import re from urlparse import urljoin -from module.plugins.internal.XFSCrypter import XFSCrypter +from pyload.plugins.internal.XFSCrypter import XFSCrypter class TusfilesNetFolder(XFSCrypter): diff --git a/pyload/plugins/crypter/UlozToFolder.py b/pyload/plugins/crypter/UlozToFolder.py index da1cb61b9..fe64d41bb 100644 --- a/pyload/plugins/crypter/UlozToFolder.py +++ b/pyload/plugins/crypter/UlozToFolder.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import re -from pyload.plugins.base.Crypter import Crypter +from pyload.plugins.internal.Crypter import Crypter class UlozToFolder(Crypter): diff --git a/pyload/plugins/crypter/UploadedToFolder.py b/pyload/plugins/crypter/UploadedToFolder.py index 359ba92d0..da1354f02 100644 --- a/pyload/plugins/crypter/UploadedToFolder.py +++ b/pyload/plugins/crypter/UploadedToFolder.py @@ -4,7 +4,7 @@ import re from urlparse import urljoin -from module.plugins.internal.SimpleCrypter import SimpleCrypter +from pyload.plugins.internal.SimpleCrypter import SimpleCrypter class UploadedToFolder(SimpleCrypter): diff --git a/pyload/plugins/crypter/WuploadComFolder.py b/pyload/plugins/crypter/WuploadComFolder.py new file mode 100644 index 000000000..2626a0d13 --- /dev/null +++ b/pyload/plugins/crypter/WuploadComFolder.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadCrypter import DeadCrypter + + +class WuploadComFolder(DeadCrypter): + __name__ = "WuploadComFolder" + __type__ = "crypter" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?wupload\.com/folder/\w+' + + __description__ = """Wupload.com folder decrypter plugin""" + __license__ = "GPLv3" + __authors__ = [("zoidberg", "zoidberg@mujmail.cz")] diff --git a/pyload/plugins/crypter/XFileSharingProFolder.py b/pyload/plugins/crypter/XFileSharingProFolder.py new file mode 100644 index 000000000..89fac31ac --- /dev/null +++ b/pyload/plugins/crypter/XFileSharingProFolder.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.XFSCrypter import XFSCrypter + + +class XFileSharingProFolder(XFSCrypter): + __name__ = "XFileSharingProFolder" + __type__ = "crypter" + __version__ = "0.03" + + __pattern__ = r'^unmatchable$' + __config__ = [("use_subfolder", "bool", "Save package to subfolder", True), + ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] + + __description__ = """XFileSharingPro dummy folder decrypter plugin for hook""" + __license__ = "GPLv3" + __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] + + + def _log(self, type, args): + msg = " | ".join([str(a).strip() for a in args if a]) + logger = getattr(self.log, type) + logger("%s: %s: %s" % (self.__name__, self.HOSTER_NAME, msg or _("%s MARK" % type.upper()))) + + + def init(self): + super(XFileSharingProFolder, self).init() + + self.__pattern__ = self.core.pluginManager.crypterPlugins[self.__name__]['pattern'] + + self.HOSTER_DOMAIN = re.match(self.__pattern__, self.pyfile.url).group(1).lower() + self.HOSTER_NAME = "".join([str.capitalize() for str in self.HOSTER_DOMAIN.split('.')]) + + account = self.core.accountManager.getAccountPlugin(self.HOSTER_NAME) + + if account and account.canUse(): + self.account = account + elif self.account: + self.account.HOSTER_DOMAIN = self.HOSTER_DOMAIN + else: + return + + self.user, data = self.account.selectAccount() + self.req = self.account.getAccountRequest(self.user) + self.premium = self.account.isPremium(self.user) diff --git a/pyload/plugins/crypter/XupPl.py b/pyload/plugins/crypter/XupPl.py index 87c93a305..7be72cf9e 100644 --- a/pyload/plugins/crypter/XupPl.py +++ b/pyload/plugins/crypter/XupPl.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Crypter import Crypter +from pyload.plugins.internal.Crypter import Crypter class XupPl(Crypter): diff --git a/pyload/plugins/crypter/YoutubeBatch.py b/pyload/plugins/crypter/YoutubeBatch.py index 7cb0e2f0a..d25f991e8 100644 --- a/pyload/plugins/crypter/YoutubeBatch.py +++ b/pyload/plugins/crypter/YoutubeBatch.py @@ -5,7 +5,7 @@ import re from urlparse import urljoin from pyload.utils import json_loads -from pyload.plugins.base.Crypter import Crypter +from pyload.plugins.internal.Crypter import Crypter from pyload.utils import safe_join diff --git a/pyload/plugins/hook/BypassCaptcha.py b/pyload/plugins/hook/BypassCaptcha.py index 8b34777f0..1a640ef87 100644 --- a/pyload/plugins/hook/BypassCaptcha.py +++ b/pyload/plugins/hook/BypassCaptcha.py @@ -5,7 +5,7 @@ from thread import start_new_thread from pyload.network.HTTPRequest import BadHeader from pyload.network.RequestFactory import getURL, getRequest -from pyload.plugins.base.Hook import Hook +from pyload.plugins.internal.Addon import Hook class BypassCaptchaException(Exception): diff --git a/pyload/plugins/hook/Captcha9kw.py b/pyload/plugins/hook/Captcha9kw.py index f131aa21e..ab5b802b0 100644 --- a/pyload/plugins/hook/Captcha9kw.py +++ b/pyload/plugins/hook/Captcha9kw.py @@ -11,7 +11,7 @@ from time import sleep from pyload.network.HTTPRequest import BadHeader from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hook import Hook +from pyload.plugins.internal.Addon import Hook class Captcha9kw(Hook): diff --git a/pyload/plugins/hook/CaptchaBrotherhood.py b/pyload/plugins/hook/CaptchaBrotherhood.py index 03821b8b6..1b7e18c51 100644 --- a/pyload/plugins/hook/CaptchaBrotherhood.py +++ b/pyload/plugins/hook/CaptchaBrotherhood.py @@ -15,7 +15,7 @@ from time import sleep from urllib import urlencode from pyload.network.RequestFactory import getURL, getRequest -from pyload.plugins.base.Hook import Hook +from pyload.plugins.internal.Addon import Hook class CaptchaBrotherhoodException(Exception): diff --git a/pyload/plugins/hook/DeathByCaptcha.py b/pyload/plugins/hook/DeathByCaptcha.py index f3e4bb808..d032c964f 100644 --- a/pyload/plugins/hook/DeathByCaptcha.py +++ b/pyload/plugins/hook/DeathByCaptcha.py @@ -12,7 +12,7 @@ from time import sleep from pyload.utils import json_loads from pyload.network.HTTPRequest import BadHeader from pyload.network.RequestFactory import getRequest -from pyload.plugins.base.Hook import Hook +from pyload.plugins.internal.Addon import Hook class DeathByCaptchaException(Exception): diff --git a/pyload/plugins/hook/ExpertDecoders.py b/pyload/plugins/hook/ExpertDecoders.py index 933355fbe..ed889319a 100644 --- a/pyload/plugins/hook/ExpertDecoders.py +++ b/pyload/plugins/hook/ExpertDecoders.py @@ -9,7 +9,7 @@ from uuid import uuid4 from pyload.network.HTTPRequest import BadHeader from pyload.network.RequestFactory import getURL, getRequest -from pyload.plugins.base.Hook import Hook +from pyload.plugins.internal.Addon import Hook class ExpertDecoders(Hook): diff --git a/pyload/plugins/hook/ImageTyperz.py b/pyload/plugins/hook/ImageTyperz.py index b79fd42ba..ce6527fad 100644 --- a/pyload/plugins/hook/ImageTyperz.py +++ b/pyload/plugins/hook/ImageTyperz.py @@ -9,7 +9,7 @@ from pycurl import FORM_FILE, LOW_SPEED_TIME from thread import start_new_thread from pyload.network.RequestFactory import getURL, getRequest -from pyload.plugins.base.Hook import Hook +from pyload.plugins.internal.Addon import Hook class ImageTyperzException(Exception): diff --git a/pyload/plugins/hook/LinkdecrypterCom.py b/pyload/plugins/hook/LinkdecrypterCom.py index 8455ed904..95145d462 100644 --- a/pyload/plugins/hook/LinkdecrypterCom.py +++ b/pyload/plugins/hook/LinkdecrypterCom.py @@ -3,7 +3,7 @@ import re from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hook import Hook +from pyload.plugins.internal.Addon import Hook from pyload.utils import remove_chars diff --git a/pyload/plugins/hook/XFileSharingPro.py b/pyload/plugins/hook/XFileSharingPro.py index 3f70f88f3..53033d8a4 100644 --- a/pyload/plugins/hook/XFileSharingPro.py +++ b/pyload/plugins/hook/XFileSharingPro.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.base.Hook import Hook +from pyload.plugins.internal.Addon import Hook class XFileSharingPro(Hook): diff --git a/pyload/plugins/hoster/AlldebridCom.py b/pyload/plugins/hoster/AlldebridCom.py index 7a7831204..7e5adf8ba 100644 --- a/pyload/plugins/hoster/AlldebridCom.py +++ b/pyload/plugins/hoster/AlldebridCom.py @@ -6,7 +6,7 @@ from random import randrange from urllib import unquote from pyload.utils import json_loads -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.utils import parseFileSize diff --git a/pyload/plugins/hoster/BasePlugin.py b/pyload/plugins/hoster/BasePlugin.py index 761ee720c..dd8540578 100644 --- a/pyload/plugins/hoster/BasePlugin.py +++ b/pyload/plugins/hoster/BasePlugin.py @@ -6,7 +6,7 @@ from urllib import unquote from urlparse import urlparse from pyload.network.HTTPRequest import BadHeader -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.utils import html_unescape, remove_chars diff --git a/pyload/plugins/hoster/BillionuploadsCom.py b/pyload/plugins/hoster/BillionuploadsCom.py index b20ace0f1..d5d8c6c0f 100644 --- a/pyload/plugins/hoster/BillionuploadsCom.py +++ b/pyload/plugins/hoster/BillionuploadsCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class BillionuploadsCom(XFSHoster): diff --git a/pyload/plugins/hoster/CramitIn.py b/pyload/plugins/hoster/CramitIn.py index 4f1ad1ff1..2d2c0cbbc 100644 --- a/pyload/plugins/hoster/CramitIn.py +++ b/pyload/plugins/hoster/CramitIn.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class CramitIn(XFSHoster): diff --git a/pyload/plugins/hoster/DailymotionCom.py b/pyload/plugins/hoster/DailymotionCom.py index 4fb0b2222..4b3af6e8f 100644 --- a/pyload/plugins/hoster/DailymotionCom.py +++ b/pyload/plugins/hoster/DailymotionCom.py @@ -5,7 +5,7 @@ import re from pyload.datatypes.PyFile import statusMap from pyload.utils import json_loads from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster def getInfo(urls): diff --git a/pyload/plugins/hoster/DebridItaliaCom.py b/pyload/plugins/hoster/DebridItaliaCom.py index 1b6b1b030..81cf0b830 100644 --- a/pyload/plugins/hoster/DebridItaliaCom.py +++ b/pyload/plugins/hoster/DebridItaliaCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class DebridItaliaCom(Hoster): diff --git a/pyload/plugins/hoster/EasybytezCom.py b/pyload/plugins/hoster/EasybytezCom.py index 3103d403f..b233e52ee 100644 --- a/pyload/plugins/hoster/EasybytezCom.py +++ b/pyload/plugins/hoster/EasybytezCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class EasybytezCom(XFSHoster): diff --git a/pyload/plugins/hoster/EnteruploadCom.py b/pyload/plugins/hoster/EnteruploadCom.py new file mode 100644 index 000000000..c535d6f48 --- /dev/null +++ b/pyload/plugins/hoster/EnteruploadCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class EnteruploadCom(DeadHoster): + __name__ = "EnteruploadCom" + __type__ = "hoster" + __version__ = "0.02" + + __pattern__ = r'http://(?:www\.)?enterupload\.com/\w+' + + __description__ = """EnterUpload.com hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("zoidberg", "zoidberg@mujmail.cz")] + + +getInfo = create_getInfo(EnteruploadCom) diff --git a/pyload/plugins/hoster/FastixRu.py b/pyload/plugins/hoster/FastixRu.py index 2e01dc216..0e353f362 100644 --- a/pyload/plugins/hoster/FastixRu.py +++ b/pyload/plugins/hoster/FastixRu.py @@ -6,7 +6,7 @@ from random import randrange from urllib import unquote from pyload.utils import json_loads -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class FastixRu(Hoster): diff --git a/pyload/plugins/hoster/FileParadoxIn.py b/pyload/plugins/hoster/FileParadoxIn.py index 7ed0e9b7a..174aa7211 100644 --- a/pyload/plugins/hoster/FileParadoxIn.py +++ b/pyload/plugins/hoster/FileParadoxIn.py @@ -2,7 +2,7 @@ import re -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class FileParadoxIn(XFSHoster): diff --git a/pyload/plugins/hoster/FileSharkPl.py b/pyload/plugins/hoster/FileSharkPl.py new file mode 100644 index 000000000..99cb4b51b --- /dev/null +++ b/pyload/plugins/hoster/FileSharkPl.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- + +import re + +from urlparse import urljoin + +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class FileSharkPl(SimpleHoster): + __name__ = "FileSharkPl" + __type__ = "hoster" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?fileshark\.pl/pobierz/\d{6}/\w{5}' + + __description__ = """FileShark.pl hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("prOq", None), + ("Walter Purcaro", "vuolter@gmail.com")] + + + NAME_PATTERN = r'

    (?P.+)

    ' + SIZE_PATTERN = r'

    (.*?)(?P\d+\.?\d*)\s(?P\w+)

    ' + + OFFLINE_PATTERN = '(P|p)lik zosta. (usuni.ty|przeniesiony)' + + DOWNLOAD_ALERT = r'

    (.*?)

    ' + IP_BLOCKED_PATTERN = 'Strona jest dost.pna wy..cznie dla u.ytkownik.w znajduj.cych si. na terenie Polski' + DOWNLOAD_SLOTS_ERROR_PATTERN = r'Osi.gni.to maksymaln. liczb. .ci.ganych jednocze.nie plik.w\.' + + DOWNLOAD_URL_FREE = r'
    ' + DOWNLOAD_URL_PREMIUM = r'' + + SECONDS_PATTERN = r'var timeToDownload = (\d+);' + + CAPTCHA_IMG_PATTERN = '' + + + def setup(self): + self.resumeDownload = True + if self.premium: + self.multiDL = True + self.limitDL = 20 + else: + self.multiDL = False + + + def prepare(self): + super(FileSharkPl, self).prepare() + + m = re.search(self.DOWNLOAD_ALERT, self.html): + if m: + return + + alert = m.group(1) + + if re.match(self.IP_BLOCKED_PATTERN, alert): + self.fail(_("Only connections from Polish IP are allowed")) + elif re.match(self.DOWNLOAD_SLOTS_ERROR_PATTERN, alert): + self.logInfo(_("No free download slots available")) + self.retry(10, 30 * 60, _("Still no free download slots available")) + else: + self.logInfo(alert) + self.retry(10, 10 * 60, _("Try again later")) + + + #@NOTE: handlePremium method was never been tested + def handlePremium(self): + self.logDebug("Premium accounts support in experimental modus!") + m = re.search(self.DOWNLOAD_URL_PREMIUM, self.html) + file_url = urljoin("http://fileshark.pl", m.group(1)) + + self.download(file_url, disposition=True) + self.checkDownload() + + + def handleFree(self): + m = re.search(self.DOWNLOAD_URL_FREE, self.html) + if m is None: + self.error(_("Download url not found")) + + file_url = urljoin("http://fileshark.pl", m.group(1)) + + m = re.search(self.SECONDS_PATTERN, self.html) + if m: + seconds = int(m.group(1)) + self.logDebug("Wait %s seconds" % seconds) + self.wait(seconds + 2) + + action, inputs = self.parseHtmlForm('action=""') + m = re.search(self.CAPTCHA_TOKEN_PATTERN, self.html) + if m is None: + self.retry(reason=_("Captcha form not found")) + + inputs['form[_token]'] = m.group(1) + + m = re.search(self.CAPTCHA_IMG_PATTERN, self.html) + if m is None: + self.retry(reason=_("Captcha image not found")) + + tmp_load = self.load + self.load = self.decode64 #: injects decode64 inside decryptCaptcha + + inputs['form[captcha]'] = self.decryptCaptcha(m.group(1), imgtype='jpeg') + inputs['form[start]'] = "" + + self.load = tmp_load + + self.download(file_url, post=inputs, cookies=True, disposition=True) + self.checkDownload() + + + def checkDownload(self): + check = super(FileSharkPl, self).checkDownload({ + 'wrong_captcha': re.compile(r''), + 'wait_pattern': re.compile(self.SECONDS_PATTERN), + 'DL-found': re.compile('') + }) + + if check == "DL-found": + self.correctCaptcha() + + elif check == "wrong_captcha": + self.invalidCaptcha() + self.retry(10, 1, _("Wrong captcha solution")) + + elif check == "wait_pattern": + self.retry() + + + def decode64(self, data, *args, **kwargs): + return data.decode("base64") + + +getInfo = create_getInfo(FileSharkPl) diff --git a/pyload/plugins/hoster/FileomCom.py b/pyload/plugins/hoster/FileomCom.py index 2b6fd34db..128039c2e 100644 --- a/pyload/plugins/hoster/FileomCom.py +++ b/pyload/plugins/hoster/FileomCom.py @@ -3,7 +3,7 @@ # Test links: # http://fileom.com/gycaytyzdw3g/random.bin.html -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class FileomCom(XFSHoster): diff --git a/pyload/plugins/hoster/FilerioCom.py b/pyload/plugins/hoster/FilerioCom.py index 52906fc67..f4582b876 100644 --- a/pyload/plugins/hoster/FilerioCom.py +++ b/pyload/plugins/hoster/FilerioCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class FilerioCom(XFSHoster): diff --git a/pyload/plugins/hoster/FilesMailRu.py b/pyload/plugins/hoster/FilesMailRu.py index c92cd0b0c..1c7c8059e 100644 --- a/pyload/plugins/hoster/FilesMailRu.py +++ b/pyload/plugins/hoster/FilesMailRu.py @@ -3,7 +3,7 @@ import re from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.plugins.Plugin import chunks diff --git a/pyload/plugins/hoster/FileserveCom.py b/pyload/plugins/hoster/FileserveCom.py index 88da94c46..f486d9f56 100644 --- a/pyload/plugins/hoster/FileserveCom.py +++ b/pyload/plugins/hoster/FileserveCom.py @@ -4,7 +4,7 @@ import re from pyload.utils import json_loads from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.plugins.Plugin import chunks from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight from pyload.plugins.internal.CaptchaService import ReCaptcha diff --git a/pyload/plugins/hoster/FileshareInUa.py b/pyload/plugins/hoster/FileshareInUa.py index 08e10dccb..8bb1a72c5 100644 --- a/pyload/plugins/hoster/FileshareInUa.py +++ b/pyload/plugins/hoster/FileshareInUa.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo class FileshareInUa(DeadHoster): diff --git a/pyload/plugins/hoster/FilesonicCom.py b/pyload/plugins/hoster/FilesonicCom.py new file mode 100644 index 000000000..323983169 --- /dev/null +++ b/pyload/plugins/hoster/FilesonicCom.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class FilesonicCom(DeadHoster): + __name__ = "FilesonicCom" + __type__ = "hoster" + __version__ = "0.35" + + __pattern__ = r'http://(?:www\.)?filesonic\.com/file/\w+' + + __description__ = """Filesonic.com hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("jeix", "jeix@hasnomail.de"), + ("paulking", None)] + + +getInfo = create_getInfo(FilesonicCom) diff --git a/pyload/plugins/hoster/FiredriveCom.py b/pyload/plugins/hoster/FiredriveCom.py index 0e3a4e847..3c7ec25f2 100644 --- a/pyload/plugins/hoster/FiredriveCom.py +++ b/pyload/plugins/hoster/FiredriveCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo class FiredriveCom(DeadHoster): diff --git a/pyload/plugins/hoster/FreakshareCom.py b/pyload/plugins/hoster/FreakshareCom.py index 1759df04a..bd31a5752 100644 --- a/pyload/plugins/hoster/FreakshareCom.py +++ b/pyload/plugins/hoster/FreakshareCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight from pyload.plugins.internal.CaptchaService import ReCaptcha diff --git a/pyload/plugins/hoster/FreeWayMe.py b/pyload/plugins/hoster/FreeWayMe.py index 219333055..128f54958 100644 --- a/pyload/plugins/hoster/FreeWayMe.py +++ b/pyload/plugins/hoster/FreeWayMe.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class FreeWayMe(Hoster): diff --git a/pyload/plugins/hoster/Ftp.py b/pyload/plugins/hoster/Ftp.py index a846d2b5f..2baec064b 100644 --- a/pyload/plugins/hoster/Ftp.py +++ b/pyload/plugins/hoster/Ftp.py @@ -6,7 +6,7 @@ import re from urllib import quote, unquote from urlparse import urlparse -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class Ftp(Hoster): diff --git a/pyload/plugins/hoster/GamefrontCom.py b/pyload/plugins/hoster/GamefrontCom.py index f502d9af4..195c6037e 100644 --- a/pyload/plugins/hoster/GamefrontCom.py +++ b/pyload/plugins/hoster/GamefrontCom.py @@ -3,7 +3,7 @@ import re from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.utils import parseFileSize diff --git a/pyload/plugins/hoster/HugefilesNet.py b/pyload/plugins/hoster/HugefilesNet.py index cbbce119f..e955d53cc 100644 --- a/pyload/plugins/hoster/HugefilesNet.py +++ b/pyload/plugins/hoster/HugefilesNet.py @@ -3,7 +3,7 @@ # Test links: # http://hugefiles.net/prthf9ya4w6s -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class HugefilesNet(XFSHoster): diff --git a/pyload/plugins/hoster/HundredEightyUploadCom.py b/pyload/plugins/hoster/HundredEightyUploadCom.py index 48e0c3d8c..717344efa 100644 --- a/pyload/plugins/hoster/HundredEightyUploadCom.py +++ b/pyload/plugins/hoster/HundredEightyUploadCom.py @@ -3,7 +3,7 @@ # Test links: # http://180upload.com/js9qdm6kjnrs -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class HundredEightyUploadCom(XFSHoster): diff --git a/pyload/plugins/hoster/JunocloudMe.py b/pyload/plugins/hoster/JunocloudMe.py new file mode 100644 index 000000000..dc5620e0e --- /dev/null +++ b/pyload/plugins/hoster/JunocloudMe.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo + + +class JunocloudMe(XFSHoster): + __name__ = "JunocloudMe" + __type__ = "hoster" + __version__ = "0.03" + + __pattern__ = r'http://(?:\w+\.)?junocloud\.me/\w{12}' + + __description__ = """Junocloud.me hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("guidobelix", "guidobelix@hotmail.it")] + + + HOSTER_DOMAIN = "junocloud.me" + + URL_REPLACEMENTS = [(r'/(?:embed-)?(\w{12}).*', r'/\1'), (r'//www\.', "//dl3.")] + + NAME_PATTERN = r'

    http://junocloud.me/w{12}/(?P.+?)

    ' + SIZE_PATTERN = r'

    Size: (?P[\d.,]+) (?P[\w^_]+)

    ' + + OFFLINE_PATTERN = r'>No such file with this filename<' + TEMP_OFFLINE_PATTERN = r'The page may have been renamed, removed or be temporarily unavailable.<' + + +getInfo = create_getInfo(JunocloudMe) diff --git a/pyload/plugins/hoster/Keep2shareCc.py b/pyload/plugins/hoster/Keep2shareCc.py new file mode 100644 index 000000000..6fc521107 --- /dev/null +++ b/pyload/plugins/hoster/Keep2shareCc.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- + +import re + +from urlparse import urlparse, urljoin + +from pyload.plugins.internal.CaptchaService import ReCaptcha +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class Keep2shareCc(SimpleHoster): + __name__ = "Keep2shareCc" + __type__ = "hoster" + __version__ = "0.15" + + __pattern__ = r'https?://(?:www\.)?(keep2share|k2s|keep2s)\.cc/file/(?P\w+)' + + __description__ = """Keep2share.cc hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("stickell", "l.stickell@yahoo.it"), + ("Walter Purcaro", "vuolter@gmail.com")] + + + NAME_PATTERN = r'File: (?P.+)' + SIZE_PATTERN = r'Size: (?P[^<]+)' + OFFLINE_PATTERN = r'File not found or deleted|Sorry, this file is blocked or deleted|Error 404' + + LINK_PATTERN = r'To download this file with slow speed, use
    this link' + CAPTCHA_PATTERN = r'src="(/file/captcha\.html.+?)"' + WAIT_PATTERN = r'Please wait ([\d:]+) to download this file' + MULTIDL_ERROR = r'Free account does not allow to download more than one file at the same time' + + + def handleFree(self): + self.sanitize_url() + self.html = self.load(self.pyfile.url) + + self.fid = re.search(r'', self.html).group(1) + self.html = self.load(self.pyfile.url, post={'yt0': '', 'slow_id': self.fid}) + + if ">Downloading is not possible" in self.html: + self.fail("Free user can't download large files") + + m = re.search(r"function download\(\){.*window\.location\.href = '([^']+)';", self.html, re.S) + if m: # Direct mode + self.startDownload(m.group(1)) + else: + self.handleCaptcha() + + self.wait(30) + + self.html = self.load(self.pyfile.url, post={'uniqueId': self.fid, 'free': 1}) + + m = re.search(self.WAIT_PATTERN, self.html) + if m: + self.logDebug("Hoster told us to wait for %s" % m.group(1)) + # string to time convert courtesy of https://stackoverflow.com/questions/10663720 + ftr = [3600, 60, 1] + wait_time = sum([a * b for a, b in zip(ftr, map(int, m.group(1).split(':')))]) + self.wait(wait_time, True) + self.retry() + + m = re.search(self.MULTIDL_ERROR, self.html) + if m: + # if someone is already downloading on our line, wait 30min and retry + self.logDebug("Already downloading, waiting for 30 minutes") + self.wait(30 * 60, True) + self.retry() + + m = re.search(self.LINK_PATTERN, self.html) + if m is None: + self.error(_("LINK_PATTERN not found")) + self.startDownload(m.group(1)) + + + def handleCaptcha(self): + recaptcha = ReCaptcha(self) + + for _i in xrange(5): + post_data = {'free': 1, + 'freeDownloadRequest': 1, + 'uniqueId': self.fid, + 'yt0': ''} + + m = re.search(self.CAPTCHA_PATTERN, self.html) + if m: + captcha_url = urljoin(self.base_url, m.group(1)) + post_data['CaptchaForm[code]'] = self.decryptCaptcha(captcha_url) + else: + challenge, response = recaptcha.challenge() + post_data.update({'recaptcha_challenge_field': challenge, + 'recaptcha_response_field': response}) + + self.html = self.load(self.pyfile.url, post=post_data) + + if 'recaptcha' not in self.html: + self.correctCaptcha() + break + else: + self.invalidCaptcha() + else: + self.fail(_("All captcha attempts failed")) + + + def startDownload(self, url): + d = urljoin(self.base_url, url) + self.download(d, disposition=True) + + + def sanitize_url(self): + header = self.load(self.pyfile.url, just_header=True) + if 'location' in header: + self.pyfile.url = header['location'] + p = urlparse(self.pyfile.url) + self.base_url = "%s://%s" % (p.scheme, p.hostname) + + +getInfo = create_getInfo(Keep2shareCc) diff --git a/pyload/plugins/hoster/KickloadCom.py b/pyload/plugins/hoster/KickloadCom.py new file mode 100644 index 000000000..88c84390c --- /dev/null +++ b/pyload/plugins/hoster/KickloadCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class KickloadCom(DeadHoster): + __name__ = "KickloadCom" + __type__ = "hoster" + __version__ = "0.21" + + __pattern__ = r'http://(?:www\.)?kickload\.com/get/.+' + + __description__ = """Kickload.com hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("mkaay", "mkaay@mkaay.de")] + + +getInfo = create_getInfo(KickloadCom) diff --git a/pyload/plugins/hoster/LinksnappyCom.py b/pyload/plugins/hoster/LinksnappyCom.py index c37006ac2..d7991ff3c 100644 --- a/pyload/plugins/hoster/LinksnappyCom.py +++ b/pyload/plugins/hoster/LinksnappyCom.py @@ -5,7 +5,7 @@ import re from urlparse import urlsplit from pyload.utils import json_loads, json_dumps -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class LinksnappyCom(Hoster): diff --git a/pyload/plugins/hoster/LomafileCom.py b/pyload/plugins/hoster/LomafileCom.py index a7ce39d37..2c4bd37a2 100644 --- a/pyload/plugins/hoster/LomafileCom.py +++ b/pyload/plugins/hoster/LomafileCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class LomafileCom(XFSHoster): diff --git a/pyload/plugins/hoster/MegaCoNz.py b/pyload/plugins/hoster/MegaCoNz.py new file mode 100644 index 000000000..f09a5cdd5 --- /dev/null +++ b/pyload/plugins/hoster/MegaCoNz.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- + +import random +import re + +from array import array +from base64 import standard_b64decode +from os import remove + +from Crypto.Cipher import AES +from Crypto.Util import Counter +from pycurl import SSL_CIPHER_LIST + +from pyload.utils import json_loads, json_dumps +from pyload.plugins.internal.Hoster import Hoster + + +class MegaCoNz(Hoster): + __name__ = "MegaCoNz" + __type__ = "hoster" + __version__ = "0.16" + + __pattern__ = r'https?://(\w+\.)?mega\.co\.nz/#!([\w!-]+)' + + __description__ = """Mega.co.nz hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("RaNaN", "ranan@pyload.org")] + + + API_URL = "https://g.api.mega.co.nz/cs?id=%d" + FILE_SUFFIX = ".crypted" + + + def b64_decode(self, data): + data = data.replace("-", "+").replace("_", "/") + return standard_b64decode(data + '=' * (-len(data) % 4)) + + + def getCipherKey(self, key): + """ Construct the cipher key from the given data """ + a = array("I", key) + key_array = array("I", [a[0] ^ a[4], a[1] ^ a[5], a[2] ^ a[6], a[3] ^ a[7]]) + return key_array + + + def callApi(self, **kwargs): + """ Dispatch a call to the api, see https://mega.co.nz/#developers """ + # generate a session id, no idea where to obtain elsewhere + uid = random.randint(10 << 9, 10 ** 10) + + res = self.load(self.API_URL % uid, post=json_dumps([kwargs])) + self.logDebug("Api Response: " + res) + return json_loads(res) + + + def decryptAttr(self, data, key): + cbc = AES.new(self.getCipherKey(key), AES.MODE_CBC, "\0" * 16) + attr = cbc.decrypt(self.b64_decode(data)) + self.logDebug("Decrypted Attr: " + attr) + if not attr.startswith("MEGA"): + self.fail(_("Decryption failed")) + + # Data is padded, 0-bytes must be stripped + return json_loads(re.search(r'{.+?}', attr).group(0)) + + + def decryptFile(self, key): + """ Decrypts the file at lastDownload` """ + + # upper 64 bit of counter start + n = key[16:24] + + # convert counter to long and shift bytes + ctr = Counter.new(128, initial_value=long(n.encode("hex"), 16) << 64) + cipher = AES.new(self.getCipherKey(key), AES.MODE_CTR, counter=ctr) + + self.pyfile.setStatus("decrypting") + + file_crypted = self.lastDownload + file_decrypted = file_crypted.rsplit(self.FILE_SUFFIX)[0] + + try: + f = open(file_crypted, "rb") + df = open(file_decrypted, "wb") + except IOError, e: + self.fail(str(e)) + + # TODO: calculate CBC-MAC for checksum + + size = 2 ** 15 # buffer size, 32k + while True: + buf = f.read(size) + if not buf: + break + + df.write(cipher.decrypt(buf)) + + f.close() + df.close() + remove(file_crypted) + + self.lastDownload = file_decrypted + + + def process(self, pyfile): + key = None + + # match is guaranteed because plugin was chosen to handle url + node = re.match(self.__pattern__, pyfile.url).group(2) + if "!" in node: + node, key = node.split("!") + + self.logDebug("File id: %s | Key: %s" % (node, key)) + + if not key: + self.fail(_("No file key provided in the URL")) + + # g is for requesting a download url + # this is similar to the calls in the mega js app, documentation is very bad + dl = self.callApi(a="g", g=1, p=node, ssl=1)[0] + + if "e" in dl: + e = dl['e'] + # ETEMPUNAVAIL (-18): Resource temporarily not available, please try again later + if e == -18: + self.retry() + else: + self.fail(_("Error code:") + e) + + # TODO: map other error codes, e.g + # EACCESS (-11): Access violation (e.g., trying to write to a read-only share) + + key = self.b64_decode(key) + attr = self.decryptAttr(dl['at'], key) + + pyfile.name = attr['n'] + self.FILE_SUFFIX + + self.req.http.c.setopt(SSL_CIPHER_LIST, "RC4-MD5:DEFAULT") + + self.download(dl['g']) + self.decryptFile(key) + + # Everything is finished and final name can be set + pyfile.name = attr['n'] diff --git a/pyload/plugins/hoster/MegaDebridEu.py b/pyload/plugins/hoster/MegaDebridEu.py index aaf5419e6..1354c0e3d 100644 --- a/pyload/plugins/hoster/MegaDebridEu.py +++ b/pyload/plugins/hoster/MegaDebridEu.py @@ -5,7 +5,7 @@ import re from urllib import unquote_plus from pyload.utils import json_loads -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class MegaDebridEu(Hoster): diff --git a/pyload/plugins/hoster/MegaRapidCz.py b/pyload/plugins/hoster/MegaRapidCz.py new file mode 100644 index 000000000..f49d0e1ec --- /dev/null +++ b/pyload/plugins/hoster/MegaRapidCz.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- + +import re + +from pycurl import HTTPHEADER + +from pyload.network.RequestFactory import getRequest +from pyload.plugins.internal.SimpleHoster import SimpleHoster, parseFileInfo + + +def getInfo(urls): + h = getRequest() + h.c.setopt(HTTPHEADER, + ["Accept: text/html", + "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0"]) + + for url in urls: + html = h.load(url, decode=True) + yield parseFileInfo(MegaRapidCz, url, html) + + +class MegaRapidCz(SimpleHoster): + __name__ = "MegaRapidCz" + __type__ = "hoster" + __version__ = "0.54" + + __pattern__ = r'http://(?:www\.)?(share|mega)rapid\.cz/soubor/\d+/.+' + + __description__ = """MegaRapid.cz hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("MikyWoW", "mikywow@seznam.cz"), + ("zoidberg", "zoidberg@mujmail.cz"), + ("stickell", "l.stickell@yahoo.it"), + ("Walter Purcaro", "vuolter@gmail.com")] + + + NAME_PATTERN = r']*>]*>(?:]*>)?(?P[^<]+)' + SIZE_PATTERN = r'Velikost:\s*\s*(?P[\d.,]+) (?P[\w^_]+)' + OFFLINE_PATTERN = ur'Nastala chyba 404|Soubor byl smazán' + + FORCE_CHECK_TRAFFIC = True + + LINK_PATTERN = r'([^<]+)' + ERR_LOGIN_PATTERN = ur'
    Stahování je přístupné pouze přihlášeným uživatelům' + ERR_CREDIT_PATTERN = ur'
    Stahování zdarma je možné jen přes náš' + + + def setup(self): + self.chunkLimit = 1 + + + def handlePremium(self): + try: + self.html = self.load(self.pyfile.url, decode=True) + except BadHeader, e: + self.account.relogin(self.user) + self.retry(wait_time=60, reason=str(e)) + + m = re.search(self.LINK_PATTERN, self.html) + if m: + link = m.group(1) + self.logDebug("Premium link: %s" % link) + self.download(link, disposition=True) + else: + if re.search(self.ERR_LOGIN_PATTERN, self.html): + self.relogin(self.user) + self.retry(wait_time=60, reason=_("User login failed")) + elif re.search(self.ERR_CREDIT_PATTERN, self.html): + self.fail(_("Not enough credit left")) + else: + self.fail(_("Download link not found")) diff --git a/pyload/plugins/hoster/MegacrypterCom.py b/pyload/plugins/hoster/MegacrypterCom.py index 4633f7d30..1ebd167f3 100644 --- a/pyload/plugins/hoster/MegacrypterCom.py +++ b/pyload/plugins/hoster/MegacrypterCom.py @@ -4,7 +4,7 @@ import re from pyload.utils import json_loads, json_dumps -from module.plugins.hoster.MegaCoNz import MegaCoNz +from pyload.plugins.hoster.MegaCoNz import MegaCoNz class MegacrypterCom(MegaCoNz): diff --git a/pyload/plugins/hoster/MegauploadCom.py b/pyload/plugins/hoster/MegauploadCom.py new file mode 100644 index 000000000..20700a3d0 --- /dev/null +++ b/pyload/plugins/hoster/MegauploadCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class MegauploadCom(DeadHoster): + __name__ = "MegauploadCom" + __type__ = "hoster" + __version__ = "0.31" + + __pattern__ = r'http://(?:www\.)?megaupload\.com/\?.*&?(d|v)=\w+' + + __description__ = """Megaupload.com hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("spoob", "spoob@pyload.org")] + + +getInfo = create_getInfo(MegauploadCom) diff --git a/pyload/plugins/hoster/MegavideoCom.py b/pyload/plugins/hoster/MegavideoCom.py new file mode 100644 index 000000000..aa458fa2c --- /dev/null +++ b/pyload/plugins/hoster/MegavideoCom.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class MegavideoCom(DeadHoster): + __name__ = "MegavideoCom" + __type__ = "hoster" + __version__ = "0.21" + + __pattern__ = r'http://(?:www\.)?megavideo\.com/\?.*&?(d|v)=\w+' + + __description__ = """Megavideo.com hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("jeix", "jeix@hasnomail.de"), + ("mkaay", "mkaay@mkaay.de")] + + +getInfo = create_getInfo(MegavideoCom) diff --git a/pyload/plugins/hoster/MovReelCom.py b/pyload/plugins/hoster/MovReelCom.py index cd1626f6f..39216a295 100644 --- a/pyload/plugins/hoster/MovReelCom.py +++ b/pyload/plugins/hoster/MovReelCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class MovReelCom(XFSHoster): diff --git a/pyload/plugins/hoster/MyfastfileCom.py b/pyload/plugins/hoster/MyfastfileCom.py index 14ed51ea7..cb1148389 100644 --- a/pyload/plugins/hoster/MyfastfileCom.py +++ b/pyload/plugins/hoster/MyfastfileCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.utils import json_loads diff --git a/pyload/plugins/hoster/MyvideoDe.py b/pyload/plugins/hoster/MyvideoDe.py index 886896056..8fbd3a772 100644 --- a/pyload/plugins/hoster/MyvideoDe.py +++ b/pyload/plugins/hoster/MyvideoDe.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.utils import html_unescape diff --git a/pyload/plugins/hoster/NahrajCz.py b/pyload/plugins/hoster/NahrajCz.py new file mode 100644 index 000000000..188e2b1e4 --- /dev/null +++ b/pyload/plugins/hoster/NahrajCz.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class NahrajCz(DeadHoster): + __name__ = "NahrajCz" + __type__ = "hoster" + __version__ = "0.21" + + __pattern__ = r'http://(?:www\.)?nahraj\.cz/content/download/.+' + + __description__ = """Nahraj.cz hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("zoidberg", "zoidberg@mujmail.cz")] + + +getInfo = create_getInfo(NahrajCz) diff --git a/pyload/plugins/hoster/NetloadIn.py b/pyload/plugins/hoster/NetloadIn.py index 5889611bb..b517fe455 100644 --- a/pyload/plugins/hoster/NetloadIn.py +++ b/pyload/plugins/hoster/NetloadIn.py @@ -5,7 +5,7 @@ import re from time import sleep, time from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.plugins.Plugin import chunks diff --git a/pyload/plugins/hoster/NosuploadCom.py b/pyload/plugins/hoster/NosuploadCom.py index b2255ca54..f70d64551 100644 --- a/pyload/plugins/hoster/NosuploadCom.py +++ b/pyload/plugins/hoster/NosuploadCom.py @@ -2,7 +2,7 @@ import re -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class NosuploadCom(XFSHoster): diff --git a/pyload/plugins/hoster/NovafileCom.py b/pyload/plugins/hoster/NovafileCom.py index 5c4dfddca..8d0677ec8 100644 --- a/pyload/plugins/hoster/NovafileCom.py +++ b/pyload/plugins/hoster/NovafileCom.py @@ -4,7 +4,7 @@ # http://novafile.com/vfun4z6o2cit # http://novafile.com/s6zrr5wemuz4 -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class NovafileCom(XFSHoster): diff --git a/pyload/plugins/hoster/NowVideoAt.py b/pyload/plugins/hoster/NowVideoAt.py new file mode 100644 index 000000000..e17e2e256 --- /dev/null +++ b/pyload/plugins/hoster/NowVideoAt.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class NowVideoAt(SimpleHoster): + __name__ = "NowVideoAt" + __type__ = "hoster" + __version__ = "0.05" + + __pattern__ = r'http://(?:www\.)?nowvideo\.(at|ch|co|eu|sx)/(video|mobile/#/videos)/(?P\w+)' + + __description__ = """NowVideo.at hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] + + + URL_REPLACEMENTS = [(__pattern__, r'http://www.nowvideo.at/video/\g')] + + NAME_PATTERN = r'

    (?P.+?)<' + OFFLINE_PATTERN = r'>This file no longer exists' + + LINK_FREE_PATTERN = r'\s*' + SIZE_PATTERN = r'>http://www.rapidfileshare.net/\w+? \((?P[\d.,]+) (?P[\w^_]+)\)' + + OFFLINE_PATTERN = r'>No such file with this filename' + TEMP_OFFLINE_PATTERN = r'The page may have been renamed, removed or be temporarily unavailable.<' + + + def handlePremium(self): + self.fail(_("Premium download not implemented")) + + +getInfo = create_getInfo(RapidfileshareNet) diff --git a/pyload/plugins/hoster/RapidshareCom.py b/pyload/plugins/hoster/RapidshareCom.py index 4b8633fef..97823ba96 100644 --- a/pyload/plugins/hoster/RapidshareCom.py +++ b/pyload/plugins/hoster/RapidshareCom.py @@ -3,7 +3,7 @@ import re from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster def getInfo(urls): diff --git a/pyload/plugins/hoster/RarefileNet.py b/pyload/plugins/hoster/RarefileNet.py index cd60ec65e..fb54f6431 100644 --- a/pyload/plugins/hoster/RarefileNet.py +++ b/pyload/plugins/hoster/RarefileNet.py @@ -2,7 +2,7 @@ import re -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo from pyload.utils import html_unescape diff --git a/pyload/plugins/hoster/RealdebridCom.py b/pyload/plugins/hoster/RealdebridCom.py index f839dc613..2ca9970e0 100644 --- a/pyload/plugins/hoster/RealdebridCom.py +++ b/pyload/plugins/hoster/RealdebridCom.py @@ -7,7 +7,7 @@ from urllib import quote, unquote from time import time from pyload.utils import json_loads -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.utils import parseFileSize diff --git a/pyload/plugins/hoster/RedtubeCom.py b/pyload/plugins/hoster/RedtubeCom.py index 50c6ba9e3..b1272f68d 100644 --- a/pyload/plugins/hoster/RedtubeCom.py +++ b/pyload/plugins/hoster/RedtubeCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.utils import html_unescape diff --git a/pyload/plugins/hoster/RehostTo.py b/pyload/plugins/hoster/RehostTo.py index 08c43ad16..d9855c796 100644 --- a/pyload/plugins/hoster/RehostTo.py +++ b/pyload/plugins/hoster/RehostTo.py @@ -2,7 +2,7 @@ from urllib import quote, unquote -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class RehostTo(Hoster): diff --git a/pyload/plugins/hoster/RyushareCom.py b/pyload/plugins/hoster/RyushareCom.py index f41e4bfbf..ab6bf1017 100644 --- a/pyload/plugins/hoster/RyushareCom.py +++ b/pyload/plugins/hoster/RyushareCom.py @@ -5,7 +5,7 @@ import re -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo from pyload.plugins.internal.CaptchaService import SolveMedia diff --git a/pyload/plugins/hoster/SecureUploadEu.py b/pyload/plugins/hoster/SecureUploadEu.py index 64e6456a9..6939e4f6d 100644 --- a/pyload/plugins/hoster/SecureUploadEu.py +++ b/pyload/plugins/hoster/SecureUploadEu.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class SecureUploadEu(XFSHoster): diff --git a/pyload/plugins/hoster/SendmywayCom.py b/pyload/plugins/hoster/SendmywayCom.py index 4254922fc..cb82fb19d 100644 --- a/pyload/plugins/hoster/SendmywayCom.py +++ b/pyload/plugins/hoster/SendmywayCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class SendmywayCom(XFSHoster): diff --git a/pyload/plugins/hoster/ShareonlineBiz.py b/pyload/plugins/hoster/ShareonlineBiz.py index 73d598cb9..0769cfe17 100644 --- a/pyload/plugins/hoster/ShareonlineBiz.py +++ b/pyload/plugins/hoster/ShareonlineBiz.py @@ -5,7 +5,7 @@ import re from time import time from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.plugins.Plugin import chunks from pyload.plugins.internal.CaptchaService import ReCaptcha diff --git a/pyload/plugins/hoster/ShareplaceCom.py b/pyload/plugins/hoster/ShareplaceCom.py index 60d93698a..6e11de05c 100644 --- a/pyload/plugins/hoster/ShareplaceCom.py +++ b/pyload/plugins/hoster/ShareplaceCom.py @@ -4,7 +4,7 @@ import re from urllib import unquote -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class ShareplaceCom(Hoster): diff --git a/pyload/plugins/hoster/SharingmatrixCom.py b/pyload/plugins/hoster/SharingmatrixCom.py new file mode 100644 index 000000000..7459c12b6 --- /dev/null +++ b/pyload/plugins/hoster/SharingmatrixCom.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class SharingmatrixCom(DeadHoster): + __name__ = "SharingmatrixCom" + __type__ = "hoster" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?sharingmatrix\.com/file/\w+' + + __description__ = """Sharingmatrix.com hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("jeix", "jeix@hasnomail.de"), + ("paulking", None)] + + +getInfo = create_getInfo(SharingmatrixCom) diff --git a/pyload/plugins/hoster/SimplyPremiumCom.py b/pyload/plugins/hoster/SimplyPremiumCom.py index 0840bc8a2..bb431a5dd 100644 --- a/pyload/plugins/hoster/SimplyPremiumCom.py +++ b/pyload/plugins/hoster/SimplyPremiumCom.py @@ -4,7 +4,7 @@ import re from datetime import datetime, timedelta -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight diff --git a/pyload/plugins/hoster/SimplydebridCom.py b/pyload/plugins/hoster/SimplydebridCom.py index f34f15ab2..5092be32a 100644 --- a/pyload/plugins/hoster/SimplydebridCom.py +++ b/pyload/plugins/hoster/SimplydebridCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class SimplydebridCom(Hoster): diff --git a/pyload/plugins/hoster/SockshareCom.py b/pyload/plugins/hoster/SockshareCom.py index aabb8dcd1..d28041893 100644 --- a/pyload/plugins/hoster/SockshareCom.py +++ b/pyload/plugins/hoster/SockshareCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.DeadHoster import DeadHoster, create_getInfo +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo class SockshareCom(DeadHoster): diff --git a/pyload/plugins/hoster/SoundcloudCom.py b/pyload/plugins/hoster/SoundcloudCom.py index 601ac774c..284f6ffbf 100644 --- a/pyload/plugins/hoster/SoundcloudCom.py +++ b/pyload/plugins/hoster/SoundcloudCom.py @@ -3,7 +3,7 @@ import pycurl import re -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class SoundcloudCom(Hoster): diff --git a/pyload/plugins/hoster/StorageTo.py b/pyload/plugins/hoster/StorageTo.py new file mode 100644 index 000000000..5ba0c145b --- /dev/null +++ b/pyload/plugins/hoster/StorageTo.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class StorageTo(DeadHoster): + __name__ = "StorageTo" + __type__ = "hoster" + __version__ = "0.01" + + __pattern__ = r'http://(?:www\.)?storage\.to/get/.+' + + __description__ = """Storage.to hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("mkaay", "mkaay@mkaay.de")] + + +getInfo = create_getInfo(StorageTo) diff --git a/pyload/plugins/hoster/StreamCz.py b/pyload/plugins/hoster/StreamCz.py index 1c1b7f204..c9d00863e 100644 --- a/pyload/plugins/hoster/StreamCz.py +++ b/pyload/plugins/hoster/StreamCz.py @@ -3,7 +3,7 @@ import re from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster def getInfo(urls): diff --git a/pyload/plugins/hoster/StreamcloudEu.py b/pyload/plugins/hoster/StreamcloudEu.py index 4f854a99d..5ae617095 100644 --- a/pyload/plugins/hoster/StreamcloudEu.py +++ b/pyload/plugins/hoster/StreamcloudEu.py @@ -2,7 +2,7 @@ import re -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class StreamcloudEu(XFSHoster): diff --git a/pyload/plugins/hoster/TusfilesNet.py b/pyload/plugins/hoster/TusfilesNet.py index 8c80455b4..3b4d7f92c 100644 --- a/pyload/plugins/hoster/TusfilesNet.py +++ b/pyload/plugins/hoster/TusfilesNet.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class TusfilesNet(XFSHoster): diff --git a/pyload/plugins/hoster/UnrestrictLi.py b/pyload/plugins/hoster/UnrestrictLi.py index e807cda98..583a9f4a9 100644 --- a/pyload/plugins/hoster/UnrestrictLi.py +++ b/pyload/plugins/hoster/UnrestrictLi.py @@ -5,7 +5,7 @@ import re from datetime import datetime, timedelta from pyload.utils import json_loads -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster def secondsToMidnight(gmt=0): diff --git a/pyload/plugins/hoster/UpleaCom.py b/pyload/plugins/hoster/UpleaCom.py new file mode 100644 index 000000000..7a7dd4870 --- /dev/null +++ b/pyload/plugins/hoster/UpleaCom.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- + +import re + +from urlparse import urljoin + +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo + + +class UpleaCom(XFSHoster): + __name__ = "UpleaCom" + __type__ = "hoster" + __version__ = "0.04" + + __pattern__ = r'https?://(?:www\.)?uplea\.com/dl/\w{15}' + + __description__ = """Uplea.com hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("Redleon", None)] + + + HOSTER_DOMAIN = "uplea.com" + + NAME_PATTERN = r'class="agmd size18">(?P.+?)<' + SIZE_PATTERN = r'size14">(?P[\d.,]+) (?P[\w^_])' + + OFFLINE_PATTERN = r'>You followed an invalid or expired link' + + LINK_PATTERN = r'"(http?://\w+\.uplea\.com/anonym/.*?)"' + WAIT_PATTERN = r'timeText:([\d.]+),' + VARS_PATTERN = r'class="cel_tbl_step1_foot">\s' + + + def setup(self): + self.multiDL = False + self.chunkLimit = 1 + self.resumeDownload = True + + + def handleFree(self): + m = re.search(self.VARS_PATTERN, self.html) + if m is None: + self.error("VARS_PATTERN not found") + + self.html = self.load(urljoin("http://uplea.com/", m.groups(1))) + + m = re.search(self.WAIT_PATTERN, self.html) + if m: + self.wait(m.group(1), True) + self.retry() + + m = re.search(self.LINK_PATTERN, self.html) + if m is None: + self.error("LINK_PATTERN not found") + + self.wait(15) + self.download(m.group(1), disposition=True) + + +getInfo = create_getInfo(UpleaCom) diff --git a/pyload/plugins/hoster/UploadboxCom.py b/pyload/plugins/hoster/UploadboxCom.py new file mode 100644 index 000000000..89a525c67 --- /dev/null +++ b/pyload/plugins/hoster/UploadboxCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class UploadboxCom(DeadHoster): + __name__ = "Uploadbox" + __type__ = "hoster" + __version__ = "0.05" + + __pattern__ = r'http://(?:www\.)?uploadbox\.com/files/.+' + + __description__ = """UploadBox.com hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("zoidberg", "zoidberg@mujmail.cz")] + + +getInfo = create_getInfo(UploadboxCom) diff --git a/pyload/plugins/hoster/UploadedTo.py b/pyload/plugins/hoster/UploadedTo.py index 17e3a4a0f..c39df66ea 100644 --- a/pyload/plugins/hoster/UploadedTo.py +++ b/pyload/plugins/hoster/UploadedTo.py @@ -9,7 +9,7 @@ import re from time import sleep from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.plugins.Plugin import chunks from pyload.plugins.internal.CaptchaService import ReCaptcha from pyload.utils import html_unescape, parseFileSize diff --git a/pyload/plugins/hoster/UploadhereCom.py b/pyload/plugins/hoster/UploadhereCom.py new file mode 100644 index 000000000..ba02ea07c --- /dev/null +++ b/pyload/plugins/hoster/UploadhereCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class UploadhereCom(DeadHoster): + __name__ = "UploadhereCom" + __type__ = "hoster" + __version__ = "0.12" + + __pattern__ = r'http://(?:www\.)?uploadhere\.com/\w{10}' + + __description__ = """Uploadhere.com hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("zoidberg", "zoidberg@mujmail.cz")] + + +getInfo = create_getInfo(UploadhereCom) diff --git a/pyload/plugins/hoster/UploadkingCom.py b/pyload/plugins/hoster/UploadkingCom.py new file mode 100644 index 000000000..e9c536819 --- /dev/null +++ b/pyload/plugins/hoster/UploadkingCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.DeadHoster import DeadHoster, create_getInfo + + +class UploadkingCom(DeadHoster): + __name__ = "UploadkingCom" + __type__ = "hoster" + __version__ = "0.14" + + __pattern__ = r'http://(?:www\.)?uploadking\.com/\w{10}' + + __description__ = """UploadKing.com hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("zoidberg", "zoidberg@mujmail.cz")] + + +getInfo = create_getInfo(UploadkingCom) diff --git a/pyload/plugins/hoster/UptoboxCom.py b/pyload/plugins/hoster/UptoboxCom.py index eeddb96b6..5aaa73286 100644 --- a/pyload/plugins/hoster/UptoboxCom.py +++ b/pyload/plugins/hoster/UptoboxCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class UptoboxCom(XFSHoster): diff --git a/pyload/plugins/hoster/VeehdCom.py b/pyload/plugins/hoster/VeehdCom.py index 440993a67..326d0a18e 100644 --- a/pyload/plugins/hoster/VeehdCom.py +++ b/pyload/plugins/hoster/VeehdCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class VeehdCom(Hoster): diff --git a/pyload/plugins/hoster/VidPlayNet.py b/pyload/plugins/hoster/VidPlayNet.py index 76af05edd..3a5198973 100644 --- a/pyload/plugins/hoster/VidPlayNet.py +++ b/pyload/plugins/hoster/VidPlayNet.py @@ -3,7 +3,7 @@ # Test links: # BigBuckBunny_320x180.mp4 - 61.7 Mb - http://vidplay.net/38lkev0h3jv0 -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo +from pyload.plugins.internal.XFSHoster import XFSHoster, create_getInfo class VidPlayNet(XFSHoster): diff --git a/pyload/plugins/hoster/WebshareCz.py b/pyload/plugins/hoster/WebshareCz.py index fcdfd55bf..bb41fbd26 100644 --- a/pyload/plugins/hoster/WebshareCz.py +++ b/pyload/plugins/hoster/WebshareCz.py @@ -2,7 +2,7 @@ import re -from module.network.RequestFactory import getURL +from pyload.network.RequestFactory import getURL from pyload.plugins.internal.SimpleHoster import SimpleHoster diff --git a/pyload/plugins/hoster/XHamsterCom.py b/pyload/plugins/hoster/XHamsterCom.py index acbcc2192..503022ec9 100644 --- a/pyload/plugins/hoster/XHamsterCom.py +++ b/pyload/plugins/hoster/XHamsterCom.py @@ -5,7 +5,7 @@ import re from urllib import unquote from pyload.utils import json_loads -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster def clean_json(json_expr): diff --git a/pyload/plugins/hoster/XVideosCom.py b/pyload/plugins/hoster/XVideosCom.py index 4fb288e51..9ab9e4484 100644 --- a/pyload/plugins/hoster/XVideosCom.py +++ b/pyload/plugins/hoster/XVideosCom.py @@ -4,7 +4,7 @@ import re from urllib import unquote -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class XVideosCom(Hoster): diff --git a/pyload/plugins/hoster/Xdcc.py b/pyload/plugins/hoster/Xdcc.py index dc0cbc27a..de750ee58 100644 --- a/pyload/plugins/hoster/Xdcc.py +++ b/pyload/plugins/hoster/Xdcc.py @@ -10,7 +10,7 @@ from os import makedirs from os.path import exists, join from select import select -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.utils import safe_join diff --git a/pyload/plugins/hoster/YoupornCom.py b/pyload/plugins/hoster/YoupornCom.py index 46c7ebfcb..6063e6816 100644 --- a/pyload/plugins/hoster/YoupornCom.py +++ b/pyload/plugins/hoster/YoupornCom.py @@ -2,7 +2,7 @@ import re -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class YoupornCom(Hoster): diff --git a/pyload/plugins/hoster/YourfilesTo.py b/pyload/plugins/hoster/YourfilesTo.py index 9e21144b7..7cb94a2df 100644 --- a/pyload/plugins/hoster/YourfilesTo.py +++ b/pyload/plugins/hoster/YourfilesTo.py @@ -4,7 +4,7 @@ import re from urllib import unquote -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class YourfilesTo(Hoster): diff --git a/pyload/plugins/hoster/YoutubeCom.py b/pyload/plugins/hoster/YoutubeCom.py index 0246d0997..7fdf848c1 100644 --- a/pyload/plugins/hoster/YoutubeCom.py +++ b/pyload/plugins/hoster/YoutubeCom.py @@ -6,7 +6,7 @@ import subprocess from urllib import unquote -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster from pyload.plugins.internal.SimpleHoster import replace_patterns from pyload.utils import html_unescape diff --git a/pyload/plugins/hoster/ZDF.py b/pyload/plugins/hoster/ZDF.py index 9d2ad446b..53939ae6c 100644 --- a/pyload/plugins/hoster/ZDF.py +++ b/pyload/plugins/hoster/ZDF.py @@ -4,7 +4,7 @@ import re from xml.etree.ElementTree import fromstring -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster # Based on zdfm by Roland Beermann (http://github.com/enkore/zdfm/) diff --git a/pyload/plugins/hoster/ZeveraCom.py b/pyload/plugins/hoster/ZeveraCom.py index 769602964..c0c10215d 100644 --- a/pyload/plugins/hoster/ZeveraCom.py +++ b/pyload/plugins/hoster/ZeveraCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Hoster import Hoster +from pyload.plugins.internal.Hoster import Hoster class ZeveraCom(Hoster): diff --git a/pyload/plugins/internal/Account.py b/pyload/plugins/internal/Account.py new file mode 100644 index 000000000..e6895f119 --- /dev/null +++ b/pyload/plugins/internal/Account.py @@ -0,0 +1,305 @@ +# -*- coding: utf-8 -*- + +from random import choice +from time import time +from traceback import print_exc +from threading import RLock + +from pyload.plugins.Plugin import Base +from pyload.utils import compare_time, parseFileSize, lock + + +class WrongPassword(Exception): + pass + + +class Account(Base): + """ + Base class for every Account plugin. + Just overwrite `login` and cookies will be stored and account becomes accessible in\ + associated hoster plugin. Plugin should also provide `loadAccountInfo` + """ + __name__ = "Account" + __type__ = "account" + __version__ = "0.03" + + __description__ = """Base account plugin""" + __license__ = "GPLv3" + __authors__ = [("mkaay", "mkaay@mkaay.de")] + + + #: after that time (in minutes) pyload will relogin the account + login_timeout = 10 * 60 + #: after that time (in minutes) account data will be reloaded + info_threshold = 10 * 60 + + + def __init__(self, manager, accounts): + Base.__init__(self, manager.core) + + self.manager = manager + self.accounts = {} + self.infos = {} #: cache for account information + self.lock = RLock() + self.timestamps = {} + + self.init() + + self.setAccounts(accounts) + + + def init(self): + pass + + + def login(self, user, data, req): + """login into account, the cookies will be saved so user can be recognized + + :param user: loginname + :param data: data dictionary + :param req: `Request` instance + """ + pass + + + @lock + def _login(self, user, data): + # set timestamp for login + self.timestamps[user] = time() + + req = self.getAccountRequest(user) + try: + self.login(user, data, req) + except WrongPassword: + self.logWarning( + _("Could not login with account %(user)s | %(msg)s") % {"user": user, + "msg": _("Wrong Password")}) + success = data['valid'] = False + except Exception, e: + self.logWarning( + _("Could not login with account %(user)s | %(msg)s") % {"user": user, + "msg": e}) + success = data['valid'] = False + if self.core.debug: + print_exc() + else: + success = True + finally: + if req: + req.close() + return success + + + def relogin(self, user): + req = self.getAccountRequest(user) + if req: + req.cj.clear() + req.close() + if user in self.infos: + del self.infos[user] #delete old information + + return 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 user in self.accounts: + 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) + return self.accounts[user]['options'] != before + else: + self.accounts[user] = {"password": password, "options": options, "valid": True} + self._login(user, self.accounts[user]) + return True + + + def removeAccount(self, user): + if user in self.accounts: + del self.accounts[user] + if user in self.infos: + del self.infos[user] + if user in self.timestamps: + del self.timestamps[user] + + + @lock + def getAccountInfo(self, name, force=False): + """retrieve account infos for an user, do **not** overwrite this method!\\ + just use it to retrieve infos in hoster plugins. see `loadAccountInfo` + + :param name: username + :param force: reloads cached account information + :return: dictionary with information + """ + data = Account.loadAccountInfo(self, name) + + if force or name not in self.infos: + self.logDebug("Get Account Info for %s" % name) + req = self.getAccountRequest(name) + + try: + infos = self.loadAccountInfo(name, req) + if not type(infos) == dict: + raise Exception("Wrong return format") + except Exception, e: + infos = {"error": str(e)} + print_exc() + + if req: + req.close() + + self.logDebug("Account Info: %s" % infos) + + infos['timestamp'] = time() + self.infos[name] = infos + elif "timestamp" in self.infos[name] and self.infos[name][ + "timestamp"] + self.info_threshold * 60 < time(): + self.logDebug("Reached timeout for account data") + self.scheduleRefresh(name) + + data.update(self.infos[name]) + return data + + + def isPremium(self, user): + info = self.getAccountInfo(user) + return info['premium'] + + + def loadAccountInfo(self, name, req=None): + """this should be overwritten in account plugin,\ + and retrieving account information for user + + :param name: + :param req: `Request` instance + :return: + """ + return {"validuntil": None, #: -1 for unlimited + "login": name, + # "password": self.accounts[name]['password'], #: commented due security reason + "options": self.accounts[name]['options'], + "valid": self.accounts[name]['valid'], + "trafficleft": None, #: in kb, -1 for unlimited + "maxtraffic": None, + "premium": None, + "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() + if not user: + return None + + req = self.core.requestFactory.getRequest(self.__name__, user) + return req + + + def getAccountCookies(self, user=None): + if not user: + user, data = self.selectAccount() + if not user: + return None + + cj = self.core.requestFactory.getCookieJar(self.__name__, user) + return cj + + + def getAccountData(self, user): + return self.accounts[user] + + + def selectAccount(self): + """ returns an valid account name and data""" + usable = [] + for user, data in self.accounts.iteritems(): + if not data['valid']: continue + + if "time" in data['options'] and data['options']['time']: + time_data = "" + try: + time_data = data['options']['time'][0] + start, end = time_data.split("-") + if not compare_time(start.split(":"), end.split(":")): + continue + except: + self.logWarning(_("Your Time %s has wrong format, use: 1:22-3:44") % time_data) + + if user in self.infos: + if "validuntil" in self.infos[user]: + if self.infos[user]['validuntil'] > 0 and time() > self.infos[user]['validuntil']: + continue + if "trafficleft" in self.infos[user]: + 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) + + + def wrongPassword(self): + raise WrongPassword + + + def empty(self, user): + if user in self.infos: + self.logWarning(_("Account %s has not enough traffic, checking again in 30min") % user) + + self.infos[user].update({"trafficleft": 0}) + self.scheduleRefresh(user, 30 * 60) + + + def expired(self, user): + if user in self.infos: + self.logWarning(_("Account %s is expired, checking again in 1h") % user) + + self.infos[user].update({"validuntil": time() - 1}) + self.scheduleRefresh(user, 60 * 60) + + + def scheduleRefresh(self, user, time=0, force=True): + """ add task to refresh account info to sheduler """ + self.logDebug("Scheduled Account refresh for %s in %s seconds." % (user, time)) + self.core.scheduler.addJob(time, self.getAccountInfo, [user, force]) + + + @lock + def checkLogin(self, user): + """ checks if user is still logged in """ + if user in self.timestamps: + if self.login_timeout > 0 and self.timestamps[user] + self.login_timeout * 60 < time(): + self.logDebug("Reached login timeout for %s" % user) + return self.relogin(user) + else: + return True + else: + return False diff --git a/pyload/plugins/internal/Addon.py b/pyload/plugins/internal/Addon.py new file mode 100644 index 000000000..1aa51c69a --- /dev/null +++ b/pyload/plugins/internal/Addon.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- + +from traceback import print_exc + +from pyload.plugins.Plugin import Base + + +class Expose(object): + """ used for decoration to declare rpc services """ + + def __new__(cls, f, *args, **kwargs): + addonManager.addRPC(f.__module__, f.func_name, f.func_doc) + return f + + +def threaded(f): + + def run(*args,**kwargs): + addonManager.startThread(f, *args, **kwargs) + return run + + +class Addon(Base): + """ + Base class for addon plugins. + """ + __name__ = "Addon" + __type__ = "addon" + __version__ = "0.03" + + __config__ = [] #: [("name", "type", "desc", "default")] + + __description__ = """Interface for addon""" + __license__ = "GPLv3" + __authors__ = [("mkaay", "mkaay@mkaay.de"), + ("RaNaN", "RaNaN@pyload.org")] + + + #: automatically register event listeners for functions, attribute will be deleted dont use it yourself + event_map = None + + # Alternative to event_map + #: List of events the plugin can handle, name the functions exactly like eventname. + event_list = None # dont make duplicate entries in event_map + + #: periodic call interval in secondc + interval = 60 + + + def __init__(self, core, manager): + Base.__init__(self, core) + + #: Provide information in dict here, usable by API `getInfo` + self.info = {} + + #: Callback of periodical job task, used by AddonManager + self.cb = None + + #: `AddonManager` + self.manager = manager + + #register events + if self.event_map: + for event, funcs in self.event_map.iteritems(): + if type(funcs) in (list, tuple): + for f in funcs: + self.manager.addEvent(event, getattr(self,f)) + else: + self.manager.addEvent(event, getattr(self,funcs)) + + #delete for various reasons + self.event_map = None + + if self.event_list: + for f in self.event_list: + self.manager.addEvent(f, getattr(self,f)) + + self.event_list = None + + self.setup() + self.initPeriodical() + + + def initPeriodical(self): + if self.interval >=1: + self.cb = self.core.scheduler.addJob(0, self._periodical, threaded=False) + + def _periodical(self): + try: + if self.isActivated(): + self.periodical() + except Exception, e: + self.logError(_("Error executing addon: %s") % e) + if self.core.debug: + print_exc() + + self.cb = self.core.scheduler.addJob(self.interval, self._periodical, threaded=False) + + + def __repr__(self): + return "" % self.__name__ + + + def setup(self): + """ more init stuff if needed """ + pass + + + def unload(self): + """ called when addon was deactivated """ + pass + + + def isActivated(self): + """ checks if addon is activated""" + return self.config.getPlugin(self.__name__, "activated") + + + #event methods - overwrite these if needed + def coreReady(self): + pass + + + def coreExiting(self): + pass + + + def downloadPreparing(self, pyfile): + pass + + + def downloadFinished(self, pyfile): + pass + + + def downloadFailed(self, pyfile): + pass + + + def packageFinished(self, pypack): + pass + + + def beforeReconnecting(self, ip): + pass + + + def afterReconnecting(self, ip): + pass + + + def periodical(self): + pass + + + def newCaptchaTask(self, task): + """ new captcha task for the plugin, it MUST set the handler and timeout or will be ignored """ + pass + + + def captchaCorrect(self, task): + pass + + + def captchaInvalid(self, task): + pass diff --git a/pyload/plugins/internal/Captcha.py b/pyload/plugins/internal/Captcha.py new file mode 100644 index 000000000..b2fd980e2 --- /dev/null +++ b/pyload/plugins/internal/Captcha.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugins.Plugin import Plugin + + +class Captcha(Plugin): + __name__ = "Captcha" + __type__ = "captcha" + __version__ = "0.14" + + __description__ = """Base captcha service plugin""" + __license__ = "GPLv3" + __authors__ = [("pyLoad Team", "admin@pyload.org")] + + + KEY_PATTERN = None + + key = None #: last key detected + + + def __init__(self, plugin): + self.plugin = plugin + + + def detect_key(self, html=None): + if not html: + if hasattr(self.plugin, "html") and self.plugin.html: + html = self.plugin.html + else: + errmsg = _("%s html not found") % self.__name__ + self.plugin.fail(errmsg) #@TODO: replace all plugin.fail(errmsg) with plugin.error(errmsg) in 0.4.10 + raise TypeError(errmsg) + + m = re.search(self.KEY_PATTERN, html) + if m: + self.key = m.group("KEY") + self.plugin.logDebug("%s key: %s" % (self.__name__, self.key)) + return self.key + else: + self.plugin.logDebug("%s key not found" % self.__name__) + return None + + + def challenge(self, key=None): + raise NotImplementedError + + + def result(self, server, challenge): + raise NotImplementedError diff --git a/pyload/plugins/internal/Container.py b/pyload/plugins/internal/Container.py new file mode 100644 index 000000000..4bd6644f9 --- /dev/null +++ b/pyload/plugins/internal/Container.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- + +import re + +from os import remove +from os.path import basename, exists + +from pyload.plugins.internal.Crypter import Crypter +from pyload.utils import safe_join + + +class Container(Crypter): + __name__ = "Container" + __type__ = "container" + __version__ = "0.01" + + __pattern__ = r'^unmatchable$' + __config__ = [] #: [("name", "type", "desc", "default")] + + __description__ = """Base container decrypter plugin""" + __license__ = "GPLv3" + __authors__ = [("mkaay", "mkaay@mkaay.de")] + + + def preprocessing(self, thread): + """prepare""" + + self.setup() + self.thread = thread + + self.loadToDisk() + + self.decrypt(self.pyfile) + self.deleteTmp() + + self.createPackages() + + + def loadToDisk(self): + """loads container to disk if its stored remotely and overwrite url, + or check existent on several places at disk""" + + if self.pyfile.url.startswith("http"): + self.pyfile.name = re.findall("([^\/=]+)", self.pyfile.url)[-1] + content = self.load(self.pyfile.url) + self.pyfile.url = safe_join(self.config['general']['download_folder'], self.pyfile.name) + try: + with open(self.pyfile.url, "wb") as f: + f.write(content) + except IOError, e: + self.fail(str(e)) + + else: + self.pyfile.name = basename(self.pyfile.url) + if not exists(self.pyfile.url): + if exists(safe_join(pypath, self.pyfile.url)): + self.pyfile.url = safe_join(pypath, self.pyfile.url) + else: + self.fail(_("File not exists")) + + + def deleteTmp(self): + if self.pyfile.name.startswith("tmp_"): + remove(self.pyfile.url) diff --git a/pyload/plugins/internal/Crypter.py b/pyload/plugins/internal/Crypter.py new file mode 100644 index 000000000..ed92357a5 --- /dev/null +++ b/pyload/plugins/internal/Crypter.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.Plugin import Plugin +from pyload.utils import save_filename + + +class Crypter(Plugin): + __name__ = "Crypter" + __type__ = "crypter" + __version__ = "0.05" + + __pattern__ = r'^unmatchable$' + __config__ = [("use_subfolder", "bool", "Save package to subfolder", True), #: Overrides core.config['general']['folder_per_package'] + ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] + + __description__ = """Base decrypter plugin""" + __license__ = "GPLv3" + __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] + + + html = None #: last html loaded + + + def __init__(self, pyfile): + #: Put all packages here. It's a list of tuples like: ( name, [list of links], folder ) + self.packages = [] + + #: List of urls, pyLoad will generate packagenames + self.urls = [] + + Plugin.__init__(self, pyfile) + + + def process(self, pyfile): + """ main method """ + + self.decrypt(pyfile) + + if self.urls: + self.generatePackages() + + elif not self.packages: + self.error(_("No link extracted"), "decrypt") + + self.createPackages() + + + def decrypt(self, pyfile): + raise NotImplementedError + + + def generatePackages(self): + """ generate new packages from self.urls """ + + packages = map(lambda name, links: (name, links, None), self.core.api.generatePackages(self.urls).iteritems()) + self.packages.extend(packages) + + + def createPackages(self): + """ create new packages from self.packages """ + + package_folder = self.pyfile.package().folder + package_password = self.pyfile.package().password + package_queue = self.pyfile.package().queue + + folder_per_package = self.config['general']['folder_per_package'] + try: + use_subfolder = self.getConfig('use_subfolder') + except: + use_subfolder = folder_per_package + try: + subfolder_per_package = self.getConfig('subfolder_per_package') + except: + subfolder_per_package = True + + for pack in self.packages: + name, links, folder = pack + + self.logDebug("Parsed package: %s" % name, + "%d links" % len(links), + "Saved to folder: %s" % folder if folder else "Saved to download folder") + + links = map(lambda x: x.decode("utf-8"), links) + + pid = self.core.api.addPackage(name, links, package_queue) + + if package_password: + self.core.api.setPackageData(pid, {"password": package_password}) + + setFolder = lambda x: self.core.api.setPackageData(pid, {"folder": x or ""}) #: Workaround to do not break API addPackage method + + if use_subfolder: + if not subfolder_per_package: + setFolder(package_folder) + self.logDebug("Set package %(name)s folder to: %(folder)s" % {"name": name, "folder": folder}) + + elif not folder_per_package or name != folder: + if not folder: + folder = name.replace("http://", "").replace(":", "").replace("/", "_").replace("\\", "_") + + folder = save_filename(folder) #@TODO: move to core code + + setFolder(folder) + self.logDebug("Set package %(name)s folder to: %(folder)s" % {"name": name, "folder": folder}) + + elif folder_per_package: + setFolder(None) diff --git a/pyload/plugins/internal/DeadCrypter.py b/pyload/plugins/internal/DeadCrypter.py index 83aed6d43..ad99c6a13 100644 --- a/pyload/plugins/internal/DeadCrypter.py +++ b/pyload/plugins/internal/DeadCrypter.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Crypter import Crypter as _Crypter +from pyload.plugins.internal.Crypter import Crypter as _Crypter class DeadCrypter(_Crypter): diff --git a/pyload/plugins/internal/DeadHoster.py b/pyload/plugins/internal/DeadHoster.py index 76a7b5d80..3c59f1489 100644 --- a/pyload/plugins/internal/DeadHoster.py +++ b/pyload/plugins/internal/DeadHoster.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.Hoster import Hoster as _Hoster +from pyload.plugins.internal.Hoster import Hoster as _Hoster def create_getInfo(plugin): diff --git a/pyload/plugins/internal/Hoster.py b/pyload/plugins/internal/Hoster.py new file mode 100644 index 000000000..ea225262e --- /dev/null +++ b/pyload/plugins/internal/Hoster.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.Plugin import Plugin + + +def getInfo(self): + #result = [ .. (name, size, status, url) .. ] + return + + +class Hoster(Plugin): + __name__ = "Hoster" + __type__ = "hoster" + __version__ = "0.02" + + __pattern__ = r'^unmatchable$' + __config__ = [] #: [("name", "type", "desc", "default")] + + __description__ = """Base hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("mkaay", "mkaay@mkaay.de")] diff --git a/pyload/plugins/internal/MultiHoster.py b/pyload/plugins/internal/MultiHoster.py index 97cbb4591..88a9c888b 100644 --- a/pyload/plugins/internal/MultiHoster.py +++ b/pyload/plugins/internal/MultiHoster.py @@ -2,14 +2,14 @@ import re -from pyload.plugins.base.Addon import Addon +from pyload.plugins.internal.Addon import Addon from pyload.utils import remove_chars class MultiHoster(Addon): __name__ = "MultiHoster" __type__ = "addon" - __version__ = "0.20" + __version__ = "0.20" __description__ = """Generic MultiHoster plugin""" __license__ = "GPLv3" diff --git a/pyload/plugins/internal/OCR.py b/pyload/plugins/internal/OCR.py new file mode 100644 index 000000000..b5ee30cb7 --- /dev/null +++ b/pyload/plugins/internal/OCR.py @@ -0,0 +1,314 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +try: + from PIL import Image, GifImagePlugin, JpegImagePlugin, PngImagePlugin, TiffImagePlugin +except ImportError: + import Image, GifImagePlugin, JpegImagePlugin, PngImagePlugin, TiffImagePlugin + +import logging +import subprocess + +from os.path import abspath, join + + +class OCR(object): + __name__ = "OCR" + __type__ = "ocr" + __version__ = "0.01" + + __description__ = """OCR base plugin""" + __license__ = "GPLv3" + __authors__ = [("pyLoad Team", "admin@pyload.org")] + + + def __init__(self): + self.logger = logging.getLogger("log") + + + def load_image(self, image): + self.image = Image.open(image) + self.pixels = self.image.load() + self.result_captcha = '' + + + def unload(self): + """delete all tmp images""" + pass + + + def threshold(self, value): + self.image = self.image.point(lambda a: a * value + 10) + + + def run(self, command): + """Run a command""" + + popen = subprocess.Popen(command, bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + popen.wait() + output = popen.stdout.read() + " | " + popen.stderr.read() + popen.stdout.close() + popen.stderr.close() + self.logger.debug("Tesseract ReturnCode %s Output: %s" % (popen.returncode, output)) + + + def run_tesser(self, subset=False, digits=True, lowercase=True, uppercase=True): + #tmpTif = tempfile.NamedTemporaryFile(suffix=".tif") + try: + tmpTif = open(join("tmp", "tmpTif_%s.tif" % self.__name__), "wb") + tmpTif.close() + + #tmpTxt = tempfile.NamedTemporaryFile(suffix=".txt") + tmpTxt = open(join("tmp", "tmpTxt_%s.txt" % self.__name__), "wb") + tmpTxt.close() + + except IOError, e: + self.logError(e) + return + + self.logger.debug("save tiff") + self.image.save(tmpTif.name, 'TIFF') + + if os.name == "nt": + tessparams = [join(pypath, "tesseract", "tesseract.exe")] + else: + tessparams = ['tesseract'] + + tessparams.extend([abspath(tmpTif.name), abspath(tmpTxt.name).replace(".txt", "")] ) + + if subset and (digits or lowercase or uppercase): + #tmpSub = tempfile.NamedTemporaryFile(suffix=".subset") + tmpSub = open(join("tmp", "tmpSub_%s.subset" % self.__name__), "wb") + tmpSub.write("tessedit_char_whitelist ") + if digits: + tmpSub.write("0123456789") + if lowercase: + tmpSub.write("abcdefghijklmnopqrstuvwxyz") + if uppercase: + tmpSub.write("ABCDEFGHIJKLMNOPQRSTUVWXYZ") + tmpSub.write("\n") + tessparams.append("nobatch") + tessparams.append(abspath(tmpSub.name)) + tmpSub.close() + + self.logger.debug("run tesseract") + self.run(tessparams) + self.logger.debug("read txt") + + try: + with open(tmpTxt.name, 'r') as f: + self.result_captcha = f.read().replace("\n", "") + except: + self.result_captcha = "" + + self.logger.debug(self.result_captcha) + try: + os.remove(tmpTif.name) + os.remove(tmpTxt.name) + if subset and (digits or lowercase or uppercase): + os.remove(tmpSub.name) + except: + pass + + + def get_captcha(self, name): + raise NotImplementedError + + + def to_greyscale(self): + if self.image.mode != 'L': + self.image = self.image.convert('L') + + self.pixels = self.image.load() + + + def eval_black_white(self, limit): + self.pixels = self.image.load() + w, h = self.image.size + for x in xrange(w): + for y in xrange(h): + if self.pixels[x, y] > limit: + self.pixels[x, y] = 255 + else: + self.pixels[x, y] = 0 + + + def clean(self, allowed): + pixels = self.pixels + + w, h = self.image.size + + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 255: + continue + # No point in processing white pixels since we only want to remove black pixel + count = 0 + + try: + if pixels[x - 1, y - 1] != 255: + count += 1 + if pixels[x - 1, y] != 255: + count += 1 + if pixels[x - 1, y + 1] != 255: + count += 1 + if pixels[x, y + 1] != 255: + count += 1 + if pixels[x + 1, y + 1] != 255: + count += 1 + if pixels[x + 1, y] != 255: + count += 1 + if pixels[x + 1, y - 1] != 255: + count += 1 + if pixels[x, y - 1] != 255: + count += 1 + except: + pass + + # not enough neighbors are dark pixels so mark this pixel + # to be changed to white + if count < allowed: + pixels[x, y] = 1 + + # second pass: this time set all 1's to 255 (white) + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 1: + pixels[x, y] = 255 + + self.pixels = pixels + + + def derotate_by_average(self): + """rotate by checking each angle and guess most suitable""" + + w, h = self.image.size + pixels = self.pixels + + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 0: + pixels[x, y] = 155 + + highest = {} + counts = {} + + for angle in xrange(-45, 45): + + tmpimage = self.image.rotate(angle) + + pixels = tmpimage.load() + + w, h = self.image.size + + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 0: + pixels[x, y] = 255 + + count = {} + + for x in xrange(w): + count[x] = 0 + for y in xrange(h): + if pixels[x, y] == 155: + count[x] += 1 + + sum = 0 + cnt = 0 + + for x in count.values(): + if x != 0: + sum += x + cnt += 1 + + avg = sum / cnt + counts[angle] = cnt + highest[angle] = 0 + for x in count.values(): + if x > highest[angle]: + highest[angle] = x + + highest[angle] = highest[angle] - avg + + hkey = 0 + hvalue = 0 + + for key, value in highest.iteritems(): + if value > hvalue: + hkey = key + hvalue = value + + self.image = self.image.rotate(hkey) + pixels = self.image.load() + + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 0: + pixels[x, y] = 255 + + if pixels[x, y] == 155: + pixels[x, y] = 0 + + self.pixels = pixels + + + def split_captcha_letters(self): + captcha = self.image + started = False + letters = [] + width, height = captcha.size + bottomY, topY = 0, height + pixels = captcha.load() + + for x in xrange(width): + black_pixel_in_col = False + for y in xrange(height): + if pixels[x, y] != 255: + if not started: + started = True + firstX = x + lastX = x + + if y > bottomY: + bottomY = y + if y < topY: + topY = y + if x > lastX: + lastX = x + + black_pixel_in_col = True + + if black_pixel_in_col is False and started is True: + rect = (firstX, topY, lastX, bottomY) + new_captcha = captcha.crop(rect) + + w, h = new_captcha.size + if w > 5 and h > 5: + letters.append(new_captcha) + + started = False + bottomY, topY = 0, height + + return letters + + + def correct(self, values, var=None): + if var: + result = var + else: + result = self.result_captcha + + for key, item in values.iteritems(): + + if key.__class__ == str: + result = result.replace(key, item) + else: + for expr in key: + result = result.replace(expr, item) + + if var: + return result + else: + self.result_captcha = result diff --git a/pyload/plugins/internal/SimpleCrypter.py b/pyload/plugins/internal/SimpleCrypter.py index 5f7f89bc2..251acd6b8 100644 --- a/pyload/plugins/internal/SimpleCrypter.py +++ b/pyload/plugins/internal/SimpleCrypter.py @@ -4,9 +4,9 @@ import re from urlparse import urlparse -from pyload.plugins.Crypter import Crypter -from module.plugins.Plugin import Fail -from module.plugins.internal.SimpleHoster import _error, _wait, parseFileInfo, replace_patterns, set_cookies +from pyload.plugins.internal.Crypter import Crypter +from pyload.plugins.Plugin import Fail +from pyload.plugins.internal.SimpleHoster import _error, _wait, parseFileInfo, replace_patterns, set_cookies from pyload.utils import fixup, html_unescape diff --git a/pyload/plugins/internal/SimpleHoster.py b/pyload/plugins/internal/SimpleHoster.py index dd3afdefd..ee8ef712b 100644 --- a/pyload/plugins/internal/SimpleHoster.py +++ b/pyload/plugins/internal/SimpleHoster.py @@ -9,8 +9,8 @@ from pycurl import FOLLOWLOCATION from pyload.network.CookieJar import CookieJar from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Hoster import Hoster -from module.plugins.Plugin import Fail +from pyload.plugins.internal.Hoster import Hoster +from pyload.plugins.Plugin import Fail from pyload.utils import fixup, html_unescape, parseFileSize diff --git a/pyload/plugins/internal/UpdateManager.py b/pyload/plugins/internal/UpdateManager.py index 3f5b34c45..f1312dda5 100644 --- a/pyload/plugins/internal/UpdateManager.py +++ b/pyload/plugins/internal/UpdateManager.py @@ -7,7 +7,7 @@ from operator import itemgetter from os import path, remove, stat from pyload.network.RequestFactory import getURL -from pyload.plugins.base.Addon import Expose, Addon, threaded +from pyload.plugins.internal.Addon import Expose, Addon, threaded from pyload.utils import safe_join diff --git a/pyload/plugins/internal/XFSAccount.py b/pyload/plugins/internal/XFSAccount.py new file mode 100644 index 000000000..0992a8c31 --- /dev/null +++ b/pyload/plugins/internal/XFSAccount.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- + +import re + +from time import gmtime, mktime, strptime +from urlparse import urljoin + +from pyload.plugins.internal.Account import Account +from pyload.plugins.internal.SimpleHoster import parseHtmlForm, set_cookies + + +class XFSAccount(Account): + __name__ = "XFSAccount" + __type__ = "account" + __version__ = "0.25" + + __description__ = """XFileSharing account plugin""" + __license__ = "GPLv3" + __authors__ = [("zoidberg", "zoidberg@mujmail.cz"), + ("Walter Purcaro", "vuolter@gmail.com")] + + + HOSTER_DOMAIN = None + HOSTER_URL = None + + COOKIES = [(HOSTER_DOMAIN, "lang", "english")] + + PREMIUM_PATTERN = r'\(Premium only\)' + + VALID_UNTIL_PATTERN = r'>Premium.[Aa]ccount expire:.*?(\d{1,2} [\w^_]+ \d{4})' + + TRAFFIC_LEFT_PATTERN = r'>Traffic available today:.*?\s*(?P[\d.,]+|[Uu]nlimited)\s*(?:(?P[\w^_]+)\s*)?' + TRAFFIC_LEFT_UNIT = "MB" #: used only if no group was found + + LOGIN_FAIL_PATTERN = r'>(Incorrect Login or Password|Error<)' + + + def __init__(self, manager, accounts): #@TODO: remove in 0.4.10 + self.init() + return super(XFSAccount, self).__init__(manager, accounts) + + + def init(self): + # if not self.HOSTER_DOMAIN: + # self.fail(_("Missing HOSTER_DOMAIN")) + + if not self.HOSTER_URL: + self.HOSTER_URL = "http://www.%s/" % self.HOSTER_DOMAIN + + + def loadAccountInfo(self, user, req): + validuntil = None + trafficleft = None + premium = None + + html = req.load(self.HOSTER_URL, get={'op': "my_account"}, decode=True) + + premium = True if re.search(self.PREMIUM_PATTERN, html) else False + + m = re.search(self.VALID_UNTIL_PATTERN, html) + if m: + expiredate = m.group(1).strip() + self.logDebug("Expire date: " + expiredate) + + try: + validuntil = mktime(strptime(expiredate, "%d %B %Y")) + + except Exception, e: + self.logError(e) + + else: + if validuntil > mktime(gmtime()): + premium = True + else: + premium = False + validuntil = None #: registered account type (not premium) + + m = re.search(self.TRAFFIC_LEFT_PATTERN, html) + if m: + try: + traffic = m.groupdict() + size = traffic['S'] + + if "nlimited" in size: + trafficleft = -1 + if validuntil is None: + validuntil = -1 + else: + if 'U' in traffic: + unit = traffic['U'] + elif isinstance(self.TRAFFIC_LEFT_UNIT, basestring): + unit = self.TRAFFIC_LEFT_UNIT + else: + unit = "" + + trafficleft = self.parseTraffic(size + unit) + + except Exception, e: + self.logError(e) + + return {'validuntil': validuntil, 'trafficleft': trafficleft, 'premium': premium} + + + def login(self, user, data, req): + if isinstance(self.COOKIES, list): + set_cookies(req.cj, self.COOKIES) + + url = urljoin(self.HOSTER_URL, "login.html") + html = req.load(url, decode=True) + + action, inputs = parseHtmlForm('name="FL"', html) + if not inputs: + inputs = {'op': "login", + 'redirect': self.HOSTER_URL} + + inputs.update({'login': user, + 'password': data['password']}) + + html = req.load(self.HOSTER_URL, post=inputs, decode=True) + + if re.search(self.LOGIN_FAIL_PATTERN, html): + self.wrongPassword() diff --git a/pyload/plugins/internal/XFSCrypter.py b/pyload/plugins/internal/XFSCrypter.py new file mode 100644 index 000000000..2de39f4bc --- /dev/null +++ b/pyload/plugins/internal/XFSCrypter.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +from pyload.plugins.internal.SimpleCrypter import SimpleCrypter + + +class XFSCrypter(SimpleCrypter): + __name__ = "XFSCrypter" + __type__ = "crypter" + __version__ = "0.04" + + __pattern__ = r'^unmatchable$' + + __description__ = """XFileSharing decrypter plugin""" + __license__ = "GPLv3" + __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] + + + HOSTER_DOMAIN = None + HOSTER_NAME = None + + URL_REPLACEMENTS = [(r'&?per_page=\d+', ""), (r'[?/&]+$', ""), (r'(.+/[^?]+)$', r'\1?'), (r'$', r'&per_page=10000')] + + COOKIES = [(HOSTER_DOMAIN, "lang", "english")] + + LINK_PATTERN = r'<(?:td|TD).*?>\s*.+?(?:)?\s*' + NAME_PATTERN = r'<[tT]itle>.*?\: (?P.+) folder' + + OFFLINE_PATTERN = r'>\s*\w+ (Not Found|file (was|has been) removed)' + TEMP_OFFLINE_PATTERN = r'>\s*\w+ server (is in )?(maintenance|maintainance)' diff --git a/pyload/plugins/internal/XFSHoster.py b/pyload/plugins/internal/XFSHoster.py new file mode 100644 index 000000000..80ddda002 --- /dev/null +++ b/pyload/plugins/internal/XFSHoster.py @@ -0,0 +1,345 @@ +# -*- coding: utf-8 -*- + +import re + +from random import random +from time import sleep + +from pycurl import FOLLOWLOCATION, LOW_SPEED_TIME + +from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight +from pyload.plugins.internal.CaptchaService import ReCaptcha, SolveMedia +from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo +from pyload.utils import html_unescape + + +class XFSHoster(SimpleHoster): + __name__ = "XFSHoster" + __type__ = "hoster" + __version__ = "0.15" + + __pattern__ = r'^unmatchable$' + + __description__ = """XFileSharing hoster plugin""" + __license__ = "GPLv3" + __authors__ = [("zoidberg", "zoidberg@mujmail.cz"), + ("stickell", "l.stickell@yahoo.it"), + ("Walter Purcaro", "vuolter@gmail.com")] + + + HOSTER_DOMAIN = None + HOSTER_NAME = None + + URL_REPLACEMENTS = [(r'/(?:embed-)?(\w{12}).*', r'/\1')] #: plus support embedded files + + COOKIES = [(HOSTER_DOMAIN, "lang", "english")] + + INFO_PATTERN = r'Filename:(?P[^<]+)\s*.*?\((?P[^<]+)\)' + NAME_PATTERN = r'[\d.,]+) ?(?P[\w^_]+)?\)' + + OFFLINE_PATTERN = r'>\s*\w+ (Not Found|file (was|has been) removed)' + TEMP_OFFLINE_PATTERN = r'>\s*\w+ server (is in )?(maintenance|maintainance)' + + WAIT_PATTERN = r'.*?>(\d+)' + + OVR_LINK_PATTERN = r'

    Download Link

    \s*]*>([^<]+)' + LINK_PATTERN = None #: final download url pattern + + CAPTCHA_PATTERN = r'(http://[^"\']+?/captchas?/[^"\']+)' + CAPTCHA_DIV_PATTERN = r'>Enter code.*?(.+?)

    ' + RECAPTCHA_PATTERN = None + SOLVEMEDIA_PATTERN = None + + ERROR_PATTERN = r'(?:class=["\']err["\'][^>]*>|<[Cc]enter>)(.+?)(?:["\']|\(ERROR:(.+?)\)' + + + def setup(self): + self.chunkLimit = 1 + self.resumeDownload = self.multiDL = self.premium + + + def prepare(self): + """ Initialize important variables """ + if not self.HOSTER_DOMAIN: + self.fail(_("Missing HOSTER_DOMAIN")) + + if not self.HOSTER_NAME: + self.HOSTER_NAME = "".join([str.capitalize() for str in self.HOSTER_DOMAIN.split('.')]) + + if not self.LINK_PATTERN: + pattern = r'(https?://(www\.)?([^/]*?%s|\d+\.\d+\.\d+\.\d+)(\:\d+)?(/d/|(/files)?/\d+/\w+/).+?)["\'<]' + self.LINK_PATTERN = pattern % self.HOSTER_DOMAIN.replace('.', '\.') + + self.captcha = None + self.errmsg = None + self.passwords = self.getPassword().splitlines() + + if (self.__pattern__ != self.core.pluginManager.hosterPlugins[self.__name__]['pattern'] + and re.match(self.__pattern__, self.pyfile.url) is None): + self.logInfo(_("Multi hoster detected")) + if self.premium: + self.logDebug(_("Looking for download link...")) + self.handleOverriden() + else: + self.fail(_("Only premium users can use url leech feature")) + + return super(XFSHoster, self).prepare() + + + def handleFree(self): + link = self.getDownloadLink() + + if link: + if self.captcha: + self.correctCaptcha() + + self.download(link, ref=True, cookies=True, disposition=True) + + elif self.errmsg: + if 'captcha' in self.errmsg: + self.fail(_("No valid captcha code entered")) + else: + self.fail(self.errmsg) + + else: + self.fail(_("Download link not found")) + + + def handlePremium(self): + return self.handleFree() + + + def getDownloadLink(self): + for i in xrange(1, 5): + self.logDebug("Getting download link: #%d" % i) + + self.checkErrors() + + m = re.search(self.LINK_PATTERN, self.html, re.S) + if m: + break + + data = self.getPostParameters() + + # sleep(10) + + self.req.http.c.setopt(FOLLOWLOCATION, 0) + + self.html = self.load(self.pyfile.url, post=data, ref=True, decode=True) + self.header = self.req.http.header + + self.req.http.c.setopt(FOLLOWLOCATION, 1) + + m = re.search(r'Location\s*:\s*(.+)', self.header, re.I) + if m: + break + + m = re.search(self.LINK_PATTERN, self.html, re.S) + if m: + break + else: + return + + self.errmsg = None + + return m.group(1).strip() #@TODO: Remove .strip() in 0.4.10 + + + def handleOverriden(self): + #only tested with easybytez.com + self.html = self.load("http://www.%s/" % self.HOSTER_DOMAIN) + + action, inputs = self.parseHtmlForm('') + + upload_id = "%012d" % int(random() * 10 ** 12) + action += upload_id + "&js_on=1&utype=prem&upload_type=url" + + inputs['tos'] = '1' + inputs['url_mass'] = self.pyfile.url + inputs['up1oad_type'] = 'url' + + self.logDebug(action, inputs) + + self.req.setOption("timeout", 600) #: wait for file to upload to easybytez.com + + self.html = self.load(action, post=inputs) + + self.checkErrors() + + action, inputs = self.parseHtmlForm('F1') + if not inputs: + if self.errmsg: + self.retry(reason=self.errmsg) + else: + self.error(_("TEXTAREA F1 not found")) + + self.logDebug(inputs) + + stmsg = inputs['st'] + + if stmsg == 'OK': + self.html = self.load(action, post=inputs) + + elif 'Can not leech file' in stmsg: + self.retry(20, 3 * 60, _("Can not leech file")) + + elif 'today' in stmsg: + self.retry(wait_time=secondsToMidnight(gmt=2), reason=_("You've used all Leech traffic today")) + + else: + self.fail(stmsg) + + #get easybytez.com link for uploaded file + m = re.search(self.OVR_LINK_PATTERN, self.html) + if m is None: + self.error(_("OVR_LINK_PATTERN not found")) + + header = self.load(m.group(1).strip(), just_header=True, decode=True) #@TODO: Remove .strip() in 0.4.10 + if 'location' in header: #: Direct download link + self.download(header['location'], ref=True, cookies=True, disposition=True) + else: + self.fail(_("Download link not found")) + + + def checkErrors(self): + m = re.search(self.ERROR_PATTERN, self.html) + + if m is None: + self.errmsg = None + else: + self.errmsg = m.group(1) + + self.logWarning(re.sub(r"<.*?>", " ", self.errmsg)) + + if 'wait' in self.errmsg: + wait_time = sum([int(v) * {"hour": 3600, "minute": 60, "second": 1}[u] for v, u in + re.findall(r'(\d+)\s*(hour|minute|second)', self.errmsg)]) + self.wait(wait_time, True) + + elif 'captcha' in self.errmsg: + self.invalidCaptcha() + + elif 'premium' in self.errmsg and 'require' in self.errmsg: + self.fail(_("File can be downloaded by premium users only")) + + elif 'limit' in self.errmsg: + if 'days' in self.errmsg: + delay = secondsToMidnight(gmt=2) + retries = 3 + else: + delay = 1 * 60 * 60 + retries = 25 + + self.wait(delay, True) + self.retry(retries, reason=_("Download limit exceeded")) + + elif 'countdown' in self.errmsg or 'Expired' in self.errmsg: + self.retry(reason=_("Link expired")) + + elif 'maintenance' in self.errmsg or 'maintainance' in self.errmsg: + self.tempOffline() + + elif 'download files up to' in self.errmsg: + self.fail(_("File too large for free download")) + + else: + self.retry(wait_time=60, reason=self.errmsg) + + return self.errmsg + + + def getPostParameters(self): + for _i in xrange(3): + if hasattr(self, "FORM_PATTERN"): + action, inputs = self.parseHtmlForm(self.FORM_PATTERN) + else: + action, inputs = self.parseHtmlForm(input_names={"op": re.compile("^download")}) + + if not inputs: + action, inputs = self.parseHtmlForm('F1') + if not inputs: + if self.errmsg: + self.retry(reason=self.errmsg) + else: + self.error(_("TEXTAREA F1 not found")) + + self.logDebug(inputs) + + if 'op' in inputs and inputs['op'] in ("download2", "download3"): + if "password" in inputs: + if self.passwords: + inputs['password'] = self.passwords.pop(0) + else: + self.fail(_("No or invalid passport")) + + if not self.premium: + m = re.search(self.WAIT_PATTERN, self.html) + if m: + wait_time = int(m.group(1)) + self.setWait(wait_time, False) + else: + wait_time = 0 + + self.captcha = self.handleCaptcha(inputs) + + if wait_time: + self.wait() + + return inputs + else: + inputs['referer'] = self.pyfile.url + + if self.premium: + inputs['method_premium'] = "Premium Download" + if 'method_free' in inputs: + del inputs['method_free'] + else: + inputs['method_free'] = "Free Download" + if 'method_premium' in inputs: + del inputs['method_premium'] + + self.html = self.load(self.pyfile.url, post=inputs, ref=True) + else: + self.error(_("FORM: %s") % (inputs['op'] if 'op' in inputs else _("UNKNOWN"))) + + + def handleCaptcha(self, inputs): + m = re.search(self.CAPTCHA_PATTERN, self.html) + if m: + captcha_url = m.group(1) + inputs['code'] = self.decryptCaptcha(captcha_url) + return 1 + + m = re.search(self.CAPTCHA_DIV_PATTERN, self.html, re.S) + if m: + captcha_div = m.group(1) + self.logDebug(captcha_div) + numerals = re.findall(r'(\d)', html_unescape(captcha_div)) + inputs['code'] = "".join([a[1] for a in sorted(numerals, key=lambda num: int(num[0]))]) + self.logDebug("Captcha code: %s" % inputs['code'], numerals) + return 2 + + recaptcha = ReCaptcha(self) + try: + captcha_key = re.search(self.RECAPTCHA_PATTERN, self.html).group(1) + except: + captcha_key = recaptcha.detect_key() + + if captcha_key: + self.logDebug("ReCaptcha key: %s" % captcha_key) + inputs['recaptcha_challenge_field'], inputs['recaptcha_response_field'] = recaptcha.challenge(captcha_key) + return 3 + + solvemedia = SolveMedia(self) + try: + captcha_key = re.search(self.SOLVEMEDIA_PATTERN, self.html).group(1) + except: + captcha_key = solvemedia.detect_key() + + if captcha_key: + self.logDebug("SolveMedia key: %s" % captcha_key) + inputs['adcopy_challenge'], inputs['adcopy_response'] = solvemedia.challenge(captcha_key) + return 4 + + return 0 diff --git a/pyload/plugins/internal/XFSPAccount.py b/pyload/plugins/internal/XFSPAccount.py deleted file mode 100644 index edf6ad3cc..000000000 --- a/pyload/plugins/internal/XFSPAccount.py +++ /dev/null @@ -1,96 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from urlparse import urljoin -from time import mktime, strptime - -from pyload.plugins.base.Account import Account -from pyload.plugins.internal.SimpleHoster import parseHtmlForm, set_cookies -from pyload.utils import parseFileSize - - -class XFSPAccount(Account): - __name__ = "XFSPAccount" - __type__ = "account" - __version__ = "0.09" - - __description__ = """XFileSharingPro base account plugin""" - __authors__ = [("zoidberg", "zoidberg@mujmail.cz"), - ("Walter Purcaro", "vuolter@gmail.com")] - - - HOSTER_URL = None - - COOKIES = None #: or list of tuples [(domain, name, value)] - - VALID_UNTIL_PATTERN = r'>Premium.[Aa]ccount expire:.*?(.+?)' - TRAFFIC_LEFT_PATTERN = r'>Traffic available today:.*?(?P.+?)' - LOGIN_FAIL_PATTERN = r'>(Incorrect Login or Password|Error<)' - # PREMIUM_PATTERN = r'>Renew premium<' - - - def loadAccountInfo(self, user, req): - html = req.load(self.HOSTER_URL, get={'op': "my_account"}, decode=True) - - validuntil = None - trafficleft = None - premium = None - - if hasattr(self, "PREMIUM_PATTERN"): - premium = True if re.search(self.PREMIUM_PATTERN, html) else False - - m = re.search(self.VALID_UNTIL_PATTERN, html) - if m: - expiredate = m.group(1) - self.logDebug("Expire date: " + expiredate) - - try: - validuntil = mktime(strptime(expiredate, "%d %B %Y")) - except Exception, e: - self.logError(e) - else: - if validuntil > mktime(gmtime()): - premium = True - trafficleft = -1 - else: - if premium is False: #: registered account type (not premium) - validuntil = -1 - premium = False - - try: - traffic = re.search(self.TRAFFIC_LEFT_PATTERN, html).groupdict() - trafficsize = traffic['S'] + traffic['U'] if 'U' in traffic else traffic['S'] - if "Unlimited" in trafficsize: - trafficleft = -1 - if premium is None: - premium = True - else: - trafficleft = parseFileSize(trafficsize) - except: - pass - - if premium is None: - premium = False - - return {'validuntil': validuntil, 'trafficleft': trafficleft, 'premium': premium} - - - def login(self, user, data, req): - set_cookies(req.cj, self.COOKIES) - - url = urljoin(self.HOSTER_URL, "login.html") - html = req.load(url, decode=True) - - action, inputs = parseHtmlForm('name="FL"', html) - if not inputs: - inputs = {'op': "login", - 'redirect': self.HOSTER_URL} - - inputs.update({'login': user, - 'password': data['password']}) - - html = req.load(self.HOSTER_URL, post=inputs, decode=True) - - if re.search(self.LOGIN_FAIL_PATTERN, html): - self.wrongPassword() diff --git a/pyload/plugins/internal/XFSPHoster.py b/pyload/plugins/internal/XFSPHoster.py deleted file mode 100644 index c3f8b6f41..000000000 --- a/pyload/plugins/internal/XFSPHoster.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo - - -class XFileSharingPro(XFSHoster): - __name__ = "XFileSharingPro" - __type__ = "hoster" - __version__ = "0.42" - - __pattern__ = r'^unmatchable$' - - __description__ = """XFileSharingPro dummy hoster plugin for hook""" - __license__ = "GPLv3" - __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] - - - def _log(self, type, args): - msg = " | ".join([str(a).strip() for a in args if a]) - logger = getattr(self.log, type) - logger("%s: %s: %s" % (self.__name__, self.HOSTER_NAME, msg or _("%s MARK" % type.upper()))) - - - def init(self): - super(XFileSharingPro, self).init() - - self.__pattern__ = self.core.pluginManager.hosterPlugins[self.__name__]['pattern'] - - self.HOSTER_DOMAIN = re.match(self.__pattern__, self.pyfile.url).group(1).lower() - self.HOSTER_NAME = "".join([str.capitalize() for str in self.HOSTER_DOMAIN.split('.')]) - - account = self.core.accountManager.getAccountPlugin(self.HOSTER_NAME) - - if account and account.canUse(): - self.account = account - elif self.account: - self.account.HOSTER_DOMAIN = self.HOSTER_DOMAIN - else: - return - - self.user, data = self.account.selectAccount() - self.req = self.account.getAccountRequest(self.user) - self.premium = self.account.isPremium(self.user) - - - def setup(self): - self.chunkLimit = 1 - self.resumeDownload = self.premium - self.multiDL = True - - -getInfo = create_getInfo(XFileSharingPro) diff --git a/pyload/plugins/ocr/GigasizeCom.py b/pyload/plugins/ocr/GigasizeCom.py index 01b50be54..e1f6e8753 100644 --- a/pyload/plugins/ocr/GigasizeCom.py +++ b/pyload/plugins/ocr/GigasizeCom.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.OCR import OCR +from pyload.plugins.internal.OCR import OCR class GigasizeCom(OCR): diff --git a/pyload/plugins/ocr/LinksaveIn.py b/pyload/plugins/ocr/LinksaveIn.py index 1bde857be..a9171ac7c 100644 --- a/pyload/plugins/ocr/LinksaveIn.py +++ b/pyload/plugins/ocr/LinksaveIn.py @@ -9,7 +9,7 @@ from glob import glob from os import sep from os.path import abspath, dirname -from pyload.plugins.base.OCR import OCR +from pyload.plugins.internal.OCR import OCR class LinksaveIn(OCR): diff --git a/pyload/plugins/ocr/NetloadIn.py b/pyload/plugins/ocr/NetloadIn.py index 86916dd72..79a88c27a 100644 --- a/pyload/plugins/ocr/NetloadIn.py +++ b/pyload/plugins/ocr/NetloadIn.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.OCR import OCR +from pyload.plugins.internal.OCR import OCR class NetloadIn(OCR): diff --git a/pyload/plugins/ocr/ShareonlineBiz.py b/pyload/plugins/ocr/ShareonlineBiz.py index 04ffeaf26..5263f8316 100644 --- a/pyload/plugins/ocr/ShareonlineBiz.py +++ b/pyload/plugins/ocr/ShareonlineBiz.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pyload.plugins.base.OCR import OCR +from pyload.plugins.internal.OCR import OCR class ShareonlineBiz(OCR): -- cgit v1.2.3