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

Форум XBMC и Kodi. Помощь, поддержка, обсуждение, плагины. (http://xbmc.ru/forum/index.php)
-   Поддержка локальной разработки модулей (http://xbmc.ru/forum/forumdisplay.php?f=12)
-   -   Оптимальный торрент стример - обсуждение (http://xbmc.ru/forum/showthread.php?t=8793)

Roman_V_M 18.07.2015 13:00

Оптимальный торрент стример - обсуждение
 
Чтобы не оффтопить в теме про статическую сборку либторрента, решил перенести обсуждение сюда.
Предлагаю обсудить оптимальную реализацию движка торрент-стриминга. Именно движка, а не вопросы взаимодействия с конкретными сайтами.
Для затравки перенесу обсуждение из соседней темы:

Цитата:

Сообщение от HAL9000 (Сообщение 80034)
В кратце - Pulsar (ну или его аналог) ведь сам решает как будет выглядеть линк для setResolveUrl(). Поэтому ничего не мешает добавить в URL дополнительную сущность в виде ID файла в раздаче (в протоколе эти ID - обычные порядковые номера, начиная с нуля). И закладки/отметки будут уже относиться к конкретному файлу в раздаче, а не ко всей раздаче.

UPDATE: Вернее, в закладки надо кидать не через setResolveUrl(), а линк на торрент-плеер. Например, - plugin://script.module.player/play/тут-хэш-магнит-сылки/4 будет означать "покажи нам 5-й по счету файл"

Мне тоже приходила в голову эта идея. Принципиальная сложность здесь в том, что в общем случае нам заранее неизвестно, сколько в торренте файлов. С файлами .torrent проще: в них такая информация есть. Но с магнитными ссылками сложнее - ссылку нужно поставить на закачку, чтобы клиент получил данные о торренте от пиров, и только потом мы можем узнать содержимое раздачи. Поэтому обработка магнитной ссылки - процесс небыстрый. А если мы еще захотим добавить дополнительную информацию о компонентах раздачи, например отдельных сериях сериала, обработка будет неприлично долгой.

Цитата:

Но у меня уже есть свое видение как вся эта балалайка должна выглядеть (торрент-плеер), которое созревает года два уже. Я обязательно изложу его на бумаге и поделюсь.
Будет интересно прочитать.

DiMartino 18.07.2015 15:30

Для меня идеальным стримером будет возможность запуска на локальной или удаленной машине, полная кроссплатформенность, возможность работы с xbmcvfs путями без костылей, поддержка торрентов с несколькими файлами.

Как мы знаем все познается в сравнении, поэтому хотел бы узнать мнение про стример на python-libtorrent в Torrenter v2, просто критику или помощь в решении проблем. В любом случае я хочу его улучшать, но у меня закончились идеи, которые я в силах реализовать. Кстати, недавно упростил внешний запуск до "plugin://plugin.video.torrenter/?action=playSTRM&url=URL_ENCODED_MAGNET_PATH_HTTP" по просьбе автора script.eztv2pulsar и подобных скриптов. Так же есть мой пример использования Torrenter во внешнем плагине для EZTV.
Он, конечно, изначально основан на том, что написал slng, но потом я добавлял код steeve из XBMCtorrent, потом сам левый код писал, в общем уже можно запутаться что и откуда я брал. Самое последнее что я добавил, например, это динамическое определение количества чанков сзади файла, потому что на SWESUB.tv чанк 0.5 Мб и формат mp4, а у меня раньше просто скачивались 2 последних, конечно для него не хватало.

TDW1980 20.07.2015 14:16

1. Отдельная служба или модуль
2. Простое и понятное API
3. Выбор файла в торренте
4. кросплатформенность
5. перемотка или воспроизведение с заданной позиции
6. Автоматическая очистка кэша по лимиту или нехватке места

Roman_V_M 20.07.2015 15:51

Цитата:

Сообщение от DiMartino (Сообщение 80099)
Для меня идеальным стримером будет возможность запуска на локальной или удаленной машине, полная кроссплатформенность, возможность работы с xbmcvfs путями без костылей, поддержка торрентов с несколькими файлами.

Насчет xbmcvfs непонятно, что имеется в виду. Насколько я понимаю, мы ограничены возможностями libtorrent, который умеет работать только с локальными путями.

Цитата:

Самое последнее что я добавил, например, это динамическое определение количества чанков сзади файла, потому что на SWESUB.tv чанк 0.5 Мб и формат mp4, а у меня раньше просто скачивались 2 последних, конечно для него не хватало.
Спасибо за интересную информацию! Я сталкивался с проблемными mp4, но до сути не докопался.

С Torrenter v2 я знаком слабо, т. к. уже давно копаюсь с собственной реализацией стримера. Изначальная задумка была и есть сделать систему просмотра зарубежных сериалов, заточенную под мои хотелки, а поскольку дури в голове хватает какие-то базовые знания есть, то и дорабатываю понемногу. Поэтому и хочу обменяться идеями. Возможно, кто-то подскажет что-то дельное (вот вы уже подсказали насчет мп4), возможно, кого-то заинтересуют мои наработки. Плюс, интересно, насколько мои представления о торрент-стримере совпадают с представлениями, так сказать, общественности.:)

Я уже почти доделал клеент-серверный стример по образцу Пульсара, но с расширенными возможностями и чисто на Питоне, но остались кое-какие моменты. В частности, никак не могу выбрать оптимальный путь работы с многофайловыми раздачами. Технически, это реализовано, но хочется сделать хорошо.

Roman_V_M 20.07.2015 15:58

Цитата:

Сообщение от TDW1980 (Сообщение 80165)
1. Отдельная служба или модуль

5. перемотка или воспроизведение с заданной позиции

Это, наверное, самое сложное. Я пытался реализовать контроль наличия кусков, но безуспешно. Мешает, во-первых, кеширование, а, во-вторых, то, что Коди не любит битые файлы.
При перескоке на нужное место по-идее нужно поставить Коди на паузу, проверить наличие кусков, при необходимости докачать их, а затем продолжить воспроизведение. Фигня в том, что при перескоке на еще нескачанный участок Коди не может надежно стать на паузу.

HAL9000 25.07.2015 01:32

Цитата:

Сообщение от Roman_V_M (Сообщение 80092)
Мне тоже приходила в голову эта идея. Принципиальная сложность здесь в том, что в общем случае нам заранее неизвестно, сколько в торренте файлов. С файлами .torrent проще: в них такая информация есть. Но с магнитными ссылками сложнее - ссылку нужно поставить на закачку, чтобы клиент получил данные о торренте от пиров, и только потом мы можем узнать содержимое раздачи. Поэтому обработка магнитной ссылки - процесс небыстрый. А если мы еще захотим добавить дополнительную информацию о компонентах раздачи, например отдельных сериях сериала, обработка будет неприлично долгой.

Это не страшно. На самом деле там процесс не такой уж и долгий. Тот же Pulsar, прежде чем запустить просмотр, полностью разруливает магнит. То есть у него на руках уже фактически уже есть торрент-файл. Просто steeve по каким-то причинам не стал добавлять выбор конкретного файла, хотя ему оставалось добавить буквально пару строк (может у него концепт такой).

Цитата:

Сообщение от Roman_V_M (Сообщение 80092)
Будет интересно прочитать.

Да. Обязательно напишу. Может быть не быстро, но постараюсь подробно. Так как это для меня самого будет хорошим ТЗ (чтобы не упустить чего-нибудь важного).

DiMartino 28.07.2015 18:41

Пока копался по своим делам на гитхабе обнаружил хорошую штукенцию - btclient. Написана она на питоне с таким же либторрентом, чем-то напоминает YATP с очередями и потоками, а так же http выдачей, но по крайней мере в VLC работает перемотка.
Используются нестандартные питоновские библиотеки, не уверен на счет их доступности под все платформы, я пробовал на Ubuntu это дело запустить.

Roman_V_M 28.07.2015 20:20

Цитата:

Сообщение от HAL9000 (Сообщение 80548)
Это не страшно. На самом деле там процесс не такой уж и долгий. Тот же Pulsar, прежде чем запустить просмотр, полностью разруливает магнит. То есть у него на руках уже фактически уже есть торрент-файл. Просто steeve по каким-то причинам не стал добавлять выбор конкретного файла, хотя ему оставалось добавить буквально пару строк (может у него концепт такой).

Технически это сделать не так сложно, для меня проблема в том, чтобы сделать удобно. Пока я у себя обошелся простым всплывающим списком.

Тут ведь в чем фигня. API плагинов Коди допускает 3 типа вызовов: вируальная папка (isFolder=True), проигрываемый файл ('IsPlayable'='true' и isFolder=False) и прочее (isFolder=False). Тип вызова элемента задается заранее при формировании списка, и в рантайме его менять нельзя.
В идеале схема должна была бы быть такая: мы открываем торрент, получаем список файлов, а дальше, если файл один, начинаем воспроизведение. Если же их несколько, формируем список для выбора.
Либо можно формировать список всегда, независимо от количества файлов, но тогда усложняется навигация.

Цитата:

Сообщение от DiMartino (Сообщение 80735)
Пока копался по своим делам на гитхабе обнаружил хорошую штукенцию - btclient. Написана она на питоне с таким же либторрентом, чем-то напоминает YATP с очередями и потоками, а так же http выдачей, но по крайней мере в VLC работает перемотка.

Насколько я понимаю, полноценной перемотки при стриминге торрента всё равно не будет, разве что файл будет скачиваться быстрее, чем скорость перемотки. Теоретически, можно реализовать прыжки, но только если всё управление будет завязано на плагин, т. к. класс xbmc.Player не предоставляет достаточно контроля. А свое управление будет сложно сделать так, чтобы оно не конфликтовало с управлением Коди. Но, возможно, я в этом плане что-то упускаю.:confused:

DiMartino 28.07.2015 20:31

Цитата:

Сообщение от Roman_V_M (Сообщение 80740)
Технически это сделать не так сложно, для меня проблема в том, чтобы сделать удобно. Пока я у себя обошелся простым всплывающим списком.

На вкус и цвет... но я бы применил (у себя применяю) обрезание одинаковых частей в именах, все таки ограничение по длине большое.


Цитата:

Сообщение от Roman_V_M (Сообщение 80740)
Насколько я понимаю, полноценной перемотки при стриминге торрента всё равно не будет, разве что файл будет скачиваться быстрее, чем скорость перемотки. Теоретически, можно реализовать прыжки, но только если всё управление будет завязано на плагин, т. к. класс xbmc.Player не предоставляет достаточно контроля. А свое управление будет сложно сделать так, чтобы оно не конфликтовало с управлением Коди. Но, возможно, я в этом плане что-то упускаю.:confused:

А я думаю, если плагин будет понимать с какого куска файла какая секунда начинается и сможет проверить наличие этого куска, то плагин сам будет ставить паузу и возобновлять воспроизведение, без xbmc.Player, от которого нужно будет только подчиниться и дать секунду куда перемотали.

Roman_V_M 28.07.2015 22:17

Цитата:

Сообщение от DiMartino (Сообщение 80741)
А я думаю, если плагин будет понимать с какого куска файла какая секунда начинается и сможет проверить наличие этого куска, то плагин сам будет ставить паузу и возобновлять воспроизведение, без xbmc.Player, от которого нужно будет только подчиниться и дать секунду куда перемотали.

Я со своей реализацией торрент-стримера копаюсь достаточно давно, и в одном из вариантов такой функционал был. Но не работал.:) В ближних пределах от точки воспроизведения картину портит кэш Коди, который норовит захватить в себя недокачанные фрагменты. А при прыжке на дальние расстояния плеер Коди не может надежно стать на паузу на битом участке и, опять таки, пытается захватить этот участок в кэш. В идеале команду на прыжок нужно перехватывать до самого прыжка, чтобы поставить плеер на паузу, проверить место прыжка, докачать, если нужно, и перекинуть плеер на нужный уже скачанный участок. Однако в API такого события, которое можно перехватить до прыжка, нет. Плюс, опять таки, нет гарантии, что нужный участок не окажется в кэше до того, как мы его скачаем. Ведь торрент-стримминг базируется на обмане плеера Коди, который думает, что проигрывает целый файл.:)


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

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