Форум XBMC и Kodi. Помощь, поддержка, обсуждение, плагины.
   

Вернуться   Форум XBMC и Kodi. Помощь, поддержка, обсуждение, плагины. > Разработка > Поддержка локальной разработки модулей

Ответ
 
Опции темы Опции просмотра
Старый 29.07.2015, 00:37   #11
HAL9000
Senior Member
 
Аватар для HAL9000
 
Регистрация: 15.03.2012
Сообщений: 1,094
По умолчанию

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Тут ведь в чем фигня. API плагинов Коди допускает 3 типа вызовов: вируальная папка (isFolder=True), проигрываемый файл ('IsPlayable'='true' и isFolder=False) и прочее (isFolder=False). Тип вызова элемента задается заранее при формировании списка, и в рантайме его менять нельзя.
В идеале схема должна была бы быть такая: мы открываем торрент, получаем список файлов, а дальше, если файл один, начинаем воспроизведение. Если же их несколько, формируем список для выбора.
Либо можно формировать список всегда, независимо от количества файлов, но тогда усложняется навигация.
Да. Все верно. И я абсолютно не вижу проблем. Сейчас так и сделано (у меня в RuTracker):
  • Выставляю isFolder=False.
  • Скачиваю торрент-раздачу.
  • Вывожу ее пользователю и на выводе снова выставляю isFolder=False
  • Пользователь жмет и я уже запускаю ему видео с помощью экземпляра xbmc.Player
При этом, не нужно пытаться использовать isPlayable=True и setResolvedUrl. Эта схема после таймаута будет выдавать ошибку.

В вашем варианте нужно делать так:
  • Выставляем isFolder=False.
  • Пользователь жмет на строку.
  • Если у нас магнит, то отдаем его нашему "libtorrent-плеер" (условно написанному в будущем), а пользователю начинаем показывать прогресс-бар "Please wait". В результате получаем список файлов.
  • Если у нас торрент, то также гоним его в наш "libtorrent-плеер" (или локально парсим) и получаем список файлов (без прогресс-бара - там все быстро).
  • Далее - анализируем. Если можем выбрать файл самостоятельно, то переходим к следующему пункту. Если не можем выбрать файл самостоятельно (например, это - сериал и их много), то выводим пользователю список файлов. При этом ОПЯТЬ выставляем isFolder=False. Пользователь жмет на нужный файл и...
  • Создаем экземпляр класса xbmc.Player и вперед...


Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Насколько я понимаю, полноценной перемотки при стриминге торрента всё равно не будет, разве что файл будет скачиваться быстрее, чем скорость перемотки. Теоретически, можно реализовать прыжки, но только если всё управление будет завязано на плагин, т. к. класс xbmc.Player не предоставляет достаточно контроля. А свое управление будет сложно сделать так, чтобы оно не конфликтовало с управлением Коди. Но, возможно, я в этом плане что-то упускаю.
Так точно. Именно так дело и обстоит.
Я постоянно пытаюсь объяснить на форуме, что bittorrent-протокол ну ваще ни разу не подходит для стриминга, а костыли мы пишем только потому, что контента на торрентах "как грязи". Но все время получаю в ответ - мол "а в ACE Stream все в порядке с перемоткой...".
ACE Stream добились нормальной перемотки с помощью того, что пожертвовали кое-чем другим. Они могут проигрывать только потоковое видео. Kodi при потоке по HTTP умеет перепрыгивать сразу через большие куски. А вот при чтение локального файла - вроде как нет (пишу вроде, так как сам до конца еще не разобрался и мне это интересно).
Как только Kodi запрашивает у ACE Stream кусок из "будущего", то оно также сообщает об этом ACE и тот начинает приоритезировать новые куски в раздаче. В это время (если этих кусков нет) в Kodi включается сообщение "буферизация". Другими словами - это частный случай реализации в Kodi (просмотр через HTTP).

