Files
addon/servers/torrent.py

297 lines
13 KiB
Python
Executable File

# -*- coding: utf-8 -*-
import re, os, sys, time, requests, xbmc, xbmcaddon
from core import filetools, jsontools
from core.support import info, match
from platformcode import config, platformtools
from torrentool.api import Torrent
from lib.guessit import guessit
if sys.version_info[0] >= 3:
import urllib.parse as urllib
else:
import urllib
monitor = filetools.join(config.get_data_path(), 'elementum_monitor.json')
extensions_list = ['.aaf', '.3gp', '.asf', '.avi', '.flv', '.mpeg', '.m1v', '.m2v', '.m4v', '.mkv', '.mov', '.mpg', '.mpe', '.mp4', '.ogg', '.wmv']
def test_video_exists(page_url):
return True, ""
# Returns an array of possible video url's from the page_url
def get_video_url(page_url, premium=False, user='', password='', video_password=''):
torrent_options = platformtools.torrent_client_installed(show_tuple=True)
if len(torrent_options) == 0:
from platformcode import elementum_download
elementum_download.download()
info('server=torrent, the url is the good')
if page_url.startswith('magnet:'):
video_urls = [['magnet: [torrent]', page_url]]
else:
video_urls = [['.torrent [torrent]', page_url]]
return video_urls
class XBMCPlayer(xbmc.Player):
def __init__(self, *args):
pass
xbmc_player = XBMCPlayer()
def mark_auto_as_watched(item):
time_limit = time.time() + 150
while not platformtools.is_playing() and time.time() < time_limit:
time.sleep(5)
if item.subtitle:
time.sleep(5)
xbmc_player.setSubtitles(item.subtitle)
if item.strm_path and platformtools.is_playing():
from platformcode import xbmc_videolibrary
xbmc_videolibrary.mark_auto_as_watched(item)
def setting():
elementum_setting = ''
elementum_host = ''
TorrentPath = ''
if xbmc.getCondVisibility('System.HasAddon("plugin.video.elementum")') == 1:
try:
elementum_setting = xbmcaddon.Addon(id='plugin.video.elementum')
elementum_host = 'http://127.0.0.1:' + elementum_setting.getSetting('remote_port') + '/torrents/'
TorrentPath = xbmc.translatePath(elementum_setting.getSetting('torrents_path'))
except:
pass
return elementum_setting, elementum_host, TorrentPath
def elementum_download(item):
elementum_setting, elementum_host, TorrentPath = setting()
if elementum_setting:
set_elementum(True)
time.sleep(3)
if config.get_setting('downloadpath').startswith('smb'):
select = platformtools.dialog_yesno('Elementum', config.get_localized_string(70807))
if select:
xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?eyJjaGFubmVsIjoic2hvcnRjdXRzIiwgImFjdGlvbiI6IlNldHRpbmdPblBvc2l0aW9uIiwgImNhdGVnb3J5Ijo2LCAic2V0dGluZyI6MX0=)")
else:
TorrentName = match(item.url, patron=r'btih(?::|%3A)([^&%]+)', string=True).match
post = 'uri=%s&file=null&all=1' % urllib.quote_plus(item.url)
match(elementum_host + 'add', post=post, timeout=5, alfa_s=True, ignore_response_code=True)
while not filetools.isfile(filetools.join(elementum_setting.getSetting('torrents_path'), TorrentName + '.torrent')):
time.sleep(1)
monitor_update(TorrentPath, TorrentName)
def elementum_monitor():
path = xbmc.translatePath(config.get_setting('downloadlistpath'))
elementum_setting, elementum_host, TorrentPath = setting()
# active_torrent = filetools.listdir(TorrentPath)
if elementum_setting:
# check if command file exist
if filetools.isfile(monitor):
json = jsontools.load(open(monitor, "r").read())
Monitor = json['monitor']
# else create it
else:
Monitor = jsontools.load('{"monitor":{},"settings":{}}')
json = jsontools.dump(Monitor)
filetools.write(monitor, json, silent=True)
if len(Monitor) > 0:
try:
data = requests.get(elementum_host + '/list').json()
except:
data = ''
if data:
for it in data:
progress = round(it['progress'], 2)
status = it['status']
name = it['id']
if name in Monitor:
jsontools.update_node(progress, Monitor[name]['file'], 'downloadProgress', path, silent=True)
jsontools.update_node(4, Monitor[name]['file'], 'downloadStatus', path, silent=True)
if status in ['Paused']:
jsontools.update_node(0, Monitor[name]['file'], 'downloadStatus', path, silent=True)
if status in ['Seeding', 'Finished'] and not config.get_setting('elementum_on_seed'):
monitor_update(TorrentPath, name, remove=True)
dlJson = jsontools.load(open(filetools.join(path, Monitor[name]['file']), "r").read())
jsontools.update_node(dlJson['downloadSize'], Monitor[name]['file'], 'downloadCompleted', path, silent=True)
jsontools.update_node(2, Monitor[name]['file'], 'downloadStatus', path, silent=True)
requests.get(elementum_host + 'pause/' + name)
filetools.remove(filetools.join(TorrentPath, name + '.torrent'))
filetools.remove(filetools.join(TorrentPath, name + '.fastresume'))
# time.sleep(1)
# rename(Monitor[name]['file'])
def monitor_update(TorrentPath, value, remove=False):
elementum_setting, elementum_host, TorrentPath = setting()
json = jsontools.load(open(monitor, "r").read())
Monitor = json['monitor']
info = Torrent.from_file(filetools.join(TorrentPath, value + '.torrent'))
path = xbmc.translatePath(config.get_setting('downloadlistpath'))
if not value in Monitor:
Monitor[value]={}
Monitor[value]['name'] = info.name
Monitor[value]['size'] = info.total_size
File = find_file(value)
Monitor[value]['file'] = File
json = jsontools.dump(json)
filetools.write(monitor, json, silent=True)
backupFilename = jsontools.load(open(filetools.join(path, File), "r").read())['downloadFilename']
jsontools.update_node(value, File, 'TorrentName', path, silent=True)
jsontools.update_node(info.total_size, File, 'downloadSize', path, silent=True)
jsontools.update_node(backupFilename, File, 'backupFilename', path, silent=True)
jsontools.update_node(info.name, File, 'downloadFilename', path, silent=True)
elif remove:
Monitor.pop(value)
jsontools.dump(json)
filetools.write(monitor, jsontools.dump(json), silent=True)
if len(Monitor) == 0: set_elementum()
def set_elementum(SET=False):
elementum_setting, elementum_host, TorrentPath = setting()
json = jsontools.load(open(monitor, "r").read())
backup_setting = json['settings']
write = False
if SET:
if elementum_setting.getSetting('logger_silent') == False or not 'logger_silent' in backup_setting:
elementum_setting.setSetting('logger_silent', 'true')
backup_setting['logger_silent'] = 'false'
if elementum_setting.getSetting('download_storage') != 0 or not 'download_storage' in backup_setting:
backup_setting['download_storage'] = elementum_setting.getSetting('download_storage') # Backup Setting
elementum_setting.setSetting('download_storage', '0') # Set Setting
if elementum_setting.getSetting('download_path') != config.get_setting('downloadpath') or not 'download_path' in backup_setting:
backup_setting['download_path'] = elementum_setting.getSetting('download_path') # Backup Setting
elementum_setting.setSetting('download_path', config.get_setting('downloadpath')) # Set Setting
write = True
elif backup_setting:
elementum_setting.setSetting('logger_silent', backup_setting['logger_silent'])
elementum_setting.setSetting('download_storage', backup_setting['download_storage'])
elementum_setting.setSetting('download_path', backup_setting['download_path'])
json['settings'] = {}
write = True
if write:
json = jsontools.dump(json)
filetools.write(monitor, json, silent=True)
time.sleep(1)
def find_file(hash):
path = xbmc.translatePath(config.get_setting('downloadlistpath'))
files = filetools.listdir(path)
for f in files:
filepath = filetools.join(path, f)
json = jsontools.load(filetools.read(filepath))
if ('downloadServer' in json and 'url' in json['downloadServer'] and hash in json['downloadServer']['url']) or ('url' in json and hash in json['url']):
break
return filetools.split(filepath)[-1]
def elementum_actions(parameter, TorrentHash):
elementum_setting, elementum_host, TorrentPath = setting()
if elementum_setting:
if parameter == 'delete': monitor_update(TorrentPath, TorrentHash, remove=True)
requests.get('%s/%s/%s' %(elementum_host, parameter, TorrentHash))
def process_filename(filename, Title, ext=True):
extension = os.path.splitext(filename)[-1]
parsedTitle = guessit(filename)
t = parsedTitle.get('title', '')
episode = ''
s = ' - '
if parsedTitle.get('episode') and parsedTitle.get('season'):
if type(parsedTitle.get('season')) == list:
episode += str(parsedTitle.get('season')[0]) + '-' + str(parsedTitle.get('season')[-1])
else:
episode += str(parsedTitle.get('season'))
if type(parsedTitle.get('episode')) == list:
episode += 'x' + str(parsedTitle.get('episode')[0]).zfill(2) + '-' + str(parsedTitle.get('episode')[-1]).zfill(2)
else:
episode += 'x' + str(parsedTitle.get('episode')).zfill(2)
elif parsedTitle.get('season') and type(parsedTitle.get('season')) == list:
episode += s + config.get_localized_string(30140) + " " +str(parsedTitle.get('season')[0]) + '-' + str(parsedTitle.get('season')[-1])
elif parsedTitle.get('season'):
episode += s + config.get_localized_string(60027) % str(parsedTitle.get('season'))
if parsedTitle.get('episode_title'):
episode += s + parsedTitle.get('episode_title')
title = (t if t else Title) + s + episode + (extension if ext else '')
return title
def rename(File):
jsonPath = xbmc.translatePath(config.get_setting('downloadlistpath'))
json = jsontools.load(open(filetools.join(jsonPath, File), "r").read())
filePath = filetools.join(xbmc.translatePath(config.get_setting('downloadpath')), json['downloadFilename'])
if json['infoLabels']['mediatype'] == 'movie':
if filetools.isdir(filePath):
extension = ''
files = filetools.listdir(filePath)
oldName = json['downloadFilename']
newName = json['backupFilename']
for f in files:
ext = os.path.splitext(f)[-1]
if ext in extensions_list: extension = ext
filetools.rename(filetools.join(filePath, f), f.replace(oldName, newName))
filetools.rename(filePath, newName)
jsontools.update_node(filetools.join(newName, newName + extension), File, 'downloadFilename', jsonPath)
else:
oldName = json['downloadFilename']
newName = json['backupFilename'] + os.path.splitext(oldName)[-1]
filetools.rename(filePath, newName)
jsontools.update_node(newName, File, 'downloadFilename', jsonPath)
else:
sep = '/' if filePath.lower().startswith("smb://") else os.sep
FolderName = json['backupFilename'].split(sep)[0]
Title = re.sub(r'(\s*\[[^\]]+\])', '', FolderName)
if filetools.isdir(filePath):
files = filetools.listdir(filePath)
file_dict = {}
for f in files:
title = process_filename(f, Title, ext=False)
ext = os.path.splitext(f)[-1]
name = os.path.splitext(f)[0]
if title not in file_dict and ext in extensions_list:
file_dict[title] = name
for title, name in file_dict.items():
for f in files:
if name in f:
filetools.rename(filetools.join(filePath, f), f.replace(name, title))
filetools.rename(filePath, FolderName)
jsontools.update_node(FolderName, File, 'downloadFilename', jsonPath)
else:
filename = filetools.split(filePath)[-1]
title = process_filename(filename, Title)
NewFolder = filetools.join(config.get_setting('downloadpath'), FolderName)
if not filetools.isdir(NewFolder):
filetools.mkdir(NewFolder)
from_folder = filetools.join(config.get_setting('downloadpath'), filename)
to_folder = filetools.join(config.get_setting('downloadpath'), FolderName, title)
filetools.move(from_folder, to_folder)
jsontools.update_node(filetools.join(FolderName, title), File, 'downloadFilename', jsonPath)