diff --git a/.idea/workspace.xml b/.idea/workspace.xml index f891eeb..e2d7f08 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -3,18 +3,11 @@ - + - - - - - + + - - - - @@ -41,14 +34,14 @@ - + - + - - + + @@ -102,7 +95,6 @@ - @@ -116,62 +108,66 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -181,7 +177,7 @@ - + @@ -189,57 +185,43 @@ - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -249,7 +231,7 @@ - + @@ -258,8 +240,8 @@ - - + + @@ -349,52 +331,57 @@ - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -403,7 +390,7 @@ - + @@ -412,7 +399,7 @@ - + @@ -472,26 +459,26 @@ @@ -526,8 +513,6 @@ - - @@ -624,6 +609,8 @@ + + @@ -805,12 +792,6 @@ @@ -1109,9 +1096,8 @@ - - + @@ -1124,6 +1110,7 @@ + @@ -1140,7 +1127,6 @@ - @@ -1165,22 +1151,16 @@ - - - - - - - - - @@ -1382,14 +1362,6 @@ - - - - - - - - @@ -1401,21 +1373,12 @@ - - - - - - - - - - + @@ -1449,64 +1412,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1518,9 +1423,6 @@ - - - @@ -1528,47 +1430,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1586,10 +1447,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1621,34 +1527,125 @@ - + - + - + - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -1702,7 +1699,6 @@ - @@ -1716,82 +1712,66 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Anteoloader.py b/Anteoloader.py index e8cb03d..08d8d93 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -37,7 +37,7 @@ import sys from contextlib import contextmanager, closing, nested -from functions import calculate, showMessage, clearStorage, DownloadDB, get_ids_video, log, debug +from functions import calculate, showMessage, clearStorage, WatchedHistoryDB, get_ids_video, log, debug from torrent2http import State, Engine, MediaType @@ -253,6 +253,10 @@ class AnteoPlayer(xbmc.Player): seeding_run = False ids_video = None episodeId = None + fullSize = 0 + watchedTime = 0 + totalTime = 1 + seek = 0 basename = '' def __init__(self, userStorageDirectory, torrentUrl, params={}): @@ -263,6 +267,8 @@ class AnteoPlayer(xbmc.Player): 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.torrent = AnteoLoader(self.userStorageDirectory, self.torrentUrl, self.torrentFilesDirectory) self.init() self.setup_engine() @@ -275,6 +281,7 @@ class AnteoPlayer(xbmc.Player): if self.setup_play(): self.setup_subs() self.loop() + WatchedHistoryDB().add(self.basename, self.watchedTime, self.totalTime, self.contentId, self.fullSize) else: log('[AnteoPlayer]: ************************************* break') break @@ -379,22 +386,25 @@ class AnteoPlayer(xbmc.Player): 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 - fullSize = file_status.size / 1024 / 1024 + 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.QUEUED_FOR_CHECKING: + 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), int(fullSize)) + (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' % ( @@ -443,6 +453,8 @@ class AnteoPlayer(xbmc.Player): 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 @@ -487,6 +499,12 @@ class AnteoPlayer(xbmc.Player): player.play(url, listitem) xbmc.sleep(2000) # very important, do not edit this, podavan + if self.seek > 0: + while not self.isPlaying(): + xbmc.sleep(200) + log('seekTime') + log('[AnteoPlayer]: seekTime - '+str(self.seek)) + self.seekTime(self.seek) return True def setup_subs(self): @@ -515,6 +533,8 @@ class AnteoPlayer(xbmc.Player): #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: diff --git a/Core.py b/Core.py index f569f71..f5d7403 100644 --- a/Core.py +++ b/Core.py @@ -54,12 +54,13 @@ class Core: def sectionMenu(self): if self.__settings__.getSetting('plugin_name') != self.__plugin__: #Every update run + first_run_242() self.__settings__.setSetting('plugin_name', self.__plugin__) #check_network_advancedsettings() check_download_dir() - if self.__plugin__ == 'Torrenter v.2.4.1b': - first_run_241() - pass + #if self.__plugin__ == 'Torrenter v.2.4.1b': + # first_run_242() + # pass ListString = 'XBMC.RunPlugin(%s)' % (sys.argv[0] + '?action=%s&action2=%s&%s=%s') contextMenu = [(self.localize('Search Control Window'), @@ -88,6 +89,13 @@ class Core: contextMenu=DLScontextMenu, replaceMenu=False) self.drawItem('< %s >' % self.localize('Torrent-client Browser'), 'uTorrentBrowser', image=self.ROOT + '/icons/' + self.getTorrentClientIcon()) + if self.history_bool: + WatchedHistorycontextMenu=[] + WatchedHistorycontextMenu.extend(contextMenu) + WatchedHistorycontextMenu.append( + (self.localize('Clear %s') % self.localize('Watched History'), ListString % ('WatchedHistory', 'clear', 'addtime', ''))) + self.drawItem('< %s >' % self.localize('Watched History'), 'WatchedHistory', + image=self.ROOT + '/icons/watched.png', contextMenu=WatchedHistorycontextMenu, replaceMenu=False) self.drawItem('< %s >' % self.localize('.torrent Player'), 'torrentPlayer', image=self.ROOT + '/icons/torrentPlayer.png') self.drawItem('< %s >' % self.localize('Search Control Window'), 'controlCenter', @@ -233,23 +241,27 @@ class Core: lockView('wide') def test(self, params={}): - from Anteoloader import AnteoPlayer - torrentUrl='D:\\test.torrent' - params['url']='0' - if not xbmcvfs.exists(torrentUrl): - action = xbmcgui.Dialog() - torrentUrl = action.browse(1, self.localize('Choose .torrent in video library'), 'video', '.torrent') - if torrentUrl and xbmcvfs.exists(torrentUrl): - if 0 != len(torrentUrl): - self.Downloader = Downloader.Torrent(self.userStorageDirectory, torrentUrl) - else: - log(self.__plugin__ + " Unexpected access to method Anteoloader() without torrent content") + #from Anteoloader import AnteoPlayer + #torrentUrl='D:\\test.torrent' + #params['url']='0' + #if not xbmcvfs.exists(torrentUrl): + # action = xbmcgui.Dialog() + # torrentUrl = action.browse(1, self.localize('Choose .torrent in video library'), 'video', '.torrent') + #if torrentUrl and xbmcvfs.exists(torrentUrl): + # if 0 != len(torrentUrl): + # self.Downloader = Downloader.Torrent(self.userStorageDirectory, torrentUrl) + # else: + # log(self.__plugin__ + " Unexpected access to method Anteoloader() without torrent content") #if self.Downloader: # x=self.Downloader.getContentList() # print str(x) # xbmc.sleep(1000) # self.Downloader.__exit__() - self.Player = AnteoPlayer(userStorageDirectory=self.userStorageDirectory, torrentUrl=torrentUrl, params=params) + #self.Player = AnteoPlayer(userStorageDirectory=self.userStorageDirectory, torrentUrl=torrentUrl, params=params) + yes=xbmcgui.Dialog().yesno('< %s >' % (Localization.localize('Torrenter Update ') + '2.4.2'), + Localization.localize('New player to Torrenter v2 - Torrent2HTTP! It should be faster, ' + 'stable and better with Android, also seeking works in it.'), + Localization.localize('Would you like to try it?'),) def DownloadStatus(self, params={}): db = DownloadDB() @@ -449,6 +461,65 @@ class Core: view_style('History') xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True) + def WatchedHistory(self, params={}): + db = WatchedHistoryDB() + get = params.get + action2 = get('action2') + url = get('url') + addtime = get('addtime') + + if action2 == 'add': + db.add(url) + xbmc.executebuiltin('Container.Refresh') + showMessage(self.localize('Watched History'), self.localize('Added!')) + + if action2 == 'delete': + db.delete(addtime) + xbmc.executebuiltin('Container.Refresh') + showMessage(self.localize('Watched History'), self.localize('Deleted!')) + + if action2 == 'play': + filename, path, url, seek, length, ind = db.get('filename, path, url, seek, length, ind', 'addtime', str(addtime)) + seek = int(seek) if int(seek) > 3*60 else 0 + if seek > 0: + seek = seeking_warning(seek) + if os.path.exists(path): + self.__settings__.setSetting("lastTorrent", path) + else: + torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) + self.__settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) + xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url='+str(ind)+'&seek='+str(seek)+'")') + + if action2 == 'clear': + db.clear() + showMessage(self.localize('Watched History'), self.localize('Clear!')) + + if not action2: + items = db.get_all() + debug('[WatchedHistory]: items - '+str(items)) + #favlist = [(1, '[B]%s[/B]'), (0, '%s')] + if items: + ListString = 'XBMC.RunPlugin(%s)' % (sys.argv[0] + '?action=%s&action2=%s&%s=%s') + #for favbool, bbstring in favlist: + for addtime, filename, path, url, seek, length, ind, size in items: + watchedPercent = int((float(seek) / float(length)) * 100) + duration = '%02d:%02d:%02d' % ((length / (60*60)), (length / 60) % 60, length % 60) + title = '[%d%%][%s] %s [%d MB]' % (watchedPercent, duration, filename.encode('utf-8'), int(size)) + contextMenu = [(self.localize('Search Control Window'), + 'xbmc.RunScript(%s,)' % os.path.join(ROOT, 'controlcenter.py'))] + if watchedPercent >= 85: + img = self.ROOT + '/icons/stop-icon.png' + else: + img = self.ROOT + '/icons/pause-icon.png' + + contextMenu.append((self.localize('Delete from %s') % self.localize('Watched History'), + ListString % ('WatchedHistory', 'delete', 'addtime', str(addtime)))) + + link = {'url': str(ind), 'action2': 'play', 'addtime': str(addtime)} + self.drawItem(title, 'WatchedHistory', link, image=img, contextMenu=contextMenu, replaceMenu=False) + view_style('History') + xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True) + def List(self, params={}): db = ListDB() get = params.get diff --git a/Localization.py b/Localization.py index 0e34661..3c88151 100644 --- a/Localization.py +++ b/Localization.py @@ -175,6 +175,9 @@ def localize(text): 'Added!': 'Добавлено', 'Deleted!': 'Удалено!', 'Search History': 'История Поиска', + ' History ':' История ', + 'Torrent History':'История Торрентов', + 'Watched History':'История Просмотров', 'Favourites': 'Избранное', 'Favourites SH': 'Избранное ИП', 'Clear %s': 'Очистить %s', @@ -273,8 +276,13 @@ def localize(text): 'Please, restart Kodi now!':'Теперь перезагрузите Коди, пожалуйста!', './ (Root folder)':'./ (Корневой каталог)', 'Opening torrent file':'Открытие torrent-файла', - 'New player to Torrenter v2 - Torrent2HTTP! It can be enabled in settings.':'В Torrenter новый плеер - Torrent2HTTP! Включить его можно в настройках.', - 'It should be faster, stable and better with Android, also seeking works in it.':'Он стабильнее, быстрее и отлично ладит с Android, в нем работает перемотка.', + 'New player to Torrenter v2 - Torrent2HTTP! It should be faster, stable and better with Android, also seeking works in it.':'В Torrenter новый плеер - Torrent2HTTP! Он стабильнее, быстрее и отлично ладит с Android, в нем работает перемотка.', + 'Would you like to try it?':'Хотите его попробовать?', + 'Torrent2HTTP enabled! Can be changed in Settings.':'Torrent2HTTP включен! Можно изменить в Настройках.', + 'Seeking':'Перемотка', + 'Would you like to resume from %s?':'Хотите начать проигрывать с %s?', + 'Seeking is working only with player Torrent2HTTP.':'Перемотка работает только с плеером Torrent2HTTP.', + }, 'uk': { 'Seeds searching.': 'Йде пошук сідів.', diff --git a/addon.xml b/addon.xml index a652855..67f2519 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/functions.py b/functions.py index 40d294c..c77de70 100644 --- a/functions.py +++ b/functions.py @@ -1000,6 +1000,102 @@ class HistoryDB: self.db.close() +class WatchedHistoryDB: + def __init__(self, version=1.2): + self.name = 'watched_history.db3' + self.version = version + self.history_bool = __settings__.getSetting('history') == 'true' + + def get_all(self): + self._connect() + self.cur.execute('select addtime,filename,path,url,seek,length,ind,size from history order by addtime DESC') + x = self.cur.fetchall() + self._close() + return x if x else None + + def get(self, get, by, equal): + self._connect() + self.cur.execute('select '+get+' from history where '+by+'="' + equal + '"') + x = self.cur.fetchone() + self._close() + return x if x else None + + def add(self, filename, seek = 0, length = 1, ind = 0, size = 0): + if self.history_bool: + self._connect() + url = __settings__.getSetting("lastTorrentUrl") + path = __settings__.getSetting("lastTorrent") + self.cur.execute('delete from history where filename="' + decode(filename) + '"') + self.cur.execute('insert into history(addtime,filename,path,url,seek,length,ind,size)' + ' values(?,?,?,?,?,?,?,?)', (int(time.time()), decode(filename), decode(path), + decode(url), str(int(seek)), str(int(length)), str(ind), str(size))) + self.db.commit() + self._close() + + def update(self, what, to, by, equal): + self._connect() + self.cur.execute('UPDATE history SET '+what+' = ' + to + ' where '+by+'=' + equal) + self.db.commit() + self._close() + + def delete(self, addtime): + self._connect() + self.cur.execute('delete from history where addtime="' + addtime + '"') + self.db.commit() + self._close() + + def clear(self): + self._connect() + self.cur.execute('delete from history') + self.db.commit() + self._close() + + def _connect(self): + dirname = xbmc.translatePath('special://temp') + for subdir in ('xbmcup', 'plugin.video.torrenter'): + dirname = os.path.join(dirname, subdir) + if not xbmcvfs.exists(dirname): + xbmcvfs.mkdir(dirname) + + self.filename = os.path.join(dirname, self.name) + + first = False + if not xbmcvfs.exists(self.filename): + first = True + + self.db = sqlite.connect(self.filename, check_same_thread=False) + if not first: + self.cur = self.db.cursor() + try: + self.cur.execute('select version from db_ver') + row = self.cur.fetchone() + if not row or float(row[0]) != self.version: + self.cur.execute('drop table history') + self.cur.execute('drop table if exists db_ver') + first = True + self.db.commit() + self.cur.close() + except: + self.cur.execute('drop table history') + first = True + self.db.commit() + self.cur.close() + + if first: + cur = self.db.cursor() + cur.execute('pragma auto_vacuum=1') + cur.execute('create table db_ver(version real)') + cur.execute( + 'create table history(addtime integer PRIMARY KEY, filename varchar(32), path varchar(32), url varchar(32), seek integer, length integer, ind integer, size integer)') + cur.execute('insert into db_ver(version) values(?)', (self.version,)) + self.db.commit() + cur.close() + self.cur = self.db.cursor() + + def _close(self): + self.cur.close() + self.db.close() + class Searchers(): def __init__(self): pass @@ -1637,10 +1733,43 @@ def first_run_231(): xbmc.executebuiltin('Dialog.Close(all,true)') xbmc.executebuiltin('XBMC.ActivateWindow(Addonbrowser,addons://search/%s)' % ('Torrenter Searcher')) -def first_run_241(): - ok = xbmcgui.Dialog().ok('< %s >' % Localization.localize('Torrenter Update ') + '2.4.1', - Localization.localize('New player to Torrenter v2 - Torrent2HTTP! It can be enabled in settings.'), - Localization.localize('It should be faster, stable and better with Android, also seeking works in it.')) +def first_run_242(): + if __settings__.getSetting('torrent_player')=='2': + __settings__.setSetting('first_run_242','True') + + if not __settings__.getSetting('first_run_242')=='True': + __settings__.setSetting('first_run_242','True') + yes=xbmcgui.Dialog().yesno('< %s >' % (Localization.localize('Torrenter Update ') + '2.4.2'), + Localization.localize('New player to Torrenter v2 - Torrent2HTTP! It should be faster, ' + 'stable and better with Android, also seeking works in it.'), + Localization.localize('Would you like to try it?'),) + if yes: + __settings__.setSetting('torrent_player','2') + ok = xbmcgui.Dialog().ok('< %s >' % (Localization.localize('Torrenter Update ') + '2.4.2'), + Localization.localize('Torrent2HTTP enabled! Can be changed in Settings.')) + +def seeking_warning(seek): + if __settings__.getSetting('torrent_player')=='2': + seek_point = '%02d:%02d:%02d' % ((seek / (60*60)), (seek / 60) % 60, seek % 60) + yes=xbmcgui.Dialog().yesno('< %s >' % (Localization.localize('Seeking')), + Localization.localize('Would you like to resume from %s?') % seek_point,) + if yes: + log('[seeking_warning]: yes, seek = '+str(seek)) + return seek + else: + log('[seeking_warning]: no, seek = '+str(0)) + return 0 + else: + if not __settings__.getSetting('seeking_warning')=='True': + __settings__.setSetting('seeking_warning','True') + yes=xbmcgui.Dialog().yesno('< %s >' % (Localization.localize('Seeking')), + Localization.localize('Seeking is working only with player Torrent2HTTP.'), + Localization.localize('Would you like to try it?')) + if yes: + __settings__.setSetting('torrent_player','2') + ok = xbmcgui.Dialog().ok('< %s >' % (Localization.localize('Seeking')), + Localization.localize('Torrent2HTTP enabled! Can be changed in Settings.')) + return seek def noActiveSerachers(): yes=xbmcgui.Dialog().yesno('< %s >' % Localization.localize('Torrenter v2'),