Но в целом, я считаю, что перемотка не такая уж и большая засада. Нужно просто отлавливать немного заранее момент, когда заканчиваются скаченные куски и принудительно ставить на паузу. Чем выше скорость перемотки пользователь врубил, тем больше должно быть кусков, входящих в это самое "заранее".
__________________
RuTracker: http://xbmc.ru/forum/showthread.php?t=2243
Ruhunt.Pulsar: http://xbmc.ru/forum/showthread.php?t=6759
Last.VK: http://xbmc.ru/forum/showthread.php?t=3709
Lovi.fm: http://xbmc.ru/forum/showthread.php?t=6758
HAL9000 вне форума   Ответить с цитированием
   
Старый 29.07.2015, 00:59   #12
HAL9000
Senior Member
 
Аватар для HAL9000
 
Регистрация: 15.03.2012
Сообщений: 1,094
По умолчанию

Цитата:
Сообщение от DiMartino Посмотреть сообщение
А я думаю, если плагин будет понимать с какого куска файла какая секунда начинается и сможет проверить наличие этого куска, то плагин сам будет ставить паузу и возобновлять воспроизведение, без xbmc.Player, от которого нужно будет только подчиниться и дать секунду куда перемотали.
Не прочитал сразу твое сообщение. Именно это я и имел в виду в предыдущем своем сообщение.

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Я со своей реализацией торрент-стримера копаюсь достаточно давно, и в одном из вариантов такой функционал был. Но не работал. В ближних пределах от точки воспроизведения картину портит кэш Коди, который норовит захватить в себя недокачанные фрагменты. А при прыжке на дальние расстояния плеер Коди не может надежно стать на паузу на битом участке и, опять таки, пытается захватить этот участок в кэш.
К такой же проблеме пришел и я в DelugeStream. Я даже до не давнего времени не оставлял мысли что-нибудь придумать с этим буфером или таймаутом.
Пришел к выводу, что ни фига там ничего не выйдет.
Думаю надо копать в сторону обратной связи от Player к плагину (как ACE). Без штатных средств Коди (без HTTP Range и все такое...).

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
В идеале команду на прыжок нужно перехватывать до самого прыжка, чтобы поставить плеер на паузу, проверить место прыжка, докачать, если нужно, и перекинуть плеер на нужный уже скачанный участок. Однако в API такого события, которое можно перехватить до прыжка, нет.
А вот тут, кстати, можно и покопать еще...
Я сейчас у себя эксперементирую со следующей хренью... Есть у меня в RuTracker инфо-окошко, которое встраивается в слой контрлов плеера и при паузе показывает статус работы libtorrent`а. Такой же есть у Pulsar, у Torrenter и т.д.
Так вот. Сейчас это окошко отрисовывается не правильно, так как заранее не известно разрешение экрана у пользователя и приходится все размеры высчитывать в реал-тайме. Все это потому, что встраивается это инфо-окошко в уже существующий слой.
Если же отрисовывать его в новом слое, то можно самостоятельно задать разрешение слоя и рисовать уже со "знанием дела". Kodi потом сам сконвертит изображение в разрешение пользователя.
Я решил попробовать следующую схему:
Попробовать рисовать все поверх некого прокси-окна. Которое будет выше, чем окно с контролами плеера. При этом все нажатия пульта ловить нашим окном и перекидывать в нижнее.
Если этот мега-костыль заработает, то также можно сделать и с отловом перемотки. Ловить нажатие пульта своим окном и если мы уверены, что перематывать "рановато", то не проксировать этот клик ниже (в окно контролов).
Вот такая вот идейка...

Update: правда пользователь может нажимать перемотку не через отрисованные контролы, а просто с пульта (вернее так и происходит чаще всего). Может прозрачный прокси-слой попробовать отрисовывать поверх видео?...
__________________
RuTracker: http://xbmc.ru/forum/showthread.php?t=2243
Ruhunt.Pulsar: http://xbmc.ru/forum/showthread.php?t=6759
Last.VK: http://xbmc.ru/forum/showthread.php?t=3709
Lovi.fm: http://xbmc.ru/forum/showthread.php?t=6758

Последний раз редактировалось HAL9000; 29.07.2015 в 01:04.
HAL9000 вне форума   Ответить с цитированием
Старый 29.07.2015, 01:31   #13
Roman_V_M
Senior Member
 
Аватар для Roman_V_M
 
Регистрация: 12.06.2011
Адрес: Киев
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от HAL9000 Посмотреть сообщение
Д
Как только Kodi запрашивает у ACE Stream кусок из "будущего", то оно также сообщает об этом ACE и тот начинает приоритезировать новые куски в раздаче. В это время (если этих кусков нет) в Kodi включается сообщение "буферизация".
Очень интересно. А как именно Коди сообщает, куда он собирается прыгнуть?

Цитата:
Сообщение от HAL9000 Посмотреть сообщение
Если же отрисовывать его в новом слое, то можно самостоятельно задать разрешение слоя и рисовать уже со "знанием дела". Kodi потом сам сконвертит изображение в разрешение пользователя.
Я решил попробовать следующую схему:
Попробовать рисовать все поверх некого прокси-окна. Которое будет выше, чем окно с контролами плеера. При этом все нажатия пульта ловить нашим окном и перекидывать в нижнее.
Если этот мега-костыль заработает, то также можно сделать и с отловом перемотки. Ловить нажатие пульта своим окном и если мы уверены, что перематывать "рановато", то не проксировать этот клик ниже (в окно контролов).
Вот такая вот идейка...

Update: правда пользователь может нажимать перемотку не через отрисованные контролы, а просто с пульта (вернее так и происходит чаще всего). Может прозрачный прокси-слой попробовать отрисовывать поверх видео?...
Теоретически, класс xbmcgui.WindowDialog умеет перехватывать события управления. У меня когда-то (до смены API закачки субтитров) работал плагин субтитров на базе моего же микро-фреймворка PyXBMCt, который запускался поверх видео и вполне себе нормально управлялся с пульта, пока не закроешь окно. Кстати, экземпляр WindowDialog всегда рисуется в координатной сетке 1280х720 независимо от фактического разрешения экрана и текущего скина. По крайней мере, геометрия элементов окна в PyXBMCt рассчитывается именно в таком разрешении, и пока никто не жаловался.
__________________
Координатор русского перевода Kodi:
https://www.transifex.com/projects/p/kodi-main/
------------------------------
Raspberry PI 2 + LibreELEC 8 (Kodi 17)
Samsung Galaxy Tab A 10.1 + Kodi 17 for Android
------------------------------
Читаем и пополняем Википедию форума: http://xbmc.ru/wiki
------------------------------
На любые личные сообщения, не связанные с переводом Kodi, не отвечаю. Для обсуждений и советов есть форум.
Roman_V_M вне форума   Ответить с цитированием
Старый 29.07.2015, 11:52   #14
Roman_V_M
Senior Member
 
Аватар для Roman_V_M
 
Регистрация: 12.06.2011
Адрес: Киев
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Очень интересно. А как именно Коди сообщает, куда он собирается прыгнуть?
Провел некоторые поверхностные исследования. Вопрос снимается. Я в общих чертах понял принцип и смысл вашего вопроса в другом разделе.
__________________
Координатор русского перевода Kodi:
https://www.transifex.com/projects/p/kodi-main/
------------------------------
Raspberry PI 2 + LibreELEC 8 (Kodi 17)
Samsung Galaxy Tab A 10.1 + Kodi 17 for Android
------------------------------
Читаем и пополняем Википедию форума: http://xbmc.ru/wiki
------------------------------
На любые личные сообщения, не связанные с переводом Kodi, не отвечаю. Для обсуждений и советов есть форум.
Roman_V_M вне форума   Ответить с цитированием
Старый 29.07.2015, 12:47   #15
Roman_V_M
Senior Member
 
Аватар для Roman_V_M
 
Регистрация: 12.06.2011
Адрес: Киев
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от HAL9000 Посмотреть сообщение
При этом, не нужно пытаться использовать isPlayable=True и setResolvedUrl. Эта схема после таймаута будет выдавать ошибку.
Схема с setResolvedUrl мне нравится двумя моментами.
1. ListItem, передаваемый в setResolvedUrl, автоматически наследует все свойства (инфо-лейблы, картинки) ListItem, из которого он был вызван.
2. Автозакладки и отметки просмотренного (теоретически). Последнее у меня не очень выходит, хотя все свойства вроде бы правильные. Т. е. отметок никаких нет, хотя автозакладки через раз срабатывают.

Недостаток только один, но существенный - setResolvedUrl прерывает выполнение текущего скрипта аналогично sys.exit().
__________________
Координатор русского перевода Kodi:
https://www.transifex.com/projects/p/kodi-main/
------------------------------
Raspberry PI 2 + LibreELEC 8 (Kodi 17)
Samsung Galaxy Tab A 10.1 + Kodi 17 for Android
------------------------------
Читаем и пополняем Википедию форума: http://xbmc.ru/wiki
------------------------------
На любые личные сообщения, не связанные с переводом Kodi, не отвечаю. Для обсуждений и советов есть форум.
Roman_V_M вне форума   Ответить с цитированием
Старый 29.07.2015, 13:29   #16
Roman_V_M
Senior Member
 
Аватар для Roman_V_M
 
Регистрация: 12.06.2011
Адрес: Киев
Сообщений: 1,933
По умолчанию

Кстати, если интересно, при получении контента по http Коди отправляет 3 запроса: HEAD, GET с начала файла и GET с конечной позиции файла.
Код:
13:08:57 T:744  NOTICE: Creating InputStream
13:08:57 T:6020  NOTICE: plugin.video.yatp: HEAD
13:08:57 T:6020  NOTICE: plugin.video.yatp: [('Content-Length', ''), ('Accept-Charset', 'UTF-8,*;q=0.8'), ('User-Agent', 'Kodi/15.0 (Windows NT 6.1; WOW64) App_Bitness/32 Version/15.0-Git:20150721-2f34a0c'), ('Accept', '*/*'), ('Host', 'localhost:8668'), ('Content-Type', 'text/plain')]
13:08:57 T:6020  NOTICE: plugin.video.yatp: Playing media: Zoo.S01E05.HDTV.x264-LOL[rarbg]/zoo.105.hdtv-lol.mp4
13:08:57 T:744   DEBUG: CCurlFile::GetMimeType - http://localhost:8668/media/Zoo.S01E05.HDTV.x264-LOL%5Brarbg%5D/zoo.105.hdtv-lol.mp4 -> video/mp4
13:08:57 T:744   DEBUG: CFileCache::Open - opening <media/Zoo.S01E05.HDTV.x264-LOL%5Brarbg%5D/zoo.105.hdtv-lol.mp4> using cache
13:08:57 T:744   DEBUG: CurlFile::Open(0B8F7C88) http://localhost:8668/media/Zoo.S01E05.HDTV.x264-LOL%5Brarbg%5D/zoo.105.hdtv-lol.mp4
13:08:58 T:3288  NOTICE: plugin.video.yatp: GET
13:08:58 T:3288  NOTICE: plugin.video.yatp: [('Content-Length', ''), ('Accept-Charset', 'UTF-8,*;q=0.8'), ('User-Agent', 'Kodi/15.0 (Windows NT 6.1; WOW64) App_Bitness/32 Version/15.0-Git:20150721-2f34a0c'), ('Accept', '*/*'), ('Range', 'bytes=0-'), ('Host', 'localhost:8668'), ('Content-Type', 'text/plain')]
13:08:58 T:3288  NOTICE: plugin.video.yatp: Playing media: Zoo.S01E05.HDTV.x264-LOL[rarbg]/zoo.105.hdtv-lol.mp4
13:08:58 T:744  NOTICE: Creating Demuxer
13:08:58 T:6680  NOTICE: Thread FileCache start, auto delete: false
13:08:58 T:744   DEBUG: CDVDDemuxFFmpeg::Open - probing detected format [mov,mp4,m4a,3gp,3g2,mj2]
13:08:58 T:6680    INFO: XCURL::DllLibCurlGlobal::easy_aquire - Created session to http://localhost
13:08:58 T:6680   DEBUG: CurlFile::CReadState::Connect - Resume from position 324296002
13:08:58 T:7052   DEBUG: ------ Window Init (DialogBusy.xml) ------
13:08:58 T:7052   DEBUG: ------ Window Deinit (DialogProgress.xml) ------
13:08:58 T:6060  NOTICE: plugin.video.yatp: GET
13:08:58 T:6060  NOTICE: plugin.video.yatp: [('Content-Length', ''), ('Accept-Charset', 'UTF-8,*;q=0.8'), ('User-Agent', 'Kodi/15.0 (Windows NT 6.1; WOW64) App_Bitness/32 Version/15.0-Git:20150721-2f34a0c'), ('Accept', '*/*'), ('Range', 'bytes=324296002-'), ('Host', 'localhost:8668'), ('Content-Type', 'text/plain')]
13:08:58 T:6060  NOTICE: plugin.video.yatp: Playing media: Zoo.S01E05.HDTV.x264-LOL[rarbg]/zoo.105.hdtv-lol.mp4
13:08:58 T:744   DEBUG: XFILE::CFileCache::Seek - waiting for position 324361487.
13:08:58 T:6680    INFO: CFileCache::Process - Hit eof.
Как я понимаю, последний запрос выполняется, чтобы проверить, соответствует ли заявленный Content-length реальному.
При прыжках выдается http-запрос с заголовком 'Range' с нужной позиции в байтах. При перемотке никаких запросов не выдается.
Т. е. при реализации выдачи контента по http на сервере прыжки отлавливать можно, но перемотку - никак.
__________________
Координатор русского перевода Kodi:
https://www.transifex.com/projects/p/kodi-main/
------------------------------
Raspberry PI 2 + LibreELEC 8 (Kodi 17)
Samsung Galaxy Tab A 10.1 + Kodi 17 for Android
------------------------------
Читаем и пополняем Википедию форума: http://xbmc.ru/wiki
------------------------------
На любые личные сообщения, не связанные с переводом Kodi, не отвечаю. Для обсуждений и советов есть форум.
Roman_V_M вне форума   Ответить с цитированием
Старый 30.07.2015, 03:43   #17
HAL9000
Senior Member
 
Аватар для HAL9000
 
Регистрация: 15.03.2012
Сообщений: 1,094
По умолчанию

В общем, убил я сутки на попытку сделать некое прокси-окно (о чем писал выше). Не вышло у меня в итоге. Событие отлавливаю через "onAction". Пробую послать в слой с контролами плеера (через внутреннюю функцию "Action(id,window)". Не видят они этих экшенов. Может я не правильно определяю слой, в котором висят контролы плеера? Не знаю. Позже еще поковыряю немного в эту сторону. Может что получится.

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Схема с setResolvedUrl мне нравится двумя моментами.
1. ListItem, передаваемый в setResolvedUrl, автоматически наследует все свойства (инфо-лейблы, картинки) ListItem, из которого он был вызван.
2. Автозакладки и отметки просмотренного (теоретически). Последнее у меня не очень выходит, хотя все свойства вроде бы правильные. Т. е. отметок никаких нет, хотя автозакладки через раз срабатывают.
Если запускать плеер как сторонний плагин (а так в идеале это и надо), то его вызов будет идти через ссылку вида (примерно): plugin://script.module.player/play/какой-то-любой-конетен-в-формате-json
Такими ссылками можно сразу убить двух зайцев (два верхних пункта):
1. В ссылке мы передадим всю инфу по лейбам и картинкам (и плеер уже самостоятельно сварганит ItemInfo).
2. Такие ссылки очень хорошо сохраняются в закладках.

Оффтоп:
Надо вообще уходит от колекционирования фильмов в виде реальной их записи на диск. Мне кажеться, надо просто сохранять такие вот ссылки на торрент-стримы и прилеплять рядом файлы NFO для наведения всякой красоты.
Плюс еще все это брахло синхронизировать с другими своими Коди через какой-нибудь Яндекс.Диск (тут еще и бэкап автоматом нарисовывается). И все. Коллекция ссылок на винте будет занимать пару мегабайт (от силы) а де-факто мы имеем коллекцию FullHD на сотни терабайт. Всякие домашние файло-помойки можно выкидывать на свалку...
__________________
RuTracker: http://xbmc.ru/forum/showthread.php?t=2243
Ruhunt.Pulsar: http://xbmc.ru/forum/showthread.php?t=6759
Last.VK: http://xbmc.ru/forum/showthread.php?t=3709
Lovi.fm: http://xbmc.ru/forum/showthread.php?t=6758
HAL9000 вне форума   Ответить с цитированием
Старый 30.07.2015, 03:56   #18
HAL9000
Senior Member
 
Аватар для HAL9000
 
Регистрация: 15.03.2012
Сообщений: 1,094
По умолчанию

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Как я понимаю, последний запрос выполняется, чтобы проверить, соответствует ли заявленный Content-length реальному.
Думаю, что не из-за этого. Некоторые форматы файлов держат информацию по индексам в конце своего файла. Это вкратце обсуждалось в ветке по DelugeStream, начиная вот с этого сообщения.

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
При прыжках выдается http-запрос с заголовком 'Range' с нужной позиции в байтах. При перемотке никаких запросов не выдается.
В том же DelugeStream я так же ориентировался именно на Range из HTTP-запросов. Проблема при прыжках в том, что у Коди срабатывает таймаут пока Deluge пытается быстренько вытащить новые куски. В начале-то фильма мы заставляем пользователя немного подождать, пока загрузится буфер, и потом уже включаем проигрывание видео. А тут он уже стоит на проигрывание и просит "срочно" качнуть ему мегабайт 50-100. Срабатывает таймаут.

Если можно было бы увеличивать программно этот таймаут, то и проблем не было бы. Перед началом фильма увеличил, после окончания вернул старое значение. Но Коди не поддерживает программное изменение этого параметра.
__________________
RuTracker: http://xbmc.ru/forum/showthread.php?t=2243
Ruhunt.Pulsar: http://xbmc.ru/forum/showthread.php?t=6759
Last.VK: http://xbmc.ru/forum/showthread.php?t=3709
Lovi.fm: http://xbmc.ru/forum/showthread.php?t=6758
HAL9000 вне форума   Ответить с цитированием
Старый 30.07.2015, 04:54   #19
yevgenb
Member
 
Регистрация: 25.01.2013
Сообщений: 85
По умолчанию

Цитата:
Сообщение от HAL9000 Посмотреть сообщение
Это не страшно. На самом деле там процесс не такой уж и долгий. Тот же Pulsar, прежде чем запустить просмотр, полностью разруливает магнит. То есть у него на руках уже фактически уже есть торрент-файл. Просто steeve по каким-то причинам не стал добавлять выбор конкретного файла, хотя ему оставалось добавить буквально пару строк (может у него концепт такой).
Ему просто не нужно было, я с ним на эту тему переписывался пару лет назад еще на заре xbmctorrent - так и лежит открытый тикет на гитхабе с этого времени. По его словам установка приоритета чанков в либторренте не работала нормально и он забил
yevgenb вне форума   Ответить с цитированием
Старый 30.07.2015, 08:06   #20
TDW1980
Senior Member
 
Аватар для TDW1980
 
Регистрация: 21.06.2011
Сообщений: 4,751
По умолчанию

Цитата:
Оффтоп:
Надо вообще уходит от колекционирования фильмов в виде реальной их записи на диск. Мне кажеться, надо просто сохранять такие вот ссылки на торрент-стримы и прилеплять рядом файлы NFO для наведения всякой красоты.
Я такие ссылки реализовал в своем плагине к Кинопоиску. Получилось вполне сносно.
__________________
Мой репозиторий: https://github.com/tdw1980/tdw/raw/master/repository.tdw1980-1.0.3.zip
Отблагодарить:
https://yoomoney.ru/bill/pay/AHwFUQEpwUU.230131
TDW1980 на форуме   Ответить с цитированием
Ответ
 


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Торрент ТВ для убунту dimmi777 Помощь по плагинам 226 11.05.2021 13:25
Торрент-ТВ и iPhone/iPad Alex2013 Поддержка платформы Mac 28 13.03.2015 17:13
торрент Алексей Подсказки, описания и FAQ по XBMC 1 14.01.2011 22:43


Текущее время: 20:03. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.