test
This commit is contained in:
BIN
resources/icons/bezvadata.cz.png
Normal file
BIN
resources/icons/bezvadata.cz.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
BIN
resources/icons/hellspy.cz.png
Normal file
BIN
resources/icons/hellspy.cz.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
BIN
resources/icons/ulozto.cz.png
Normal file
BIN
resources/icons/ulozto.cz.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 70 KiB |
BIN
resources/icons/webshare.cz.png
Normal file
BIN
resources/icons/webshare.cz.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 53 KiB |
167
resources/language/Czech/strings.po
Normal file
167
resources/language/Czech/strings.po
Normal file
@@ -0,0 +1,167 @@
|
||||
# Kodi Media Center language file
|
||||
# Addon Name: Soubory Online
|
||||
# Addon id: plugin.video.online-files
|
||||
msgid ""
|
||||
msgstr ""
|
||||
|
||||
"Language: cs_CZ\n"
|
||||
|
||||
msgctxt "#30000"
|
||||
msgid "Size of search history"
|
||||
msgstr "Počet zapamatovaných hledání"
|
||||
|
||||
msgctxt "#30001"
|
||||
msgid "Video is not available, check[CR]whether it works using web page."
|
||||
msgstr "Video není dostupné, zkontrolujte,[CR]zda funguje přehrávání na webu."
|
||||
|
||||
msgctxt "#30002"
|
||||
msgid "Enable service"
|
||||
msgstr "Povolit službu"
|
||||
|
||||
msgctxt "#30003"
|
||||
msgid "Download using VIP account"
|
||||
msgstr "Stahovat pomocí VIP účtu"
|
||||
|
||||
msgctxt "#30004"
|
||||
msgid "Ask"
|
||||
msgstr "Zeptat se"
|
||||
|
||||
msgctxt "#30005"
|
||||
msgid "Always"
|
||||
msgstr "Vždy"
|
||||
|
||||
msgctxt "#30006"
|
||||
msgid "Never"
|
||||
msgstr "Nikdy"
|
||||
|
||||
msgctxt "#30007"
|
||||
msgid "Username"
|
||||
msgstr "Uživ. jméno"
|
||||
|
||||
msgctxt "#30008"
|
||||
msgid "Password"
|
||||
msgstr "Uživ. heslo"
|
||||
|
||||
msgctxt "#30009"
|
||||
msgid "bezvadata.cz"
|
||||
msgstr "bezvadata.cz"
|
||||
|
||||
msgctxt "#30010"
|
||||
msgid "ulozto.cz"
|
||||
msgstr "ulozto.cz"
|
||||
|
||||
msgctxt "#30011"
|
||||
msgid "hellspy.cz"
|
||||
msgstr "hellspy.cz"
|
||||
|
||||
msgctxt "#30012"
|
||||
msgid "Would you like to use VIP account to get this file?"
|
||||
msgstr "Chcete pro získání souboru použít VIP účet?"
|
||||
|
||||
msgctxt "#30013"
|
||||
msgid "Server"
|
||||
msgstr "Server"
|
||||
|
||||
msgctxt "#30014"
|
||||
msgid "fastshare.cz"
|
||||
msgstr "fastshare.cz"
|
||||
|
||||
msgctxt "#30015"
|
||||
msgid "webshare.cz"
|
||||
msgstr "webshare.cz"
|
||||
|
||||
msgctxt "#30030"
|
||||
msgid "Downloads"
|
||||
msgstr "Složka pro stahování"
|
||||
|
||||
msgctxt "#30031"
|
||||
msgid "Please setup downloads folder"
|
||||
msgstr "Nastavte prosím složku pro stahování"
|
||||
|
||||
msgctxt "#30032"
|
||||
msgid "Notify when downloading"
|
||||
msgstr "Zobrazovat stav stahování"
|
||||
|
||||
msgctxt "#30033"
|
||||
msgid " - display notification every"
|
||||
msgstr " - zobrazit stav každých"
|
||||
|
||||
msgctxt "#30034"
|
||||
msgid "10%"
|
||||
msgstr "10%"
|
||||
|
||||
msgctxt "#30035"
|
||||
msgid "5%"
|
||||
msgstr "5%"
|
||||
|
||||
msgctxt "#30036"
|
||||
msgid "1%"
|
||||
msgstr "1%"
|
||||
|
||||
msgctxt "#30037"
|
||||
msgid "Downloads"
|
||||
msgstr "[B]Stažené soubory[/B]"
|
||||
|
||||
msgctxt "#30050"
|
||||
msgid "Show adult only content"
|
||||
msgstr "Povolit zobrazování 18+ obsahu"
|
||||
|
||||
msgctxt "#30051"
|
||||
msgid "Do not show files with extensions"
|
||||
msgstr "Nezobrazovat soubory s příponou"
|
||||
|
||||
msgctxt "#30052"
|
||||
msgid "General"
|
||||
msgstr "Obecné"
|
||||
|
||||
msgctxt "#30053"
|
||||
msgid "Most Downloaded"
|
||||
msgstr "Nejstahovanější"
|
||||
|
||||
msgctxt "#30054"
|
||||
msgid "Downloading now"
|
||||
msgstr "Právě se stahuje"
|
||||
|
||||
msgctxt "#30055"
|
||||
msgid "Saved to download later"
|
||||
msgstr "Ke stažení"
|
||||
|
||||
msgctxt "#30056"
|
||||
msgid "Add to later downloads"
|
||||
msgstr "Přidat ke stažení"
|
||||
|
||||
msgctxt "#30057"
|
||||
msgid "Search for files of type"
|
||||
msgstr "Hledat soubory typu"
|
||||
|
||||
msgctxt "#30058"
|
||||
msgid "All"
|
||||
msgstr "Vše"
|
||||
|
||||
msgctxt "#30059"
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgctxt "#30060"
|
||||
msgid "Images"
|
||||
msgstr "Obrázky"
|
||||
|
||||
msgctxt "#30061"
|
||||
msgid "Audio"
|
||||
msgstr "Audio"
|
||||
|
||||
msgctxt "#30062"
|
||||
msgid "Documents"
|
||||
msgstr "Dokumenty"
|
||||
|
||||
msgctxt "#30063"
|
||||
msgid "Next Page"
|
||||
msgstr "Další stránka"
|
||||
|
||||
msgctxt "#30064"
|
||||
msgid "Adult content"
|
||||
msgstr "Erotický obsah"
|
||||
|
||||
msgctxt "#31000"
|
||||
msgid "Usage of plugin is tracked whenever you play or download video. We do NOT track what has been played"
|
||||
msgstr "Data o použití jsou zaslána v okamžiku, kdy spustíte přehrávání nebo stahování videa doplňkem. Není odesílána informace o tom, co přehráváte."
|
||||
175
resources/language/English/strings.po
Normal file
175
resources/language/English/strings.po
Normal file
@@ -0,0 +1,175 @@
|
||||
# Kodi Media Center language file
|
||||
# Addon Name: Soubory Online
|
||||
# Addon id: plugin.video.online-files
|
||||
msgid ""
|
||||
msgstr ""
|
||||
|
||||
"Language: en_GB\n"
|
||||
|
||||
msgctxt "#30000"
|
||||
msgid "Size of search history"
|
||||
msgstr "Size of search history"
|
||||
|
||||
msgctxt "#30001"
|
||||
msgid "Video is not available, check[CR]whether it works using web page."
|
||||
msgstr "Video is not available, check[CR]whether it works using web page."
|
||||
|
||||
msgctxt "#30002"
|
||||
msgid "Enable service"
|
||||
msgstr "Enable service"
|
||||
|
||||
msgctxt "#30003"
|
||||
msgid "Download using VIP account"
|
||||
msgstr "Download using VIP account"
|
||||
|
||||
msgctxt "#30004"
|
||||
msgid "Ask"
|
||||
msgstr "Ask"
|
||||
|
||||
msgctxt "#30005"
|
||||
msgid "Always"
|
||||
msgstr "Always"
|
||||
|
||||
msgctxt "#30006"
|
||||
msgid "Never"
|
||||
msgstr "Never"
|
||||
|
||||
msgctxt "#30007"
|
||||
msgid "Username"
|
||||
msgstr "Username"
|
||||
|
||||
msgctxt "#30008"
|
||||
msgid "Password"
|
||||
msgstr "Password"
|
||||
|
||||
msgctxt "#30009"
|
||||
msgid "bezvadata.cz"
|
||||
msgstr "bezvadata.cz"
|
||||
|
||||
msgctxt "#30010"
|
||||
msgid "ulozto.cz"
|
||||
msgstr "ulozto.cz"
|
||||
|
||||
msgctxt "#30011"
|
||||
msgid "hellspy.cz"
|
||||
msgstr "hellspy.cz"
|
||||
|
||||
msgctxt "#30012"
|
||||
msgid "Would you like to use VIP account to get this file?"
|
||||
msgstr "Would you like to use VIP account to get this file?"
|
||||
|
||||
msgctxt "#30013"
|
||||
msgid "Server"
|
||||
msgstr "Server"
|
||||
|
||||
msgctxt "#30014"
|
||||
msgid "fastshare.cz"
|
||||
msgstr "fastshare.cz"
|
||||
|
||||
msgctxt "#30015"
|
||||
msgid "webshare.cz"
|
||||
msgstr "webshare.cz"
|
||||
|
||||
msgctxt "#30030"
|
||||
msgid "Downloads"
|
||||
msgstr "Downloads"
|
||||
|
||||
msgctxt "#30031"
|
||||
msgid "Please setup downloads folder"
|
||||
msgstr "Please setup downloads folder"
|
||||
|
||||
msgctxt "#30032"
|
||||
msgid "Notify when downloading"
|
||||
msgstr "Notify when downloading"
|
||||
|
||||
msgctxt "#30033"
|
||||
msgid " - display notification every"
|
||||
msgstr " - display notification every"
|
||||
|
||||
msgctxt "#30034"
|
||||
msgid "10%"
|
||||
msgstr "10%"
|
||||
|
||||
msgctxt "#30035"
|
||||
msgid "5%"
|
||||
msgstr "5%"
|
||||
|
||||
msgctxt "#30036"
|
||||
msgid "1%"
|
||||
msgstr "1%"
|
||||
|
||||
msgctxt "#30037"
|
||||
msgid "Downloads"
|
||||
msgstr "Downloads"
|
||||
|
||||
msgctxt "#30040"
|
||||
msgid "Auto-Captcha"
|
||||
msgstr "Auto-Captcha"
|
||||
|
||||
msgctxt "#30041"
|
||||
msgid "Timeout"
|
||||
msgstr "Timeout"
|
||||
|
||||
msgctxt "#30050"
|
||||
msgid "Show adult only content"
|
||||
msgstr "Show adult only content"
|
||||
|
||||
msgctxt "#30051"
|
||||
msgid "Do not show files with extensions"
|
||||
msgstr "Do not show files with extensions"
|
||||
|
||||
msgctxt "#30052"
|
||||
msgid "General"
|
||||
msgstr "General"
|
||||
|
||||
msgctxt "#30053"
|
||||
msgid "Most Downloaded"
|
||||
msgstr "Most Downloaded"
|
||||
|
||||
msgctxt "#30054"
|
||||
msgid "Downloading now"
|
||||
msgstr "Downloading now"
|
||||
|
||||
msgctxt "#30055"
|
||||
msgid "Saved to download later"
|
||||
msgstr "Saved to download later"
|
||||
|
||||
msgctxt "#30056"
|
||||
msgid "Add to later downloads"
|
||||
msgstr "Add to later downloads"
|
||||
|
||||
msgctxt "#30057"
|
||||
msgid "Search for files of type"
|
||||
msgstr "Search for files of type"
|
||||
|
||||
msgctxt "#30058"
|
||||
msgid "All"
|
||||
msgstr "All"
|
||||
|
||||
msgctxt "#30059"
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgctxt "#30060"
|
||||
msgid "Images"
|
||||
msgstr "Images"
|
||||
|
||||
msgctxt "#30061"
|
||||
msgid "Audio"
|
||||
msgstr "Audio"
|
||||
|
||||
msgctxt "#30062"
|
||||
msgid "Documents"
|
||||
msgstr "Documents"
|
||||
|
||||
msgctxt "#30063"
|
||||
msgid "Next Page"
|
||||
msgstr "Next Page"
|
||||
|
||||
msgctxt "#30064"
|
||||
msgid "Adult content"
|
||||
msgstr "Adult content"
|
||||
|
||||
msgctxt "#31000"
|
||||
msgid "Usage of plugin is tracked whenever you play or download video. We do NOT track what has been played"
|
||||
msgstr "Usage of plugin is tracked whenever you play or download video. We do NOT track what has been played"
|
||||
167
resources/language/Slovak/strings.po
Normal file
167
resources/language/Slovak/strings.po
Normal file
@@ -0,0 +1,167 @@
|
||||
# Kodi Media Center language file
|
||||
# Addon Name: Soubory Online
|
||||
# Addon id: plugin.video.online-files
|
||||
msgid ""
|
||||
msgstr ""
|
||||
|
||||
"Language: sk_SK\n"
|
||||
|
||||
msgctxt "#30000"
|
||||
msgid "Size of search history"
|
||||
msgstr "Počet zapamätaných hľadaní"
|
||||
|
||||
msgctxt "#30001"
|
||||
msgid "Video is not available, check[CR]whether it works using web page."
|
||||
msgstr "Video nie je dostupné, skontrolujte,[CR]či funguje prehrávanie na webe."
|
||||
|
||||
msgctxt "#30002"
|
||||
msgid "Enable service"
|
||||
msgstr "Povoliť službu"
|
||||
|
||||
msgctxt "#30003"
|
||||
msgid "Download using VIP account"
|
||||
msgstr "Sťahovať pomocou VIP účtu"
|
||||
|
||||
msgctxt "#30004"
|
||||
msgid "Ask"
|
||||
msgstr "Spýtať sa"
|
||||
|
||||
msgctxt "#30005"
|
||||
msgid "Always"
|
||||
msgstr "Vždy"
|
||||
|
||||
msgctxt "#30006"
|
||||
msgid "Never"
|
||||
msgstr "Nikdy"
|
||||
|
||||
msgctxt "#30007"
|
||||
msgid "Username"
|
||||
msgstr "Login"
|
||||
|
||||
msgctxt "#30008"
|
||||
msgid "Password"
|
||||
msgstr "Heslo"
|
||||
|
||||
msgctxt "#30009"
|
||||
msgid "bezvadata.cz"
|
||||
msgstr "bezvadata.cz"
|
||||
|
||||
msgctxt "#30010"
|
||||
msgid "ulozto.cz"
|
||||
msgstr "ulozto.cz"
|
||||
|
||||
msgctxt "#30011"
|
||||
msgid "hellspy.cz"
|
||||
msgstr "hellspy.cz"
|
||||
|
||||
msgctxt "#30012"
|
||||
msgid "Would you like to use VIP account to get this file?"
|
||||
msgstr "Chcete pre získanie súboru použiť VIP účet?"
|
||||
|
||||
msgctxt "#30013"
|
||||
msgid "Server"
|
||||
msgstr "Server"
|
||||
|
||||
msgctxt "#30014"
|
||||
msgid "fastshare.cz"
|
||||
msgstr "fastshare.cz"
|
||||
|
||||
msgctxt "#30015"
|
||||
msgid "webshare.cz"
|
||||
msgstr "webshare.cz"
|
||||
|
||||
msgctxt "#30030"
|
||||
msgid "Downloads"
|
||||
msgstr "Priečinok pre sťahovanie"
|
||||
|
||||
msgctxt "#30031"
|
||||
msgid "Please setup downloads folder"
|
||||
msgstr "Nastavte prosím priečinok pre sťahovanie"
|
||||
|
||||
msgctxt "#30032"
|
||||
msgid "Notify when downloading"
|
||||
msgstr "Zobrazovať stav sťahovania"
|
||||
|
||||
msgctxt "#30033"
|
||||
msgid " - display notification every"
|
||||
msgstr " - zobraziť stav každých"
|
||||
|
||||
msgctxt "#30034"
|
||||
msgid "10%"
|
||||
msgstr "10%"
|
||||
|
||||
msgctxt "#30035"
|
||||
msgid "5%"
|
||||
msgstr "5%"
|
||||
|
||||
msgctxt "#30036"
|
||||
msgid "1%"
|
||||
msgstr "1%"
|
||||
|
||||
msgctxt "#30037"
|
||||
msgid "Downloads"
|
||||
msgstr "[B]Stiahnuté súbory[/B]"
|
||||
|
||||
msgctxt "#30050"
|
||||
msgid "Show adult only content"
|
||||
msgstr "Povoliť zobrazovanie obsahu 18+"
|
||||
|
||||
msgctxt "#30051"
|
||||
msgid "Do not show files with extensions"
|
||||
msgstr "Nezobrazovať súbory s príponou"
|
||||
|
||||
msgctxt "#30052"
|
||||
msgid "General"
|
||||
msgstr "Všeobecné"
|
||||
|
||||
msgctxt "#30053"
|
||||
msgid "Most Downloaded"
|
||||
msgstr "Najsťahovanejšie"
|
||||
|
||||
msgctxt "#30054"
|
||||
msgid "Downloading now"
|
||||
msgstr "Práve sa sťahuje"
|
||||
|
||||
msgctxt "#30055"
|
||||
msgid "Saved to download later"
|
||||
msgstr "Na stiahnutie"
|
||||
|
||||
msgctxt "#30056"
|
||||
msgid "Add to later downloads"
|
||||
msgstr "Pridať ku stiahnutiu"
|
||||
|
||||
msgctxt "#30057"
|
||||
msgid "Search for files of type"
|
||||
msgstr "Hľadať súbory typu"
|
||||
|
||||
msgctxt "#30058"
|
||||
msgid "All"
|
||||
msgstr "Všetko"
|
||||
|
||||
msgctxt "#30059"
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgctxt "#30060"
|
||||
msgid "Images"
|
||||
msgstr "Obrázky"
|
||||
|
||||
msgctxt "#30061"
|
||||
msgid "Audio"
|
||||
msgstr "Audio"
|
||||
|
||||
msgctxt "#30062"
|
||||
msgid "Documents"
|
||||
msgstr "Dokumenty"
|
||||
|
||||
msgctxt "#30063"
|
||||
msgid "Next Page"
|
||||
msgstr "Ďalšia stránka"
|
||||
|
||||
msgctxt "#30064"
|
||||
msgid "Adult content"
|
||||
msgstr "Erotický obsah"
|
||||
|
||||
msgctxt "#31000"
|
||||
msgid "Usage of plugin is tracked whenever you play or download video. We do NOT track what has been played"
|
||||
msgstr "Údaje o použití sú zaslané iba v okamihu, keď spustíte prehrávanie alebo sťahovanie videa doplnkom."
|
||||
BIN
resources/lib/__pycache__/bezvadata.cpython-38.opt-1.pyc
Normal file
BIN
resources/lib/__pycache__/bezvadata.cpython-38.opt-1.pyc
Normal file
Binary file not shown.
BIN
resources/lib/__pycache__/fastshare.cpython-38.opt-1.pyc
Normal file
BIN
resources/lib/__pycache__/fastshare.cpython-38.opt-1.pyc
Normal file
Binary file not shown.
BIN
resources/lib/__pycache__/hellspy.cpython-38.opt-1.pyc
Normal file
BIN
resources/lib/__pycache__/hellspy.cpython-38.opt-1.pyc
Normal file
Binary file not shown.
BIN
resources/lib/__pycache__/ulozto.cpython-38.opt-1.pyc
Normal file
BIN
resources/lib/__pycache__/ulozto.cpython-38.opt-1.pyc
Normal file
Binary file not shown.
BIN
resources/lib/__pycache__/ulozto_search.cpython-38.opt-1.pyc
Normal file
BIN
resources/lib/__pycache__/ulozto_search.cpython-38.opt-1.pyc
Normal file
Binary file not shown.
BIN
resources/lib/__pycache__/webshare.cpython-38.opt-1.pyc
Normal file
BIN
resources/lib/__pycache__/webshare.cpython-38.opt-1.pyc
Normal file
Binary file not shown.
156
resources/lib/bezvadata.py
Normal file
156
resources/lib/bezvadata.py
Normal file
@@ -0,0 +1,156 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
#/*
|
||||
# * Copyright (C) 2012 Libor Zoubek
|
||||
# *
|
||||
# *
|
||||
# * This Program is free software; you can redistribute it and/or modify
|
||||
# * it under the terms of the GNU General Public License as published by
|
||||
# * the Free Software Foundation; either version 2, or (at your option)
|
||||
# * any later version.
|
||||
# *
|
||||
# * This Program is distributed in the hope that it will be useful,
|
||||
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# * GNU General Public License for more details.
|
||||
# *
|
||||
# * You should have received a copy of the GNU General Public License
|
||||
# * along with this program; see the file COPYING. If not, write to
|
||||
# * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
# * http://www.gnu.org/copyleft/gpl.html
|
||||
# *
|
||||
# */
|
||||
import sys
|
||||
import urllib
|
||||
#Python 2
|
||||
try:
|
||||
import cookielib
|
||||
import urllib2
|
||||
#import sys
|
||||
reload(sys) # Reload does the trick!
|
||||
sys.setdefaultencoding('UTF8')
|
||||
#Python 3
|
||||
except:
|
||||
import http.cookiejar
|
||||
cookielib = http.cookiejar
|
||||
urllib2 = urllib.request
|
||||
|
||||
import re,random,util,os,traceback,base64
|
||||
from provider import ContentProvider
|
||||
|
||||
class BezvadataContentProvider(ContentProvider):
|
||||
|
||||
def __init__(self,username=None,password=None,filter=None,tmp_dir='.'):
|
||||
ContentProvider.__init__(self,'bezvadata.cz','http://bezvadata.cz/',username,password,filter,tmp_dir)
|
||||
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.LWPCookieJar()))
|
||||
urllib2.install_opener(opener)
|
||||
|
||||
def capabilities(self):
|
||||
return ['search','resolve','categories']
|
||||
|
||||
def search(self,keyword):
|
||||
return self.list('vyhledavani/?s='+urllib.parse.quote(keyword))
|
||||
|
||||
def categories(self):
|
||||
page = util.request(self.base_url)
|
||||
page = util.substr(page,'<div class=\"stats','<footer>')
|
||||
result = []
|
||||
for m in re.finditer('<section class=\"(?P<type>[^\"]+)[^<]+<h3>(?P<title>[^<]+)',page, re.IGNORECASE|re.DOTALL):
|
||||
item = self.dir_item()
|
||||
item['title'] = m.group('title')
|
||||
item['url'] = '#'+m.group('type')
|
||||
result.append(item)
|
||||
return result
|
||||
|
||||
def list_special(self,type):
|
||||
page = util.request(self.base_url)
|
||||
page = util.substr(page,'<section class=\"'+type,'</section>')
|
||||
result = []
|
||||
for m in re.finditer('<a href=\"(?P<url>[^\"]+)[^>]+>(?P<title>[^<]+)',page, re.IGNORECASE|re.DOTALL):
|
||||
item = self.video_item()
|
||||
item['title'] = m.group('title')
|
||||
item['url'] = m.group('url')
|
||||
result.append(item)
|
||||
return result
|
||||
|
||||
|
||||
def list(self,url):
|
||||
if url.find('#') == 0:
|
||||
return self.list_special(url[1:])
|
||||
page = util.request(self._url(url))
|
||||
ad = re.search('<a href=\"(?P<url>/vyhledavani/souhlas-zavadny-obsah[^\"]+)',page,re.IGNORECASE|re.DOTALL)
|
||||
if ad:
|
||||
page = util.request(self._url(ad.group('url')))
|
||||
data = util.substr(page,'<div class=\"content','<div class=\"stats')
|
||||
pattern = '<section class=\"img[^<]+<a href=\"(?P<url>[^\"]+)(.+?)<img src=\"(?P<img>[^\"]+)\" alt=\"(?P<name>[^\"]+)(.+?)<b>velikost:</b>(?P<size>[^<]+)'
|
||||
result = []
|
||||
for m in re.finditer(pattern,data,re.IGNORECASE | re.DOTALL ):
|
||||
item = self.video_item()
|
||||
item['title'] = m.group('name')
|
||||
item['size'] = m.group('size').strip()
|
||||
item['img'] = m.group('img')
|
||||
item['url'] = m.group('url')
|
||||
# mark 18+ content
|
||||
if ad:
|
||||
item['18+'] = True
|
||||
if self.filter:
|
||||
if self.filter(item):
|
||||
result.append(item)
|
||||
else:
|
||||
result.append(item)
|
||||
|
||||
# page navigation
|
||||
data = util.substr(page,'<div class=\"pagination','</div>')
|
||||
m = re.search('<li class=\"previous[^<]+<a href=\"(?P<url>[^\"]+)',data,re.DOTALL|re.IGNORECASE)
|
||||
if m:
|
||||
item = self.dir_item()
|
||||
item['type'] = 'prev'
|
||||
item['url'] = m.group('url')
|
||||
result.append(item)
|
||||
n = re.search('<li class=\"next[^<]+<a href=\"(?P<url>[^\"]+)',data,re.DOTALL|re.IGNORECASE)
|
||||
if n:
|
||||
item = self.dir_item()
|
||||
item['type'] = 'next'
|
||||
item['url'] = n.group('url')
|
||||
result.append(item)
|
||||
return result
|
||||
|
||||
|
||||
def resolve(self,item,captcha_cb=None,wait_cb=None):
|
||||
item = item.copy()
|
||||
url = self._url(item['url'])
|
||||
item['surl'] = url
|
||||
data = util.request(url)
|
||||
link = re.search('<a class="stahnoutSoubor.+?href=\"([^\"]+)',data)
|
||||
if link:
|
||||
url = self._url(link.group(1))
|
||||
data = util.request(url)
|
||||
m = re.search('<img src=\"(?P<img>[^\"]+)\" alt=\"Captcha\"',data)
|
||||
cap_id = re.search('<input type=\"hidden\" name=\"_uid_captcha.+?value=\"(?P<cid>[^\"]+)',data)
|
||||
if m and cap_id:
|
||||
cid = cap_id.group('cid')
|
||||
img_data = m.group('img')[m.group('img').find('base64,')+7:]
|
||||
if not os.path.exists(self.tmp_dir):
|
||||
os.makedirs(self.tmp_dir)
|
||||
tmp_image = os.path.join(self.tmp_dir,'captcha.png')
|
||||
util.save_data_to_file(base64.b64decode(img_data),tmp_image)
|
||||
code = captcha_cb({'id':cid,'img': tmp_image})
|
||||
if not code:
|
||||
return
|
||||
data = util.post(url+'?do=stahnoutFreeForm-submit',{'_uid_captcha':cid,'captcha':code,'stahnoutSoubor':'Stáhnout'})
|
||||
countdown = re.search('shortly\.getSeconds\(\) \+ (\d+)',data)
|
||||
last_url = re.search('<a class=\"stahnoutSoubor2.+?href=\"([^\"]+)',data)
|
||||
if countdown and last_url:
|
||||
wait = int(countdown.group(1))
|
||||
url = self._url(last_url.group(1))
|
||||
wait_cb(wait)
|
||||
req = urllib2.Request(url)
|
||||
req.add_header('User-Agent',util.UA)
|
||||
resp = urllib2.urlopen(req)
|
||||
item['url'] = resp.geturl()
|
||||
resp.close()
|
||||
return item
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
BIN
resources/lib/bezvadata.pyo
Normal file
BIN
resources/lib/bezvadata.pyo
Normal file
Binary file not shown.
149
resources/lib/fastshare.py
Normal file
149
resources/lib/fastshare.py
Normal file
@@ -0,0 +1,149 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
#/*
|
||||
# * Copyright (C) 2012 Libor Zoubek
|
||||
# *
|
||||
# *
|
||||
# * This Program is free software; you can redistribute it and/or modify
|
||||
# * it under the terms of the GNU General Public License as published by
|
||||
# * the Free Software Foundation; either version 2, or (at your option)
|
||||
# * any later version.
|
||||
# *
|
||||
# * This Program is distributed in the hope that it will be useful,
|
||||
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# * GNU General Public License for more details.
|
||||
# *
|
||||
# * You should have received a copy of the GNU General Public License
|
||||
# * along with this program; see the file COPYING. If not, write to
|
||||
# * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
# * http://www.gnu.org/copyleft/gpl.html
|
||||
# *
|
||||
# */
|
||||
import sys
|
||||
import urllib
|
||||
#Python 2
|
||||
try:
|
||||
import cookielib
|
||||
import urllib2
|
||||
import urlparse
|
||||
#import sys
|
||||
reload(sys) # Reload does the trick!
|
||||
sys.setdefaultencoding('UTF8')
|
||||
#Python 3
|
||||
except:
|
||||
import http.cookiejar
|
||||
cookielib = http.cookiejar
|
||||
urllib2 = urllib.request
|
||||
urlparse = urllib.parse
|
||||
|
||||
import re,random,util,os,traceback
|
||||
from provider import ContentProvider
|
||||
from provider import ResolveException
|
||||
|
||||
class FastshareContentProvider(ContentProvider):
|
||||
|
||||
def __init__(self,username=None,password=None,filter=None,tmp_dir='.'):
|
||||
ContentProvider.__init__(self,'fastshare.cz','https://www.fastshare.cz/',username,password,filter,tmp_dir)
|
||||
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.LWPCookieJar()))
|
||||
urllib2.install_opener(opener)
|
||||
|
||||
def capabilities(self):
|
||||
return ['search','resolve']
|
||||
|
||||
def search(self,keyword):
|
||||
return self.list('?term='+urlparse.quote(keyword))
|
||||
|
||||
def list(self,url):
|
||||
result = []
|
||||
page = util.request(self._url(url))
|
||||
data = util.substr(page,'<div class=\"search','<footer')
|
||||
for m in re.finditer('<div class=\"search-result-box(.+?)</a>',data,re.IGNORECASE | re.DOTALL ):
|
||||
it = m.group(1)
|
||||
link = re.search('<a href=([^ ]+)',it,re.IGNORECASE | re.DOTALL)
|
||||
name = re.search('title=\"([^\"]+)',it,re.IGNORECASE | re.DOTALL)
|
||||
img = re.search('<img src=\"([^\"]+)',it,re.IGNORECASE | re.DOTALL)
|
||||
size = re.search('<div class=\"fs\">([^<]+)',it,re.IGNORECASE | re.DOTALL)
|
||||
time = re.search('<div class=\"vd\">([^<]+)',it,re.IGNORECASE | re.DOTALL)
|
||||
if name and link:
|
||||
item = self.video_item()
|
||||
item['title'] = name.group(1)
|
||||
if size:
|
||||
item['size'] = size.group(1).strip()
|
||||
if time:
|
||||
item['length'] = time.group(1).strip()
|
||||
item['url'] = self._url(link.group(1))
|
||||
item['img'] = self._url(img.group(1))
|
||||
self._filter(result,item)
|
||||
next = re.search('<a href=\"(?P<url>[^\"]+)[^>]+>dal',data,re.IGNORECASE | re.DOTALL)
|
||||
if next:
|
||||
item = self.dir_item()
|
||||
item['type'] = 'next'
|
||||
item['url'] = next.group('url')
|
||||
result.append(item)
|
||||
return result
|
||||
|
||||
|
||||
def resolve(self,item,captcha_cb=None,select_cb=None):
|
||||
item = item.copy()
|
||||
util.init_urllib()
|
||||
url = self._url(item['url'])
|
||||
page = ''
|
||||
try:
|
||||
opener = urllib2.OpenerDirector()
|
||||
opener.add_handler(urllib2.HTTPHandler())
|
||||
opener.add_handler(urllib2.UnknownHandler())
|
||||
urllib2.install_opener(opener)
|
||||
request = urllib2.Request(url)
|
||||
request.add_header('User-Agent',util.UA)
|
||||
response= urllib2.urlopen(request)
|
||||
page = response.read()
|
||||
response.close()
|
||||
except urllib2.HTTPErro as e:
|
||||
traceback.print_exc()
|
||||
return
|
||||
data = util.substr(page,'<form method=post target=\"iframe_dwn\"','</form>')
|
||||
action = re.search('action=(?P<url>[^>]+)',data,re.IGNORECASE | re.DOTALL)
|
||||
img = re.search('<img src=\"(?P<url>[^\"]+)',data,re.IGNORECASE | re.DOTALL)
|
||||
if img and action:
|
||||
sessid=[]
|
||||
for cookie in re.finditer('(PHPSESSID=[^\;]+)',response.headers.get('Set-Cookie'),re.IGNORECASE | re.DOTALL):
|
||||
sessid.append(cookie.group(1))
|
||||
# we have to download image ourselves
|
||||
image = util.request(self._url(img.group('url')),headers={'Referer':url,'Cookie':sessid[-1]})
|
||||
img_file = os.path.join(self.tmp_dir,'captcha.png')
|
||||
util.save_data_to_file(image,img_file)
|
||||
code = None
|
||||
if captcha_cb:
|
||||
code = captcha_cb({'id':'0','img':img_file})
|
||||
if not code:
|
||||
self.info('No captcha received, exit')
|
||||
return
|
||||
request = urllib.urlencode({'code':code})
|
||||
req = urllib2.Request(self._url(action.group('url')),request)
|
||||
req.add_header('User-Agent',util.UA)
|
||||
req.add_header('Referer',url)
|
||||
req.add_header('Cookie',sessid[-1])
|
||||
try:
|
||||
resp = urllib2.urlopen(req)
|
||||
if resp.code == 302:
|
||||
file_url = resp.headers.get('location')
|
||||
else:
|
||||
file_url = resp.geturl()
|
||||
if file_url.find(action.group('url')) > 0:
|
||||
msg = resp.read()
|
||||
resp.close()
|
||||
js_msg = re.search('alert\(\'(?P<msg>[^\']+)',msg,re.IGNORECASE | re.DOTALL)
|
||||
if js_msg:
|
||||
raise ResolveException(js_msg.group('msg'))
|
||||
self.error(msg)
|
||||
raise ResolveException('Nelze ziskat soubor, zkuste to znovu')
|
||||
resp.close()
|
||||
if file_url.find('data') >=0 or file_url.find('download_free') > 0:
|
||||
item['url'] = file_url
|
||||
return item
|
||||
self.error('wrong captcha, retrying')
|
||||
return self.resolve(item,captcha_cb,select_cb)
|
||||
except urllib2.HTTPError:
|
||||
traceback.print_exc()
|
||||
return
|
||||
|
||||
BIN
resources/lib/fastshare.pyo
Normal file
BIN
resources/lib/fastshare.pyo
Normal file
Binary file not shown.
193
resources/lib/hellspy.py
Normal file
193
resources/lib/hellspy.py
Normal file
@@ -0,0 +1,193 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
#/*
|
||||
# * Copyright (C) 2012 Libor Zoubek
|
||||
# *
|
||||
# *
|
||||
# * This Program is free software; you can redistribute it and/or modify
|
||||
# * it under the terms of the GNU General Public License as published by
|
||||
# * the Free Software Foundation; either version 2, or (at your option)
|
||||
# * any later version.
|
||||
# *
|
||||
# * This Program is distributed in the hope that it will be useful,
|
||||
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# * GNU General Public License for more details.
|
||||
# *
|
||||
# * You should have received a copy of the GNU General Public License
|
||||
# * along with this program; see the file COPYING. If not, write to
|
||||
# * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
# * http://www.gnu.org/copyleft/gpl.html
|
||||
# *
|
||||
# */
|
||||
import sys
|
||||
import urllib
|
||||
#Python 2
|
||||
try:
|
||||
import cookielib
|
||||
import urllib2
|
||||
#import sys
|
||||
reload(sys) # Reload does the trick!
|
||||
sys.setdefaultencoding('UTF8')
|
||||
#Python 3
|
||||
except:
|
||||
import http.cookiejar
|
||||
cookielib = http.cookiejar
|
||||
urllib2 = urllib.request
|
||||
|
||||
import re,random,util,os,traceback
|
||||
import json, xbmcaddon
|
||||
from base64 import b64decode
|
||||
from provider import ContentProvider
|
||||
|
||||
__scriptid__ = 'plugin.video.online-files'
|
||||
__addon__ = xbmcaddon.Addon(id=__scriptid__)
|
||||
__settings__ = __addon__.getSetting
|
||||
|
||||
class HellspyContentProvider(ContentProvider):
|
||||
|
||||
def __init__(self,username=None,password=None,filter=None,site_url='https://hellspy.cz/'):
|
||||
ContentProvider.__init__(self,'hellspy.cz',site_url,username,password,filter)
|
||||
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.LWPCookieJar()))
|
||||
urllib2.install_opener(opener)
|
||||
|
||||
def capabilities(self):
|
||||
return ['login','search','resolve','categories']
|
||||
|
||||
def search(self,keyword):
|
||||
return self.list('search/?usrq='+urllib.parse.quote(keyword))
|
||||
|
||||
def login(self):
|
||||
if not self.username and not self.password:
|
||||
return True # fall back to free account
|
||||
elif self.username and self.password and len(self.username)>0 and len(self.password)>0:
|
||||
page = util.request(self.base_url+'?do=loginBox-loginpopup')
|
||||
if page.find('href="/?do=loginBox-logout') > 0:
|
||||
self.info('Already logged in')
|
||||
return True
|
||||
data = util.substr(page,'<td class=\"popup-lef','</form')
|
||||
m = re.search('<form action=\"(?P<url>[^\"]+)',data,re.IGNORECASE | re.DOTALL)
|
||||
if m:
|
||||
login_url = self._url(m.group('url')).replace('&','&')
|
||||
data = util.post(login_url,{'username':self.username,'password':self.password,'pernament_login':'on','login':'1','redir_url':self.base_url+'?do=loginBox-login'})
|
||||
if data.find('href="/?do=loginBox-logout') > 0:
|
||||
return True
|
||||
return False
|
||||
|
||||
def list_favourites(self,url):
|
||||
url = self._url(url)
|
||||
page = util.request(url)
|
||||
data = util.substr(page,'<div class=\"file-list file-list-vertical','<div id=\"layout-push')
|
||||
result = []
|
||||
for m in re.finditer('<div class=\"file-entry.+?<div class="preview.+?<div class=\"data.+?</div>',data, re.IGNORECASE|re.DOTALL):
|
||||
entry = m.group(0)
|
||||
item = self.video_item()
|
||||
murl = re.search('<[hH]3><a href=\"(?P<url>[^\"]+)[^>]+>(?P<name>[^<]+)',entry)
|
||||
item['url'] = murl.group('url')
|
||||
item['title'] = murl.group('name')
|
||||
mimg = re.search('<img src=\"(?P<img>[^\"]+)',entry)
|
||||
if mimg:
|
||||
item['img'] = mimg.group('img')
|
||||
msize = re.search('<span class=\"file-size[^>]+>(?P<size>[^<]+)',entry)
|
||||
if msize:
|
||||
item['size'] = msize.group('size').strip()
|
||||
mtime = re.search('<span class=\"duration[^>]+>(?P<time>[^<]+)',entry)
|
||||
if mtime:
|
||||
item['length'] = mtime.group('time').strip()
|
||||
self._filter(result,item)
|
||||
return result
|
||||
|
||||
def list(self,url,filter=None):
|
||||
if url.find('ucet/favourites') >= 0:# and self.login():
|
||||
return self.list_favourites(url)
|
||||
url = self._url(url)
|
||||
util.init_urllib()
|
||||
page = util.request(url)
|
||||
|
||||
adult = '0'
|
||||
if __settings__('hellspy_adult') == 'true':
|
||||
adult = '1'
|
||||
|
||||
if page.find('adultWarn-') > 0:
|
||||
page = util.request(url + '&adultControl-state=' + adult + '&do=adultControl-confirmed')
|
||||
|
||||
data = util.substr(page,'<div class=\"file-list file-list-horizontal','<div id=\"layout-push')
|
||||
result = []
|
||||
for m in re.finditer('<div class=\"file-entry.+?<div class="preview.+?<div class=\"data.+?</div>',data, re.IGNORECASE|re.DOTALL):
|
||||
entry = m.group(0)
|
||||
item = self.video_item()
|
||||
murl = re.search('<[hH]3><a href=\"(?P<url>[^\"]+)[^>]+>(?P<name>[^<]+)',entry)
|
||||
|
||||
if murl:
|
||||
item['url'] = murl.group('url')
|
||||
item['title'] = murl.group('name')
|
||||
mimg = re.search('<img src=\"(?P<img>[^\"]+)',entry)
|
||||
if mimg:
|
||||
item['img'] = mimg.group('img')
|
||||
msize = re.search('<span class=\"file-size[^>]+>(?P<size>[^<]+)',entry)
|
||||
if msize:
|
||||
item['size'] = msize.group('size').strip()
|
||||
mtime = re.search('<span class=\"duration[^>]+>(?P<time>[^<]+)',entry)
|
||||
if mtime:
|
||||
item['length'] = mtime.group('time').strip()
|
||||
self._filter(result,item)
|
||||
|
||||
# page navigation
|
||||
data = util.substr(page,'<div class=\"paginator','</div')
|
||||
mprev = re.search('<li class=\"prev[^<]+<a href=\"(?P<url>[^\"]+)',data)
|
||||
if mprev:
|
||||
item = self.dir_item()
|
||||
item['type'] = 'prev'
|
||||
item['url'] = mprev.group('url')
|
||||
result.append(item)
|
||||
mnext = re.search('<li class=\"next[^<]+<a href=\"(?P<url>[^\"]+)',data)
|
||||
if mnext:
|
||||
item = self.dir_item()
|
||||
item['type'] = 'next'
|
||||
item['url'] = mnext.group('url').replace('&','&')
|
||||
result.append(item)
|
||||
return result
|
||||
|
||||
def categories(self):
|
||||
result = []
|
||||
page = util.request(self.base_url)
|
||||
data = util.substr(page,'<div id=\"layout-menu','</div')
|
||||
index = 0
|
||||
for m in re.finditer('<a href=\"(?P<url>[^\"]+)[^>]+>(?P<title>[^<]+)',data):
|
||||
if index > 0 and index <= 3:
|
||||
item = self.dir_item()
|
||||
item['title'] = m.group('title')
|
||||
item['url'] = m.group('url')
|
||||
result.append(item)
|
||||
index +=1
|
||||
return result
|
||||
|
||||
def resolve(self,item,captcha_cb=None,select_cb=None):
|
||||
item = item.copy()
|
||||
url = self._url(item['url'])
|
||||
# if not self.login():
|
||||
# util.error('[hellspy] login failed, unable to resolve')
|
||||
if url.find('?') > 0:
|
||||
url+='&download=1'
|
||||
else:
|
||||
url+='?download=1'
|
||||
data = util.request(url)
|
||||
if data.find('Soubor nenalezen') > 0:
|
||||
util.error('[hellspy] - page with movie was not found on server')
|
||||
return
|
||||
m = re.search('launchFullDownload\(\'(?P<url>[^\']+)',data)
|
||||
if m:
|
||||
item['url'] = m.group('url')
|
||||
item['surl'] = url
|
||||
return item
|
||||
|
||||
def to_downloads(self,url):
|
||||
# if not self.login():
|
||||
# util.error('[hellspy] login failed, unable to add to downloads')
|
||||
util.info('adding to downloads')
|
||||
try:
|
||||
util.request(self._url(url+'&do=downloadControl-favourite'))
|
||||
except urllib2.HTTPError:
|
||||
traceback.print_exc()
|
||||
util.error('[hellspy] failed to add to downloads')
|
||||
return
|
||||
util.info('added, DONE')
|
||||
BIN
resources/lib/hellspy.pyo
Normal file
BIN
resources/lib/hellspy.pyo
Normal file
Binary file not shown.
469
resources/lib/ulozto.py
Normal file
469
resources/lib/ulozto.py
Normal file
@@ -0,0 +1,469 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
#/*
|
||||
# * Copyright (C) 2013 Libor Zoubek
|
||||
# *
|
||||
# *
|
||||
# * This Program is free software; you can redistribute it and/or modify
|
||||
# * it under the terms of the GNU General Public License as published by
|
||||
# * the Free Software Foundation; either version 2, or (at your option)
|
||||
# * any later version.
|
||||
# *
|
||||
# * This Program is distributed in the hope that it will be useful,
|
||||
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# * GNU General Public License for more details.
|
||||
# *
|
||||
# * You should have received a copy of the GNU General Public License
|
||||
# * along with this program; see the file COPYING. If not, write to
|
||||
# * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
# * http://www.gnu.org/copyleft/gpl.html
|
||||
# *
|
||||
# */
|
||||
import sys
|
||||
import urllib
|
||||
import ulozto_search
|
||||
|
||||
query = "your_query"
|
||||
file_type = "documents|videos|images|archives|audios" # optional
|
||||
kwargs = {
|
||||
"insecure": False, # disables SSL check, optional, default False
|
||||
"includeApproximate": False # also return approximate results
|
||||
}
|
||||
|
||||
#Python 2
|
||||
try:
|
||||
import cookielib
|
||||
import urllib2
|
||||
#import sys
|
||||
reload(sys) # Reload does the trick!
|
||||
sys.setdefaultencoding('UTF8')
|
||||
#Python 3
|
||||
except:
|
||||
import http.cookiejar
|
||||
cookielib = http.cookiejar
|
||||
urllib2 = urllib.request
|
||||
|
||||
import re,random,util,os,traceback
|
||||
import json
|
||||
from base64 import b64decode
|
||||
from provider import ContentProvider
|
||||
from provider import ResolveException
|
||||
from provider import cached
|
||||
|
||||
|
||||
def loadurl(url, req, headers=None):
|
||||
print (url)
|
||||
req = urllib.parse.urlencode(req).encode('utf-8')
|
||||
if headers:
|
||||
req = urllib.request.Request(url, req, headers=headers)
|
||||
else:
|
||||
req = urllib.request.Request(url, req)
|
||||
with urllib.request.urlopen(req) as f:
|
||||
try:
|
||||
if f.getcode()==200:
|
||||
response = f.read()
|
||||
return response
|
||||
except:
|
||||
return False
|
||||
|
||||
class UloztoContentProvider(ContentProvider):
|
||||
|
||||
def __init__(self,username=None,password=None,filter=None):
|
||||
ContentProvider.__init__(self,'ulozto.cz','https://www.ulozto.cz/',username,password,filter)
|
||||
self.search_type=''
|
||||
self.cp = urllib2.HTTPCookieProcessor(cookielib.LWPCookieJar())
|
||||
self.rh = UloztoHTTPRedirectHandler()
|
||||
self.rh.throw = False
|
||||
self.rh.location = None
|
||||
self.init_urllib()
|
||||
|
||||
def init_urllib(self):
|
||||
opener = urllib2.build_opener(self.cp,self.rh)
|
||||
urllib2.install_opener(opener)
|
||||
|
||||
def capabilities(self):
|
||||
return ['login','search','resolve','categories']
|
||||
|
||||
def categories(self):
|
||||
result = []
|
||||
if not self.login():
|
||||
return result
|
||||
data = util.request(self.base_url+'m/'+self.username)
|
||||
fav = re.search('<li id=\"fmFavoritesFolder.+?href=\"(?P<url>[^\"]+)[^>]*>(?P<title>[^<]+)',data,re.IGNORECASE|re.DOTALL)
|
||||
if fav:
|
||||
item = self.dir_item()
|
||||
item['url'] = '#fm#'+fav.group('url')
|
||||
item['title'] = fav.group('title')
|
||||
result.append(item)
|
||||
myfiles = re.search('<a class=\"fmHomeFolder.+?href=\"(?P<url>[^\"]+)[^>]*>(?P<title>[^<]+)',data,re.IGNORECASE|re.DOTALL)
|
||||
if myfiles:
|
||||
item = self.dir_item()
|
||||
item['url'] = '#fm#' + myfiles.group('url')
|
||||
item['title'] = myfiles.group('title')
|
||||
result.append(item)
|
||||
return result
|
||||
|
||||
def search(self, keyword):
|
||||
#https://ulozto.sk/hledej?type=videos&q=matrix
|
||||
# brb = self.base_url+'hledej?'+self.search_type+'q='+urllib.parse.quote(keyword)
|
||||
# self.info (brb)
|
||||
# return self.list('https://ulozto.cz/hledej?'+self.search_type+'q='+urllib.parse.quote(keyword))
|
||||
query = keyword
|
||||
l = ulozto_search.search(query, 1, file_type, **kwargs)
|
||||
return self.list( l )
|
||||
|
||||
def login(self):
|
||||
return True
|
||||
# if self.username and self.password and len(self.username)>0 and len(self.password)>0:
|
||||
# self.info('Login user=%s, pass=*****' % self.username)
|
||||
# self.rh.throw = False
|
||||
# page = util.request(self.base_url+'login?key=logreg')#.decode('utf-8-sig')
|
||||
# # headers = util.headers
|
||||
# self.info(page)
|
||||
# self.info(type(page))
|
||||
# if page.find('href="/?do=web-logout') > 0:
|
||||
# self.info('Already logged in')
|
||||
# return True
|
||||
# data = util.substr(page,'<li class=\"menu-username','</li')
|
||||
# m = re.search('key=(?P<key>[^\"]+)\"',data,re.IGNORECASE | re.DOTALL)
|
||||
# token = re.search('<input type=\"hidden\" name=\"_token_\".+?value=\"([^\"]+)"',page,re.IGNORECASE | re.DOTALL)
|
||||
# self.info (token)
|
||||
# #if m and token:
|
||||
# if True:
|
||||
# #login_url = self.base_url+'login?key='+m.group('key')+'&do=loginForm-submit'
|
||||
# #login_url = self.base_url+'login?key=logreg'
|
||||
|
||||
# # urllib.parse.urljoin("https://ulozto.net/login", url),
|
||||
# # post=inputs)
|
||||
# inputs = {'username' : self.username,
|
||||
# 'password' : self.password,
|
||||
# 'fakeUsername':'',
|
||||
# 'fakePassword':'',
|
||||
# 'login': '',
|
||||
# '_do': 'loginComponent-loginForm-form-submit',
|
||||
# }
|
||||
|
||||
# data = util.post(self.base_url+'login&do=loginForm-submit', inputs)
|
||||
|
||||
# #data = util.post('https://uloz.to/login&do=loginForm-submit', inputs)
|
||||
# #data = loadurl(self._url('login'), inputs, headers=headers)
|
||||
# self.info (data)
|
||||
# if data.find('href="/?do=web-logout') > 0:
|
||||
# self.info('Login successfull')
|
||||
# return True
|
||||
# self.info('Login failed')
|
||||
# return False
|
||||
|
||||
def list_folder(self,url):
|
||||
self.login()
|
||||
result = []
|
||||
page = util.request(self._url(url))
|
||||
page = util.substr(page,'<div id=\"fmItems','</ul')
|
||||
for m in re.finditer('<div class=\"fmFolder(.+?)</em',page,re.IGNORECASE | re.DOTALL):
|
||||
data = m.group(1)
|
||||
item = self.dir_item()
|
||||
item['url'] = '#fm#' + re.search('data-href=\"([^\"]+)',data).group(1)
|
||||
item['title'] = re.search('data-name=\"([^\"]+)',data).group(1)
|
||||
item['img'] = re.search('<img src=\"([^\"]+)',data).group(1)
|
||||
result.append(item)
|
||||
for m in re.finditer('<div class=\"fmFile(.+?)</em>',page,re.IGNORECASE | re.DOTALL):
|
||||
data = m.group(1)
|
||||
item = self.video_item()
|
||||
item['url'] = re.search('data-href=\"([^\"]+)',data).group(1)
|
||||
item['title'] = '%s.%s' % (re.search('data-name=\"([^\"]+)',data).group(1),re.search('data-ext=\"([^\"]+)',data).group(1))
|
||||
item['img'] = re.search('<img src=\"([^\"]+)',data).group(1)
|
||||
result.append(item)
|
||||
return result
|
||||
|
||||
@cached(1)
|
||||
def list(self, url):
|
||||
self.info(url)
|
||||
|
||||
# if url.find('#fm#') == 0:
|
||||
# return self.list_folder(url[5:])
|
||||
# url = self._url(url)
|
||||
|
||||
# # page = util.request(url,headers={'X-Requested-With':'XMLHttpRequest','Referer':url,'Cookie':'uloz-to-id=1561277170;'})#.decode('string-escape')
|
||||
# self.info(page)
|
||||
# # script = util.substr(page,'var kn','</script>')
|
||||
# keymap = None
|
||||
# key = None
|
||||
# # self.info(script)
|
||||
# # k = re.search(r'({.+?})',script)
|
||||
# # if k:
|
||||
# # keymap = util.json.loads(k.group(1))
|
||||
# # j = re.search(r'ad.push\(\[kn, kn\["([^"]+)', script)
|
||||
# # if j:
|
||||
# # key = j.group(1)
|
||||
# # if not (j and k):
|
||||
# # self.error('error parsing page - unable to locate keys')
|
||||
# # return []
|
||||
# keymap = json.loads(page)
|
||||
# burl = b64decode('I2h0dHA6Ly9kZWNyLWNlY2gucmhjbG91ZC5jb20vZGVjcnlwdC8/a2V5PSVzJnZhbHVlPSVz')
|
||||
# murl = b64decode('aHR0cDovL2RlY3ItY2VjaC5yaGNsb3VkLmNvbS9kZWNyeXB0Lw==')
|
||||
# result = []
|
||||
# req = {'seed':keymap[key], 'values':keymap}
|
||||
# decr = json.loads(util.post_json(murl, req))
|
||||
page = url
|
||||
result = []
|
||||
for p in page:
|
||||
item = self.video_item()
|
||||
item['title'] = p['name']
|
||||
item['url'] = p['link']
|
||||
item['length'] = p['length']
|
||||
item['size'] = p['size']
|
||||
|
||||
# div_media = util.substr(body, 'div class="media"', '<div class="tools">')
|
||||
# img_match = re.search(r'img src="([^"]+)', div_media)
|
||||
# if img_match:
|
||||
# item['img'] = "http:" + img_match.group(1)
|
||||
# time_match = re.search(r'<span>Čas</span>(.+)', div_media)
|
||||
# if time_match:
|
||||
# item['length'] = time_match.group(1).strip()
|
||||
# size_match = re.search(r'<span>Velikost</span>([^<]+)', div_media)
|
||||
# if size_match:
|
||||
# item['size'] = size_match.group(1).strip()
|
||||
self._filter(result, item)
|
||||
|
||||
# for li in re.finditer('<div data-icon=\"(?P<key>[^\"]+)',page, re.IGNORECASE | re.DOTALL):
|
||||
# body = urllib.unquote(b64decode(decr[li.group('key')]))
|
||||
# div_name = util.substr(body, '<div class="name"', '</div>')
|
||||
# title_url_match = re.search(r'<a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)', div_name)
|
||||
|
||||
# if not title_url_match:
|
||||
# continue
|
||||
# item = self.video_item()
|
||||
# item['title'] = title_url_match.group('title')
|
||||
# item['url'] = title_url_match.group('url')
|
||||
|
||||
# div_media = util.substr(body, 'div class="media"', '<div class="tools">')
|
||||
# img_match = re.search(r'img src="([^"]+)', div_media)
|
||||
# if img_match:
|
||||
# item['img'] = "http:" + img_match.group(1)
|
||||
# time_match = re.search(r'<span>Čas</span>(.+)', div_media)
|
||||
# if time_match:
|
||||
# item['length'] = time_match.group(1).strip()
|
||||
# size_match = re.search(r'<span>Velikost</span>([^<]+)', div_media)
|
||||
# if size_match:
|
||||
# item['size'] = size_match.group(1).strip()
|
||||
# self._filter(result,item)
|
||||
# page navigation
|
||||
# data = util.substr(page,'<div class=\"paginator','</div')
|
||||
# mnext = re.search('<a href=\"(?P<url>[^\"]+)\" class="next',data)
|
||||
# ulozto_search.search(query, file_type, **kwargs)
|
||||
# if mnext:
|
||||
# item = self.dir_item()
|
||||
# item['type'] = 'next'
|
||||
# item['url'] = util.decode_html(mnext.group('url'))
|
||||
# result.append(item)
|
||||
# mnext = re.search('page=(?P<id>[\d]+)', url)
|
||||
# # idx = url.find('page=')
|
||||
|
||||
# # if idx != -1:
|
||||
# # st = url[idx + len('page='):]
|
||||
|
||||
# if mnext:
|
||||
# s = int(mnext.group('id'))
|
||||
# url = re.sub(mnext.group(), 'page={}'.format(s+1), url)
|
||||
# item = self.dir_item()
|
||||
# item['type'] = 'next'
|
||||
# item['url'] = util.decode_html(url)
|
||||
# result.append(item)
|
||||
# return result
|
||||
|
||||
@cached(48)
|
||||
def decr_url(self,url):
|
||||
if url.startswith('#'):
|
||||
ret = json.loads(util.request(url[1:]))
|
||||
#if ret.has_key('result'):
|
||||
if 'result' in ret.keys():
|
||||
url = b64decode(ret['result'])
|
||||
url = self._url(url)
|
||||
return url
|
||||
|
||||
def resolve(self,item,captcha_cb=None):
|
||||
item = item.copy()
|
||||
url = item['url']
|
||||
if url.startswith('http://www.ulozto.sk'):
|
||||
url = self.base_url + url[20:]
|
||||
url = self.decr_url(url)
|
||||
url = self._url(url)
|
||||
if url.startswith('#'):
|
||||
util.error('[uloz.to] - url was not correctly decoded')
|
||||
return
|
||||
self.init_urllib()
|
||||
self.login()
|
||||
self.info('Resolving %s'% url)
|
||||
# if not item.has_key('vip'):
|
||||
if not 'vip' in item.keys():
|
||||
item['vip'] = False
|
||||
vip = item['vip']
|
||||
if vip:
|
||||
page = util.request(url)
|
||||
else:
|
||||
try:
|
||||
request = urllib2.Request(url)
|
||||
response = urllib2.urlopen(request)
|
||||
page = response.read().decode('utf-8')
|
||||
response.close()
|
||||
except urllib2.HTTPError as e:
|
||||
traceback.print_exc()
|
||||
return
|
||||
self.info( page )
|
||||
if page.find('Stránka nenalezena!') > 0:
|
||||
self.error('page with movie was not found on server')
|
||||
return
|
||||
|
||||
if vip:
|
||||
url = self._url('quickDownload/' + 'e2ZbEck4nD1E')
|
||||
self.info( url )
|
||||
# data = util.substr(page,'<h3>Neomezené stahování</h3>','</div')
|
||||
# m = re.search('<a(.+?)href=\"(?P<url>[^\"#]+)\"',data,re.IGNORECASE | re.DOTALL)
|
||||
if url:
|
||||
try:
|
||||
self.rh.throw = True
|
||||
resp = urllib2.urlopen(urllib2.Request(url))
|
||||
except RedirectionException:
|
||||
# this is what we need, our redirect handler raises this
|
||||
pass
|
||||
except urllib2.HTTPError:
|
||||
# this is not OK, something went wrong
|
||||
traceback.print_exc()
|
||||
self.error('Cannot resolve stream url, server did not redirected us')
|
||||
self.info('POST url:'+post_url)
|
||||
return
|
||||
stream = self.rh.location
|
||||
item['url'] = self._fix_stream_url(stream)
|
||||
item['surl'] = url
|
||||
return item
|
||||
|
||||
else:
|
||||
# m = re.search('<form action="(?P<action>[^"]+)[^>]+class="jsFreeDownloadForm"', page)
|
||||
m = re.search('data-href=\"(/download-dialog/free/download\?fileSlug=\S+)\"', page)
|
||||
self.info (m)
|
||||
if m:
|
||||
self.info (m.group(1))
|
||||
self.rh.throw = True
|
||||
stream_url = self._get_file_url_anonymous(page,self._url(m.group(1)),response.headers,captcha_cb)
|
||||
#stream_url = self._get_file_url_anonymous(page,self._url(m.group('action')),response.headers,captcha_cb)
|
||||
if stream_url:
|
||||
item['url'] = stream_url
|
||||
# free ulozto allows seeking but doesn't allow multiple connections.
|
||||
# kodi does this when seeking is possible so playback doesn't work.
|
||||
# To prevent from use of multiple connections we set header special for kodi
|
||||
# which disables seeking -> only one connection -> playback works, though we lose
|
||||
# seeking possibility.
|
||||
|
||||
# more info - http://forum.kodi.tv/showthread.php?tid=236411
|
||||
item['headers'] = {'seekable':'0'}
|
||||
item['surl'] = url
|
||||
return item
|
||||
|
||||
def _get_file_url_anonymous(self,page,post_url,headers,captcha_cb):
|
||||
|
||||
data = util.request(self._url('reloadXapca.php'))
|
||||
capdata = json.loads(data)
|
||||
captcha = capdata['image']
|
||||
if not captcha.startswith('http'):
|
||||
captcha = 'http:' + captcha
|
||||
sound = capdata['sound']
|
||||
if not sound.startswith('http'):
|
||||
sound = 'http:' + sound
|
||||
# ask callback to provide captcha code
|
||||
self.info('Asking for captcha img %s' % captcha)
|
||||
code = captcha_cb({'id':captcha,'img': captcha,'snd':sound})
|
||||
if not code:
|
||||
self.info('Captcha not provided, done')
|
||||
return
|
||||
|
||||
self.info( page )
|
||||
ts = re.search('<input type=\"hidden\" name=\"ts\".+?value=\"([^\"]+)"',page,re.IGNORECASE | re.DOTALL)
|
||||
cid = re.search('<input type=\"hidden\" name=\"cid\".+?value=\"([^\"]+)"',page,re.IGNORECASE | re.DOTALL)
|
||||
sign = re.search('<input type=\"hidden\" name=\"sign\".+?value=\"([^\"]+)"',page,re.IGNORECASE | re.DOTALL)
|
||||
sign_a = re.search('<input type=\"hidden\" name=\"sign_a\".+?value=\"([^\"]+)"',page,re.IGNORECASE | re.DOTALL)
|
||||
has = capdata['hash']
|
||||
salt = capdata['salt']
|
||||
timestamp = capdata['timestamp']
|
||||
token = re.search('<input type=\"hidden\" name=\"_token_\".+?value=\"([^\"]+)"',page,re.IGNORECASE | re.DOTALL)
|
||||
if not (sign and ts and cid and has and token):
|
||||
util.error('[uloz.to] - unable to parse required params from page, plugin needs fix')
|
||||
return
|
||||
request = {
|
||||
'captcha_type':'xapca',
|
||||
'hash':has,
|
||||
'salt':salt,
|
||||
'timestamp':timestamp,
|
||||
'ts':ts.group(1),
|
||||
'cid':'',
|
||||
'sign':sign.group(1),
|
||||
'sign_a':sign_a.group(1),
|
||||
'captcha_value':code,
|
||||
'_do':'download-freeDownloadTab-freeDownloadForm-submit',
|
||||
'_token_':token.group(1),
|
||||
'adi':'f'
|
||||
}
|
||||
req = urllib2.Request(post_url, urllib.urlencode(request))
|
||||
req.add_header('User-Agent',util.UA)
|
||||
req.add_header('Referer',post_url)
|
||||
req.add_header('Accept','application/json')
|
||||
req.add_header('X-Requested-With','XMLHttpRequest')
|
||||
sessid=[]
|
||||
for cookie in re.finditer('(ULOSESSID=[^\;]+)',headers.get('Set-Cookie'),re.IGNORECASE | re.DOTALL):
|
||||
sessid.append(cookie.group(1))
|
||||
req.add_header('Cookie','nomobile=1; uloztoid='+cid.group(1)+'; uloztoid2='+cid.group(1)+'; '+sessid[-1])
|
||||
util.info(req.headers)
|
||||
util.info(request)
|
||||
try:
|
||||
resp = urllib2.urlopen(req)
|
||||
page = resp.read()
|
||||
headers = resp.headers
|
||||
except urllib2.HTTPError:
|
||||
# this is not OK, something went wrong
|
||||
traceback.print_exc()
|
||||
util.error('[uloz.to] cannot resolve stream url, server did not redirected us')
|
||||
util.info('[uloz.to] POST url:'+post_url)
|
||||
return
|
||||
try:
|
||||
result = json.loads(page)
|
||||
except:
|
||||
raise ResolveException('Unexpected error, addon needs fix')
|
||||
if not 'status' in result.keys():
|
||||
raise ResolveException('Unexpected error, addon needs fix')
|
||||
if result['status'] == 'ok':
|
||||
return self._fix_stream_url(result['url'])
|
||||
elif result['status'] == 'error':
|
||||
# the only known state is wrong captcha for now
|
||||
util.error('Captcha validation failed, please try playing/downloading again')
|
||||
util.error(result)
|
||||
raise ResolveException('Captcha failed, try again')
|
||||
|
||||
|
||||
def _fix_stream_url(self,stream):
|
||||
index = stream.rfind('/')
|
||||
if index > 0:
|
||||
fn = stream[index:]
|
||||
index2 = fn.find('?')
|
||||
if index2 > 0:
|
||||
fn = urllib.quote(fn[:index2])+fn[index2:]
|
||||
else:
|
||||
fn = urllib.quote(fn)
|
||||
stream = stream[:index]+fn
|
||||
return stream
|
||||
|
||||
|
||||
|
||||
def _regex(url):
|
||||
return re.search('(#(.*)|ulozto\.cz|uloz\.to)',url,re.IGNORECASE | re.DOTALL)
|
||||
|
||||
class UloztoHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
|
||||
|
||||
def http_error_302(self, req, fp, code, msg, headers):
|
||||
if self.throw:
|
||||
self.location = headers.getheader('Location')
|
||||
raise RedirectionException()
|
||||
else:
|
||||
return urllib2.HTTPRedirectHandler.http_error_302(self,req,fp,code,msg,headers)
|
||||
|
||||
class RedirectionException(Exception):
|
||||
pass
|
||||
|
||||
BIN
resources/lib/ulozto.pyo
Normal file
BIN
resources/lib/ulozto.pyo
Normal file
Binary file not shown.
203
resources/lib/ulozto_search.py
Normal file
203
resources/lib/ulozto_search.py
Normal file
@@ -0,0 +1,203 @@
|
||||
|
||||
# *
|
||||
# * ulozto-search
|
||||
# * https://github.com/ZDVokoun/ulozto-search
|
||||
# * MIT License
|
||||
# *
|
||||
# *
|
||||
|
||||
from math import floor
|
||||
from requests import get as getRequest
|
||||
#from urllib.request import Request as getRequest
|
||||
from json import loads as loadjson
|
||||
from bs4 import BeautifulSoup
|
||||
from urllib.parse import unquote as unquoteURI
|
||||
import re
|
||||
|
||||
#import urllib
|
||||
|
||||
#getRequest("https://uloz.to/hledej", params=queryPayload, verify=not(insecure), headers={"X-Requested-With": "XMLHttpRequest"})
|
||||
# def getRequest(url, params, verify, headers):
|
||||
# req = params
|
||||
# class d:
|
||||
# def __init__(self, text):
|
||||
# self.text = text.decode('utf-8')
|
||||
# print (type(text))
|
||||
|
||||
# req = urllib.parse.urlencode(req).encode('utf-8')
|
||||
# req = urllib.request.Request(url, req, headers=headers)
|
||||
# with urllib.request.urlopen(req) as f:
|
||||
# try:
|
||||
# if f.getcode() == 200:
|
||||
# response = f.read()
|
||||
# return d(response)
|
||||
# except:
|
||||
# return None
|
||||
|
||||
class _decoder:
|
||||
def __init__(self, inputKey):
|
||||
self.numberSet1 = [608135816, 2242054355, 320440878, 57701188, 2752067618, 698298832, 137296536, 3964562569, 1160258022, 953160567, 3193202383, 887688300, 3232508343, 3380367581, 1065670069, 3041331479, 2450970073, 2306472731];
|
||||
self.numberSet2 = [3509652390, 2564797868, 805139163, 3491422135, 3101798381, 1780907670, 3128725573, 4046225305, 614570311, 3012652279, 134345442, 2240740374, 1667834072, 1901547113, 2757295779, 4103290238, 227898511, 1921955416, 1904987480, 2182433518, 2069144605, 3260701109, 2620446009, 720527379, 3318853667, 677414384, 3393288472, 3101374703, 2390351024, 1614419982, 1822297739, 2954791486, 3608508353, 3174124327, 2024746970, 1432378464, 3864339955, 2857741204, 1464375394, 1676153920, 1439316330, 715854006, 3033291828, 289532110, 2706671279, 2087905683, 3018724369, 1668267050, 732546397, 1947742710, 3462151702, 2609353502, 2950085171, 1814351708, 2050118529, 680887927, 999245976, 1800124847, 3300911131, 1713906067, 1641548236, 4213287313, 1216130144, 1575780402, 4018429277, 3917837745, 3693486850, 3949271944, 596196993, 3549867205, 258830323, 2213823033, 772490370, 2760122372, 1774776394, 2652871518, 566650946, 4142492826, 1728879713, 2882767088, 1783734482, 3629395816, 2517608232, 2874225571, 1861159788, 326777828, 3124490320, 2130389656, 2716951837, 967770486, 1724537150, 2185432712, 2364442137, 1164943284, 2105845187, 998989502, 3765401048, 2244026483, 1075463327, 1455516326, 1322494562, 910128902, 469688178, 1117454909, 936433444, 3490320968, 3675253459, 1240580251, 122909385, 2157517691, 634681816, 4142456567, 3825094682, 3061402683, 2540495037, 79693498, 3249098678, 1084186820, 1583128258, 426386531, 1761308591, 1047286709, 322548459, 995290223, 1845252383, 2603652396, 3431023940, 2942221577, 3202600964, 3727903485, 1712269319, 422464435, 3234572375, 1170764815, 3523960633, 3117677531, 1434042557, 442511882, 3600875718, 1076654713, 1738483198, 4213154764, 2393238008, 3677496056, 1014306527, 4251020053, 793779912, 2902807211, 842905082, 4246964064, 1395751752, 1040244610, 2656851899, 3396308128, 445077038, 3742853595, 3577915638, 679411651, 2892444358, 2354009459, 1767581616, 3150600392, 3791627101, 3102740896, 284835224, 4246832056, 1258075500, 768725851, 2589189241, 3069724005, 3532540348, 1274779536, 3789419226, 2764799539, 1660621633, 3471099624, 4011903706, 913787905, 3497959166, 737222580, 2514213453, 2928710040, 3937242737, 1804850592, 3499020752, 2949064160, 2386320175, 2390070455, 2415321851, 4061277028, 2290661394, 2416832540, 1336762016, 1754252060, 3520065937, 3014181293, 791618072, 3188594551, 3933548030, 2332172193, 3852520463, 3043980520, 413987798, 3465142937, 3030929376, 4245938359, 2093235073, 3534596313, 375366246, 2157278981, 2479649556, 555357303, 3870105701, 2008414854, 3344188149, 4221384143, 3956125452, 2067696032, 3594591187, 2921233993, 2428461, 544322398, 577241275, 1471733935, 610547355, 4027169054, 1432588573, 1507829418, 2025931657, 3646575487, 545086370, 48609733, 2200306550, 1653985193, 298326376, 1316178497, 3007786442, 2064951626, 458293330, 2589141269, 3591329599, 3164325604, 727753846, 2179363840, 146436021, 1461446943, 4069977195, 705550613, 3059967265, 3887724982, 4281599278, 3313849956, 1404054877, 2845806497, 146425753, 1854211946];
|
||||
self.numberSet3 = [1266315497, 3048417604, 3681880366, 3289982499, 290971e4, 1235738493, 2632868024, 2414719590, 3970600049, 1771706367, 1449415276, 3266420449, 422970021, 1963543593, 2690192192, 3826793022, 1062508698, 1531092325, 1804592342, 2583117782, 2714934279, 4024971509, 1294809318, 4028980673, 1289560198, 2221992742, 1669523910, 35572830, 157838143, 1052438473, 1016535060, 1802137761, 1753167236, 1386275462, 3080475397, 2857371447, 1040679964, 2145300060, 2390574316, 1461121720, 2956646967, 4031777805, 4028374788, 33600511, 2920084762, 1018524850, 629373528, 3691585981, 3515945977, 2091462646, 2486323059, 586499841, 988145025, 935516892, 3367335476, 2599673255, 2839830854, 265290510, 3972581182, 2759138881, 3795373465, 1005194799, 847297441, 406762289, 1314163512, 1332590856, 1866599683, 4127851711, 750260880, 613907577, 1450815602, 3165620655, 3734664991, 3650291728, 3012275730, 3704569646, 1427272223, 778793252, 1343938022, 2676280711, 2052605720, 1946737175, 3164576444, 3914038668, 3967478842, 3682934266, 1661551462, 3294938066, 4011595847, 840292616, 3712170807, 616741398, 312560963, 711312465, 1351876610, 322626781, 1910503582, 271666773, 2175563734, 1594956187, 70604529, 3617834859, 1007753275, 1495573769, 4069517037, 2549218298, 2663038764, 504708206, 2263041392, 3941167025, 2249088522, 1514023603, 1998579484, 1312622330, 694541497, 2582060303, 2151582166, 1382467621, 776784248, 2618340202, 3323268794, 2497899128, 2784771155, 503983604, 4076293799, 907881277, 423175695, 432175456, 1378068232, 4145222326, 3954048622, 3938656102, 3820766613, 2793130115, 2977904593, 26017576, 3274890735, 3194772133, 1700274565, 1756076034, 4006520079, 3677328699, 720338349, 1533947780, 354530856, 688349552, 3973924725, 1637815568, 332179504, 3949051286, 53804574, 2852348879, 3044236432, 1282449977, 3583942155, 3416972820, 4006381244, 1617046695, 2628476075, 3002303598, 1686838959, 431878346, 2686675385, 1700445008, 1080580658, 1009431731, 832498133, 3223435511, 2605976345, 2271191193, 2516031870, 1648197032, 4164389018, 2548247927, 300782431, 375919233, 238389289, 3353747414, 2531188641, 2019080857, 1475708069, 455242339, 2609103871, 448939670, 3451063019, 1395535956, 2413381860, 1841049896, 1491858159, 885456874, 4264095073, 4001119347, 1565136089, 3898914787, 1108368660, 540939232, 1173283510, 2745871338, 3681308437, 4207628240, 3343053890, 4016749493, 1699691293, 1103962373, 3625875870, 2256883143, 3830138730, 1031889488, 3479347698, 1535977030, 4236805024, 3251091107, 2132092099, 1774941330, 1199868427, 1452454533, 157007616, 2904115357, 342012276, 595725824, 1480756522, 206960106, 497939518, 591360097, 863170706, 2375253569, 3596610801, 1814182875, 2094937945, 3421402208, 1082520231, 3463918190, 2785509508, 435703966, 3908032597, 1641649973, 2842273706, 3305899714, 1510255612, 2148256476, 2655287854, 3276092548, 4258621189, 236887753, 3681803219, 274041037, 1734335097, 3815195456, 3317970021, 1899903192, 1026095262, 4050517792, 356393447, 2410691914, 3873677099, 3682840055];
|
||||
self.numberSet4 = [3913112168, 2491498743, 4132185628, 2489919796, 1091903735, 1979897079, 3170134830, 3567386728, 3557303409, 857797738, 1136121015, 1342202287, 507115054, 2535736646, 337727348, 3213592640, 1301675037, 2528481711, 1895095763, 1721773893, 3216771564, 62756741, 2142006736, 835421444, 2531993523, 1442658625, 3659876326, 2882144922, 676362277, 1392781812, 170690266, 3921047035, 1759253602, 3611846912, 1745797284, 664899054, 1329594018, 3901205900, 3045908486, 2062866102, 2865634940, 3543621612, 3464012697, 1080764994, 553557557, 3656615353, 3996768171, 991055499, 499776247, 1265440854, 648242737, 3940784050, 980351604, 3713745714, 1749149687, 3396870395, 4211799374, 3640570775, 1161844396, 3125318951, 1431517754, 545492359, 4268468663, 3499529547, 1437099964, 2702547544, 3433638243, 2581715763, 2787789398, 1060185593, 1593081372, 2418618748, 4260947970, 69676912, 2159744348, 86519011, 2512459080, 3838209314, 1220612927, 3339683548, 133810670, 1090789135, 1078426020, 1569222167, 845107691, 3583754449, 4072456591, 1091646820, 628848692, 1613405280, 3757631651, 526609435, 236106946, 48312990, 2942717905, 3402727701, 1797494240, 859738849, 992217954, 4005476642, 2243076622, 3870952857, 3732016268, 765654824, 3490871365, 2511836413, 1685915746, 3888969200, 1414112111, 2273134842, 3281911079, 4080962846, 172450625, 2569994100, 980381355, 4109958455, 2819808352, 2716589560, 2568741196, 3681446669, 3329971472, 1835478071, 660984891, 3704678404, 4045999559, 3422617507, 3040415634, 1762651403, 1719377915, 3470491036, 2693910283, 3642056355, 3138596744, 1364962596, 2073328063, 1983633131, 926494387, 3423689081, 2150032023, 4096667949, 1749200295, 3328846651, 309677260, 2016342300, 1779581495, 3079819751, 111262694, 1274766160, 443224088, 298511866, 1025883608, 3806446537, 1145181785, 168956806, 3641502830, 3584813610, 1689216846, 3666258015, 3200248200, 1692713982, 2646376535, 4042768518, 1618508792, 1610833997, 3523052358, 4130873264, 2001055236, 3610705100, 2202168115, 4028541809, 2961195399, 1006657119, 2006996926, 3186142756, 1430667929, 3210227297, 1314452623, 4074634658, 4101304120, 2273951170, 1399257539, 3367210612, 3027628629, 1190975929, 2062231137, 2333990788, 2221543033, 2438960610, 1181637006, 548689776, 2362791313, 3372408396, 3104550113, 3145860560, 296247880, 1970579870, 3078560182, 3769228297, 1714227617, 3291629107, 3898220290, 166772364, 1251581989, 493813264, 448347421, 195405023, 2709975567, 677966185, 3703036547, 1463355134, 2715995803, 1338867538, 1343315457, 2802222074, 2684532164, 233230375, 2599980071, 2000651841, 3277868038, 1638401717, 4028070440, 3237316320, 6314154, 819756386, 300326615, 590932579, 1405279636, 3267499572, 3150704214, 2428286686, 3959192993, 3461946742, 1862657033, 1266418056, 963775037, 2089974820, 2263052895, 1917689273, 448879540, 3550394620, 3981727096, 150775221, 3627908307, 1303187396, 508620638, 2975983352, 2726630617, 1817252668, 1876281319, 1457606340, 908771278, 3720792119, 3617206836, 2455994898, 1729034894, 1080033504];
|
||||
self.numberSet5 = [976866871, 3556439503, 2881648439, 1522871579, 1555064734, 1336096578, 3548522304, 2579274686, 3574697629, 3205460757, 3593280638, 3338716283, 3079412587, 564236357, 2993598910, 1781952180, 1464380207, 3163844217, 3332601554, 1699332808, 1393555694, 1183702653, 3581086237, 1288719814, 691649499, 2847557200, 2895455976, 3193889540, 2717570544, 1781354906, 1676643554, 2592534050, 3230253752, 1126444790, 2770207658, 2633158820, 2210423226, 2615765581, 2414155088, 3127139286, 673620729, 2805611233, 1269405062, 4015350505, 3341807571, 4149409754, 1057255273, 2012875353, 2162469141, 2276492801, 2601117357, 993977747, 3918593370, 2654263191, 753973209, 36408145, 2530585658, 25011837, 3520020182, 2088578344, 530523599, 2918365339, 1524020338, 1518925132, 3760827505, 3759777254, 1202760957, 3985898139, 3906192525, 674977740, 4174734889, 2031300136, 2019492241, 3983892565, 4153806404, 3822280332, 352677332, 2297720250, 60907813, 90501309, 3286998549, 1016092578, 2535922412, 2839152426, 457141659, 509813237, 4120667899, 652014361, 1966332200, 2975202805, 55981186, 2327461051, 676427537, 3255491064, 2882294119, 3433927263, 1307055953, 942726286, 933058658, 2468411793, 3933900994, 4215176142, 1361170020, 2001714738, 2830558078, 3274259782, 1222529897, 1679025792, 2729314320, 3714953764, 1770335741, 151462246, 3013232138, 1682292957, 1483529935, 471910574, 1539241949, 458788160, 3436315007, 1807016891, 3718408830, 978976581, 1043663428, 3165965781, 1927990952, 4200891579, 2372276910, 3208408903, 3533431907, 1412390302, 2931980059, 4132332400, 1947078029, 3881505623, 4168226417, 2941484381, 1077988104, 1320477388, 886195818, 18198404, 3786409e3, 2509781533, 112762804, 3463356488, 1866414978, 891333506, 18488651, 661792760, 1628790961, 3885187036, 3141171499, 876946877, 2693282273, 1372485963, 791857591, 2686433993, 3759982718, 3167212022, 3472953795, 2716379847, 445679433, 3561995674, 3504004811, 3574258232, 54117162, 3331405415, 2381918588, 3769707343, 4154350007, 1140177722, 4074052095, 668550556, 3214352940, 367459370, 261225585, 2610173221, 4209349473, 3468074219, 3265815641, 314222801, 3066103646, 3808782860, 282218597, 3406013506, 3773591054, 379116347, 1285071038, 846784868, 2669647154, 3771962079, 3550491691, 2305946142, 453669953, 1268987020, 3317592352, 3279303384, 3744833421, 2610507566, 3859509063, 266596637, 3847019092, 517658769, 3462560207, 3443424879, 370717030, 4247526661, 2224018117, 4143653529, 4112773975, 2788324899, 2477274417, 1456262402, 2901442914, 1517677493, 1846949527, 2295493580, 3734397586, 2176403920, 1280348187, 1908823572, 3871786941, 846861322, 1172426758, 3287448474, 3383383037, 1655181056, 3139813346, 901632758, 1897031941, 2986607138, 3066810236, 3447102507, 1393639104, 373351379, 950779232, 625454576, 3124240540, 4148612726, 2007998917, 544563296, 2244738638, 2330496472, 2058025392, 1291430526, 424198748, 50039436, 29584100, 3605783033, 2429876329, 2791104160, 1057563949, 3255363231, 3075367218, 3463963227, 1469046755, 985887462];
|
||||
if len(str(inputKey)) == 0:
|
||||
raise "error"
|
||||
key = inputKey[0:56] if len(inputKey) > 56 else inputKey
|
||||
n = 0
|
||||
for i in range(18):
|
||||
r = ord(key[n])
|
||||
for index in range(1,4):
|
||||
r = 256 * r + ord(key[(n + index) % len(key)])
|
||||
self.numberSet1[i] = self.xorUnsigned(self.numberSet1[i], r)
|
||||
n = (n + 4) % len(key)
|
||||
self.first, self.second = 0, 0
|
||||
for i in range(0,18,2):
|
||||
self.multipleRound()
|
||||
self.numberSet1[i] = self.first
|
||||
self.numberSet1[i + 1] = self.second
|
||||
for i in range(0,256,2):
|
||||
self.multipleRound()
|
||||
self.numberSet2[i] = self.first
|
||||
self.numberSet2[i + 1] = self.second
|
||||
for i in range(0,256,2):
|
||||
self.multipleRound()
|
||||
self.numberSet3[i] = self.first
|
||||
self.numberSet3[i + 1] = self.second
|
||||
for i in range(0,256,2):
|
||||
self.multipleRound()
|
||||
self.numberSet4[i] = self.first
|
||||
self.numberSet4[i + 1] = self.second
|
||||
for i in range(0,256,2):
|
||||
self.multipleRound()
|
||||
self.numberSet5[i] = self.first
|
||||
self.numberSet5[i + 1] = self.second
|
||||
def modulosAfterDivision (self, n):
|
||||
array = []
|
||||
for i in range(4):
|
||||
array.append(floor(n / (256**i)) % 256)
|
||||
return array
|
||||
def xorUnsigned(self,x,y):
|
||||
result = int(x)^int(y)
|
||||
if result < 0:
|
||||
result += (1 << 32)
|
||||
return result
|
||||
def partialDecode (self, string):
|
||||
result = ""
|
||||
for i in range(0, len(string), 2):
|
||||
x,y = ord(string[i]), ord(string[i + 1])
|
||||
x -= 48 if x < 58 else (87 if x > 96 else 55)
|
||||
y -= 48 if y < 58 else (87 if y > 96 else 55)
|
||||
result += chr(16 * x + y)
|
||||
return result
|
||||
def decode (self, encoded):
|
||||
for i in range(len(encoded) % 16):
|
||||
encoded += "0"
|
||||
string = ""
|
||||
for i in range(0, len(encoded), 16):
|
||||
a = self.partialDecode(encoded[i:i+8])
|
||||
b = self.partialDecode(encoded[i+8:i+16])
|
||||
x = (ord(a[3])) | (ord(a[2]) << 8) | (ord(a[1]) << 16) | (ord(a[0]) << 24)
|
||||
x += 1 << 32 if x < 0 else 0
|
||||
y = ord(b[3]) | (ord(b[2]) << 8) | (ord(b[1]) << 16) | (ord(b[0]) << 24)
|
||||
y += 1 << 32 if y < 0 else 0
|
||||
self.first = x
|
||||
self.second = y
|
||||
self.reverseMultipleRound()
|
||||
string += self.toHexadecimal(self.first) + self.toHexadecimal(self.second)
|
||||
return self.partialDecode(string)
|
||||
def toHexadecimal (self, n):
|
||||
string, modulos = "", self.modulosAfterDivision(n)
|
||||
for i in range (3,-1, -1):
|
||||
x = floor(modulos[i] / 16)
|
||||
y = modulos[i] % 16
|
||||
x += 48 if x < 10 else 55
|
||||
y += 48 if y < 10 else 55
|
||||
string += chr(x) + chr(y)
|
||||
return string
|
||||
def round (self,x,y,i):
|
||||
modulos = self.modulosAfterDivision(y)
|
||||
a = self.xorUnsigned(self.numberSet2[modulos[3]] + self.numberSet3[modulos[2]], self.numberSet4[modulos[1]])
|
||||
b = self.xorUnsigned(a + self.numberSet5[modulos[0]], self.numberSet1[i])
|
||||
result = self.xorUnsigned(x,b)
|
||||
return result
|
||||
def multipleRound (self):
|
||||
x = self.xorUnsigned(self.first, self.numberSet1[0])
|
||||
y = self.second
|
||||
for i in range(1,17):
|
||||
if i % 2 == 0:
|
||||
x = self.round(x,y,i)
|
||||
else:
|
||||
y = self.round(y,x,i)
|
||||
y = self.xorUnsigned(y, self.numberSet1[17])
|
||||
self.first = y
|
||||
self.second = x
|
||||
def reverseMultipleRound (self):
|
||||
x = self.xorUnsigned(self.first, self.numberSet1[17])
|
||||
y = self.second
|
||||
for i in range(16,0,-1):
|
||||
if i % 2 == 1:
|
||||
x = self.round(x,y,i)
|
||||
else:
|
||||
y = self.round(y,x,i)
|
||||
y = self.xorUnsigned(y, self.numberSet1[0])
|
||||
self.first = y
|
||||
self.second = x
|
||||
def searchHTML(query, page=1, fileType="", *, insecure=False, includeApproximate=False):
|
||||
queryPayload = {"q": query, "page": page}
|
||||
if fileType in ("documents", "videos", "images", "archives", "audios"):
|
||||
queryPayload["type"] = fileType
|
||||
req = getRequest("https://uloz.to/hledej", params=queryPayload, verify=not(insecure), headers={"X-Requested-With": "XMLHttpRequest"})
|
||||
#print(req)
|
||||
result = []
|
||||
if re.search('class=[\\\]"flash', req.text) != None:
|
||||
return result
|
||||
res = loadjson(req.json()["items"].split("pg.push(")[1].split(");\n</script>")[0])
|
||||
decoder = _decoder(res[1])
|
||||
#print (decoder)
|
||||
for key in res[0].keys():
|
||||
rawDecode = decoder.decode(res[0][key])
|
||||
fixedDiacritics = unquoteURI(re.sub("\\\\x", "%", rawDecode.encode('ascii', 'backslashreplace').decode()))
|
||||
result.append(fixedDiacritics)
|
||||
return result
|
||||
|
||||
def search(query, page=1, fileType="", *, insecure=False, includeApproximate=False):
|
||||
html = "".join(searchHTML(query, page, fileType, insecure=insecure, includeApproximate=includeApproximate))
|
||||
soup = BeautifulSoup(html, "html.parser")
|
||||
# print (soup)
|
||||
results = []
|
||||
for result in soup.select(".js-result-item"):
|
||||
filenameEl = result.find("a", class_="js-file-name")
|
||||
item_len = None
|
||||
|
||||
# filenameEl_len = result.find("i", class_="fi-clock-o")
|
||||
# filenameEl_size = result.find("a", class_="fi-database")
|
||||
# print ('filenameEl_len', filenameEl_len)
|
||||
# print ('filenameEl_size', filenameEl_size)
|
||||
|
||||
info = result.find("div", class_="info")
|
||||
spans = info.find_all('span',"")
|
||||
info_length = None
|
||||
# for span in spans:
|
||||
# print(span.text)
|
||||
if len(spans) == 2:
|
||||
info_length = spans[0].text
|
||||
info_size = spans[1].text
|
||||
else:
|
||||
info_size = spans[0].text
|
||||
|
||||
|
||||
# print(soup.find("span", title=re.compile("RAM")).text)
|
||||
|
||||
results.append({"name": filenameEl.text.strip(),
|
||||
"link": "https://uloz.to" + filenameEl["href"] ,
|
||||
"length": info_length,
|
||||
"size": info_size,
|
||||
# "img": filenameEl_size.text.strip()
|
||||
})
|
||||
return results
|
||||
|
||||
# def search_for_kodi(query, fileType="", *, insecure=False, includeApproximate=False):
|
||||
# html = "".join(searchHTML(query, fileType, insecure=insecure, includeApproximate=includeApproximate))
|
||||
# # soup = BeautifulSoup(html, "html.parser")
|
||||
# return html
|
||||
164
resources/lib/webshare.py
Normal file
164
resources/lib/webshare.py
Normal file
@@ -0,0 +1,164 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
#/*
|
||||
# * Copyright (C) 2013 Libor Zoubek
|
||||
# *
|
||||
# *
|
||||
# * This Program is free software; you can redistribute it and/or modify
|
||||
# * it under the terms of the GNU General Public License as published by
|
||||
# * the Free Software Foundation; either version 2, or (at your option)
|
||||
# * any later version.
|
||||
# *
|
||||
# * This Program is distributed in the hope that it will be useful,
|
||||
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# * GNU General Public License for more details.
|
||||
# *
|
||||
# * You should have received a copy of the GNU General Public License
|
||||
# * along with this program; see the file COPYING. If not, write to
|
||||
# * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
# * http://www.gnu.org/copyleft/gpl.html
|
||||
# *
|
||||
# */
|
||||
import re,random,util,sys,os,traceback,hashlib
|
||||
import urllib
|
||||
#Python 2
|
||||
try:
|
||||
import cookielib
|
||||
import urllib2
|
||||
import urlparse
|
||||
import elementtree.ElementTree as ET
|
||||
#import sys
|
||||
# reload(sys) # Reload does the trick!
|
||||
# sys.setdefaultencoding('UTF8')
|
||||
#Python 3
|
||||
except:
|
||||
import http.cookiejar
|
||||
cookielib = http.cookiejar
|
||||
urllib2 = urllib.request
|
||||
urlparse = urllib.parse
|
||||
# urllib = urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from provider import ContentProvider
|
||||
from provider import ResolveException
|
||||
from crypto.md5crypt import md5crypt
|
||||
|
||||
def loadurl(url, req, headers):
|
||||
req = urllib.parse.urlencode(req).encode('utf-8')
|
||||
req = urllib.request.Request(url, req, headers=headers)
|
||||
with urllib.request.urlopen(req) as f:
|
||||
try:
|
||||
if f.getcode()==200:
|
||||
response = f.read()
|
||||
return response
|
||||
except:
|
||||
return False
|
||||
|
||||
|
||||
class WebshareContentProvider(ContentProvider):
|
||||
|
||||
def __init__(self,username=None,password=None,filter=None,tmp_dir='.'):
|
||||
ContentProvider.__init__(self,'webshare.cz','https://webshare.cz/',username,password,filter,tmp_dir)
|
||||
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.LWPCookieJar()))
|
||||
urllib2.install_opener(opener)
|
||||
self.token = ''
|
||||
|
||||
def capabilities(self):
|
||||
return ['login', 'search', 'resolve']
|
||||
|
||||
def search(self, keyword):
|
||||
return self.list('what=%s'%urllib.parse.quote(keyword))
|
||||
|
||||
def _create_request(self, url, base):
|
||||
args = dict(urlparse.parse_qsl(url))
|
||||
headers = {'X-Requested-With':'XMLHttpRequest','Accept':'text/xml; charset=UTF-8','Referer':self.base_url}
|
||||
req = base.copy()
|
||||
for key in req:
|
||||
if key in args.keys():
|
||||
req[key] = args[key]
|
||||
return headers, req
|
||||
|
||||
|
||||
def login(self):
|
||||
if not self.username and not self.password:
|
||||
return True # fall back to free account
|
||||
elif self.username and self.password and len(self.username)>0 and len(self.password)>0:
|
||||
self.info('Login user=%s, pass=*****' % (self.username))
|
||||
# get salt
|
||||
headers,req = self._create_request('',{'username_or_email':self.username})
|
||||
data = util.post(self._url('api/salt/'),req,headers=headers)
|
||||
xml = ET.fromstring(data)
|
||||
if not xml.find('status').text == 'OK':
|
||||
self.error('Server returned error status, response: %s' % data)
|
||||
return False
|
||||
salt = xml.find('salt').text
|
||||
# create hashes
|
||||
password = hashlib.sha1(md5crypt(self.password, salt).encode('utf-8')).hexdigest()
|
||||
digest = hashlib.md5((self.username + ':Webshare:' + self.password).encode('utf-8')).hexdigest()
|
||||
# login
|
||||
headers,req = self._create_request('',{'username_or_email':self.username,'password':password,'digest':digest,'keep_logged_in':1})
|
||||
data = util.post(self._url('api/login/'),req,headers=headers)
|
||||
xml = ET.fromstring(data)
|
||||
if not xml.find('status').text == 'OK':
|
||||
self.error('Server returned error status, response: %s' % data)
|
||||
return False
|
||||
self.token = xml.find('token').text
|
||||
self.info('Login successfull')
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def list(self, url):
|
||||
self.info(' ==== list ==========')
|
||||
result = []
|
||||
headers, req = self._create_request( url, {'what':'','offset':0,'limit':25,'category':'','sort':'','wst':self.token} )
|
||||
self.info(' ==== headers ==========' )
|
||||
self.info(headers)
|
||||
self.info(type(headers))
|
||||
self.info(' ==== req ==========')
|
||||
self.info(req)
|
||||
self.info(type(req))
|
||||
|
||||
data = loadurl(self._url('api/search/'), req, headers=headers)
|
||||
# with urllib.request.urlopen(req, data=data) as f:
|
||||
# resp = f.read()
|
||||
|
||||
self.info(data)
|
||||
xml = ET.fromstring(data)
|
||||
if not xml.find('status').text == 'OK':
|
||||
self.error('Server returned error status, response: %s' % data)
|
||||
return []
|
||||
total = int(xml.find('total').text)
|
||||
for file in xml.findall('file'):
|
||||
item = self.video_item()
|
||||
item['title'] = file.find('name').text
|
||||
item['url'] = 'ident=%s' % file.find('ident').text
|
||||
size = int(file.find('size').text)
|
||||
item['size'] = '%d MB' % (int(size)/1024/1024)
|
||||
img = file.find('img').text
|
||||
if img:
|
||||
item['img'] = self._url(img)
|
||||
self._filter(result,item)
|
||||
listed = int(req['limit']) + int(req['offset'])
|
||||
if total > listed:
|
||||
req['offset'] = listed
|
||||
item = self.dir_item()
|
||||
item['type'] = 'next'
|
||||
item['url'] = urllib.parse.urlencode(req)
|
||||
result.append(item)
|
||||
return result
|
||||
|
||||
|
||||
def resolve(self,item,captcha_cb=None,select_cb=None):
|
||||
item = item.copy()
|
||||
util.init_urllib()
|
||||
headers, req = self._create_request(item['url'],{'ident':'','wst':self.token})
|
||||
#data = util.post(self._url('api/file_link/'),req,headers=headers)
|
||||
data = loadurl(self._url('api/file_link/'), req, headers=headers)
|
||||
self.info(data)
|
||||
xml = ET.fromstring(data)
|
||||
if not xml.find('status').text == 'OK':
|
||||
self.error('Server returned error status, response: %s' % data)
|
||||
raise ResolveException(xml.find('message').text)
|
||||
item['url'] = xml.find('link').text
|
||||
return item
|
||||
BIN
resources/lib/webshare.pyo
Normal file
BIN
resources/lib/webshare.pyo
Normal file
Binary file not shown.
45
resources/settings.xml
Normal file
45
resources/settings.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<settings>
|
||||
<category label="30052">
|
||||
<setting label="30000" id="keep-searches" type="text" default="20" />
|
||||
<setting label="30030" id="downloads" type="folder" default="" />
|
||||
<setting label="30032" id="download-notify" type="bool" default="true" />
|
||||
<setting label="30033" id="download-notify-every" type="enum" lvalues="30034|30035|30036" default="0" visible="eq(-1,true)" />
|
||||
</category>
|
||||
<category label="30015">
|
||||
<setting label="30002" id="webshare_enabled" type="bool" default="true" />
|
||||
<setting label="30000" id="webshare_keep-searches" type="text" default="20" />
|
||||
<setting label="30007" id="webshare_user" type="text" default="" />
|
||||
<setting label="30008" id="webshare_pass" type="text" default="" option="hidden" />
|
||||
<setting label="30051" id="webshare_ext-filter" type="text" default="exe,rar,srt,zip" />
|
||||
</category>
|
||||
<category label="30010">
|
||||
<setting label="30002" id="ulozto_enabled" type="bool" default="true" />
|
||||
<setting label="30000" id="ulozto_keep-searches" type="text" default="20" />
|
||||
<setting label="30007" id="ulozto_user" type="text" default="" />
|
||||
<setting label="30008" id="ulozto_pass" type="text" default="" option="hidden" />
|
||||
<setting label="30003" id="ulozto_usevip" type="enum" lvalues="30004|30005|30006" default="0" />
|
||||
<setting label="30057" id="ulozto_search-type" type="enum" lvalues="30058|30059|30060|30061|30062" default="1" />
|
||||
<setting label="30051" id="ulozto_ext-filter" type="text" default="exe,rar,srt,zip" />
|
||||
<setting label="30040" id="ulozto_captcha_auto" type="bool" default="true" />
|
||||
<setting label="30041" id="ulozto_captcha_timeout" type="number" default="30" visible="eq(-1,true)" />
|
||||
</category>
|
||||
<category label="30011">
|
||||
<setting label="30002" id="hellspy_enabled" type="bool" default="true" />
|
||||
<setting label="30013" id="hellspy_site_url" type="text" default="http://hellspy.cz" />
|
||||
<setting label="30000" id="hellspy_keep-searches" type="text" default="20" />
|
||||
<setting label="30007" id="hellspy_user" type="text" default="" />
|
||||
<setting label="30008" id="hellspy_pass" type="text" default="" option="hidden" />
|
||||
<setting label="30064" id="hellspy_adult" type="bool" default="false" />
|
||||
</category>
|
||||
<category label="30014">
|
||||
<setting label="30002" id="fastshare_enabled" type="bool" default="true" />
|
||||
<setting label="30000" id="fastshare_keep-searches" type="text" default="20" />
|
||||
</category>
|
||||
<category label="30009">
|
||||
<setting label="30002" id="bezvadata_enabled" type="bool" default="true" />
|
||||
<setting label="30000" id="bezvadata_keep-searches" type="text" default="20" />
|
||||
<setting label="30050" id="bezvadata_18+content" type="bool" default="false" />
|
||||
<setting label="30051" id="bezvadata_ext-filter" type="text" default="exe,rar,srt,zip" />
|
||||
</category>
|
||||
</settings>
|
||||
Reference in New Issue
Block a user