![]() |
|
![]() |
#201 |
Senior Member
Регистрация: 11.12.2009
Адрес: Russia
Сообщений: 2,184
|
![]()
Ниче не понял, но интересно...)))
__________________
Dune HD TV-102/Pioneer VSX-520-K/Samsung ES6727 ВИКИ Настройка DSPlayer: http://xbmc.ru/wiki/index.php?title=Настройка_DSPlayer DSPlayer поддержка ускорения GPU: http://xbmc.ru/forum/showthread.php?t=12 XBMC+SVP: http://habrahabr.ru/post/181598/ Крипто-робот, бонус за регистрацию, оплата за результат: https://apitrade.pro/bonus_xbmcru.htm |
![]() |
![]() |
![]() |
#202 |
Senior Member
Регистрация: 08.03.2013
Сообщений: 126
|
![]()
вот внедрение http интерфейса
теперь acestream понимает ссылки http://127.0.0.1:6878/LOAD/PID=21a3d...192755b518a9a0 http://127.0.0.1:6878/LOAD/TORRENT=h...cience.acelive ACEStream/Plugin/BackgroundProcess.py Код:
@@ -150,7 +151,7 @@ def __init__(self, wrapper, redirectstderrout, appname, appversion, params, inst self.videoHTTPServer = VideoHTTPServer(self.httpport) if DEBUG_TIME: print >> sys.stderr, '>>>time:bg:init: VideoHTTPServer created', time.clock() - self.videoHTTPServer.register(self.videoservthread_error_callback, self.videoservthread_set_status_callback) + self.videoHTTPServer.register(self.videoservthread_error_callback, self.videoservthread_set_status_callback, self.videoservthread_load_torr) if DEBUG_TIME: print >> sys.stderr, '>>>time:bg:init: VideoHTTPServer registered', time.clock() BaseApp.__init__(self, wrapper, redirectstderrout, appname, appversion, params, installdir, i2i_port, session_port) @@ -1764,7 +1765,58 @@ def videoserver_error_guicallback(self, e, url): def videoservthread_set_status_callback(self, status): videoserver_set_status_guicallback_lambda = lambda : self.videoserver_set_status_guicallback(status) self.run_delayed(videoserver_set_status_guicallback_lambda) + + + def videoservthread_load_torr(self, t_type, t_str): + if DEBUG: + log('bg::loading %s %s' % (t_type, t_str)) + ic = BGInstanceConnection2(self, self.videoHTTPServer) + content_id = t_str + if t_type == 'TORRENT': + content_id_type = CONTENT_ID_TORRENT_URL + elif t_type == 'INFOHASH': + content_id_type = CONTENT_ID_INFOHASH + elif t_type == 'PID': + content_id_type = CONTENT_ID_PLAYER + elif t_type == 'RAW': + content_id_type = CONTENT_ID_RAW + else: + log('bg::cmd: unknown type:', content_id_type) + raise ValueError('Unformatted LOAD command') + developer_id = 0 + affiliate_id = 0 + zone_id = 0 + position = 0 + quality_id = 0 + fileindex = 0 + extra_file_indexes = 0 + try: + ret = self.load_torrent(ic, content_id_type, content_id, developer_id, affiliate_id, zone_id) + files = [] + for x in ret['files']: + try: + urlencoded_name = urllib.quote(x[0].encode('utf-8')) + except: + print_exc() + urlencoded_name = '' + index = x[1] + files.append([urlencoded_name, index]) + except Exception as e: + log("bg: error ", e) + + player_data = self.get_torrent(content_id_type, content_id, quality_id) + if player_data is None: + raise ValueError, 'Cannot retrieve torrent' + if player_data.has_key('developer_id'): + developer_id = player_data['developer_id'] + if player_data.has_key('affiliate_id'): + affiliate_id = player_data['affiliate_id'] + if player_data.has_key('zone_id'): + zone_id = player_data['zone_id'] + + self.get_torrent_start_download(ic, player_data['tdef'], fileindex, extra_file_indexes, developer_id, affiliate_id, zone_id, position) @@ -2191,6 +2242,117 @@ def shutdown(self, shutdownplugin = True): except: log_exc() +class BGInstanceConnection2: + def __init__(self, connhandler, videoHTTPServer): + self.bgapp = connhandler + self.videoHTTPServer = videoHTTPServer + self.urlpath = None + self.cstreaminfo = {} + self.shutteddown = False + self.supportedvodevents = [VODEVENT_START, VODEVENT_PAUSE, VODEVENT_RESUME] + self.ready = False + self.last_message_id = 0 + self.last_message_text = '' + self.reported_events = {} + self.videoHTTPServer.url_is_set = 0 + self.videoHTTPServer.ic = self + + + def set_streaminfo(self, streaminfo, count_read_bytes = False): + self.cstreaminfo.update(streaminfo) + stream = streaminfo['stream'] + self.cstreaminfo['stream'] = ControlledStream(stream, count_read_bytes) + + def start_playback(self, infohash, is_ad, is_interruptable_ad = False, position = 0, is_live = False, extension = None, click_url = None): + self.urlpath = URLPATH_CONTENT_PREFIX + '/' + infohash2urlpath(infohash) + '/' + str(random.random()) + if extension is not None: + self.urlpath += '.' + extension + streaminfo = copy.copy(self.cstreaminfo) + self.videoHTTPServer.set_inputstream(streaminfo, self.urlpath) + + def cleanup_playback(self): + if DEBUG: + log('bg::cleanup_playback') + if len(self.cstreaminfo) != 0: + if DEBUG2: + log('bg::cleanup_playback: close stream, cstreaminfo', self.cstreaminfo) + self.cstreaminfo['stream'].close() + try: + urlpath_copy = self.urlpath + http_del_inputstream_lambda = lambda : self.videoHTTPServer.del_inputstream(urlpath_copy) + if DEBUG2: + log('bg::cleanup_playback: schedule input stream deletion: url', urlpath_copy) + self.bgapp.tqueue.add_task(http_del_inputstream_lambda) + except: + log_exc() + + def pause(self): + return + + def resume(self): + return + + def info(self, message_text, message_id = 0, force = False): + if DEBUG2: + log('bg:ic:info: message_id', message_id, 'message_text', message_text) + if force or message_id != self.last_message_id or message_text != self.last_message_text: + self.last_message_id = message_id + self.last_message_text = message_text + + def status(self, main_status, ad_status = None): + return + + def error(self, errstr): + raise Exception, 'error() deprecated' + + def auth(self, authlevel): + return + + + def hello(self): + return + + def state(self, state): + if DEBUG: + log('STATE', state) + + def event(self, name, params = {}): + if DEBUG_EVENTS: + log('ic:event: name', name, 'params', params) + + def send_response(self, response, mark_as_retval = True): + if mark_as_retval: + response = '##' + response + if DEBUG: + log('BGInstanceConnection::send_response: ', response) + + def send_load_response(self, request_id, response): + if DEBUG: + log('ic::send_load_response: request_id', request_id, 'response', response) + + def searchurl(self, searchurl): + log('SENDING SEARCHURL 2 PLUGIN') + + def close(self): + self = None + + def stop(self): + if DEBUG: + log("ic::got command stop") + self.bgapp.gui_connection_lost(self, switchp2ptarget=True) + + def shutdown(self, shutdownplugin = True): + if DEBUG: + log('bg: Shutting down: shutdownplugin', shutdownplugin) + if not self.shutteddown: + self.shutteddown = True + self.cleanup_playback() + if shutdownplugin: + try: + self.close() + except: + log_exc() + ACEStream/Video/VideoServer.py Код:
@@ -63,6 +63,9 @@ def __init__(self, port): self.mappers = [] self.errorcallback = None self.statuscallback = None + self.ic = None + self.load_torr = None + self.url_is_set = 0 @@ -77,10 +80,11 @@ def background_serve(self): self.thread2.setDaemon(True) self.thread2.start() - def register(self, errorcallback, statuscallback): + def register(self, errorcallback, statuscallback, load_torr): self.errorcallback = errorcallback self.statuscallback = statuscallback + self.load_torr = load_torr @@ -92,6 +96,7 @@ def set_inputstream(self, streaminfo, urlpath): streaminfo['lock'] = RLock() self.urlpath2streaminfo[urlpath] = streaminfo self.lock.release() + self.url_is_set = urlpath @@ -187,6 +192,218 @@ def log_message(self, format, *args): def do_GET(self): global DEBUG try: + if self.path.startswith('/LOAD'): + content_id = self.path.split("=")[1] + content_type = self.path.split("=")[0].split('/')[2] + self.server.load_torr(content_type, content_id) + t = 0 + while not self.server.url_is_set and t < 30: + t+=1 + time.sleep(1) + if DEBUG: + log('videoserv: do_GET: Got request', self.path, self.headers.getheader('range'), currentThread().getName()) + nbytes2send = None + nbyteswritten = 0 + try: + streaminfo = self.server.acquire_inputstream(self.server.url_is_set) + except: + streaminfo = None + + if self.request_version == 'HTTP/1.1': + self.protocol_version = 'HTTP/1.1' + try: + if streaminfo is None or 'statuscode' in streaminfo and streaminfo['statuscode'] != 200: + if streaminfo is None: + streaminfo = {'statuscode': 500, + 'statusmsg': "Internal Server Error, couldn't find resource"} + if DEBUG: + log('videoserv: do_GET: Cannot serve request', streaminfo['statuscode'], currentThread().getName()) + if streaminfo['statuscode'] == 301: + self.send_header('Location', streaminfo['statusmsg']) + self.end_headers() + else: + self.send_header('Content-Type', 'text/plain') + self.send_header('Content-Length', len(streaminfo['statusmsg'])) + self.end_headers() + self.wfile.write(streaminfo['statusmsg']) + return + mimetype = streaminfo['mimetype'] + stream = streaminfo['stream'] + length = streaminfo['length'] + if 'blocksize' in streaminfo: + blocksize = streaminfo['blocksize'] + else: + blocksize = 65536 + if 'svc' in streaminfo: + svc = streaminfo['svc'] + else: + svc = False + if DEBUG: + log('videoserv: do_GET: MIME type is', mimetype, 'length', length, 'blocksize', blocksize, currentThread().getName()) + firstbyte = 0 + if length is not None: + lastbyte = length - 1 + else: + lastbyte = None + range = self.headers.getheader('range') + if self.RANGE_REQUESTS_ENABLED and length and range: + bad = False + type, seek = string.split(range, '=') + if seek.find(',') != -1: + bad = True + else: + firstbytestr, lastbytestr = string.split(seek, '-') + firstbyte = bytestr2int(firstbytestr) + lastbyte = bytestr2int(lastbytestr) + if length is None: + bad = True + elif firstbyte is None and lastbyte is None: + bad = True + elif firstbyte >= length: + bad = True + elif lastbyte >= length: + if firstbyte is None: + lastbyte = length - 1 + else: + bad = True + if bad: + self.send_response(416) + if length is None: + crheader = 'bytes */*' + else: + crheader = 'bytes */' + str(length) + self.send_header('Content-Range', crheader) + self.end_headers() + return + if firstbyte is not None and lastbyte is None: + nbytes2send = length - firstbyte + lastbyte = length - 1 + elif firstbyte is None and lastbyte is not None: + nbytes2send = lastbyte + firstbyte = length - lastbyte + lastbyte = length - 1 + else: + nbytes2send = lastbyte + 1 - firstbyte + crheader = 'bytes ' + str(firstbyte) + '-' + str(lastbyte) + '/' + str(length) + if DEBUG: + log('VideoServer::do_Get: send response 206,', crheader) + self.send_response(206) + self.send_header('Content-Range', crheader) + else: + nbytes2send = length + self.send_response(200) + if DEBUG: + log('videoserv: do_GET: final range', firstbyte, lastbyte, nbytes2send, currentThread().getName()) + if not svc: + try: + stream.seek(firstbyte) + except: + log_exc() + + if self.request_version == 'HTTP/1.1': + self.send_header('Connection', 'Keep-Alive') + self.send_header('Keep-Alive', 'timeout=15, max=100') + self.send_header('Content-Type', mimetype) + self.send_header('Accept-Ranges', 'bytes') + try: + if streaminfo.has_key('bitrate') and streaminfo['bitrate'] is not None and length is not None: + bitrate = streaminfo['bitrate'] + estduration = float(length) / float(bitrate) + self.send_header('X-Content-Duration', estduration) + except: + log_exc() + + if length is not None: + self.send_header('Content-Length', nbytes2send) + else: + self.send_header('Transfer-Encoding', 'chunked') + self.end_headers() + if svc: + data = stream.read() + if len(data) > 0: + self.wfile.write(data) + elif len(data) == 0: + if DEBUG: + log('videoserv: svc: stream.read() no data') + else: + done = False + while True: + tt = time.time() + data = stream.read(blocksize) + data_len = len(data) + if data_len == 0: + done = True + tt = time.time() - tt + if DEBUG: + log('videoserver::get: read done: blocksize', blocksize, 'length', length, 'len(data)', data_len, 'time', tt, 'thread', currentThread().getName()) + if length is None: + self.wfile.write('%x\r\n' % data_len) + if data_len > 0: + tt = time.time() + if length is not None and nbyteswritten + data_len > nbytes2send: + endlen = nbytes2send - nbyteswritten + if endlen != 0: + self.wfile.write(data[:endlen]) + done = True + nbyteswritten += endlen + else: + try: + playback_started = stream.stream.mt.playback_started + bitrate = stream.stream.mt.videostatus.bitrate + except: + playback_started = False + bitrate = None + + if bitrate is None: + try: + self.wfile.write(data) + except: + raise ConnectionResetError() + + else: + delay = 0.01 + speed = bitrate * 8 + chunk_size = bitrate + pos = 0 + while pos < data_len: + chunk = data[pos:pos + chunk_size] + try: + self.wfile.write(chunk) + except: + raise ConnectionResetError() + + if DEBUG: + log('videoserver::get: write chunk: pos', pos, 'chunk_size', chunk_size, 'delay', delay, 'speed', speed, 'thread', currentThread().getName()) + pos += chunk_size + + nbyteswritten += data_len + if DEBUG: + log('videoserver::get: write done: nbyteswritten', nbyteswritten, 'time', time.time() - tt, 'thread', currentThread().getName()) + if length is None: + self.wfile.write('\r\n') + if done: + if DEBUG: + log('videoserver::get: stream reached EOF: thread', currentThread().getName()) + break + + if DEBUG and nbyteswritten != nbytes2send: + log('videoserver::get: sent wrong amount: wanted', nbytes2send, 'got', nbyteswritten, 'thread', currentThread().getName()) + if not range: + stream.close() + if self.server.statuscallback is not None: + self.server.statuscallback('Done') + except ConnectionResetError: + if DEBUG: + log('videoserver::get: connection reset') + + except: + log_exc() + finally: + self.server.release_inputstream(self.server.url_is_set) + self.server.ic.stop() + self.server.ic.shutdown() + + else: if self.path.startswith('/webUI'):
__________________
LibreElec rpi 3 | x96 Последний раз редактировалось tarasian666; 05.06.2013 в 17:40. |
![]() |
![]() |
![]() |
#203 |
Junior Member
Регистрация: 23.11.2013
Сообщений: 1
|
![]()
Не кидайте тапками-хочу установить безглючный вариант XBMCbuntu с русским языком и уже предустановленными аддонами,включая просмотр торрентов через AceStream с rutor в частности. Железо i5 с HD Intel. Вопрос: где взять образ для установки? Frodo 12.2 работает, но как устанавливать аддоны и настраивать интернет в XBMCbuntu так и не понял
|
![]() |
![]() |
![]() |
#204 |
Junior Member
Регистрация: 27.11.2013
Сообщений: 2
|
![]()
Не получается что-то на убунте заставить его работать. 2.0.8.7 патченный с новым шифрованием.
Все запускается нормально но когда в VLC вбиваю допустим поток http://127.0.0.1:6878/http://ttv-kv-...kraina.acelive то выдает "Этот источник не открывается". В браузере если перехожу по ссылке то получаю это: "Internal Server Error, couldn't find resource". С дебагом включенным выдает в консоли: Код:
2013-11-27 16:00:43 BaseApp::set_ratelimits: Setting max upload rate to 0.0 2013-11-27 16:00:43 BaseApp::gui_states_callback: restart others: time 0.000469207763672 2013-11-27 16:00:43 baseapp::get_preload_ads_enabled: get from config: True 2013-11-27 16:00:43 baseapp::init: preload_ads_enabled True 2013-11-27 16:00:43 baseapp::init: got disk_cache_limit: 4793675776 2013-11-27 16:00:43 baseapp::init: got ad_storage_limit: 1073741824 2013-11-27 16:00:44 baseapp::check_auth_level: got user level: 1 2013-11-27 16:00:44 baseapp::check_auth_level: regular next try in 3600 2013-11-27 16:00:44 baseapp::check_statistics_settings: --- 2013-11-27 16:00:45 baseapp::check_statistics_settings: next run in 86400 2013-11-27 16:00:48 videoserv: do_GET: Got request /http://ttv-kv-torrent1.ytv.su/112ukraina.acelive None Thread-31 2013-11-27 16:00:48 VideoServer::acquire_inputstream: lock done /http://ttv-kv-torrent1.ytv.su/112ukraina.acelive Thread-31 2013-11-27 16:00:48 videoserver::acquire_inputstream: got streaminfo: urlpath /http://ttv-kv-torrent1.ytv.su/112ukraina.acelive streaminfo None 2013-11-27 16:00:48 VideoServer::acquire_inputstream: unlock /http://ttv-kv-torrent1.ytv.su/112ukraina.acelive Thread-31 2013-11-27 16:00:48 videoserv: do_GET: Cannot serve request 500 Thread-31 2013-11-27 16:00:48 VideoServer::release_inputstream: lock /http://ttv-kv-torrent1.ytv.su/112ukraina.acelive Thread-31 2013-11-27 16:00:48 VideoServer::release_inputstream: unlock /http://ttv-kv-torrent1.ytv.su/112ukraina.acelive Thread-31 |
![]() |
![]() |
![]() |
#205 | |
Junior Member
Регистрация: 22.03.2013
Сообщений: 4
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#206 | |
Senior Member
Регистрация: 08.03.2013
Сообщений: 126
|
![]() Цитата:
а лучше обращайтесь в личку, а то тут "шпионы" смотрят
__________________
LibreElec rpi 3 | x96 Последний раз редактировалось tarasian666; 30.11.2013 в 15:09. |
|
![]() |
![]() |
![]() |
#207 |
Junior Member
Регистрация: 27.02.2014
Сообщений: 1
|
![]()
Похоже авторы AceStream опять готовят подлянку в виде AceSteam 3, который не совместим с текущей версией.
|
![]() |
![]() |
![]() |
#208 |
Senior Member
Регистрация: 08.03.2013
Сообщений: 126
|
![]()
Green
а не шпион ли вы случайно? ![]()
__________________
LibreElec rpi 3 | x96 |
![]() |
![]() |
![]() |
#209 |
Banned
Регистрация: 13.01.2013
Адрес: /dev/null 2>&1
Сообщений: 1,160
|
![]() Последний раз редактировалось arheon; 05.07.2017 в 14:03. |
![]() |
![]() |
![]() |
#210 |
Senior Member
Регистрация: 08.03.2013
Сообщений: 126
|
![]()
Вот поэтому и приходится использовать исходники, где менять можешь что хочешь.
Вроде говорят исправили утечку памяти и "новые алгоритмы Live Stream, с более совершенной логикой распределения потоков. " как выйдет на линукс будет видно, стало лучше или нет.
__________________
LibreElec rpi 3 | x96 |
![]() |
![]() |
![]() |
Метки |
torrent, ubuntu |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
XBMC на убунту, низкий FPS | Roha | Поддержка платформы Linux \ Live | 15 | 07.02.2012 20:48 |
Торрент фильмы онлайн | Podor | Подсказки, описания и FAQ по XBMC | 14 | 11.02.2011 18:27 |
торрент | Алексей | Подсказки, описания и FAQ по XBMC | 1 | 14.01.2011 22:43 |