diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 88d090a..8192bf8 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -2,37 +2,11 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
@@ -62,11 +36,11 @@
-
+
-
-
+
+
@@ -74,25 +48,59 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -101,30 +109,63 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -132,18 +173,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
@@ -165,25 +194,58 @@
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
@@ -198,18 +260,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
@@ -242,8 +292,6 @@
@@ -327,6 +377,8 @@
+
+
@@ -345,10 +397,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
@@ -360,13 +424,13 @@
+
+
+
-
-
-
@@ -530,12 +594,6 @@
1420801533300
-
- 1437068342157
-
-
- 1437068342157
-
1437075408271
@@ -824,7 +882,13 @@
1450188565240
-
+
+ 1450189086720
+
+
+ 1450189086720
+
+
@@ -835,7 +899,7 @@
-
+
@@ -865,7 +929,6 @@
-
@@ -890,7 +953,8 @@
-
+
+
@@ -899,38 +963,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1064,13 +1096,6 @@
-
-
-
-
-
-
-
@@ -1092,23 +1117,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1158,14 +1166,6 @@
-
-
-
-
-
-
-
-
@@ -1194,24 +1194,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1239,17 +1221,6 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -1257,16 +1228,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -1274,46 +1235,222 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Anteoloader.py b/Anteoloader.py
new file mode 100644
index 0000000..2ea4578
--- /dev/null
+++ b/Anteoloader.py
@@ -0,0 +1,237 @@
+# -*- 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 thread
+import os
+import urllib2
+import hashlib
+import re
+from StringIO import StringIO
+import gzip
+import sys
+from contextlib import closing
+
+import xbmc
+import xbmcgui
+import xbmcvfs
+import xbmcplugin
+import Localization
+from functions import file_encode, isSubtitle, DownloadDB, log, debug, is_writable, unquote
+from torrent2http import State, Engine, MediaType
+
+class Anteoloader:
+ magnetLink = None
+ startPart = 0
+ endPart = 0
+ partOffset = 0
+ torrentHandle = None
+ session = None
+ engine = None
+ downloadThread = None
+ threadComplete = False
+
+ 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
+ self.pre_buffer_bytes = 15*1024*1024
+ print torrentFile
+ torrentFile=unquote(torrentFile)
+ print torrentFile
+ print str(xbmcvfs.exists(torrentFile))
+ print str(os.path.exists(torrentFile))
+
+
+ self.engine = Engine(uri=torrentFile)
+
+ def __exit__(self):
+ log('on __exit__')
+ if self.engine:
+ self.engine.close()
+ log('__exit__ worked!')
+
+
+ def getContentList(self, media_types=None):
+ files = []
+ filelist = []
+ with closing(self.engine):
+ self.engine.start()
+ if media_types is None:
+ media_types=[MediaType.VIDEO, MediaType.AUDIO, MediaType.SUBTITLES, MediaType.UNKNOWN]
+
+ while not files and not xbmc.abortRequested:
+ files = self.engine.list(media_types)
+ self.engine.check_torrent_error()
+ xbmc.sleep(200)
+
+ for fs in files:
+ stringdata = {"title": fs.name, "size": fs.size, "ind": fs.index,
+ 'offset': fs.offset}
+ filelist.append(stringdata)
+
+
+ def stream(self, params):
+ self.params = params
+ self.get = self.params.get
+ self.contentId = int(self.get("url")) if self.get("url") else 0
+ #with closing(self.engine):
+ self.engine.start(self.contentId)
+
+ ready = self.buffer()
+ if ready:
+ file_status = self.engine.file_status(self.contentId)
+ listitem = xbmcgui.ListItem('xxxx')
+ playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
+ playlist.clear()
+ playlist.add(file_status.url, listitem)
+ xbmc.Player().play(playlist)
+ while not xbmc.abortRequested and xbmc.Player().isPlaying():
+ xbmc.sleep(500)
+ xbmc.Player().stop()
+
+ def buffer(self):
+ ready = False
+ progressBar = xbmcgui.DialogProgress()
+ progressBar.create(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)
+
+ #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")
+
+ while not xbmc.abortRequested and not ready:
+ xbmc.sleep(500)
+ status = self.engine.status()
+ self.engine.check_torrent_error(status)
+ file_status = self.engine.file_status(self.contentId)
+ if not file_status:
+ continue
+ log('[buffer] file_status:'+str(file_status))
+ log('[buffer] status:'+str(status))
+ #self.torrent.debug()
+ fullSize = 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.QUEUED_FOR_CHECKING:
+ progressBar.update(iterator, self.localize('Checking preloaded files...'), ' ', ' ')
+ elif status.state == State.DOWNLOADING:
+ dialogText = self.localize('Preloaded: ') + "%d MB / %d MB" % \
+ (int(downloadedSize), int(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))
+ #if self.debug:
+ # peersText=peersText + ' ' + self.torrent.get_debug_info('dht_state')
+ # dialogText=dialogText.replace(self.localize('Preloaded: '),'') + ' ' + self.torrent.get_debug_info('trackers_sum')
+ 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():
+ ready = False
+ break
+
+ progressBar.update(0)
+ progressBar.close()
+ return ready
+
+ def localize(self, string):
+ try:
+ return Localization.localize(string)
+ except:
+ return string
+
+
+ def saveTorrent(self, torrentUrl):
+ if not xbmcvfs.exists(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 = 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())
+ f = gzip.GzipFile(fileobj=buf)
+ content = f.read()
+ else:
+ content = result.read()
+
+ localFile = xbmcvfs.File(torrentFile, "w+b")
+ localFile.write(content)
+ localFile.close()
+ except Exception, e:
+ print 'Unable to save torrent file from "' + torrentUrl + '" to "' + torrentFile + '" in Torrent::saveTorrent' + '. Exception: ' + str(
+ e)
+ return
+ else:
+ torrentFile = torrentUrl
+ if xbmcvfs.exists(torrentFile):
+ self.torrentFile = "file:///"+torrentFile.replace('\\','//').replace('////','//')
+ 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):
+ self.torrentFile = magnet
\ No newline at end of file
diff --git a/Core.py b/Core.py
index a77a546..bbabdd4 100644
--- a/Core.py
+++ b/Core.py
@@ -45,6 +45,7 @@ class Core:
def __init__(self):
print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__
+ print str(self.ROOT)
if len(self.userStorageDirectory) == 0:
download_dir = get_download_dir()
else:
@@ -233,7 +234,7 @@ class Core:
lockView('wide')
def test(self, params={}):
- from BTClientPlayer import BTClientPlayer
+ from Anteoloader import Anteoloader
torrentUrl='D:\\ntest.torrent'
params['url']='0'
if not xbmcvfs.exists(torrentUrl):
@@ -241,15 +242,13 @@ class Core:
torrentUrl = action.browse(1, self.localize('Choose .torrent in video library'), 'video', '.torrent')
if torrentUrl and xbmcvfs.exists(torrentUrl):
if 0 != len(torrentUrl):
- self.Player = BTClientPlayer(userStorageDirectory=self.userStorageDirectory, torrentUrl=torrentUrl, params=params)
+ self.Downloader = Anteoloader(self.userStorageDirectory, torrentUrl)
else:
- print self.__plugin__ + " Unexpected access to method playTorrent() without torrent content"
- #path='http://127.0.0.1:5001/Inception.2010.1080p.BluRay.x264.5xRus.Eng-Otaibi.mkv'
- #listitem = xbmcgui.ListItem('Inception.2010.1080p.BluRay.x264.5xRus.Eng-Otaibi.mkv', path=path)
- #playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
- #playlist.clear()
- #playlist.add(path, listitem)
- #xbmc.Player().play(playlist)
+ print self.__plugin__ + " Unexpected access to method Anteoloader() without torrent content"
+ if self.Downloader:
+ self.Downloader.stream()
+ xbmc.sleep(1000)
+ self.Downloader.__exit__()
def DownloadStatus(self, params={}):
db = DownloadDB()
@@ -345,16 +344,16 @@ class Core:
progress=int(jsoninfo.get('progress'))
if status=='pause':
status_sign='[||]'
- img = os.path.join(self.ROOT, '/icons/', 'pause-icon.png')
+ img = os.path.join(self.ROOT, 'icons', 'pause-icon.png')
elif status=='stopped':
status_sign='[X]'
- img = os.path.join(self.ROOT, '/icons/', 'stop-icon.png')
+ img = os.path.join(self.ROOT, 'icons', 'stop-icon.png')
else:
status_sign='[>]'
if progress==100:
- img = os.path.join(self.ROOT, '/icons/', 'upload-icon.png')
+ img = os.path.join(self.ROOT, 'icons', 'upload-icon.png')
else:
- img = os.path.join(self.ROOT, '/icons/', 'download-icon.png')
+ img = os.path.join(self.ROOT, 'icons', 'download-icon.png')
title = '[%d%%]%s %s' % (progress, status_sign, title)
if jsoninfo.get('seeds')!=None and jsoninfo.get('peers')!=None and \
@@ -973,6 +972,7 @@ class Core:
def drawItem(self, title, action, link='', image='', isFolder=True, contextMenu=None, replaceMenu=True, action2='',
info={}):
listitem = xbmcgui.ListItem(title, iconImage=image, thumbnailImage=image)
+ log('[drawItem]:'+str((title, action, image, isFolder, contextMenu, replaceMenu, action2, info)))
if not info: info = {"Title": title, "plot": title}
if isinstance(link, dict):
link_url = ''
@@ -1116,10 +1116,14 @@ class Core:
status = TextBB(' [||] ', 'b')
elif data['status'] in ('seeding', 'downloading'):
status = TextBB(' [>] ', 'b')
- if data['status'] == 'seed_pending': os.path.join(self.ROOT, '/icons/', 'pause-icon.png')
- elif data['status'] == 'stopped': os.path.join(self.ROOT, '/icons/', 'stop-icon.png')
- elif data['status'] == 'seeding': os.path.join(self.ROOT, '/icons/', 'upload-icon.png')
- elif data['status'] == 'downloading': os.path.join(self.ROOT, '/icons/', 'download-icon.png')
+ if data['status'] == 'seed_pending':
+ img = os.path.join(self.ROOT, 'icons', 'pause-icon.png')
+ elif data['status'] == 'stopped':
+ img = os.path.join(self.ROOT, 'icons', 'stop-icon.png')
+ elif data['status'] == 'seeding':
+ img = os.path.join(self.ROOT, 'icons', 'upload-icon.png')
+ elif data['status'] == 'downloading':
+ img = os.path.join(self.ROOT, 'icons', 'download-icon.png')
menu.append(
{"title": '[' + str(data['progress']) + '%]' + status + data['name'] + ' [' + str(
data['ratio']) + ']', "image":img,
diff --git a/Downloader.py b/Downloader.py
index ec3cd6c..e1702d8 100644
--- a/Downloader.py
+++ b/Downloader.py
@@ -23,6 +23,7 @@ import sys
import Libtorrent
import AceStream
+import Anteoloader
class Torrent():
@@ -36,15 +37,20 @@ class Torrent():
elif self.player == 'acestream':
self.player = AceStream.AceStream(storageDirectory, torrentFile, torrentFilesDirectory)
+ elif self.player == 'anteo':
+ self.player = Anteoloader.Anteoloader(storageDirectory, torrentFile, torrentFilesDirectory)
+
def __exit__(self):
self.player.__exit__()
def get_torrent_client(self):
player = self.__settings__.getSetting("torrent_player")
- if player in ['0','2']:
+ if player == '0':
self.player = 'libtorrent'
elif player == '1':
self.player = 'acestream'
+ elif player == '2':
+ self.player = 'anteo'
def play_url_ind(self, ind, label, icon):
return self.player.play_url_ind(int(ind), label, str(icon))
diff --git a/addon.xml b/addon.xml
index 3a3a264..e6a4130 100644
--- a/addon.xml
+++ b/addon.xml
@@ -1,10 +1,12 @@
-
+
+
+
video