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

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

Ответ
 
Опции темы Опции просмотра
Старый 07.12.2014, 23:12   #1
HAL9000
Senior Member
 
Аватар для HAL9000
 
Регистрация: 15.03.2012
Сообщений: 1,094
По умолчанию Статическая сборка библиотеки python-libtorrent

Этот ветка создана для всех желающих помочь получить СТАТИЧЕСКИ скомпилированную библиотеку Libtorrent.


Зачем это нужно?

На текущий момент эту библиотеку используют многие плагины, представленные на нашем форуме. Используют для организации потокового скачивания торрент-раздач (реализация торрент-плееров).
Однако есть небольшая засада. Установка этой библиотеки для обычного пользователя не так тривиальна в случае, если она используется в связки с XBMC. В добавок к этому, кучу “головняков” имеют и разработчики плагинов, пытаясь разобраться в “зоопарке” железа пользователей.
Все эти проблемы можно решить, если скомпилировать библиотеку для всех платформ в статическом режиме.
В этом случае, все зависимости (OpenSSL, GeoIP и др.) и сам libtorrent будут собраны в ОДИН файл. Точнее – по одному файлу на каждую платформу (linux32, linux64 и т.д.). Если библиотека собрана в статическом режиме, то ей безразлично где она находится, какой python-интерпретатор ее использует (системный или встроеный в XBMC) и т.д.
Полученные файлы можно просто закидывать в свои плагины и пользователь даже не заметит, что используется libtorrent. Все «портянки» с описанием установки библиотеки уйдут в прошлое.


Как компилировать?

Чтобы не загрязнять собственную систему, а также быть полностью уверенными в том, что все зависимости собираются внутрь библиотеки (и она будет работать поверх чистой ОС) вся компиляция происходит в виртуальной машине. На основе VirtualBox. Для упрощения передачи друг-другу наработок используется Vagrant.


Как поставить Vagrant?

Vagrant хорошо работает в Linux и MacOS. Про Windows ничего не могу сказать. Имеется в виду сам Vagrant, а не виртуальные машины с целевыми системами.
Vagrant имеет две зависимости: Ruby и VirtualBox. Если у вас MacOS, то Ruby уже стоит. Если Linux свежий, то Ruby также скорее всего установлен. VirtaulBox ставится элементарно. Если вы используете GUI в Linux или MacOS, то ставьте VirtualBox с помощью графического установщика. Просто ответьте на все вопросы положительно.
С установкой Vagrant также справится любая домохозяйка. На официальном сайте скачайте графический установщик и также ответьте на все вопросы положительно.


Как использовать Vagrant?
  • Создайте директорию где будет происходить ваша сборка (например: ~/build).
  • Скачайте туда один из файлов, представленных ниже.
  • Переименуйте его в Vagrantfile
  • Создайте поддиректорию vm
  • В консоле перейдите в директорию ~/build и выполните команду vagrant up

На этом все. Нужная виртуальная машина скачается из интернет и в ней запустится компиляция libtorrent.
После того, как все скомпилируется, файл будет находиться по адресу ~/build/vm. Просто скопируйте его куда-нибудь и после этого виртуальную машину можно уничтожить.
Уничтожение виртуальной машины происходит при помощи консольной команды vagrant destroy выполненной из той-же директории, где лежит Vagrantfile.
Для повторной компиляции (например, в случае ошибки), вначале надо уничтожить виртуальную машину (выполните vagrant destroy) и затем заново выполните vagrant up.
Если вам надо войти внутрь виртуальной машины, то в той же директории выполните vagrant ssh.


Как редактировать Vagrantfile для сборки под другую систему?

Найдите в Vagrantfile внизу строчку config.vm.box = "бла-бла-бла"
В этой строчке указывается целевая операционная система под которую вы хотите скомпилировать libtorrent. Например, кодовое имя для «пустой» 64-битной Убунты будет hashicorp/precise64. Весь список доступных ОС вы можете найти на сайте VagrantCloud.
Далее.
Выбранная система будет установлена «голой». Весь процесс компиляции запрограммирован в строках, которые начинаются с $script = SCRIPT и заканчиваются строкой SCRIPT. Все что между этими строками – это обычный shell. Вот в нем вы и можете «играться» сколько захотите.


Какая помощь необходима от сообщества?

Если вы умеете статически компилировать libtorrent под какую-то конкретную систему (на которой работает XBMC) создайте такой же Vagrantfile и скиньте его в эту ветку. Я размещу его в этом заглавном посте.
Также, если у вас есть какие-то полезные ссылки по теме, то также их скидывайте в эту ветку. Я размещу их в заглавном посте.


Будущее.

Как только мы «научимся» компилировать под большинство требуемых нами платформ, можно будет создать какой-нибудь проектик где-нибудь на github`е и уже как-то все это причесать в виде отдельного плагина для XBMC.
Имея такой плагин, создать уже к нему качественный торрент-плеер будет делом небольшого времени.


Полезные ссылки:
  • Страница сборки Си-шной части библиотеки на официальном сайте - http://libtorrent.org/building.html. Особое внимание обращайте там на все, что связано со static.
  • Страница сборки питоновской обвязки с того-же сайта - http://libtorrent.org/python_binding.html
  • Есть проект go-libtorrent (используется в проекте Pulsar). Это статически скомпилированный libtorrent почти для всех платформ, но там обвязка для языка Go, а не для Python. Тем не менее, можно подчерпнуть очень много информации из файлов этого проекта. А именно – README.md, а также из файлов Docerfile, которые расположены в соответствующих папках этого проекта (linux-64, android-arm и т.д.)
  • Исходный код Pulsar (автор оставил проект и открыл код): https://github.com/steeve/pulsar
  • Исходный код форка проекта torrent2http (от anteo): https://github.com/anteo/torrent2http
  • Страница wiki с мануалом по сборке libtorrent на сайте торрент-клиента Deluge - http://dev.deluge-torrent.org/wiki/Building/libtorrent. У libtorrent и Deluge сейчас одни и те же авторы. Будте осторожны – там иструкция по сборке shared-версии libtorrent. Поэтому не забывайте добавлять соответствующие флаги static.
  • Неплохая ветка на форуме LOR: https://www.linux.org.ru/forum/development/6599490
  • На github`е есть человек, который скомпилил libtorrent для iOS и Android. Правда без python-обвязки.
    iOS: https://github.com/chublix/libtorrent-ios
    Android: https://github.com/chublix/libtorrent-android
  • Наработки от ребят, нарезающих qBittorrent (сделан на базе libtorrent). У них на Github есть страничка c WiKi: https://github.com/qbittorrent/qBittorrent/wiki. Там в самом низу есть раздел Compilation и в нем ссылки на текст по компиляции для трех основных ОС (Win, Mac, Linux).
  • Наработки по компиляции от команды LeechCraft (комбайн с браузером, чатом, торрент-клиентом и т.д. В нем также присутствует libtorrent): http://leechcraft.org/development-general-information
  • Уже собранная, но старая версия (0.16.5) libtorrent для Raspberry Pi: http://xbmc.ru/forum/showthread.php?t=3820
  • Уже собранная для Android версия, однако пока никто не завел ее у себя: GitHub и обсуждение на форуме Tribler
  • Есть проект Tribler Streaming для Андроид. У него есть уже собранный libtorrent. И есть инструкция (страница 68) по сборки для Андроид.
  • Бакалаврская работа голландских студентов, в конце которой описывается процедура компиляции под Андроид boost и libtorrent с питоновской-обвязкой.
  • Есть проект BitTorrent.bundle (это клон Pulsar). До версии 0.8 в нем использовался libtorrent-go под управлением cherrytorrent. Уже собранные библиотеки для Linux (32bit и 64bit), Windows и MacOSX можно взять здесь. Сейчас (начиная с версии 0.8) он работает на собственной сборки libtorrent-go - scrapmagnet. Уже собранные библиотеки под Linux (32bit, 64bit и ARM), Windows и MacOSX можно взять здесь.
  • Есть софтина для скачки торрентов с Рутрекер в фоновом режиме на Андроид: страница проекта (исходники).

