From cd830f16674571459ca327a76ed87975543185bd Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sun, 11 Dec 2016 01:13:58 +0300 Subject: [PATCH] watched history --- Core.py | 3 +- Localization.py | 4 +- SkorbaLoader.py | 19 +- icons/searchwindow/button.psd | Bin 917812 -> 983334 bytes searchwindow.py | 332 ++++++++++++++++++++++++---------- 5 files changed, 251 insertions(+), 107 deletions(-) diff --git a/Core.py b/Core.py index 0bb1284..57b3c47 100644 --- a/Core.py +++ b/Core.py @@ -523,7 +523,7 @@ class Core: self.__settings__.setSetting("lastTorrent", path) xbmc.executebuiltin( 'XBMC.ActivateWindow(%s)' % 'Videos,plugin://plugin.video.torrenter/?action=%s&url=%s' - % ('torrentPlayer', path)) + % ('torrentPlayer', path.encode('utf-8'))) if action2 == 'playnoseek' or action2 == 'playwithseek': filename, path, url, seek, length, ind = db.get('filename, path, url, seek, length, ind', 'addtime', str(addtime)) @@ -1837,7 +1837,6 @@ class Core: int(self.__settings__.getSetting("download_limit")) * 1000000 / 8) #MBits/second torrent.downloadProcess(ind, encryption) showMessage(self.localize('Download Status'), self.localize('Added!')) - xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True) def titleMake(self, seeds, leechers, size, title): diff --git a/Localization.py b/Localization.py index 135c1ec..9d963e0 100644 --- a/Localization.py +++ b/Localization.py @@ -809,6 +809,8 @@ def localize(text): 'Play (from start)':'Lejátszás (az elejétől)', }, 'ru': { + 'Clear History': 'Очистить Историю', + 'Play (with seek)': 'Играть (перемотка)', 'Mass Control':'Массовое Управление', 'Info':'Инфо', 'Delete torrent with files?':'Вы уверены, что хотите удалить торрент с файлами?', @@ -900,7 +902,7 @@ def localize(text): 'Checking preloaded files...': 'Проверка файлов...', 'Waiting for website response...': 'Ожидание ответа сайта...', 'Search and cache information for:': 'Поиск и кэширование информации для:', - 'Open Torrent': 'Открыть Список файлов', + 'Open Torrent': 'Открыть Торрент', 'Torrent list is empty.': 'Список раздач пуст.', 'Content Lists': 'Списки Медиа', 'Canceled by User': 'Отменено пользователем', diff --git a/SkorbaLoader.py b/SkorbaLoader.py index 6dd3534..e23e6ef 100644 --- a/SkorbaLoader.py +++ b/SkorbaLoader.py @@ -32,7 +32,7 @@ import xbmcgui import xbmcvfs import Localization from functions import isSubtitle, DownloadDB, log, debug, is_writable,\ - vista_check, windows_check, localize_path + vista_check, windows_check, localize_path, decode_str class SkorbaLoader: magnetLink = None @@ -127,7 +127,7 @@ class SkorbaLoader: return if not xbmcvfs.exists(self.torrentFilesPath): xbmcvfs.mkdirs(self.torrentFilesPath) - newFile = self.torrentFilesPath + self.md5(torrentUrl) + '.torrent' + newFile = localize_path(self.torrentFilesPath + self.md5(torrentUrl) + '.torrent') if newFile != torrentFile: if xbmcvfs.exists(newFile): xbmcvfs.delete(newFile) @@ -285,12 +285,12 @@ class SkorbaLoader: if len(ContentList) == 1 or contentId not in [None, -1]: if not contentId: contentId = 0 title = os.path.basename(ContentList[contentId]['title']) - path = os.path.join(self.storageDirectory, localize_path(ContentList[contentId]['title'])) + path = localize_path(os.path.join(self.storageDirectory, ContentList[contentId]['title'])) type = 'file' else: contentId = -1 title = ContentList[0]['title'].split('\\')[0] - path = os.path.join(self.storageDirectory, title) + path = localize_path(os.path.join(self.storageDirectory, title)) type = 'folder' add = db.add(title, path, type, {'progress': 0}, 'downloading', self.torrentFile, contentId, @@ -307,11 +307,18 @@ class SkorbaLoader: thread.start_new_thread(self.downloadLoop, (title,)) def downloadLoop(self, title): + log(title) db = DownloadDB() status = 'downloading' while db.get(title) and status != 'stopped': xbmc.sleep(3000) + log('status 1 '+status) status = db.get_status(title) + log('status 2 ' + status) + if status == 'stopped': + xbmc.sleep(10000) + status = db.get_status(title) + log('status 3 ' + status) if not self.paused: if status == 'pause': self.paused = True @@ -329,7 +336,9 @@ class SkorbaLoader: iterator = int(s.progress * 100) info['progress'] = iterator db.update(title, info) - #self.debug() + log(title+str(info)) + self.debug() + log('out of downloadLoop') self.session.remove_torrent(self.torrentHandle) return diff --git a/icons/searchwindow/button.psd b/icons/searchwindow/button.psd index feaf4c6f48a1d687267490cb68707184cd2124f2..2965a22dcf012b0336d8a5539cef75b1631f7f8c 100644 GIT binary patch delta 93193 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 N{+RoCzrOhJ{{g?b;6MNX delta 29997 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 3*60 else 0 + 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)) + clDimgray = '[COLOR FF696969]%s[/COLOR]' + clWhite = '[COLOR FFFFFFFF]%s[/COLOR]' + + title = clWhite % title + chr(10) + clDimgray % '(%s)' % foldername.encode('utf-8') + + if watchedPercent >= 85: + img = __root__ + '/icons/stop-icon.png' + else: + img = __root__ + '/icons/pause-icon.png' + + + link = {'mode': 'watched_item', 'addtime': str(addtime)} + self.drawItem(title, link, image=img) + + + def watched_action(self, action, addtime): + db = WatchedHistoryDB() + + if action == 'delete': + db.delete(addtime) + showMessage(self.localize('Watched History'), self.localize('Deleted!')) + self.watched() + + if action == 'open': + filename, foldername, path, url, seek, length, ind = db.get('filename, foldername, path, url, seek, length, ind', 'addtime', str(addtime)) + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.watched) + self.open_torrent(path.encode('utf-8')) + + if action == 'playnoseek' or action == 'playwithseek': + filename, path, url, seek, length, ind = db.get('filename, path, url, seek, length, ind', 'addtime', str(addtime)) + + if action == 'playwithseek': + seek = int(seek) + else: + seek = 0 + + if os.path.exists(path): + __settings__.setSetting("lastTorrent", path) + else: + from Downloader import Downloader + torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) + __settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) + xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url='+str(ind)+'&seek='+str(seek)+'")') + self.close() + + if action == 'clear': + db.clear() + showMessage(self.localize('Watched History'), self.localize('Clear!')) + self.watched() + def browser(self, hash = None, tdir = None): from resources.utorrent.net import Download self.listing.reset() @@ -345,8 +418,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): folder = data['dir'] break if isRemoteTorr(): - torrent_dir = self.__settings__.getSetting("torrent_dir") - torrent_replacement = self.__settings__.getSetting("torrent_replacement") + torrent_dir = __settings__.getSetting("torrent_dir") + torrent_replacement = __settings__.getSetting("torrent_replacement") empty = [None, ''] if torrent_dir in empty or torrent_replacement in empty: if xbmcgui.Dialog().yesno( @@ -355,7 +428,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.localize('For example /media/dl_torr/ to smb://SERVER/dl_torr/. Setup now?')): if torrent_dir in empty: torrent_dir() - self.__settings__.openSettings() + __settings__.openSettings() return folder = folder.replace(torrent_dir, torrent_replacement) @@ -414,41 +487,41 @@ class SearchWindow(pyxbmct.AddonDialogWindow): db = DownloadDB() items = db.get_all() + if items: + for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: + jsoninfo = json.loads(urllib.unquote_plus(info)) - for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: - jsoninfo = json.loads(urllib.unquote_plus(info)) + if status != 'stopped' and int(lastupdate) < int(time.time()) - 10: + status = 'stopped' + db.update_status(addtime, status) - if status != 'stopped' and int(lastupdate) < int(time.time()) - 10: - status = 'stopped' - db.update_status(addtime, status) - - progress = int(jsoninfo.get('progress')) - if status == 'pause': - status_sign = '[||]' - img = os.path.join(__root__, 'icons', 'pause-icon.png') - elif status == 'stopped': - status_sign = '[X]' - img = os.path.join(__root__, 'icons', 'stop-icon.png') - else: - status_sign = '[>]' - if progress == 100: - img = os.path.join(__root__, 'icons', 'upload-icon.png') + progress = int(jsoninfo.get('progress')) + if status == 'pause': + status_sign = '[||]' + img = os.path.join(__root__, 'icons', 'pause-icon.png') + elif status == 'stopped': + status_sign = '[X]' + img = os.path.join(__root__, 'icons', 'stop-icon.png') else: - img = os.path.join(__root__, 'icons', 'download-icon.png') + status_sign = '[>]' + if progress == 100: + img = os.path.join(__root__, 'icons', 'upload-icon.png') + else: + img = os.path.join(__root__, 'icons', 'download-icon.png') - title = '[%d%%]%s %s' % (progress, status_sign, title) - if jsoninfo.get('seeds') != None and jsoninfo.get('peers') != None and \ - jsoninfo.get('download') != None and jsoninfo.get('upload') != None: - d, u = float(jsoninfo['download']) / 1000000, float(jsoninfo['upload']) / 1000000 - s, p = str(jsoninfo['seeds']), str(jsoninfo['peers']) - second = '[D/U %.2f/%.2f (MB/s)][S/L %s/%s]' % (d, u, s, p) - title = dlstat_titleMake('[B]%s[/B]' % title if type == 'folder' else title, second) + title = '[%d%%]%s %s' % (progress, status_sign, title) + if jsoninfo.get('seeds') != None and jsoninfo.get('peers') != None and \ + jsoninfo.get('download') != None and jsoninfo.get('upload') != None: + d, u = float(jsoninfo['download']) / 1000000, float(jsoninfo['upload']) / 1000000 + s, p = str(jsoninfo['seeds']), str(jsoninfo['peers']) + second = '[D/U %.2f/%.2f (MB/s)][S/L %s/%s]' % (d, u, s, p) + title = dlstat_titleMake('[B]%s[/B]' % title if type == 'folder' else title, second) - params = {'addtime': addtime, 'type': type, 'path': urllib.quote_plus(path.encode('utf-8')), - 'status': status, 'progress': progress, 'storage': storage} - params['mode'] = 'downloadstatus_subfolder' if type == 'folder' else 'downloadstatus_file' + params = {'addtime': addtime, 'type': type, 'path': path, + 'status': status, 'progress': progress, 'storage': storage} + params['mode'] = 'downloadstatus_subfolder' if type == 'folder' else 'downloadstatus_file' - self.drawItem(title, params, image=img, isFolder=type == 'folder') + self.drawItem(title, params, image=img, isFolder=type == 'folder') # def drawItem(self, title, params, image = None, isFolder = False): if self.listing.size(): @@ -457,89 +530,121 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.setFocus(self.button_downloadstatus) return - def file_browser(self, path, tdir): - - self.listing.reset() - self.right_menu('file_browser') - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.downloadstatus) - - self.drawItem('..', {'mode': 'moveup', 'path': path, 'tdir': tdir}, isFolder=True) - - path = urllib.unquote_plus(path) - dirs, files = xbmcvfs.listdir(path + os.sep) - if len(dirs) > 0: - for dir in dirs: - link = {'mode': 'subfolder', 'path': path, 'tdir': os.path.join(tdir, dir)} - self.drawItem(dir, link, isFolder=True) - for file in files: - link = {'mode': 'file', 'path': path, 'tdir': os.path.join(tdir, file)} - self.drawItem(file, link, isFolder=False) - def downloadstatus_action(self, action, addtime, path, type, progress, storage): db = DownloadDB() if action == 'play': - if type == 'file' and progress > 30: - xbmc.Player().play(urllib.unquote_plus(path)) - elif type == 'folder' and progress == 100: - self.file_browser(path, path) + if type == 'file' and progress > 30 or progress == 100: + self.file_browser(type, path, path) else: showMessage(self.localize('Download Status'), self.localize('Download has not finished yet')) - if action == 'delete': + elif action == 'delete': db.delete(addtime) showMessage(self.localize('Download Status'), self.localize('Stopped and Deleted!')) - if action == 'pause': + elif action == 'pause': db.update_status(addtime, 'pause') showMessage(self.localize('Download Status'), self.localize('Paused!')) - if action == 'stop': + elif action == 'stop': db.update_status(addtime, 'stopped') showMessage(self.localize('Download Status'), self.localize('Stopped!')) - if action == 'start': - if 'status' == 'pause': + elif action == 'start': + start = db.get_byaddtime(addtime) + if start[5] == 'pause': db.update_status(addtime, 'downloading') showMessage(self.localize('Download Status'), self.localize('Unpaused!')) else: - start = db.get_byaddtime(addtime) torrent, ind = start[6], start[7] - start_exec = 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s&ind=%s&storage=%s') % ( - sys.argv[0], 'downloadLibtorrent', urllib.quote_plus(torrent.encode('utf-8')), str(ind), storage) - xbmc.executebuiltin(start_exec) + + from Core import Core + params = {'url': torrent.encode('utf-8'), + 'ind': str(ind), 'storage': storage.encode('utf-8')} + + del db + + import SkorbaLoader + __settings__.setSetting("lastTorrent", torrent.encode('utf-8')) + torrent = SkorbaLoader.SkorbaLoader(storage.encode('utf-8'), torrent.encode('utf-8')) + encryption = __settings__.getSetting('encryption') == 'true' + torrent.downloadProcess(str(ind), encryption) + #start_exec = self.form_link('downloadLibtorrent', + # {'url': torrent.encode('utf-8'), + # 'ind': str(ind), 'storage': storage.encode('utf-8')}) + #log(start_exec) + #xbmc.executebuiltin('XBMC.RunPlugin(%s)' % start_exec) showMessage(self.localize('Download Status'), self.localize('Started!')) - if action == 'startall': - items = db.get_all() - if items: - for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: - start_exec = 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s&ind=%s&storage=%s') % ( - sys.argv[0], 'downloadLibtorrent', urllib.quote_plus(torrent.encode('utf-8')), str(ind), - urllib.quote_plus(storage.encode('utf-8'))) - xbmc.executebuiltin(start_exec) - xbmc.sleep(1000) - showMessage(self.localize('Download Status'), self.localize('Started All!')) + elif action == 'masscontrol': + dialog_items = [self.localize('Start All'), self.localize('Stop All'), + self.localize('Clear %s') % self.localize('Download Status'), self.localize('Cancel')] + ret = xbmcgui.Dialog().select(self.localize('Mass Control'), dialog_items) + if ret == 0: + items = db.get_all() + if items: + for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: + start_exec = self.form_link('downloadLibtorrent', + {'url':torrent.encode('utf-8'), + 'ind':str(ind), 'storage':storage.encode('utf-8')}) + log(start_exec) + xbmc.executebuiltin('XBMC.RunScript(%s)' % start_exec) + xbmc.sleep(1000) + showMessage(self.localize('Download Status'), self.localize('Started All!')) + elif ret == 1: + items = db.get_all() + if items: + for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: + db.update_status(addtime, 'stopped') + xbmc.sleep(1000) + showMessage(self.localize('Download Status'), self.localize('Stopped All!')) + elif ret == 2: + db.clear() + showMessage(self.localize('Download Status'), self.localize('Clear!')) - if action == 'stopall': - items = db.get_all() - if items: - for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: - db.update_status(addtime, 'stopped') - xbmc.sleep(1000) - showMessage(self.localize('Download Status'), self.localize('Stopped All!')) + xbmc.sleep(1000) + self.downloadstatus() - if action == 'clear': - db.clear() - showMessage(self.localize('Download Status'), self.localize('Clear!')) + def file_browser(self, mode, path, tdir): + + path = encode_msg(path) + tdir = encode_msg(tdir) + + self.listing.reset() + if tdir == os.path.dirname(path): + self.downloadstatus() + elif mode == 'file': + xbmc.Player().play(localize_path(tdir)) + self.close() + else: + self.right_menu('file_browser') + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.downloadstatus) + + self.drawItem('..', {'mode': 'moveup', 'path': path, + 'tdir': os.path.dirname(tdir)}, isFolder=True) + + dirs, files = xbmcvfs.listdir(tdir + os.sep) + if len(dirs) > 0: + for dir in dirs: + link = {'mode': 'subfolder', 'path': path, 'type': 'folder', + 'tdir': os.path.join(tdir, dir)} + self.drawItem(dir, link, isFolder=True) + for file in files: + link = {'mode': 'file', 'path': path, 'type': 'file', + 'tdir': os.path.join(tdir, file)} + self.drawItem(file, link, isFolder=False) + if self.listing.size(): + self.setFocus(self.listing) + else: + self.setFocus(self.button_downloadstatus) def open_torrent(self, link, tdir=None): # cache if link != self.last_link: self.contentList = get_contentList(link) self.last_link = link - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.search) dirList, contentListNew = cutFolder(self.contentList, tdir) @@ -585,7 +690,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.localize('Individual Tracker Options'), self.localize('Fav. / Unfav.'), self.localize('Delete')] - elif mode in ['browser', 'browser_item']: label_list = [self.localize('Open'), self.localize('Start'), self.localize('Stop'), self.localize('Remove'), self.localize('High Priority'), @@ -604,6 +708,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif mode in ['downloadstatus_file']: label_list = [self.localize('Play'), self.localize('Start'), self.localize('Pause'), self.localize('Stop'), self.localize('Delete'), self.localize('Mass Control'),] + elif mode in ['watched', 'watched_item']: + label_list = [self.localize('Open Torrent'), self.localize('Play (from start)'), + self.localize('Play (with seek)'), self.localize('Delete'), self.localize('Clear History'), ] return label_list def context(self): @@ -738,6 +845,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): tdir = params.get('tdir') self.listing.reset() if mode in ['search_item', 'torrent_subfolder']: + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.search) self.open_torrent(filename, tdir) elif mode == 'torrent_moveup': self.search() @@ -750,13 +858,18 @@ class SearchWindow(pyxbmct.AddonDialogWindow): addtime = params.get('addtime') self.input_search.setText(filename) self.search(addtime) - elif mode in ['browser_item', 'browser_subfolder']: - self.browser(hash, tdir) - elif mode == 'browser_moveup': + elif mode in ['browser_item', 'browser_subfolder', 'browser_moveup']: self.browser(hash, tdir) elif mode == 'browser_file': self.browser_action(hash, 'play', tdir = tdir, ind = ind) self.close() + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('play', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) + elif mode in ['moveup', 'subfolder', 'file']: + self.file_browser(params.get('type'), params.get('path'), tdir) + elif mode == 'watched_item': + self.watched_action('open', params.get('addtime')) def right_press2(self): item = self.listing.getSelectedItem() @@ -785,6 +898,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.browser_action(hash, '3', tdir=tdir, ind=ind) elif mode == 'browser_file': self.browser_action(hash, '3', tdir=tdir, ind=ind) + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('start', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) + elif mode == 'watched_item': + self.watched_action('playnoseek', params.get('addtime')) def right_press3(self): item = self.listing.getSelectedItem() @@ -813,6 +931,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.browser_action(hash, '0', tdir=tdir, ind=ind) elif mode == 'browser_file': self.browser_action(hash, '0', tdir=tdir, ind=ind) + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('pause', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) + elif mode == 'watched_item': + self.watched_action('playwithseek', params.get('addtime')) def right_press4(self): item = self.listing.getSelectedItem() @@ -837,6 +960,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.browser() elif mode == 'browser_subfolder': self.browser_action(hash, 'copy', tdir=tdir, ind=ind) + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('stop', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) + elif mode == 'watched_item': + self.watched_action('delete', params.get('addtime')) def right_press5(self): item = self.listing.getSelectedItem() @@ -850,6 +978,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.history_action('delete', addtime, fav) elif mode == 'browser_item': self.browser_action(hash, '3') + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('delete', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) + elif mode == 'watched_item': + self.watched_action('clear', params.get('addtime')) def right_press6(self): item = self.listing.getSelectedItem() @@ -859,6 +992,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): hash = params.get('hash') if mode == 'browser_item': self.browser_action(hash, '0') + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('masscontrol', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) def right_press7(self): item = self.listing.getSelectedItem() @@ -955,7 +1091,6 @@ class InfoWindow(pyxbmct.AddonDialogWindow): self.logoimg.setImage(meta.get('thumbnail')) self.plot.setText(meta.get('plot')) - def log(msg): try: xbmc.log("### [%s]: %s" % (__plugin__, msg,), level=xbmc.LOGNOTICE) @@ -964,7 +1099,6 @@ def log(msg): except: xbmc.log("### [%s]: %s" % (__plugin__, 'ERROR LOG',), level=xbmc.LOGNOTICE) - def titleMake(seeds, leechers, size, title): # AARRGGBB clGreen = '[COLOR FF008000]%s[/COLOR]'