275 lines
10 KiB
Python
275 lines
10 KiB
Python
# -*- 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 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
|
|
pass
|
|
|
|
import re,os,traceback,socket
|
|
sys.path.append( os.path.join ( os.path.dirname(__file__),'resources','lib') )
|
|
import xbmcaddon,xbmc,xbmcgui,xbmcplugin
|
|
|
|
__scriptid__ = 'plugin.video.online-files'
|
|
__scriptname__ = 'Soubory Online'
|
|
__addon__ = xbmcaddon.Addon(id=__scriptid__)
|
|
__language__ = __addon__.getLocalizedString
|
|
__settings__ = __addon__.getSetting
|
|
|
|
import util,search
|
|
|
|
import xbmcutil, xbmcvfs
|
|
# import bezvadata,
|
|
import hellspy,ulozto,fastshare,webshare
|
|
import xbmcprovider
|
|
from threading import Lock
|
|
from provider import ResolveException
|
|
|
|
|
|
def search_cb(what):
|
|
|
|
def paralel_search(search):
|
|
def do_search(p,what):
|
|
res = []
|
|
try:
|
|
result = p.provider.search(what)
|
|
for item in result:
|
|
item['title'] = '[%s] %s' % (p.provider.name,item['title'])
|
|
if item['type'] == 'next':
|
|
item['type'] = 'dir'
|
|
item['title'] = '[%s] %s >>' % (p.provider.name,__language__(30063))
|
|
except:
|
|
traceback.print_exc()
|
|
try:
|
|
lock.acquire()
|
|
p.list(result)
|
|
finally:
|
|
lock.release()
|
|
lock = Lock()
|
|
util.run_parallel_in_threads(do_search, search)
|
|
|
|
searches = []
|
|
for key in providers.keys():
|
|
p = providers[key]
|
|
searches.append((p,what))
|
|
paralel_search(searches)
|
|
return xbmcplugin.endOfDirectory(int(sys.argv[1]))
|
|
|
|
# def bezvadata_filter(item):
|
|
# ext_filter = __settings__('bezvadata_ext-filter').split(',')
|
|
# ext_filter = ['.'+f.strip() for f in ext_filter]
|
|
# extension = os.path.splitext(item['title'])[1]
|
|
# if extension in ext_filter:
|
|
# return False
|
|
# elif '18+' in item.keys() and __settings__('bezvadata_18+content') != 'true':
|
|
# return False
|
|
# return True
|
|
|
|
def ulozto_filter(item):
|
|
ext_filter = __settings__('ulozto_ext-filter').split(',')
|
|
ext_filter = ['.'+f.strip() for f in ext_filter]
|
|
extension = os.path.splitext(item['title'])[1]
|
|
if extension in ext_filter:
|
|
return False
|
|
return True
|
|
|
|
def webshare_filter(item):
|
|
ext_filter = __settings__('webshare_ext-filter').split(',')
|
|
ext_filter = ['.'+f.strip() for f in ext_filter]
|
|
extension = os.path.splitext(item['title'])[1]
|
|
if extension in ext_filter:
|
|
return False
|
|
return True
|
|
|
|
class XBMCHellspyContentProvider(xbmcprovider.XBMCLoginRequiredContentProvider):
|
|
|
|
def render_default(self,item):
|
|
params = self.params()
|
|
if item['type'] == 'top':
|
|
params.update({'list':item['url']})
|
|
xbmcutil.add_dir(item['title'],params,xbmcutil.icon('top.png'))
|
|
|
|
def render_video(self,item):
|
|
params = self.params()
|
|
params.update({'to-downloads':item['url']})
|
|
item['menu'] = {__language__(30056):params}
|
|
return xbmcprovider.XBMCLoginRequiredContentProvider.render_video(self,item)
|
|
|
|
def run_custom(self,params):
|
|
if 'to-downloads' in params.keys():
|
|
self.provider.to_downloads(params['to-downloads'])
|
|
|
|
class XBMCUloztoContentProvider(xbmcprovider.XBMCLoginOptionalContentProvider):
|
|
|
|
def __init__(self,provider,settings,addon):
|
|
xbmcprovider.XBMCLoginOptionalContentProvider.__init__(self,provider,settings,addon)
|
|
self.check_setting_keys(['vip','search-type'])
|
|
search_type = ''
|
|
#search_types = {'0':'','1':'media=video&','2':'media=image&','3':'media=music&','4':'media=document&'}
|
|
search_types = {'0':'','1':'type=videos&','2':'type=images&','3':'type=audios&','4':'type=documents&','5':'type=archives&'}
|
|
if settings['search-type'] in search_types.keys():
|
|
search_type = search_types[settings['search-type']]
|
|
provider.search_type = search_type
|
|
|
|
def resolve(self,url):
|
|
item = self.provider.video_item()
|
|
item.update({'url':url,'vip':True})
|
|
if not self.ask_for_account_type():
|
|
# user does not want to use VIP at this time
|
|
item.update({'vip':False})
|
|
else:
|
|
if not self.provider.login():
|
|
xbmcgui.Dialog().ok(self.provider.name,xbmcutil.__lang__(30011))
|
|
return
|
|
try:
|
|
if __settings__("ulozto_captcha_auto") == "true":
|
|
return self.provider.resolve(item,captcha_cb=self.solve_captcha)
|
|
else:
|
|
return self.provider.resolve(item,captcha_cb=self.ask_for_captcha)
|
|
except ResolveException as e:
|
|
self._handle_exc(e)
|
|
|
|
def solve_captcha(self,params):
|
|
#snd = os.path.join(unicode(xbmc.translatePath(self.addon.getAddonInfo('profile'))),'sound.wav')
|
|
snd = os.path.join(xbmcvfs.translatePath(self.addon.getAddonInfo('profile')),'sound.wav')
|
|
# snd = 'sound.wav'
|
|
print(self.addon.getAddonInfo('profile'))
|
|
util.save_to_file(params['snd'], snd)
|
|
sndfile = open(snd, 'rb').read()
|
|
url = 'http://m217-io.appspot.com/ulozto'
|
|
headers = {'Content-Type': 'audio/wav'}
|
|
req = urllib.request.Request(url, sndfile, headers)
|
|
response = None
|
|
try:
|
|
response = urllib.request.urlopen(req, timeout = int(__settings__("ulozto_captcha_timeout")))
|
|
data = response.read()
|
|
except (urllib.request.HTTPError, socket.timeout):
|
|
traceback.print_exc()
|
|
data = ''
|
|
finally:
|
|
response and response.close()
|
|
if not data:
|
|
return self.ask_for_captcha(params)
|
|
return data
|
|
|
|
class XBMCWebshareContentProvider(xbmcprovider.XBMCLoginOptionalContentProvider):
|
|
|
|
def resolve(self,url):
|
|
item = self.provider.video_item(url=url)
|
|
if not self.provider.login():
|
|
xbmcgui.Dialog().ok(self.provider.name,xbmcutil.__lang__(30011))
|
|
return
|
|
try:
|
|
return self.provider.resolve(item)
|
|
except ResolveException as e:
|
|
self._handle_exc(e)
|
|
|
|
|
|
settings = {
|
|
'downloads':__settings__('downloads'),
|
|
'download-notify':__settings__('download-notify'),
|
|
'download-notify-every':__settings__('download-notify-every'),
|
|
}
|
|
|
|
providers = {}
|
|
|
|
# if __settings__('bezvadata_enabled') == 'true':
|
|
# p = bezvadata.BezvadataContentProvider(username='',password='',filter=bezvadata_filter,tmp_dir=xbmc.translatePath(__addon__.getAddonInfo('profile')))
|
|
# extra = {
|
|
# 'keep-searches':__settings__('bezvadata_keep-searches'),
|
|
# 'vip':'0'
|
|
# }
|
|
# extra.update(settings)
|
|
# providers[p.name] = xbmcprovider.XBMCLoginOptionalDelayedContentProvider(p,extra,__addon__)
|
|
|
|
if __settings__('ulozto_enabled') == 'true':
|
|
p = ulozto.UloztoContentProvider(__settings__('ulozto_user'),__settings__('ulozto_pass'),filter=ulozto_filter)
|
|
extra = {
|
|
'vip':__settings__('ulozto_usevip'),
|
|
'keep-searches':__settings__('ulozto_keep-searches'),
|
|
'search-type':__settings__('ulozto_search-type')
|
|
}
|
|
extra.update(settings)
|
|
providers[p.name] = XBMCUloztoContentProvider(p,extra,__addon__)
|
|
if __settings__('hellspy_enabled') == 'true':
|
|
p = hellspy.HellspyContentProvider(__settings__('hellspy_user'),__settings__('hellspy_pass'),site_url=__settings__('hellspy_site_url'))
|
|
extra = {
|
|
'keep-searches':__settings__('hellspy_keep-searches')
|
|
}
|
|
extra.update(settings)
|
|
providers[p.name] = XBMCHellspyContentProvider(p,extra,__addon__)
|
|
|
|
if __settings__('fastshare_enabled') == 'true':
|
|
p = fastshare.FastshareContentProvider(__settings__('fastshare_user'),__settings__('fastshare_pass'),tmp_dir=xbmcvfs.translatePath(__addon__.getAddonInfo('profile')))
|
|
extra = {
|
|
'vip':'0',
|
|
'keep-searches':__settings__('fastshare_keep-searches')
|
|
}
|
|
extra.update(settings)
|
|
providers[p.name] = xbmcprovider.XBMCLoginOptionalContentProvider(p,extra,__addon__)
|
|
|
|
if __settings__('webshare_enabled') == 'true':
|
|
p = webshare.WebshareContentProvider(__settings__('webshare_user'),__settings__('webshare_pass'),filter=webshare_filter)
|
|
extra = {
|
|
'vip':'0',
|
|
'keep-searches':__settings__('webshare_keep-searches')
|
|
}
|
|
extra.update(settings)
|
|
providers[p.name] = XBMCWebshareContentProvider(p,extra,__addon__)
|
|
|
|
|
|
def icon(provider):
|
|
icon_file = os.path.join(__addon__.getAddonInfo('path'),'resources','icons',provider+'.png')
|
|
if not os.path.isfile(icon_file):
|
|
return 'DefaultFolder.png'
|
|
return icon_file
|
|
|
|
def root():
|
|
search.item()
|
|
xbmcutil.add_local_dir(xbmcutil.__lang__(30006),settings['downloads'],xbmcutil.icon('download.png'))
|
|
for provider in providers.keys():
|
|
xbmcutil.add_dir(provider,{'cp':provider},icon(provider))
|
|
return xbmcplugin.endOfDirectory(int(sys.argv[1]))
|
|
|
|
params = util.params()
|
|
if params=={}:
|
|
xbmcutil.init_usage_reporting( __scriptid__)
|
|
root()
|
|
elif 'cp' in params.keys():
|
|
cp = params['cp']
|
|
if cp in providers.keys():
|
|
providers[cp].run(params)
|
|
else:
|
|
search.main(__addon__,'search_history',params,search_cb)
|