Готовые наработки


Текущий статус проекта

Таблица с текущем состоянием проекта находится здесь: https://docs.google.com/spreadsheets...GA00ZDnlBb99_g


Скомпилированные модули

Скомпилированные модули можно взять в плагине script.module.libtorrent, который разрабатывает DiMartino.
Папка с самими модулями находится здесь: https://github.com/DiMartinoXBMC/scr...hon_libtorrent


Скрипты компиляции (включая Vagrantfile)

Некоторые компилятся с ошибками (отмечены красным) и выложены для обмена наработками.

Vagrantfile для Linux 32-bit: (версия 1.0.6):
PHP код:
# -*- mode: ruby -*-
# vi: set ft=ruby :

$script = <<SCRIPT

BOOST_VERSION
=1.58.0
LIBTORRENT_VERSION
=1.0.6

# common
apt-get update
apt
-get install -y curl g++ make automake autoconf libtool python-dev

rm 
-rf /tmp/shared/*
mkdir -p /tmp/build

# boost
BST_VERSION=`echo ${BOOST_VERSION} | sed 's/\\./_/g'`
mkdir -p /tmp/boost
cd /tmp/build
curl -L http://sourceforge.net/projects/boost/files/boost/${BOOST_VERSION}/boost_${BST_VERSION}.tar.bz2/download | tar xvj
cd boost_${BST_VERSION}
./bootstrap.sh --prefix=/tmp/boost
./b2 --with-date_time --with-system --with-python --prefix=/tmp/boost link=static variant=release threading=multi target-os=linux optimization=space install

# libtorrent
LT_VERSION=`echo ${LIBTORRENT_VERSION} | sed 's/\\./_/g'`
cd /tmp/build
curl -L https://github.com/arvidn/libtorrent/archive/libtorrent-${LT_VERSION}.tar.gz | tar xvz
#curl -L http://sourceforge.net/projects/libtorrent/files/libtorrent/libtorrent-rasterbar-${LIBTORRENT_VERSION}.tar.gz/download | tar xvz
cd ./libtorrent-libtorrent-${LT_VERSION}
./bootstrap.sh --enable-python-binding --enable-static --disable-shared --disable-deprecated-functions --disable-pool-allocators --disable-encryption --with-boost=/tmp/boost --with-boost-libdir=/tmp/boost/lib
make

# finish
cd /tmp/build/libtorrent-libtorrent-${LT_VERSION}/bindings/python/build/lib.linux-i686-2.7/

# strip
strip ./libtorrent.so

# return
cp ./libtorrent.so /tmp/shared

SCRIPT

require "fileutils"
FileUtils::mkdir_p "shared"

Vagrant.configure("2") do |config|

    config.vm.box = "hashicorp/precise32"
    config.vm.synced_folder "shared/", "/tmp/shared"
    config.vm.network "private_network", ip: "172.20.20.20"
    config.vm.provision "shell", inline: $script

end 

Vagrantfile для Linux 64-bit (версия 1.0.6):
PHP код:
# -*- mode: ruby -*-
# vi: set ft=ruby :

$script = <<SCRIPT

BOOST_VERSION
=1.58.0
LIBTORRENT_VERSION
=1.0.6

# common
apt-get update
apt
-get install -y curl g++ make automake autoconf libtool python-dev

rm 
-rf /tmp/shared/*
mkdir -p /tmp/build

# boost
BST_VERSION=`echo ${BOOST_VERSION} | sed 's/\\./_/g'`
mkdir -p /tmp/boost
cd /tmp/build
curl -L http://sourceforge.net/projects/boost/files/boost/${BOOST_VERSION}/boost_${BST_VERSION}.tar.bz2/download | tar xvj
cd boost_${BST_VERSION}
./bootstrap.sh --prefix=/tmp/boost
./b2 cxxflags="-fPIC" --with-date_time --with-system --with-python --prefix=/tmp/boost link=static variant=release threading=multi target-os=linux optimization=space install

# libtorrent
LT_VERSION=`echo ${LIBTORRENT_VERSION} | sed 's/\\./_/g'`
cd /tmp/build
curl -L https://github.com/arvidn/libtorrent/archive/libtorrent-${LT_VERSION}.tar.gz | tar xvz
#curl -L http://sourceforge.net/projects/libtorrent/files/libtorrent/libtorrent-rasterbar-${LIBTORRENT_VERSION}.tar.gz/download | tar xvz
cd ./libtorrent-libtorrent-${LT_VERSION}
export CFLAGS=${CFLAGS}" -fPIC"
export CXXFLAGS=${CXXFLAGS}" -fPIC"
export LDFLAGS=${LDFLAGS}" -fPIC"
./bootstrap.sh --enable-python-binding --enable-static --disable-shared --disable-deprecated-functions --disable-pool-allocators --disable-encryption --with-boost=/tmp/boost --with-boost-libdir=/tmp/boost/lib
make

# finish
cd /tmp/build/libtorrent-libtorrent-${LT_VERSION}/bindings/python/build/lib.linux-x86_64-2.7/

# strip
strip ./libtorrent.so

# return
cp ./libtorrent.so /tmp/shared

SCRIPT

require "fileutils"
FileUtils::mkdir_p "shared"

Vagrant.configure("2") do |config|

    config.vm.box = "hashicorp/precise64"
    config.vm.synced_folder "shared/", "/tmp/shared"
    config.vm.network "private_network", ip: "172.20.20.21"
    config.vm.provision "shell", inline: $script

end 

Инструкция для компиляции в Windows (автор - Roman_V_M):
Компиляцию лучше проводить на чистой винде ХР/7 под виртуалкой.
Выполняете инструкцию отсюда до п. 5 включительно. В качестве компилятора устанавливаете VC++ 2008 Express (можно скачать с сайта Майкрософта).
После установки всех компонентов и компиляции Буста у вас должны быть следующие папки:
c:\OpenSSL-Win32\
C:\boost
C:\libtorrent-rasterbar
Далее выполняете следующий батник:
PHP код:
@echo off

copy 
"c:\OpenSSL-Win32\lib\VC\static\libeay32MT.lib" "C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\libeay32.lib" /y
copy 
"c:\OpenSSL-Win32\lib\VC\static\ssleay32MT.lib" "C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\ssleay32.lib" /y
xcopy 
"C:\OpenSSL-Win32\include\openssl" "C:\Program Files\Microsoft Visual Studio 9.0\VC\include\openssl" //i

call 
"C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86

set BOOST_ROOT
=C:\boost
set BOOST_BUILD_PATH
=%BOOST_ROOT%
set PATH=%BOOST_ROOT%;%PATH%

c:
cd C:\libtorrent-rasterbar\bindings\python

b2 boost
=source link=static geoip=static boost-link=static runtime-link=static release optimization=space encryption=openssl

pause 
Если всё сделано правильно, в папке C:\libtorrent-rasterbar\bindings\python должен быть скомпилированный модуль.

Скрипт компиляции для Win32 (автор - Roman_V_M):

Сам скрипт и все необходимые утилиты для компиляции можно взять из архива: http://xbmc.ru/forum/showthread.php?p=80865#post80865
Внутри архива есть инструкция на английском. На русском можно прочитать здесь: http://xbmc.ru/forum/showthread.php?p=80717#post80717

Скрипт компиляции для Android (по словам автора - "пока сыровато") [версия - 1.0.3] (автор - srg70):

Необходимо выполнить подготовительные действия: http://xbmc.ru/forum/showthread.php?p=79796#post79796

Непосредственно сам скрипт:

PHP код:
#!/bin/bash
set -e

#BUILD_TARGET_NAME="arm-linux-androideabi-android-17"
#ANDROID_TOOLCHAIN_ROOT="/opt/arm-linux-androideabi-4.8-vanilla/android-17"
#SRTIP_TOOL="arm-linux-androideabi-strip"
#STD_LIB_PATH="/opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi"

ANDROID_TOOLCHAIN_ROOT="/opt/x86-linux-4.8-vanilla/android-17"
BUILD_TARGET_NAME="i686-linux-android-android-17"
SRTIP_TOOL="i686-linux-android-strip"
STD_LIB_PATH="/opt/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.8/libs/x86"

XBMC_DEPENDS_DIRECTORY="/opt/xbmc-depends/$BUILD_TARGET_NAME"

#********************************************
#*               patch_bjam                 *
#********************************************
function patch_bjam {
    
local PATCH="been patched"
    
local JAM_CONFIG_DIR="$1"
    
local XBMC_JAM="$2/user-config.jam"
    
local CONFIG_JAM="$JAM_CONFIG_DIR/user-config.jam"

    
if [ -e $CONFIG_JAM ]; then
        
if grep -Fq "$PATCH$CONFIG_JAM;     then
            
echo "BOOST.BUILD configuration has been already patched."
            
return
        
fi
    fi

    
echo "Patching BOOST.BUILD configuration file at $CONFIG_JAM..."
    
\cp -f $XBMC_JAM $CONFIG_JAM
    
echo "#This file has been patched by build-libtorrent.bash script!">> $CONFIG_JAM

    
# Add python block
    
echo "using python" >> $CONFIG_JAM
    
echo " : 2.6" >> $CONFIG_JAM
    
echo " : $XBMC_DEPENDS_DIRECTORY/bin/python2.6" >> $CONFIG_JAM
    
echo " : $XBMC_DEPENDS_DIRECTORY/include/python2.6" >> $CONFIG_JAM
    
echo " : $XBMC_DEPENDS_DIRECTORY/lib" >> $CONFIG_JAM
    
echo " ; " >> $CONFIG_JAM
    
echo "Done"
    
echo "Patched $CONFIG_JAM:"
    
cat $CONFIG_JAM
}

#********************************************
#*            setup_build_env               *
#********************************************
function setup_build_env {
    
local CONFIG_JAM="$1/user-config.jam"
    
local JAM_CFLAG_PATTERN="<cflags>"
    
local JAM_CXXFLAG_PATTERN="<cxxflags>"

    
while IFS='' read -r line || [[ -n $line ]]; do
        if [[ 
$line == *"$JAM_CFLAG_PATTERN"* ]]; then
            line
=${line/$JAM_CFLAG_PATTERN/}
            
line="$(echo -e "${line}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
            
line="${line%\"}"
            
line="${line#\"}"
            
export CFLAGS="$line -I$XBMC_DEPENDS_DIRECTORY/include/python2.6"
        
fi
        
if [[ $line == *"$JAM_CXXFLAG_PATTERN"* ]]; then
            line
=${line/$JAM_CXXFLAG_PATTERN/}
            
line="$(echo -e "${line}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
            
line="${line%\"}"
            
line="${line#\"}"
            
export CXXFLAGS="$line -I$XBMC_DEPENDS_DIRECTORY/include/python2.6 -Wno-sign-compare -Wno-unused-variable -Wno-literal-suffix -Wno-unused-local-typedefs"
        
fi

    done 
$CONFIG_JAM

    export LDFLAGS
="$LDFLAGS -L$ANDROID_TOOLCHAIN_ROOT/sysroot/usr/lib"

}

function build_libtorrent {
    local LIBTORRENT_ROOT="
$1"
    local XBMC_ROOT="
$2"

    if  [ -e "
$LIBTORRENT_ROOT/libtorrent.so" ]; then
        echo "
Skip libtorrent building$LIBTORRENT_ROOT/libtorrent.so exists"
        return
    fi

    echo "
Buildin libtorrent core..."
    cd "
$LIBTORRENT_ROOT"
    #--debug-configuration --debug-building 
    
$BOOST_ROOT/bjam    toolset=gcc target-os=android boost=source release  boost-link=static link=static runtime-link=shared encryption=tommath  cxxflags="$CXXFLAGS" linkflags="$LDFLAGS"
    # Sometimes previous line will fail for libtorrent 0.16.19. For some reason bjam fails to construct right command for mpi.cpp...
    # Please copy failed command from terminal and edit it like following sample. After that just run in terminal a fixed command and re-run script once again. Sudo may be needed.
       #"
/opt/arm-linux-androideabi-4.8-vanilla/android-17/bin/arm-linux-androideabi-gcc" -x c -DANDROID -DBOOST_PTHREAD_NO_LIB -DBOOST_PYTHON2.6_NO_LIB -DBOOST_PYTHON_STATIC_LIB -Os -fexceptions -march=armv7-a -mtune=cortex-a9 -mfloat-abi=softfp -mfpu=neon  -I/opt/xbmc-depends/arm-linux-androideabi-android-17/include/android-17 -isystem /opt/xbmc-depends/arm-linux-androideabi-android-17/include --sysroot=/opt/arm-linux-androideabi-4.8-vanilla/android-17/sysroot/ -Wl,--verbose -DANDROID -O3 -finline-functions -Wno-inline -Wall -Wno-missing-braces -fno-strict-aliasing -DBOOST_ALL_NO_LIB -DBOOST_ASIO_ENABLE_CANCELIO -DBOOST_ASIO_HASH_MAP_BUCKETS=1021 -DBOOST_ASIO_SEPARATE_COMPILATION -DBOOST_EXCEPTION_DISABLE -DBOOST_SYSTEM_STATIC_LINK=1 -DNDEBUG -DTORRENT_DISABLE_GEO_IP -DTORRENT_USE_I2P=1 -DTORRENT_USE_TOMMATH -DUNICODE -D_FILE_OFFSET_BITS=64 -D_UNICODE -D_WIN32_WINNT=0x0500  -I"/home/sergey/boost_1_57_0" -I"/usr/local/include" -I"/usr/sfw/include" -I"include" -I"include/libtorrent" -c -o "bin/gcc-4.8/release/boost-source/link-static/target-os-android/threading-multi/src/mpi.o" "src/mpi.c"

    echo "
Done."
    echo "
Building libtorrent python bindings..."
    #mv 
$XBMC_DEPENDS_DIRECTORY/lib/libpython2.6.a $XBMC_DEPENDS_DIRECTORY/lib/libpython2.6.bak || true
    cd "
$LIBTORRENT_ROOT/bindings/python"

    #export LDFLAGS="
$LDFLAGS -undefined dynamic_lookup -Z"
    #--debug-configuration --debug-building 
    
$BOOST_ROOT/bjam    toolset=gcc target-os=android boost=source release  boost-link=static link=static runtime-link=shared encryption=tommath cxxflags="$CXXFLAGS" linkflags="$LDFLAGS" | tee build-log.txt
    # Sometimes previous line will fail for libtorrent 0.16.19. For some reason bjam fails to construct right command for mpi.cpp...
    # Please copy failed command from terminal and edit it like following sample. After that just run in terminal a fixed command and re-run script once again. Sudo may be needed.
    #"
/opt/arm-linux-androideabi-4.8-vanilla/android-17/bin/arm-linux-androideabi-gcc" -x c -DANDROID -DBOOST_PTHREAD_NO_LIB -DBOOST_PYTHON2.6_NO_LIB -DBOOST_PYTHON_STATIC_LIB -Os -fexceptions -march=armv7-a -mtune=cortex-a9 -mfloat-abi=softfp -mfpu=neon  -I/opt/xbmc-depends/arm-linux-androideabi-android-17/include/android-17 -isystem /opt/xbmc-depends/arm-linux-androideabi-android-17/include --sysroot=/opt/arm-linux-androideabi-4.8-vanilla/android-17/sysroot/ -Wl,--verbose -DANDROID -O3 -finline-functions -Wno-inline -Wall -Wno-missing-braces -fPIC -fno-strict-aliasing -DBOOST_ALL_NO_LIB -DBOOST_ASIO_ENABLE_CANCELIO -DBOOST_ASIO_HASH_MAP_BUCKETS=1021 -DBOOST_ASIO_SEPARATE_COMPILATION -DBOOST_EXCEPTION_DISABLE -DBOOST_SYSTEM_STATIC_LINK=1 -DNDEBUG -DTORRENT_DISABLE_GEO_IP -DTORRENT_USE_I2P=1 -DTORRENT_USE_TOMMATH -DUNICODE -D_FILE_OFFSET_BITS=64 -D_UNICODE -D_WIN32_WINNT=0x0500  -I"../../include" -I"../../include/libtorrent" -I"/home/sergey/boost_1_57_0" -I"/usr/local/include" -I"/usr/sfw/include" -c -o "../../bin/gcc-4.8/release/boost-source/fpic-on/link-static/target-os-android/threading-multi/src/mpi.o" "../../src/mpi.c"

#    if ! grep -q "
ldlibrary not found for -lpython2.6" build-log.txt
#    then
#        echo Check link errors. Expected only missing libpython2.6.a
#        exit 1
#    fi

    PATTERN="
libtorrent.so -shared"
    FINAL_LINK_COMMAND=$(grep 'libtorrent.so -shared' build-log.txt)
    #echo Original FINAL_LINK_COMMAND = 
$FINAL_LINK_COMMAND

    NEW_FINAL_LINK_COMMAND_SUFFIX=" 
-Wl,-Bstatic -lgnustl_static -Wl,-Bdynamic -ldl -lkodi -Wl,--end-group  -Wl,-z,defs -L$ANDROID_TOOLCHAIN_ROOT/sysroot/usr/lib -L$XBMC_ROOT -L$STD_LIB_PATH"
    FINAL_LINK_COMMAND=
${FINAL_LINK_COMMAND%-Wl,-Bstatic*}
    #echo
    #echo Truncated FINAL_LINK_COMMAND = 
$FINAL_LINK_COMMAND
    FINAL_LINK_COMMAND="
sudo $FINAL_LINK_COMMAND$NEW_FINAL_LINK_COMMAND_SUFFIX"
    #echo
    #echo Modified FINAL_LINK_COMMAND = 
$FINAL_LINK_COMMAND

    eval "
$FINAL_LINK_COMMAND"


    FINAL_LIB_PATH=
${FINAL_LINK_COMMAND#*-o \"}
    
FINAL_LIB_PATH=${FINAL_LIB_PATH%%\" *}

    if [ -e 
$FINAL_LIB_PATH ]; then
       cp 
$FINAL_LIB_PATH $LIBTORRENT_ROOT 
       "
$ANDROID_TOOLCHAIN_ROOT/bin/$SRTIP_TOOL" -g $LIBTORRENT_ROOT/libtorrent.so
        echo "
Done"
        echo
        echo "
Final result been copied to  $LIBTORRENT_ROOT"
    else
        echo
        echo "
Build of libtorrent binding FAILED."
        return 1
    fi

}

#********************************************
#*                MAIN                      *
#********************************************

XBMC_SOURCES_DIRECTORY="
$HOME/kodi-android"
LIBTORRENT_SOURCES_DIRECTORY="
$HOME/libtorrent-0.16.19"

export BOOST_ROOT="
$HOME/boost_1_57_0"
# For boost version < 1.56 
#export BOOST_BUILD_PATH="
$BOOST_ROOT/tools/build/v2"
export BOOST_BUILD_PATH="
$BOOST_ROOT/tools/build"

XBMC_BJAM_SETTINGS="
$XBMC_SOURCES_DIRECTORY/tools/depends/target/boost/$BUILD_TARGET_NAME/tools/build/v2"

patch_bjam 
$HOME $XBMC_BJAM_SETTINGS #$BOOST_BUILD_PATH

setup_build_env 
$HOME #$BOOST_BUILD_PATH
echo
echo "
CFLAGS $CFLAGS"
echo "
CXXFLAGS $CXXFLAGS"
echo "
LDFLAGS $LDFLAGS"
echo

PATH=
$XBMC_DEPENDS_DIRECTORY:$PATH
export PATH

build_libtorrent 
$LIBTORRENT_SOURCES_DIRECTORY $XBMC_SOURCES_DIRECTORY 

Скрипт компиляции для Mac OS X [версия - 0.16.19] (автор - srg70):

Запускать можно со следующими параметрами:
Код:
./build-libtorrent [-r | --rebuild all | libtorrent] [-t | --libtorrent-version ...]
-r or --rebuild                  - will build from scratch (takes a while).
-t or --libtorrent-version   - version of libtorrent source to build. Default 0.16.19
PHP код:
#!/bin/bash
set -e
#  build_order.bash
#
#  Created by Sergey Shramchenko on 15.08.13.
#  Copyright (c) 2013 Sergey Shramchenko. All rights reserved.

function usage {
    echo 
"Usage ./build-libtorrent [-r | --rebuild all | libtorrent] [-t | --libtorrent-version ...]"
    
echo "    -r or --rebuild               - will build from scratch (takes a while)."
    
echo "    -t | --libtorrent-version     - version of libtorrent source to build. Default 0.16.19"
}

SHOULD_REBUILD_ALL=0
SHOULD_REBUILD_LIBTORRENT
=0
LIBTORRENT_VERSION
="0.16.19"

while [[ $# > 0 ]]
do
    
key="$1"

    
case $key in
        
-r|--rebuild)
            if [ 
"$2" == "all" ]; then
                SHOULD_REBUILD_ALL
=1
            
else
                if [ 
"$2" == "libtorrent" ]; then
                    SHOULD_REBUILD_LIBTORRENT
=1
                fi
            fi
            shift 
# past argument
        
;;
        -
t|--libtorrent-version)
            
LIBTORRENT_VERSION="$2"
            
shift # past argument
        
;;
#        -l|--lib)
#        LIBPATH="$2"
#        shift # past argument
#        ;;
#        --default)
#        DEFAULT=YES
#        ;;
        
*)
            
usage
            
exit
        ;;
    
esac
    shift 
# past argument or value
done

#********************************************
#*             contains_element             *
#********************************************
function contains_element () {
    
local e
    
for e in "${@:2}"; do [[ "$e== "$1" ]] && return 0done
    
return 1
}

#********************************************
#*             check_components             *
#********************************************
function check_components {
    
local test=""
    
echo "Checking components..."
    
# brew
    
if [ $(which brew) != "/usr/local/bin/brew" ]; then
        
echo "Home Brew not found. Tring to install..."
        
ruby -"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
        
if [ $(which brew) != "/usr/local/bin/brew" ]; then
            
echo "FAILED to install Home Brew. Please visit [url]http://brew.sh[/url] and install Home Brew manually"
            
exit 1
        fi
    fi
    
echo "Brew: Ok"
    
installed_libs=( $(brew list) )
    
requested_libs=("autoconf" "automake" "binutils" "cmake" "cppunit" "libtool" "openssl" "pkg-config")
    for 
i in "${requested_libs[@]}"; do
        if ! 
contains_element "$i" "${installed_libs[@]}"then
            
echo "Tring to installing $i..."
            
brew install openssl
            
echo "$i: Ok"
        
else
            echo 
"$i: Ok"
        
fi
    done
}

#********************************************
#*                 download                 *
#********************************************
function download {
    
local REMOTE="$1"
    
local LOCAL="$3/$2"

    
if [ -e $LOCAL ]; then
        
echo "Skip downloading of $REMOTE. Found local copy at $LOCAL"
        
return
    
fi

    
if [ ! -$]; then
        mkdir 
$3
    fi

    
echo "Downloading $REMOTE ..."
    
curl --progress-bar --o $LOCAL $REMOTE
    
echo "Done"
}

#********************************************
#*                 extract                  *
#********************************************
function extract {
    
local ARCHIVE="$1"
    
local TARGET="$2"

    
if  [ -d $TARGET ] && [ $SHOULD_REBUILD_ALL -ne 1 ]; then
        
echo "Skip extracting of $ARCHIVE$TARGET exists"
        
return
    
fi
    
echo "Exracting $ARCHIVE to $TARGET ..."
    
rm -rf $TARGETmkdir $TARGET
    tar 
-xf $ARCHIVE -C $TARGET
    
echo "Done"
}

#********************************************
#*                build_xbmc                *
#********************************************
function build_xbmc {
    
local XBMC_HOME="$1"
    
local XBMC_DEPENDS="$2"

    
cd $XBMC_HOME

    
if  [ -d $XBMC_DEPENDS ] && [ $SHOULD_REBUILD_ALL -ne 1 ]; then
        
echo "Skip XBMC building. $XBMC_DEPENDS exists"
        
return
    
fi
    
echo "Building XBMC/Kodi ..."
    
rm -rf $XBMC_DEPENDS

    cd 
"$XBMC_HOME/tools/depends"
    
./bootstrap
    
./configure --host=x86_64-apple-darwin
    
# NOTE: do NOT use -j to speed up make. Building may fail
    
make

    cd 
"$XBMC_HOME"
    
make -C tools/depends/target/xbmc
    make clean
    make xcode_depends
}

#********************************************
#*               patch_bjam                 *
#********************************************
function patch_bjam {
    
local PATTERN="using gcc"
    
local PATCH="using darwin"
    
local JAM_CONFIG_DIR="$1"
    
local CONFIG_JAM="$JAM_CONFIG_DIR/user-config.jam"

    
if grep -Fq "$PATCH$CONFIG_JAM;     then
        
echo "BOOST.BUILD configuration has been already patched."
        
return
    
fi
    
echo "Patching BOOST.BUILD configuration file at $CONFIG_JAM..."
    
CONFIG_JAM_BACKUP="$JAM_CONFIG_DIR/user-config.original"
    
\cp $CONFIG_JAM $CONFIG_JAM_BACKUP
    
echo "#This file has been patched by build-libtorrent.bash script!"$CONFIG_JAM
    
while IFS='' read -r line || [[ -n $line ]]; do
        
line=${line/$PATTERN/$PATCH}
        echo 
"$line>> $CONFIG_JAM
    done 
$CONFIG_JAM_BACKUP

    
# Add python block
    
echo "using python" >> $CONFIG_JAM
    
echo " : 2.6" >> $CONFIG_JAM
    
echo " : /Users/Shared/xbmc-depends/macosx10.10_x86_64-target/bin/python2.6" >> $CONFIG_JAM
    
echo " : /Users/Shared/xbmc-depends/macosx10.10_x86_64-target/include/python2.6" >> $CONFIG_JAM
    
echo " : /Users/Shared/xbmc-depends/macosx10.10_x86_64-target/lib" >> $CONFIG_JAM
    
echo " ; " >> $CONFIG_JAM
    
echo "Done"
    
echo "Patched $CONFIG_JAM:"
    
cat $CONFIG_JAM
}

#********************************************
#*            setup_build_env               *
#********************************************
function setup_build_env {
    
local CONFIG_JAM="$1/user-config.jam"
    
local JAM_CFLAG_PATTERN="<cflags>"
    
local JAM_CXXFLAG_PATTERN="<cxxflags>"

    
while IFS='' read -r line || [[ -n $line ]]; do
        if [[ 
$line == *"$JAM_CFLAG_PATTERN"* ]]; then
            line
=${line/$JAM_CFLAG_PATTERN/}
            
line="$(echo -e "${line}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
            
line="${line%\"}"
            
line="${line#\"}"
            
export CFLAGS="$line -I$XBMC_DEPENDS_DIRECTORY/include/python2.6"
        
fi
        
if [[ $line == *"$JAM_CXXFLAG_PATTERN"* ]]; then
            line
=${line/$JAM_CXXFLAG_PATTERN/}
            
line="$(echo -e "${line}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
            
line="${line%\"}"
            
line="${line#\"}"
            
export CXXFLAGS="$line -I$XBMC_DEPENDS_DIRECTORY/include/python2.6 -stdlib=libstdc++ -Wno-parentheses-equality -Wno-unused-private-field -Wno-unused-function -Wno-unused-variable -Wno-deprecated-declarations"
        
fi

    done 
$CONFIG_JAM

    export LDFLAGS
=-"L$XBMC_DEPENDS_DIRECTORY/lib -Wl,-search_paths_first -arch x86_64 -mmacosx-version-min=10.6 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -lz -L/usr/local/opt/openssl/lib -lssl -lcrypto -lffi -lintl -lsqlite3 -liconv -framework CoreFoundation -framework SystemConfiguration -lstdc++"

}

function build_libtorrent {
    local LIBTORRENT_ROOT="
$1"

    if  [ -e "
$LIBTORRENT_ROOT/libtorrent.so" ]; then
        echo "
Skip libtorrent building$LIBTORRENT_ROOT/libtorrent.so exists"
        return
    fi

    echo "
Buildin libtorrent core..."
    cd "
$LIBTORRENT_ROOT"
    
$BOOST_ROOT/bjam    --debug-configuration toolset=darwin boost=source release  boost-link=static link=static runtime-link=shared cxxflags="$CXXFLAGS" linkflags="$LDFLAGS"

    echo "
Done."
    echo "
Building libtorrent python bindings..."
    mv 
$XBMC_DEPENDS_DIRECTORY/lib/libpython2.6.a $XBMC_DEPENDS_DIRECTORY/lib/libpython2.6.bak || true
    cd "
$LIBTORRENT_ROOT/bindings/python"

    export LDFLAGS="
$LDFLAGS -undefined dynamic_lookup -Z"


    
$BOOST_ROOT/bjam    --debug-configuration toolset=darwin boost=source release  boost-link=static link=static runtime-link=shared cxxflags="$CXXFLAGS" linkflags="$LDFLAGS" | tee build-log.txt

    if ! grep -q "
ldlibrary not found for -lpython2.6" build-log.txt
    then
        echo Check link errors. Expected only missing libpython2.6.a
        exit 1
    fi

    FINAL_LINK_COMMAND=$(grep "
\"/usr/bin/clang\" -dynamiclib" build-log.txt)
    
#echo Original length ${#FINAL_LINK_COMMAND}

    
STRING_TO_REMOVE="-lpython2.6"
    
FINAL_LINK_COMMAND=${FINAL_LINK_COMMAND/$STRING_TO_REMOVE/}
    
#echo First remove length ${#FINAL_LINK_COMMAND}

    
STRING_TO_REMOVE="-Z"
    
FINAL_LINK_COMMAND=${FINAL_LINK_COMMAND/$STRING_TO_REMOVE/}
    
#echo Second remove length ${#FINAL_LINK_COMMAND}

    
eval $FINAL_LINK_COMMAND

    mv 
-f $XBMC_DEPENDS_DIRECTORY/lib/libpython2.6.bak $XBMC_DEPENDS_DIRECTORY/lib/libpython2.6.|| true

    FINAL_LIB_PATH
=${FINAL_LINK_COMMAND#*-o \"}
    
FINAL_LIB_PATH=${FINAL_LIB_PATH%%\" *}

    if [ -e 
$FINAL_LIB_PATH ]; then
        cp 
$FINAL_LIB_PATH $LIBTORRENT_ROOT
        echo "
Done"
        echo
        echo "
Final result been copied to  $LIBTORRENT_ROOT"
    else
        echo "
Build of libtorrent binding FAILED."
        return 1
    fi

}

#********************************************
#*                MAIN                      *
#********************************************
check_components

TARBOLS_DIRECTORY="
$PWD/tarballs"

XBMC_ARCHIVE_URL="
https://github.com/xbmc/xbmc/archive/Helix.zip"
XBMC_ARCHIVE="Helix.zip"
XBMC_DEPENDS_DIRECTORY="/Users/Shared/xbmc-depends"
XBMC_SOURCES_DIRECTORY="$PWD/xbmc_release"
LIBTORRENT_SOURCES_DIRECTORY="$PWD/libtorrent"

echo SHOULD_REBUILD_ALL=$SHOULD_REBUILD_ALL
# Download XBMC
download $XBMC_ARCHIVE_URL $XBMC_ARCHIVE $TARBOLS_DIRECTORY
extract $TARBOLS_DIRECTORY
/$XBMC_ARCHIVE $XBMC_SOURCES_DIRECTORY

# XBMC  archive has subdirectory with branch name
XBMC_SOURCES_DIRECTORY="$XBMC_SOURCES_DIRECTORY/$(ls $XBMC_SOURCES_DIRECTORY )"
echo XBMC_SOURCES_DIRECTORY $XBMC_SOURCES_DIRECTORY

# Build XBMC

build_xbmc $XBMC_SOURCES_DIRECTORY $XBMC_DEPENDS_DIRECTORY
XBMC_DEPENDS_DIRECTORY
="$(find $XBMC_DEPENDS_DIRECTORY -maxdepth 1 -name 'mac*' -print )"
echo XBMC_DEPENDS_DIRECTORY $XBMC_DEPENDS_DIRECTORY

export BOOST_ROOT
="$XBMC_SOURCES_DIRECTORY/tools/depends/target/boost/macosx10.10_x86_64-target"
export BOOST_BUILD_PATH="$BOOST_ROOT/tools/build/v2"

setup_build_env $BOOST_BUILD_PATH
echo "CFLAGS = $CFLAGS"
echo "CXXFLAGS = $CXXFLAGS"
echo "LDFLAGS = $LDFLAGS"
patch_bjam $BOOST_BUILD_PATH

PATH
=$XBMC_DEPENDS_DIRECTORY:$PATH
export PATH

LIBTORRENT_ARCHIVE_URL
="http://sourceforge.net/projects/libtorrent/files/libtorrent/libtorrent-rasterbar-$LIBTORRENT_VERSION.tar.gz/download"
LIBTORRENT_ARCHIVE="libtorrent-rasterbar-$LIBTORRENT_VERSION.tar.gz"


# Download libtorrent
download $LIBTORRENT_ARCHIVE_URL $LIBTORRENT_ARCHIVE $TARBOLS_DIRECTORY
if [ $SHOULD_REBUILD_ALL -eq 1 ] || [ $SHOULD_REBUILD_LIBTORRENT -eq 1 ]; then
    rm 
-rf $LIBTORRENT_SOURCES_DIRECTORY
fi
extract $TARBOLS_DIRECTORY
/$LIBTORRENT_ARCHIVE $LIBTORRENT_SOURCES_DIRECTORY

# XBMC  archive has subdirectory with branch name
#LIBTORRENT_SOURCES_DIRECTORY="$LIBTORRENT_SOURCES_DIRECTORY/$(ls $LIBTORRENT_SOURCES_DIRECTORY )"
LIBTORRENT_SOURCES_DIRECTORY="$(find $LIBTORRENT_SOURCES_DIRECTORY -maxdepth 1 -name 'libtorrent-rasterbar*' -print )"
echo LIBTORRENT_SOURCES_DIRECTORY=$LIBTORRENT_SOURCES_DIRECTORY
build_libtorrent $LIBTORRENT_SOURCES_DIRECTORY 
__________________
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; 28.01.2016 в 23:35.
HAL9000 вне форума   Ответить с цитированием
   
Старый 08.12.2014, 01:52   #2
DiMartino
Senior Member
 
Аватар для DiMartino
 
Регистрация: 26.01.2013
Сообщений: 867
Отправить сообщение для DiMartino с помощью Skype™
По умолчанию

Пока человечество не научится компилировать boost.python под Android и iOS, мы не сможем собрать ни статические, ни любые другие py-libtorrent под эти платформы.
С остальными платформами не должно быть больших проблем. Я бы начал с составления списка наших целей, а именно до сих пор не имеющих своих libtorrent.so ОСей.
Отмечу, что я скомпилировал 1.0.2 и 1.0.0 под windows и linux_x86_64, так они ужасно искали сидов, с чем связано решительно не понятно, настройки сессий сравнивал буквально построчно, все разные выставлял в соответствии со старой версией, где на популярную раздачу уже через секунду есть сид. Поэтому временно в модуле для Torrenter использую старую 0.6.10, хотя уже тестирую 0.6.18 и ищет сидов она так же хорошо как 0.6.10. Надо попробовать со всеми равными флагами компиляции. Дошло до того, что я перехватывал пакеты, выяснил, что 1.0.2 посылает всем find_node запросы, а старая get_peers, у них даже в блоге libtorrent об этом что-то написано.

И так, по моим прикидкам для создания libtorrent в python обмотке требуется: компилятор способный скомпилировать boost.python, потому что сам python, openssl и даже остальные модули boost вроде не испытывают проблем с кроссплатформенностью.
__________________
Плагин MyShows.ru (+оценка KinoPoisk.ru) для Kodi http://xbmc.ru/forum/showthread.php?t=3264
Торрент-стример Torrenter v2 http://xbmc.ru/forum/showthread.php?t=6837

Последний раз редактировалось DiMartino; 08.12.2014 в 07:00.
DiMartino вне форума   Ответить с цитированием
Старый 09.12.2014, 09:12   #3
yevgenb
Member
 
Регистрация: 25.01.2013
Сообщений: 85
По умолчанию

Отличное начинание!
yevgenb вне форума   Ответить с цитированием
Старый 09.12.2014, 15:48   #4
Roman_V_M
Senior Member
 
Аватар для Roman_V_M
 
Регистрация: 12.06.2011
Адрес: Киев
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от HAL9000 Посмотреть сообщение
[SIZE="4"][COLOR="DarkGreen"][*]Страница wiki с мануалом по сборке libtorrent на сайте торрент-клиента Deluge - http://dev.deluge-torrent.org/wiki/Building/libtorrent. У libtorrent и Deluge сейчас одни и те же авторы. Будте осторожны – там иструкция по сборке shared-версии libtorrent. Поэтому не забывайте добавлять соответствующие флаги static.
Странно, там вроде бы все флаги в static и собирается как надо.

Может есть смысл выкладывать уже скомпилированные модули с указанием версии libtorrent, системы и платформы, например libtorent 0.16.19, Windows x86?
Насчет того, чтобы свести все бинарные модули в один аддон-модуль, идея тоже интересная. Единственное но - всё равно придется делать проверку системы при помощи platform, чтобы импортировать нужный бинарный модуль. Но это дело техники.

Кстати, объясните чайнику, какой принцип воспризведения торрентов в Коди? Мы запускаем закачку, ставим ей set_sequential_download(True), чтобы грузить куски последовательно, дожидаемся, пока загрузится достаточный кусок файла (в %) и потом отдаем частично загруженный файл плееру Коди, который играет файл с начала, пока в фоне грузятся остальные части? Так? Или я чего-то не понимаю?
__________________
Координатор русского перевода 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 вне форума   Ответить с цитированием
Старый 09.12.2014, 18:06   #5
DiMartino
Senior Member
 
Аватар для DiMartino
 
Регистрация: 26.01.2013
Сообщений: 867
Отправить сообщение для DiMartino с помощью Skype™
По умолчанию

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Может есть смысл выкладывать уже скомпилированные модули с указанием версии libtorrent, системы и платформы, например libtorent 0.16.19, Windows x86?
Насчет того, чтобы свести все бинарные модули в один аддон-модуль, идея тоже интересная. Единственное но - всё равно придется делать проверку системы при помощи platform, чтобы импортировать нужный бинарный модуль. Но это дело техники.
Я уже сделал "один" модуль, есть в репо. Платформу использовать не обязательно, при неудачной попытке она просто не загрузится. В торрентере использую:
PHP код:
        try:
            
import libtorrent
            
print 'Imported libtorrent v'+libtorrent.version+' from import libtorrent'
        
except:
            print 
'Error importing from import libtorrent'
            
pass

        
if platform.system() != 'Windows':
            try:
                
from python_libtorrent.linux_x86_64 import libtorrent
                
print 'Imported libtorrent v'+libtorrent.version+' from python_libtorrent.linux_x86_64'
            
except:
                print 
'Error importing python_libtorrent.linux_x86_64'
                
pass

            
try:
                
from python_libtorrent.linux_x86 import libtorrent
                
print 'Imported libtorrent v'+libtorrent.version+' from python_libtorrent.linux_x86'
            
except:
                print 
'Error importing python_libtorrent.linux_x86'
                
pass
        
else:
            try:
                
from python_libtorrent.windows import libtorrent
                
print 'Imported libtorrent v'+libtorrent.version+' from python_libtorrent.windows'
            
except:
                print 
'Error importing python_libtorrent.windows'
                
pass 
В зависимостях должна быть "<import addon="script.module.libtorrent" version="0.6.10"/>". Вот только жалуются 32 битные линухи, но его компилировал не я.

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Кстати, объясните чайнику, какой принцип воспризведения торрентов в Коди? Мы запускаем закачку, ставим ей set_sequential_download(True), чтобы грузить куски последовательно, дожидаемся, пока загрузится достаточный кусок файла (в %) и потом отдаем частично загруженный файл плееру Коди, который играет файл с начала, пока в фоне грузятся остальные части? Так? Или я чего-то не понимаю?
В принципе класс Torrent изначально разработанный slng и допиленный мной можно перенести в script.module.libtorrent, допилить нормальный API и использовать в любом плагине.
Класс Torrent стримит так: создает сессию, подключает dht, добавляет торрент, обнуляет приоритет всех кусков, высчитывает первый и последний кусок файла, выставляет приоритет первый+сколько скажут в МБ и два последних, set_sequential_download, полностью скачивает буфер, МЕГАКОСТЫЛЬ, начинает играть и ставит все остальные куски в скачку.
__________________
Плагин MyShows.ru (+оценка KinoPoisk.ru) для Kodi http://xbmc.ru/forum/showthread.php?t=3264
Торрент-стример Torrenter v2 http://xbmc.ru/forum/showthread.php?t=6837
DiMartino вне форума   Ответить с цитированием
Старый 09.12.2014, 19:18   #6
HAL9000
Senior Member
 
Аватар для HAL9000
 
Регистрация: 15.03.2012
Сообщений: 1,094
По умолчанию

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Странно, там вроде бы все флаги в static и собирается как надо.
Может быть. Последний раз когда я смотрел, это было не так. Может что и изменилось.

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Может есть смысл выкладывать уже скомпилированные модули с указанием версии libtorrent, системы и платформы, например libtorent 0.16.19, Windows x86?
Думаю, что лучше все-таки пытаться поддерживать именно скрипты компиляции. Потому что, человек может заболеть, влюбиться, уйти с головой в основную работу и так далее... Если есть скрипты, то с выходом новой версии libtorrent кто-нибудь другой сможет подхватить проект. И тогда работа не пропадет. А готовые сборки и сейчас есть. Вон по форуму где-то гуляет сборка для OpenELEC, но версия libtorrent старая. По идее надо бы собрать новую версию, но никто не готов браться за это с нуля.
__________________
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 вне форума   Ответить с цитированием
Старый 20.12.2014, 15:15   #7
Roman_V_M
Senior Member
 
Аватар для Roman_V_M
 
Регистрация: 12.06.2011
Адрес: Киев
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от HAL9000 Посмотреть сообщение
Может быть. Последний раз когда я смотрел, это было не так. Может что и изменилось.
Похоже, вы всё-таки правы. Собрать полностью статический модуль под Винду не получилось. Причем из Винды всё работает, а из Коди пишет ошибку импорта. Вероятно, какая-то dll не подтянулась при сборке.

На всякий случай батник сборки:
Код:
@echo off

set INCLUDE=C:\OpenSSL-Win32\include;%INCLUDE%
set LIB=C:\OpenSSL-Win32\lib;%LIB%
set BOOST_ROOT=C:\boost
set BOOST_BUILD_PATH=%BOOST_ROOT%
set PATH=%BOOST_ROOT%;%PATH%
set PATH=C:\OpenSSL-Win32;%PATH%

b2 boost=source link=static geoip=static boost-link=static runtime-link=static release optimization=space encryption=openssl
Все пути на месте.
__________________
Координатор русского перевода 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 вне форума   Ответить с цитированием
Старый 20.12.2014, 15:35   #8
DiMartino
Senior Member
 
Аватар для DiMartino
 
Регистрация: 26.01.2013
Сообщений: 867
Отправить сообщение для DiMartino с помощью Skype™
По умолчанию

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Похоже, вы всё-таки правы. Собрать полностью статический модуль под Винду не получилось. Причем из Винды всё работает, а из Коди пишет ошибку импорта. Вероятно, какая-то dll не подтянулась при сборке.

На всякий случай батник сборки:
Код:
@echo off

set INCLUDE=C:\OpenSSL-Win32\include;%INCLUDE%
set LIB=C:\OpenSSL-Win32\lib;%LIB%
set BOOST_ROOT=C:\boost
set BOOST_BUILD_PATH=%BOOST_ROOT%
set PATH=%BOOST_ROOT%;%PATH%
set PATH=C:\OpenSSL-Win32;%PATH%

b2 boost=source link=static geoip=static boost-link=static runtime-link=static release optimization=space encryption=openssl
Все пути на месте.
Отключи ssl и попробуй, мне только это помогло.
__________________
Плагин MyShows.ru (+оценка KinoPoisk.ru) для Kodi http://xbmc.ru/forum/showthread.php?t=3264
Торрент-стример Torrenter v2 http://xbmc.ru/forum/showthread.php?t=6837
DiMartino вне форума   Ответить с цитированием
Старый 20.12.2014, 16:03   #9
HAL9000
Senior Member
 
Аватар для HAL9000
 
Регистрация: 15.03.2012
Сообщений: 1,094
По умолчанию

Цитата:
Сообщение от DiMartino Посмотреть сообщение
Отключи ssl и попробуй, мне только это помогло.
Как временная мера - это КОНЕЧНО подходит, но в будущем надо как-то ssl прикручивать. Ребята из Deluge как-то компилят черти этакие

У меня, кстати, тоже версия для Linux 64-bit компилится нормально, но без GeoIP. А вот с GeoIP спотыкается с сообщением о проблеме с fPIC. Когда смогу скомпилить с GeoIP, вот тогда я скажу что эта версия готова
__________________
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 вне форума   Ответить с цитированием
Старый 20.12.2014, 16:17   #10
Roman_V_M
Senior Member
 
Аватар для Roman_V_M
 
Регистрация: 12.06.2011
Адрес: Киев
Сообщений: 1,933
По умолчанию

Кстати, напейсал свою реализацию торрент-стримера:
https://github.com/romanvm/video.kic....video.kickass
Пока это даже не альфа, а Proof of Concept, но первые результаты обнадеживающие. По крайней мере, если буферизация прошла нормально, то файл проигрывается без всякого мегакостыля.
Сам я этой темой в силу ряда личных обстоятельств заниматься пока не буду, но, возможно, кого-то заинтересуют мои наработки.
__________________
Координатор русского перевода 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 вне форума   Ответить с цитированием
Ответ
 


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenELEC с поддержкой ACEStream и LibTorrent-Rasterbar OneEvil Поддержка платформы Linux \ Live 383 29.07.2015 06:21
Рзделы для видео библиотеки mdog288 Подсказки, описания и FAQ по XBMC 3 16.09.2011 10:17


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


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