From 1031f7136470e0e0f512f7cc7ab43dcb9285ec64 Mon Sep 17 00:00:00 2001 From: inpos Date: Sat, 12 Mar 2016 01:30:27 +0300 Subject: [PATCH 01/18] =?UTF-8?q?=D0=9F=D0=BB=D0=BE=D1=85=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D1=80=D0=B5=D0=BD=D1=82=20-=20=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B9=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Anteoloader.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Anteoloader.py b/Anteoloader.py index 35700ca..d02dc2e 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -165,7 +165,8 @@ class AnteoLoader: else Localization.localize('Opening torrent file') while not files and not xbmc.abortRequested and iterator < 100: files = self.engine.list() - self.engine.check_torrent_error() + #self.engine.check_torrent_error() + if len(files) == 0: break if iterator==4: progressBar = xbmcgui.DialogProgress() progressBar.create(Localization.localize('Please Wait'), From fc0e69ab63dca7fe39777f1e72c15cbfe661b6d0 Mon Sep 17 00:00:00 2001 From: inpos Date: Sat, 12 Mar 2016 02:28:40 +0300 Subject: [PATCH 02/18] =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Anteoloader.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index d02dc2e..35640bf 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -157,14 +157,15 @@ class AnteoLoader: files = [] filelist = [] with closing(self.engine): - self.engine.start() + #self.engine.start() #media_types=[MediaType.VIDEO, MediaType.AUDIO, MediaType.SUBTITLES, MediaType.UNKNOWN] iterator = 0 text = Localization.localize('Magnet-link is converting') if self.magnetLink\ else Localization.localize('Opening torrent file') while not files and not xbmc.abortRequested and iterator < 100: - files = self.engine.list() + #files = self.engine.list() + files = self.engine.list_from_info() #self.engine.check_torrent_error() if len(files) == 0: break if iterator==4: From 6b43a7f208a4e416f41fa1119c3b959c526ccb73 Mon Sep 17 00:00:00 2001 From: inpos Date: Sat, 12 Mar 2016 15:08:48 +0300 Subject: [PATCH 03/18] =?UTF-8?q?=D0=BE=D1=85=20=D1=83=D0=B6=20=D1=8D?= =?UTF-8?q?=D1=82=D0=B8=20contextmanager-=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/proxy/antizapret.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/proxy/antizapret.py b/resources/proxy/antizapret.py index 127949f..3daf5ca 100644 --- a/resources/proxy/antizapret.py +++ b/resources/proxy/antizapret.py @@ -21,7 +21,7 @@ def shelf(filename, ttl=0): with LOCKS.get(filename, threading.RLock()): with closing(shelve.open(filename, writeback=True)) as d: import time - if not d: + if not dict(d): d.update({ "created_at": time.time(), "data": {}, From 2bd36fa5c943b165a8d64dc208a68a29941d10fe Mon Sep 17 00:00:00 2001 From: inpos Date: Sat, 12 Mar 2016 15:12:48 +0300 Subject: [PATCH 04/18] . --- resources/proxy/antizapret.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/proxy/antizapret.py b/resources/proxy/antizapret.py index 3daf5ca..bfc5f72 100644 --- a/resources/proxy/antizapret.py +++ b/resources/proxy/antizapret.py @@ -42,7 +42,7 @@ def config(): pac_data = urllib2.urlopen(PAC_URL).read() except: pac_data = "" - + log("[antizapret]: +++++++++++ pac_data %s" % (repr(pac_data),)) r = re.search(r"\"PROXY (.*); DIRECT", pac_data) if r: pac_config["server"] = r.group(1) From 971817c888c8c0a4662f0bf3eb7967b5251e4491 Mon Sep 17 00:00:00 2001 From: inpos Date: Sat, 12 Mar 2016 15:14:37 +0300 Subject: [PATCH 05/18] . --- resources/proxy/antizapret.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/proxy/antizapret.py b/resources/proxy/antizapret.py index bfc5f72..b48c936 100644 --- a/resources/proxy/antizapret.py +++ b/resources/proxy/antizapret.py @@ -42,7 +42,7 @@ def config(): pac_data = urllib2.urlopen(PAC_URL).read() except: pac_data = "" - log("[antizapret]: +++++++++++ pac_data %s" % (repr(pac_data),)) + r = re.search(r"\"PROXY (.*); DIRECT", pac_data) if r: pac_config["server"] = r.group(1) @@ -50,6 +50,7 @@ def config(): else: pac_config["server"] = None pac_config["domains"] = [] + log("[antizapret]: +++++++++++ pac_config %s" % (repr(pac_config),)) _config = pac_config return _config From 515b573a7470819bfb21b3abfc42eaf207f55f9b Mon Sep 17 00:00:00 2001 From: inpos Date: Sat, 12 Mar 2016 15:22:35 +0300 Subject: [PATCH 06/18] . --- resources/proxy/antizapret.py | 56 ++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/resources/proxy/antizapret.py b/resources/proxy/antizapret.py index b48c936..944a6e4 100644 --- a/resources/proxy/antizapret.py +++ b/resources/proxy/antizapret.py @@ -14,44 +14,46 @@ if not os.path.exists(CACHE_DIR): CACHE = 24 * 3600 # 24 hour caching -@contextmanager +#@contextmanager def shelf(filename, ttl=0): import shelve filename = os.path.join(CACHE_DIR, filename) with LOCKS.get(filename, threading.RLock()): - with closing(shelve.open(filename, writeback=True)) as d: - import time - if not dict(d): - d.update({ - "created_at": time.time(), - "data": {}, - }) - elif ttl > 0 and (time.time() - d["created_at"]) > ttl: - d["data"] = {} - yield d["data"] +# with closing(shelve.open(filename, writeback=True)) as d: + import time + if not dict(d): + d.update({ + "created_at": time.time(), + "data": {}, + }) + elif ttl > 0 and (time.time() - d["created_at"]) > ttl: + d["data"] = {} + return d _config = {} def config(): global _config if not _config: - with shelf("antizapret.pac_config", ttl=CACHE) as pac_config: - if not pac_config: - log("[antizapret]: Fetching Antizapret PAC file on %s" %PAC_URL) - try: - pac_data = urllib2.urlopen(PAC_URL).read() - except: - pac_data = "" +# with shelf("antizapret.pac_config", ttl=CACHE) as pac_config: + d = shelf("antizapret.pac_config", ttl=CACHE) + pac_config = d['data'] + if not pac_config: + log("[antizapret]: Fetching Antizapret PAC file on %s" %PAC_URL) + try: + pac_data = urllib2.urlopen(PAC_URL).read() + except: + pac_data = "" - r = re.search(r"\"PROXY (.*); DIRECT", pac_data) - if r: - pac_config["server"] = r.group(1) - pac_config["domains"] = map(lambda x: x.replace(r"\Z(?ms)", "").replace("\\", ""), map(fnmatch.translate, re.findall(r"\"(.*?)\",", pac_data))) - else: - pac_config["server"] = None - pac_config["domains"] = [] - log("[antizapret]: +++++++++++ pac_config %s" % (repr(pac_config),)) - _config = pac_config + r = re.search(r"\"PROXY (.*); DIRECT", pac_data) + if r: + pac_config["server"] = r.group(1) + pac_config["domains"] = map(lambda x: x.replace(r"\Z(?ms)", "").replace("\\", ""), map(fnmatch.translate, re.findall(r"\"(.*?)\",", pac_data))) + else: + pac_config["server"] = None + pac_config["domains"] = [] + d.close() + _config = pac_config return _config class AntizapretProxyHandler(urllib2.ProxyHandler, object): From 197ad9595995a990b7bbed9e8394cce6144ddbc5 Mon Sep 17 00:00:00 2001 From: inpos Date: Sat, 12 Mar 2016 15:24:20 +0300 Subject: [PATCH 07/18] . --- resources/proxy/antizapret.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/resources/proxy/antizapret.py b/resources/proxy/antizapret.py index 944a6e4..e54ed17 100644 --- a/resources/proxy/antizapret.py +++ b/resources/proxy/antizapret.py @@ -20,15 +20,20 @@ def shelf(filename, ttl=0): filename = os.path.join(CACHE_DIR, filename) with LOCKS.get(filename, threading.RLock()): # with closing(shelve.open(filename, writeback=True)) as d: - import time - if not dict(d): - d.update({ - "created_at": time.time(), - "data": {}, - }) - elif ttl > 0 and (time.time() - d["created_at"]) > ttl: - d["data"] = {} - return d + d = shelve.open(filename, writeback=True) + try: + import time + if not dict(d): + d.update({ + "created_at": time.time(), + "data": {}, + }) + elif ttl > 0 and (time.time() - d["created_at"]) > ttl: + d["data"] = {} + return d + except: + d.close() + raise _config = {} From 0f7ca4f6bfdde467820d491ea94db366b7c52a7f Mon Sep 17 00:00:00 2001 From: inpos Date: Sat, 12 Mar 2016 16:18:07 +0300 Subject: [PATCH 08/18] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/proxy/antizapret.py | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/proxy/antizapret.py b/resources/proxy/antizapret.py index e54ed17..1ac86ec 100644 --- a/resources/proxy/antizapret.py +++ b/resources/proxy/antizapret.py @@ -29,6 +29,7 @@ def shelf(filename, ttl=0): "data": {}, }) elif ttl > 0 and (time.time() - d["created_at"]) > ttl: + d["created_at"] = time.time() d["data"] = {} return d except: From 73a3d5ea2593ee96a6201fc88b4b0c50060f5e29 Mon Sep 17 00:00:00 2001 From: inpos Date: Thu, 17 Mar 2016 19:32:12 +0300 Subject: [PATCH 09/18] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=81=D0=BB=D0=B8=D1=8F=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Anteoloader.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index c42e5bf..a2c60eb 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -165,23 +165,16 @@ class AnteoLoader: self.setup_engine() files = [] filelist = [] -<<<<<<< HEAD - with closing(self.engine): - #self.engine.start() -======= try: self.engine.start() ->>>>>>> 1974c5a41ad9cbfa5eb82d5848e79387701b9c92 #media_types=[MediaType.VIDEO, MediaType.AUDIO, MediaType.SUBTITLES, MediaType.UNKNOWN] iterator = 0 text = Localization.localize('Magnet-link is converting') if self.magnetLink\ else Localization.localize('Opening torrent file') while not files and not xbmc.abortRequested and iterator < 100: - #files = self.engine.list() - files = self.engine.list_from_info() - #self.engine.check_torrent_error() - if len(files) == 0: break + files = self.engine.list() + self.engine.check_torrent_error() if iterator==4: progressBar = xbmcgui.DialogProgress() progressBar.create(Localization.localize('Please Wait'), From 8e61b9353b47adba4052942dc07047d266f6052a Mon Sep 17 00:00:00 2001 From: inpos Date: Thu, 17 Mar 2016 22:12:02 +0300 Subject: [PATCH 10/18] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5?= =?UTF-8?q?=D0=BC=D0=B0=20=D1=81=20=D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4?= =?UTF-8?q?=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Anteoloader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Anteoloader.py b/Anteoloader.py index a2c60eb..679175b 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -566,7 +566,7 @@ class AnteoPlayer(xbmc.Player): self.print_debug(status) debug_counter=0 - overlay.text = "\n".join(self._get_status_lines(status, file_status)) + overlay.text = u"\n".join(self._get_status_lines(status, file_status)) self.iterator = int(file_status.progress * 100) From 6c6bf6f9d48ad58a5efccf198250a3733d11fd6e Mon Sep 17 00:00:00 2001 From: inpos Date: Thu, 17 Mar 2016 22:14:53 +0300 Subject: [PATCH 11/18] . --- Anteoloader.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Anteoloader.py b/Anteoloader.py index 679175b..f80189a 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -610,6 +610,7 @@ class AnteoPlayer(xbmc.Player): event.remove(callback) def _get_status_lines(self, s, f): + log('++++++++++++++ %s , %s' % (s,f)) return [ localize_path(self.display_name), "%.2f%% %s" % (f.progress * 100, self.localize(STATE_STRS[s.state]).decode('utf-8')), From 4924bd3061ed282944e11b3ab20706dff433f928 Mon Sep 17 00:00:00 2001 From: inpos Date: Thu, 17 Mar 2016 22:23:45 +0300 Subject: [PATCH 12/18] . --- Anteoloader.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index f80189a..f8dea14 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -565,8 +565,9 @@ class AnteoPlayer(xbmc.Player): else: self.print_debug(status) debug_counter=0 - - overlay.text = u"\n".join(self._get_status_lines(status, file_status)) + t = "\n".join(self._get_status_lines(status, file_status)) + log('++++++++++++++ t: %t' % (repr(t),)) + overlay.text = t self.iterator = int(file_status.progress * 100) @@ -610,7 +611,6 @@ class AnteoPlayer(xbmc.Player): event.remove(callback) def _get_status_lines(self, s, f): - log('++++++++++++++ %s , %s' % (s,f)) return [ localize_path(self.display_name), "%.2f%% %s" % (f.progress * 100, self.localize(STATE_STRS[s.state]).decode('utf-8')), From eec20efba9bc5764d32512908962b70b21e73554 Mon Sep 17 00:00:00 2001 From: inpos Date: Thu, 17 Mar 2016 22:26:04 +0300 Subject: [PATCH 13/18] . --- Anteoloader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index f8dea14..0ebf564 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -565,9 +565,9 @@ class AnteoPlayer(xbmc.Player): else: self.print_debug(status) debug_counter=0 - t = "\n".join(self._get_status_lines(status, file_status)) + t = self._get_status_lines(status, file_status) log('++++++++++++++ t: %t' % (repr(t),)) - overlay.text = t + overlay.text = '\n'.join(t) self.iterator = int(file_status.progress * 100) From ed2bab0bd41396cb54456f9dfce811bc519d684f Mon Sep 17 00:00:00 2001 From: inpos Date: Thu, 17 Mar 2016 22:27:18 +0300 Subject: [PATCH 14/18] . --- Anteoloader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Anteoloader.py b/Anteoloader.py index 0ebf564..0b6538c 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -566,7 +566,7 @@ class AnteoPlayer(xbmc.Player): self.print_debug(status) debug_counter=0 t = self._get_status_lines(status, file_status) - log('++++++++++++++ t: %t' % (repr(t),)) + log('++++++++++++++ t: %s' % (repr(t),)) overlay.text = '\n'.join(t) self.iterator = int(file_status.progress * 100) From 19f10a55008104e19bb8250ad6bf42975ed07fdd Mon Sep 17 00:00:00 2001 From: inpos Date: Thu, 17 Mar 2016 22:30:44 +0300 Subject: [PATCH 15/18] . --- Anteoloader.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index 0b6538c..b1438c1 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -613,9 +613,9 @@ class AnteoPlayer(xbmc.Player): def _get_status_lines(self, s, f): return [ localize_path(self.display_name), - "%.2f%% %s" % (f.progress * 100, self.localize(STATE_STRS[s.state]).decode('utf-8')), - "D:%.2f%s U:%.2f%s S:%d P:%d" % (s.download_rate, self.localize('kb/s').decode('utf-8'), - s.upload_rate, self.localize('kb/s').decode('utf-8'), + "%.2f%% %s" % (f.progress * 100, self.localize(STATE_STRS[s.state])), + "D:%.2f%s U:%.2f%s S:%d P:%d" % (s.download_rate, self.localize('kb/s'), + s.upload_rate, self.localize('kb/s'), s.num_seeds, s.num_peers) ] From 009c321090250264b85b145328859f39bdbf7b87 Mon Sep 17 00:00:00 2001 From: inpos Date: Thu, 17 Mar 2016 22:33:13 +0300 Subject: [PATCH 16/18] =?UTF-8?q?=D0=94=D0=B5=D0=BA=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BD=D0=B0=D0=B4=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Anteoloader.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index b1438c1..c440ebc 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -565,9 +565,8 @@ class AnteoPlayer(xbmc.Player): else: self.print_debug(status) debug_counter=0 - t = self._get_status_lines(status, file_status) - log('++++++++++++++ t: %s' % (repr(t),)) - overlay.text = '\n'.join(t) + + overlay.text = "\n".join(self._get_status_lines(status, file_status)) self.iterator = int(file_status.progress * 100) From 9e588e5e9c73ea132611dfd2903f2650768f2c3f Mon Sep 17 00:00:00 2001 From: inpos Date: Sat, 19 Mar 2016 17:35:55 +0300 Subject: [PATCH 17/18] Inposloader --- Inposloader.py | 712 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 712 insertions(+) create mode 100644 Inposloader.py diff --git a/Inposloader.py b/Inposloader.py new file mode 100644 index 0000000..bff6d73 --- /dev/null +++ b/Inposloader.py @@ -0,0 +1,712 @@ +# -*- coding: utf-8 -*- +''' + Torrenter v2 plugin for XBMC/Kodi + Copyright (C) 2012-2015 Vadim Skorba v1 - DiMartino v2 + + 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 3 of the License, 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. If not, see . +''' + + +import urllib2 +import hashlib +import re +from StringIO import StringIO +import zlib + +import xbmc +import xbmcgui +import xbmcvfs +import xbmcaddon +import Localization +from functions import localize_path, isSubtitle, is_writable, file_url + + +import os +import urllib +import sys +from contextlib import contextmanager, closing, nested + + +from functions import foldername, showMessage, clearStorage, WatchedHistoryDB, get_ids_video, log, debug, ensure_str + +if sys.modules["__main__"].__settings__.getSetting("torrent_player") == '2': + from torrent2http import State, Engine, MediaType + author = 'Anteo' + __settings__ = xbmcaddon.Addon(id='script.module.torrent2http') + __version__ = __settings__.getAddonInfo('version') +elif sys.modules["__main__"].__settings__.getSetting("torrent_player") == '3': + from pyrrent2http import State, Engine, MediaType + author = 'Inpos' + __settings__ = xbmcaddon.Addon(id='script.module.pyrrent2http') + __version__ = __settings__.getAddonInfo('version') + +ROOT = sys.modules["__main__"].__root__ +RESOURCES_PATH = os.path.join(ROOT, 'resources') +TORRENT2HTTP_TIMEOUT = 20 +TORRENT2HTTP_POLL = 1000 +PLAYING_EVENT_INTERVAL = 60 +MIN_COMPLETED_PIECES = 0.5 + +WINDOW_FULLSCREEN_VIDEO = 12005 + +XBFONT_LEFT = 0x00000000 +XBFONT_RIGHT = 0x00000001 +XBFONT_CENTER_X = 0x00000002 +XBFONT_CENTER_Y = 0x00000004 +XBFONT_TRUNCATED = 0x00000008 +XBFONT_JUSTIFY = 0x00000010 + +STATE_STRS = [ + 'Queued', + 'Checking', + 'Downloading metadata', + 'Downloading', + 'Finished', + 'Seeding', + 'Allocating', + 'Allocating file & Checking resume' +] + +VIEWPORT_WIDTH = 1920.0 +VIEWPORT_HEIGHT = 1088.0 +OVERLAY_WIDTH = int(VIEWPORT_WIDTH * 0.7) # 70% size +OVERLAY_HEIGHT = 150 + +ENCRYPTION_SETTINGS = { + "Forced": 0, + "Enabled": 1, + "Disabled": 2, +} + +class Encryption: + FORCED = 0 + ENABLED = 1 + DISABLED = 2 + +class AnteoLoader: + magnetLink = None + engine = None + torrentFile = None + __plugin__ = sys.modules["__main__"].__plugin__ + __settings__ = sys.modules["__main__"].__settings__ + + def __init__(self, storageDirectory='', torrentFile='', torrentFilesDirectory='torrents'): + self.storageDirectory = storageDirectory + self.torrentFilesPath = os.path.join(self.storageDirectory, torrentFilesDirectory) + os.sep + if not is_writable(self.storageDirectory): + xbmcgui.Dialog().ok(self.localize('Torrenter v2'), + self.localize('Your storage path is not writable or not local! Please change it in settings!'), + self.localize(self.storageDirectory)) + + sys.exit(1) + + #pre settings + if re.match("^magnet\:.+$", torrentFile): + self.magnetLink = torrentFile + else: + self.torrentFile = torrentFile + + def setup_engine(self): + encryption = Encryption.ENABLED if self.__settings__.getSetting('encryption') == 'true' else Encryption.DISABLED + + if self.__settings__.getSetting("connections_limit") not in ["",0,"0"]: + connections_limit = int(self.__settings__.getSetting("connections_limit")) + else: + connections_limit = None + + use_random_port = True if self.__settings__.getSetting('use_random_port') == 'true' else False + + listen_port=int(self.__settings__.getSetting("listen_port")) if self.__settings__.getSetting( + "listen_port") != "" else 6881 + + if '1' != self.__settings__.getSetting("keep_files") and 'Saved Files' not in self.storageDirectory: + keep_complete = False + keep_incomplete = False + else: + keep_complete = True + keep_incomplete = True + + dht_routers = ["router.bittorrent.com:6881", "router.utorrent.com:6881"] + user_agent = 'uTorrent/2200(24683)' + self.engine = Engine(uri=file_url(self.torrentFile), download_path=self.storageDirectory, + connections_limit=connections_limit, + encryption=encryption, keep_complete=keep_complete, keep_incomplete=keep_incomplete, + dht_routers=dht_routers, use_random_port=use_random_port, listen_port=listen_port, + user_agent=user_agent) + + def localize(self, string): + try: + return Localization.localize(string) + except: + return string + + def getContentList(self): + try: + from Libtorrent import Libtorrent + torrent = Libtorrent(self.storageDirectory, self.torrentFile) + return torrent.getContentList() + except: + import traceback + log(traceback.format_exc()) + return self.getContentList_engine() + + def getContentList_engine(self): + self.setup_engine() + files = [] + filelist = [] + try: + self.engine.start() + #media_types=[MediaType.VIDEO, MediaType.AUDIO, MediaType.SUBTITLES, MediaType.UNKNOWN] + + iterator = 0 + text = Localization.localize('Magnet-link is converting') if self.magnetLink\ + else Localization.localize('Opening torrent file') + while not files and not xbmc.abortRequested and iterator < 100: + files = self.engine.list() + self.engine.check_torrent_error() + if iterator==4: + progressBar = xbmcgui.DialogProgress() + progressBar.create(Localization.localize('Please Wait'), + Localization.localize('Magnet-link is converting')) + elif iterator>4: + progressBar.update(iterator, Localization.localize('Please Wait'),text+'.' * (iterator % 4), ' ') + if progressBar.iscanceled(): + progressBar.update(0) + progressBar.close() + return [] + xbmc.sleep(500) + iterator += 1 + + for fs in files: + stringdata = {"title": ensure_str(fs.name), "size": fs.size, "ind": fs.index, + 'offset': fs.offset} + filelist.append(stringdata) + except: + import traceback + log(traceback.format_exc()) + finally: + self.engine.close() + return filelist + + def saveTorrent(self, torrentUrl): + #if not xbmcvfs.exists(torrentUrl) or re.match("^http.+$", torrentUrl): + if re.match("^magnet\:.+$", torrentUrl): + self.magnetLink = torrentUrl + self.magnetToTorrent(torrentUrl) + self.magnetLink = None + return self.torrentFile + else: + if not xbmcvfs.exists(self.torrentFilesPath): xbmcvfs.mkdirs(self.torrentFilesPath) + torrentFile = os.path.join(self.torrentFilesPath, self.md5(torrentUrl) + '.torrent') + try: + if not re.match("^http\:.+$", torrentUrl): + content = xbmcvfs.File(torrentUrl, "rb").read() + else: + request = urllib2.Request(torrentUrl) + request.add_header('Referer', torrentUrl) + request.add_header('Accept-encoding', 'gzip') + result = urllib2.urlopen(request) + if result.info().get('Content-Encoding') == 'gzip': + buf = StringIO(result.read()) + decomp = zlib.decompressobj(16 + zlib.MAX_WBITS) + content = decomp.decompress(buf.getvalue()) + else: + content = result.read() + + localFile = xbmcvfs.File(torrentFile, "w+b") + localFile.write(content) + localFile.close() + except Exception, e: + log('Unable to rename torrent file from %s to %s in AnteoLoader::saveTorrent. Exception: %s' % + (torrentUrl, torrentFile, str(e))) + return + if xbmcvfs.exists(torrentFile) and not os.path.exists(torrentFile): + if not xbmcvfs.exists(self.torrentFilesPath): xbmcvfs.mkdirs(self.torrentFilesPath) + torrentFile = os.path.join(self.torrentFilesPath, self.md5(torrentUrl) + '.torrent') + xbmcvfs.copy(torrentUrl, torrentFile) + if os.path.exists(torrentFile): + self.torrentFile = torrentFile + return self.torrentFile + + def md5(self, string): + hasher = hashlib.md5() + try: + hasher.update(string) + except: + hasher.update(string.encode('utf-8', 'ignore')) + return hasher.hexdigest() + + def magnetToTorrent(self, magnet): + try: + from Libtorrent import Libtorrent + torrent = Libtorrent(self.storageDirectory, magnet) + torrent.magnetToTorrent(magnet) + self.torrentFile = torrent.torrentFile + except: + self.torrentFile = magnet + log('['+author+'Loader][magnetToTorrent]: self.torrentFile '+str(self.torrentFile)) + +class AnteoPlayer(xbmc.Player): + __plugin__ = sys.modules["__main__"].__plugin__ + __settings__ = sys.modules["__main__"].__settings__ + ROOT = sys.modules["__main__"].__root__ + USERAGENT = "Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0" + torrentFilesDirectory = 'torrents' + debug = __settings__.getSetting('debug') == 'true' + subs_dl = __settings__.getSetting('subs_dl') == 'true' + seeding = __settings__.getSetting('keep_seeding') == 'true' and __settings__.getSetting('keep_files') == '1' + seeding_status = False + seeding_run = False + ids_video = None + episodeId = None + fullSize = 0 + watchedTime = 0 + totalTime = 1 + seek = 0 + basename = '' + + def __init__(self, userStorageDirectory, torrentUrl, params={}): + self.userStorageDirectory = userStorageDirectory + self.torrentUrl = torrentUrl + xbmc.Player.__init__(self) + log("["+author+"Player] Initalized v"+__version__) + self.params = params + self.get = self.params.get + self.contentId = int(self.get("url")) + if self.get("seek"): + self.seek = int(self.get("seek")) + self.init() + self.setup_engine() + try: + self.engine.start(self.contentId) + self.setup_nextep() + while True: + if self.buffer(): + log('['+author+'Player]: ************************************* GOING LOOP') + if self.setup_play(): + self.setup_subs() + self.loop() + WatchedHistoryDB().add(self.basename, foldername(self.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize) + else: + log('['+author+'Player]: ************************************* break') + break + log('['+author+'Player]: ************************************* GO NEXT?') + if self.next_dl and self.next_contentId != False and isinstance(self.next_contentId, int) and self.iterator == 100: + if not self.next_play: + xbmc.sleep(3000) + if not xbmcgui.Dialog().yesno( + self.localize('Torrent2HTTP'), + self.localize('Would you like to play next episode?')): + break + self.contentId = self.next_contentId + continue + log('['+author+'Player]: ************************************* NO! break') + break + except: + import traceback + log(traceback.format_exc()) + finally: + self.engine.close() + + xbmc.Player().stop() + + if '1' != self.__settings__.getSetting("keep_files") and 'Saved Files' not in self.userStorageDirectory: + xbmc.sleep(1000) + clearStorage(self.userStorageDirectory) + else: + #if self.seeding_status: + #showMessage(self.localize('Information'), + # self.localize('Torrent is seeding. To stop it use Download Status.'), forced=True) + #else: + #if self.seeding: self.db_delete() + showMessage(self.localize('Information'), + self.localize('Torrent downloading is stopped.'), forced=True) + + def init(self): + self.next_contentId = False + self.display_name = '' + self.downloadedSize = 0 + self.dialog = xbmcgui.Dialog() + self.on_playback_started = [] + self.on_playback_resumed = [] + self.on_playback_paused = [] + self.on_playback_stopped = [] + self.torrentUrl = self.torrentUrl + + def setup_engine(self): + #uri=None, binaries_path=None, platform=None, download_path=".", + #bind_host='127.0.0.1', bind_port=5001, connections_limit=None, download_kbps=None, upload_kbps=None, + #enable_dht=True, enable_lsd=True, enable_natpmp=True, enable_upnp=True, enable_scrape=False, + #log_stats=False, encryption=Encryption.ENABLED, keep_complete=False, keep_incomplete=False, + #keep_files=False, log_files_progress=False, log_overall_progress=False, log_pieces_progress=False, + #listen_port=6881, use_random_port=False, max_idle_timeout=None, no_sparse=False, resume_file=None, + #user_agent=None, startup_timeout=5, state_file=None, enable_utp=True, enable_tcp=True, + #debug_alerts=False, logger=None, torrent_connect_boost=50, connection_speed=50, + #peer_connect_timeout=15, request_timeout=20, min_reconnect_time=60, max_failcount=3, + #dht_routers=None, trackers=None) + + encryption = Encryption.ENABLED if self.__settings__.getSetting('encryption') == 'true' else Encryption.DISABLED + upload_limit = int(self.__settings__.getSetting("upload_limit"))*1024/8 if self.__settings__.getSetting( + "upload_limit") != "" else 0 + download_limit = int(self.__settings__.getSetting("download_limit"))*1024/8 if self.__settings__.getSetting( + "download_limit") != "" else 0 + + if self.__settings__.getSetting("connections_limit") not in ["",0,"0"]: + connections_limit = int(self.__settings__.getSetting("connections_limit")) + else: + connections_limit = None + + use_random_port = True if self.__settings__.getSetting('use_random_port') == 'true' else False + + listen_port=int(self.__settings__.getSetting("listen_port")) if self.__settings__.getSetting( + "listen_port") != "" else 6881 + + if '1' != self.__settings__.getSetting("keep_files") and 'Saved Files' not in self.userStorageDirectory: + keep_complete = False + keep_incomplete = False + keep_files = False + resume_file = None + else: + keep_complete = True + keep_incomplete = True + keep_files = True + resume_file=os.path.join(self.userStorageDirectory, 'torrents', os.path.basename(self.torrentUrl)+'.resume_data') + + dht_routers = ["router.bittorrent.com:6881","router.utorrent.com:6881"] + user_agent = 'uTorrent/2200(24683)' + self.pre_buffer_bytes = int(self.__settings__.getSetting("pre_buffer_bytes"))*1024*1024 + showMessage('[%sPlayer v%s] ' % (author, __version__), self.localize('Please Wait')) + + self.engine = Engine(uri=file_url(self.torrentUrl), download_path=self.userStorageDirectory, + connections_limit=connections_limit, download_kbps=download_limit, upload_kbps=upload_limit, + encryption=encryption, keep_complete=keep_complete, keep_incomplete=keep_incomplete, + dht_routers=dht_routers, use_random_port=use_random_port, listen_port=listen_port, + keep_files=keep_files, user_agent=user_agent, resume_file=resume_file) + + def buffer(self): + #self.pre_buffer_bytes = 30*1024*1024 #30 MB + ready = False + progressBar = xbmcgui.DialogProgress() + progressBar.create('[%sPlayer v%s] ' % (author, __version__) + self.localize('Please Wait'), + self.localize('Seeds searching.')) + #if self.subs_dl: + # subs = self.torrent.getSubsIds(os.path.basename(self.torrent.getFilePath(self.contentId))) + # if len(subs) > 0: + # for ind, title in subs: + # self.torrent.continueSession(ind) + + while not xbmc.abortRequested and not ready: + xbmc.sleep(500) + status = self.engine.status() + self.print_debug(status) + #self.print_fulldebug() + self.engine.check_torrent_error(status) + file_status = self.engine.file_status(self.contentId) + if not file_status: + continue + self.fullSize = int(file_status.size / 1024 / 1024) + downloadedSize = status.total_download / 1024 / 1024 + getDownloadRate = status.download_rate / 1024 * 8 + getUploadRate = status.upload_rate / 1024 * 8 + getSeeds, getPeers = status.num_seeds, status.num_peers + iterator = int(round(float(file_status.download) / self.pre_buffer_bytes, 2) * 100) + if iterator > 99: iterator = 99 + if status.state == State.CHECKING_FILES: + iterator = int(status.progress*100) + if iterator > 99: iterator = 99 + progressBar.update(iterator, self.localize('Checking preloaded files...'), ' ', ' ') + elif status.state == State.DOWNLOADING: + dialogText = self.localize('Preloaded: ') + "%d MB / %d MB" % \ + (int(downloadedSize), self.fullSize) + peersText = ' [%s: %s; %s: %s]' % ( + self.localize('Seeds'), getSeeds, self.localize('Peers'), getPeers) + speedsText = '%s: %d Mbit/s; %s: %d Mbit/s' % ( + self.localize('Downloading'), int(getDownloadRate), + self.localize('Uploading'), int(getUploadRate)) + progressBar.update(iterator, self.localize('Seeds searching.') + peersText, dialogText, + speedsText) + + if file_status.download >= self.pre_buffer_bytes: + ready = True + break + elif status.state in [State.FINISHED, State.SEEDING]: + ready = True + break + else: + progressBar.update(iterator, self.localize('UNKNOWN STATUS'), ' ', ' ') + if progressBar.iscanceled(): + self.iterator = 0 + ready = False + break + + progressBar.update(0) + progressBar.close() + return ready + + def setup_nextep(self): + try: + if self.get("url2"): + debug("[setup_nextep]: url2") + self.ids_video = urllib.unquote_plus(self.get("url2")).split(',') + else: + debug("[setup_nextep]: not url2") + self.ids_video = self.get_ids() + except: + pass + + if self.__settings__.getSetting('next_dl') == 'true' and self.ids_video and len(self.ids_video)>1: + self.next_dl = True + else: + self.next_dl = False + self.next_play = self.__settings__.getSetting('next_play') == 'true' + log('['+author+'Player]: next_dl - %s, next_play - %s, ids_video - %s' % (str(self.next_dl), str(self.next_play), str(self.ids_video))) + + def setup_play(self): + file_status = self.engine.file_status(self.contentId) + self.iterator = 0 + self.watchedTime = 0 + self.totalTime = 1 + url = file_status.url + label = os.path.basename(file_status.name) + self.basename = label + self.seeding_run = False + listitem = xbmcgui.ListItem(label, path=url) + + if self.next_dl: + next_contentId_index = self.ids_video.index(str(self.contentId)) + 1 + if len(self.ids_video) > next_contentId_index: + self.next_contentId = int(self.ids_video[next_contentId_index]) + else: + self.next_contentId = False + log('['+author+'Player][setup_play]: next_contentId: '+str(self.next_contentId)) + try: + seasonId = self.get("seasonId") + self.episodeId = self.get("episodeId") if not self.episodeId else int(self.episodeId) + 1 + title = urllib.unquote_plus(self.get("title")) if self.get("title") else None + + if self.get("label") and self.episodeId == self.get("episodeId"): + label = urllib.unquote_plus(self.get("label")) + elif seasonId and self.episodeId and title: + label = '%s S%02dE%02d.%s (%s)' % ( + title, int(seasonId), int(self.episodeId), self.basename.split('.')[-1], self.basename) + + if seasonId and self.episodeId and label and title: + listitem = xbmcgui.ListItem(label, path=url) + + listitem.setInfo(type='video', infoLabels={'title': label, + 'episode': int(self.episodeId), + 'season': int(seasonId), + 'tvshowtitle': title}) + except: + log('['+author+'Player]: Operation INFO failed!') + + thumbnail = self.get("thumbnail") + if thumbnail: + listitem.setThumbnailImage(urllib.unquote_plus(thumbnail)) + self.display_name = label + + player = xbmc.Player() + player.play(url, listitem) + + xbmc.sleep(2000) # very important, do not edit this, podavan + i = 0 + while not xbmc.abortRequested and not self.isPlaying() and i < 150: + xbmc.sleep(200) + i += 1 + + log('['+author+'Player]: self.isPlaying() = %s, i = %d, xbmc.abortRequested - %s' % (str(self.isPlaying()), i, str(xbmc.abortRequested))) + if not self.isPlaying() or xbmc.abortRequested: + return False + + if self.seek > 0: + log('['+author+'Player]: seekTime - '+str(self.seek)) + self.seekTime(self.seek) + return True + + def setup_subs(self): + if self.subs_dl: + file_status = self.engine.file_status(self.contentId) + subs = [] + filename = os.path.basename(file_status.name) + sub_files = self.engine.list(media_types=[MediaType.SUBTITLES]) + for i in sub_files: + if isSubtitle(filename, i.name): + subs.append(i) + if subs: + log("["+author+"Player][setup_subs]: Detected subtitles: %s" % str(subs)) + for sub in subs: + xbmc.Player().setSubtitles(sub.url) + + def loop(self): + debug_counter = 0 + pause = True + with closing( + OverlayText(w=OVERLAY_WIDTH, h=OVERLAY_HEIGHT, alignment=XBFONT_CENTER_X | XBFONT_CENTER_Y)) as overlay: + with nested(self.attach(overlay.show, self.on_playback_paused), + self.attach(overlay.hide, self.on_playback_resumed, self.on_playback_stopped)): + while not xbmc.abortRequested and self.isPlaying(): + #self.print_fulldebug() + status = self.engine.status() + file_status = self.engine.file_status(self.contentId) + self.watchedTime = xbmc.Player().getTime() + self.totalTime = xbmc.Player().getTotalTime() + if self.iterator == 100 and debug_counter < 100: + debug_counter += 1 + else: + self.print_debug(status) + debug_counter=0 + + overlay.text = "\n".join(self._get_status_lines(status, file_status)) + + self.iterator = int(file_status.progress * 100) + + if pause and self.__settings__.getSetting("pause_onplay") == 'true': + pause = False + xbmc.Player().pause() + xbmc.sleep(1000) + + #if not self.seeding_run and self.iterator == 100 and self.seeding: + #self.seeding_run = True + #self.seed(self.contentId) + #self.seeding_status = True + # xbmc.sleep(7000) + + def onPlayBackStarted(self): + for f in self.on_playback_started: + f() + log('[onPlayBackStarted]: '+(str(("video", "play", self.display_name)))) + + def onPlayBackResumed(self): + for f in self.on_playback_resumed: + f() + self.onPlayBackStarted() + + def onPlayBackPaused(self): + for f in self.on_playback_paused: + f() + log('[onPlayBackPaused]: '+(str(("video", "pause", self.display_name)))) + + def onPlayBackStopped(self): + for f in self.on_playback_stopped: + f() + log('[onPlayBackStopped]: '+(str(("video", "stop", self.display_name)))) + + @contextmanager + def attach(self, callback, *events): + for event in events: + event.append(callback) + yield + for event in events: + event.remove(callback) + + def _get_status_lines(self, s, f): + return [ + localize_path(self.display_name), + "%.2f%% %s" % (f.progress * 100, self.localize(STATE_STRS[s.state])), + "D:%.2f%s U:%.2f%s S:%d P:%d" % (s.download_rate, self.localize('kb/s'), + s.upload_rate, self.localize('kb/s'), + s.num_seeds, s.num_peers) + ] + + def localize(self, string): + try: + return Localization.localize(string) + except: + return string + + def print_debug(self, status=None): + #FileStatus = namedtuple('FileStatus', "name, save_path, url, size, offset, download, progress, index, media_type") + + #SessionStatus = namedtuple('SessionStatus', "name, state, state_str, error, progress, download_rate, upload_rate, " + # "total_download, total_upload, num_peers, num_seeds, total_seeds, " + # "total_peers") + + #log('[buffer] file_status:'+str(file_status)) + #log('[buffer] status:'+str(status)) + if not status: + status = self.engine.status() + self.engine.check_torrent_error(status) + log('['+author+'Player]: %.2f%% complete (down: %.1f kb/s up: %.1f kb/s peers: %d) %s' % \ + (status.progress * 100, status.download_rate, + status.upload_rate, status.num_peers, status.state_str)) + + def print_fulldebug(self): + status = self.engine.status() + file_status = self.engine.file_status(self.contentId) + log('[buffer] file_status:'+str(file_status)) + log('[buffer] status:'+str(status)) + + def get_ids(self): + contentList = [] + for fs in self.engine.list(): + contentList.append((fs.name, str(fs.index))) + contentList = sorted(contentList, key=lambda x: x[0]) + return get_ids_video(contentList) + + def getContentList(self): + filelist = [] + for fs in self.engine.list(): + stringdata = {"title": ensure_str(fs.name), "size": fs.size, "ind": fs.index, + 'offset': fs.offset} + filelist.append(stringdata) + return filelist + +class OverlayText(object): + def __init__(self, w, h, *args, **kwargs): + self.window = xbmcgui.Window(WINDOW_FULLSCREEN_VIDEO) + viewport_w, viewport_h = self._get_skin_resolution() + # Adjust size based on viewport, we are using 1080p coordinates + w = int(w * viewport_w / VIEWPORT_WIDTH) + h = int(h * viewport_h / VIEWPORT_HEIGHT) + x = (viewport_w - w) / 2 + y = (viewport_h - h) / 2 + self._shown = False + self._text = "" + self._label = xbmcgui.ControlLabel(x, y, w, h, self._text, *args, **kwargs) + self._background = xbmcgui.ControlImage(x, y, w, h, os.path.join(RESOURCES_PATH, "images", "black.png")) + self._background.setColorDiffuse("0xD0000000") + + def show(self): + if not self._shown: + self.window.addControls([self._background, self._label]) + self._shown = True + self._background.setColorDiffuse("0xD0000000") + + def hide(self): + if self._shown: + self._shown = False + self.window.removeControls([self._background, self._label]) + self._background.setColorDiffuse("0xFF000000") + + def close(self): + self.hide() + + @property + def text(self): + return self._text + + @text.setter + def text(self, text): + self._text = text + if self._shown: + self._label.setLabel(self._text) + + # This is so hackish it hurts. + def _get_skin_resolution(self): + import xml.etree.ElementTree as ET + + skin_path = xbmc.translatePath("special://skin/") + tree = ET.parse(os.path.join(skin_path, "addon.xml")) + res = tree.findall("./extension/res")[0] + return int(res.attrib["width"]), int(res.attrib["height"]) \ No newline at end of file From 622c4dc3e78ed8690183086795ed2cce7b3982d5 Mon Sep 17 00:00:00 2001 From: inpos Date: Sat, 19 Mar 2016 17:56:59 +0300 Subject: [PATCH 18/18] =?UTF-8?q?Anteoloader=20=D0=B8=20Inposloader=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Anteoloader.py | 26 +++++++++++++------------- Core.py | 8 +++++++- Downloader.py | 8 +++++++- Inposloader.py | 47 +++++++++++++++++++++-------------------------- 4 files changed, 48 insertions(+), 41 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index bff6d73..83a1d47 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -40,16 +40,16 @@ from contextlib import contextmanager, closing, nested from functions import foldername, showMessage, clearStorage, WatchedHistoryDB, get_ids_video, log, debug, ensure_str -if sys.modules["__main__"].__settings__.getSetting("torrent_player") == '2': - from torrent2http import State, Engine, MediaType - author = 'Anteo' - __settings__ = xbmcaddon.Addon(id='script.module.torrent2http') - __version__ = __settings__.getAddonInfo('version') -elif sys.modules["__main__"].__settings__.getSetting("torrent_player") == '3': - from pyrrent2http import State, Engine, MediaType - author = 'Inpos' - __settings__ = xbmcaddon.Addon(id='script.module.pyrrent2http') - __version__ = __settings__.getAddonInfo('version') +#if sys.modules["__main__"].__settings__.getSetting("torrent_player") == '2': +from torrent2http import State, Engine, MediaType +author = 'Anteo' +__settings__ = xbmcaddon.Addon(id='script.module.torrent2http') +__version__ = __settings__.getAddonInfo('version') +#elif sys.modules["__main__"].__settings__.getSetting("torrent_player") == '3': +# from pyrrent2http import State, Engine, MediaType +# author = 'Inpos' +# __settings__ = xbmcaddon.Addon(id='script.module.pyrrent2http') +# __version__ = __settings__.getAddonInfo('version') ROOT = sys.modules["__main__"].__root__ RESOURCES_PATH = os.path.join(ROOT, 'resources') @@ -613,9 +613,9 @@ class AnteoPlayer(xbmc.Player): def _get_status_lines(self, s, f): return [ localize_path(self.display_name), - "%.2f%% %s" % (f.progress * 100, self.localize(STATE_STRS[s.state])), - "D:%.2f%s U:%.2f%s S:%d P:%d" % (s.download_rate, self.localize('kb/s'), - s.upload_rate, self.localize('kb/s'), + "%.2f%% %s" % (f.progress * 100, self.localize(STATE_STRS[s.state]).decode('utf-8')), + "D:%.2f%s U:%.2f%s S:%d P:%d" % (s.download_rate, self.localize('kb/s').decode('utf-8'), + s.upload_rate, self.localize('kb/s').decode('utf-8'), s.num_seeds, s.num_peers) ] diff --git a/Core.py b/Core.py index 9278334..4e73190 100644 --- a/Core.py +++ b/Core.py @@ -1391,12 +1391,18 @@ class Core: self.Player = TorrentPlayer(userStorageDirectory=self.userStorageDirectory, torrentUrl=torrentUrl, params=params) else: log(self.__plugin__ + " Unexpected access to method playTorrent() without torrent content") - elif self.torrent_player == '2' or self.torrent_player == '3': + elif self.torrent_player == '2': from Anteoloader import AnteoPlayer if 0 != len(torrentUrl): self.Player = AnteoPlayer(userStorageDirectory=self.userStorageDirectory, torrentUrl=torrentUrl, params=params) else: log(self.__plugin__ + " Unexpected access to method playTorrent() without torrent content") + elif self.torrent_player == '3': + from Inposloader import InposPlayer + if 0 != len(torrentUrl): + self.Player = InposPlayer(userStorageDirectory=self.userStorageDirectory, torrentUrl=torrentUrl, params=params) + else: + log(self.__plugin__ + " Unexpected access to method playTorrent() without torrent content") elif self.torrent_player == '1': __ASsettings__ = xbmcaddon.Addon(id='script.module.torrent.ts') folder=__ASsettings__.getSetting("folder") diff --git a/Downloader.py b/Downloader.py index bde7252..d334c28 100644 --- a/Downloader.py +++ b/Downloader.py @@ -24,6 +24,7 @@ import sys import Libtorrent import AceStream import Anteoloader +import Inposloader from functions import log class Torrent(): @@ -39,6 +40,9 @@ class Torrent(): elif self.player == 'anteo': self.player = Anteoloader.AnteoLoader(storageDirectory, torrentFile, torrentFilesDirectory) + + elif self.player == 'inpos': + self.player = Inposloader.InposLoader(storageDirectory, torrentFile, torrentFilesDirectory) def __exit__(self): self.player.__exit__() @@ -49,8 +53,10 @@ class Torrent(): self.player = 'libtorrent' elif player == '1': self.player = 'acestream' - elif player == '2' or player == '3': + elif player == '2': self.player = 'anteo' + elif player == '3': + self.player = 'inpos' def play_url_ind(self, ind, label, icon): return self.player.play_url_ind(int(ind), label, str(icon)) diff --git a/Inposloader.py b/Inposloader.py index bff6d73..6f5caf3 100644 --- a/Inposloader.py +++ b/Inposloader.py @@ -40,16 +40,16 @@ from contextlib import contextmanager, closing, nested from functions import foldername, showMessage, clearStorage, WatchedHistoryDB, get_ids_video, log, debug, ensure_str -if sys.modules["__main__"].__settings__.getSetting("torrent_player") == '2': - from torrent2http import State, Engine, MediaType - author = 'Anteo' - __settings__ = xbmcaddon.Addon(id='script.module.torrent2http') - __version__ = __settings__.getAddonInfo('version') -elif sys.modules["__main__"].__settings__.getSetting("torrent_player") == '3': - from pyrrent2http import State, Engine, MediaType - author = 'Inpos' - __settings__ = xbmcaddon.Addon(id='script.module.pyrrent2http') - __version__ = __settings__.getAddonInfo('version') +#if sys.modules["__main__"].__settings__.getSetting("torrent_player") == '2': +# from torrent2http import State, Engine, MediaType +# author = 'Anteo' +# __settings__ = xbmcaddon.Addon(id='script.module.torrent2http') +# __version__ = __settings__.getAddonInfo('version') +#elif sys.modules["__main__"].__settings__.getSetting("torrent_player") == '3': +from pyrrent2http import State, Engine, MediaType +author = 'Inpos' +__settings__ = xbmcaddon.Addon(id='script.module.pyrrent2http') +__version__ = __settings__.getAddonInfo('version') ROOT = sys.modules["__main__"].__root__ RESOURCES_PATH = os.path.join(ROOT, 'resources') @@ -94,7 +94,7 @@ class Encryption: ENABLED = 1 DISABLED = 2 -class AnteoLoader: +class InposLoader: magnetLink = None engine = None torrentFile = None @@ -152,16 +152,11 @@ class AnteoLoader: return string def getContentList(self): - try: - from Libtorrent import Libtorrent - torrent = Libtorrent(self.storageDirectory, self.torrentFile) - return torrent.getContentList() - except: - import traceback - log(traceback.format_exc()) - return self.getContentList_engine() + from Libtorrent import Libtorrent + torrent = Libtorrent(self.storageDirectory, self.torrentFile) + return torrent.getContentList() - def getContentList_engine(self): + '''def getContentList_engine(self): self.setup_engine() files = [] filelist = [] @@ -197,7 +192,7 @@ class AnteoLoader: log(traceback.format_exc()) finally: self.engine.close() - return filelist + return filelist''' def saveTorrent(self, torrentUrl): #if not xbmcvfs.exists(torrentUrl) or re.match("^http.+$", torrentUrl): @@ -228,7 +223,7 @@ class AnteoLoader: localFile.write(content) localFile.close() except Exception, e: - log('Unable to rename torrent file from %s to %s in AnteoLoader::saveTorrent. Exception: %s' % + log('Unable to rename torrent file from %s to %s in InposLoader::saveTorrent. Exception: %s' % (torrentUrl, torrentFile, str(e))) return if xbmcvfs.exists(torrentFile) and not os.path.exists(torrentFile): @@ -257,7 +252,7 @@ class AnteoLoader: self.torrentFile = magnet log('['+author+'Loader][magnetToTorrent]: self.torrentFile '+str(self.torrentFile)) -class AnteoPlayer(xbmc.Player): +class InposPlayer(xbmc.Player): __plugin__ = sys.modules["__main__"].__plugin__ __settings__ = sys.modules["__main__"].__settings__ ROOT = sys.modules["__main__"].__root__ @@ -539,7 +534,7 @@ class AnteoPlayer(xbmc.Player): file_status = self.engine.file_status(self.contentId) subs = [] filename = os.path.basename(file_status.name) - sub_files = self.engine.list(media_types=[MediaType.SUBTITLES]) + sub_files = self.engine.list_from_info(media_types=[MediaType.SUBTITLES]) for i in sub_files: if isSubtitle(filename, i.name): subs.append(i) @@ -649,14 +644,14 @@ class AnteoPlayer(xbmc.Player): def get_ids(self): contentList = [] - for fs in self.engine.list(): + for fs in self.engine.list_from_info(): contentList.append((fs.name, str(fs.index))) contentList = sorted(contentList, key=lambda x: x[0]) return get_ids_video(contentList) def getContentList(self): filelist = [] - for fs in self.engine.list(): + for fs in self.engine.list_from_info(): stringdata = {"title": ensure_str(fs.name), "size": fs.size, "ind": fs.index, 'offset': fs.offset} filelist.append(stringdata)