diff --git a/packages/addons/addon-depends/pcre2/package.mk b/packages/addons/addon-depends/pcre2/package.mk new file mode 100644 index 0000000000..28ba317c6b --- /dev/null +++ b/packages/addons/addon-depends/pcre2/package.mk @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="pcre2" +PKG_VERSION="10.36" +PKG_SHA256="a9ef39278113542968c7c73a31cfcb81aca1faa64690f400b907e8ab6b4a665c" +PKG_LICENSE="BSD" +PKG_SITE="http://www.pcre.org/" +PKG_URL="https://ftp.pcre.org/pub/pcre/pcre2-${PKG_VERSION}.tar.bz2" +PKG_DEPENDS_TARGET="toolchain" +PKG_LONGDESC="A set of functions that implement regular expression pattern matching using the same syntax." +PKG_TOOLCHAIN="cmake" +PKG_BUILD_FLAGS="+pic" + +PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \ + -DPCRE2_BUILD_PCRE2_16=ON \ + -DPCRE2_SUPPORT_LIBREADLINE=OFF" + +post_makeinstall_target() { + safe_remove ${INSTALL}/usr/bin +} diff --git a/packages/addons/service/tvheadend43/addon.xml b/packages/addons/service/tvheadend43/addon.xml new file mode 100644 index 0000000000..92b199becf --- /dev/null +++ b/packages/addons/service/tvheadend43/addon.xml @@ -0,0 +1,34 @@ + + + + +@REQUIRES@ + + + @PKG_ADDON_PROVIDES@ + + + @PKG_ADDON_PROVIDES@ + + + @PKG_SHORTDESC@ + +@PKG_LONGDESC@ + + +@PKG_DISCLAIMER@ + + all + +@PKG_ADDON_NEWS@ + + + resources/icon.png + resources/fanart.png +@PKG_ADDON_SCREENSHOT@ + + + diff --git a/packages/addons/service/tvheadend43/changelog.txt b/packages/addons/service/tvheadend43/changelog.txt new file mode 100644 index 0000000000..939a143a03 --- /dev/null +++ b/packages/addons/service/tvheadend43/changelog.txt @@ -0,0 +1,2 @@ +100 +- initial LibreELEC version diff --git a/packages/addons/service/tvheadend43/icon/icon.png b/packages/addons/service/tvheadend43/icon/icon.png new file mode 100644 index 0000000000..1e25ce8b91 Binary files /dev/null and b/packages/addons/service/tvheadend43/icon/icon.png differ diff --git a/packages/addons/service/tvheadend43/package.mk b/packages/addons/service/tvheadend43/package.mk new file mode 100644 index 0000000000..4e074b70eb --- /dev/null +++ b/packages/addons/service/tvheadend43/package.mk @@ -0,0 +1,130 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="tvheadend43" +PKG_VERSION="fe0e5f1f9c8fa175183cede9b3182fb25de2d367" +PKG_SHA256="64f006c76f6bb6f17bc5420ff42b7d9ca2530ae9fdd1a835afa91c8acecad3b7" +PKG_VERSION_NUMBER="4.3-1940" +PKG_REV="100" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://www.tvheadend.org" +PKG_URL="https://github.com/tvheadend/tvheadend/archive/${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain avahi comskip curl dvb-apps ffmpegx libdvbcsa libhdhomerun \ + libiconv openssl pcre2 pngquant:host Python3:host tvh-dtv-scan-tables" +PKG_DEPENDS_CONFIG="ffmpegx" +PKG_SECTION="service" +PKG_SHORTDESC="Tvheadend: a TV streaming server for Linux" +PKG_LONGDESC="Tvheadend (${PKG_VERSION_NUMBER}): is a TV streaming server for Linux supporting DVB-S/S2, DVB-C, DVB-T/T2, IPTV, SAT>IP, ATSC and ISDB-T" +PKG_BUILD_FLAGS="-sysroot" + +PKG_IS_ADDON="yes" +PKG_ADDON_NAME="Tvheadend Server 4.3 (Alpha)" +PKG_ADDON_TYPE="xbmc.service" + +# basic transcoding options +PKG_TVH_TRANSCODING="\ + --disable-ffmpeg_static \ + --disable-libfdkaac_static \ + --disable-libopus_static \ + --disable-libtheora \ + --disable-libtheora_static \ + --disable-libvorbis_static \ + --disable-libvpx_static \ + --disable-libx264_static \ + --disable-libx265_static \ + --enable-libav \ + --enable-libfdkaac \ + --enable-libopus \ + --enable-libvorbis \ + --enable-libvpx \ + --enable-libx264 \ + --enable-libx265" + +# hw specific transcoding options +if [ "$TARGET_ARCH" = x86_64 ]; then + PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET libva" + PKG_TVH_TRANSCODING="$PKG_TVH_TRANSCODING \ + --enable-vaapi" +fi + +# specific transcoding options +if [[ "${TARGET_ARCH}" != "x86_64" ]]; then + PKG_TVH_TRANSCODING="${PKG_TVH_TRANSCODING} \ + --disable-libvpx \ + --disable-libx265" +fi + +post_unpack() { + sed -e 's/VER="0.0.0~unknown"/VER="'${PKG_VERSION_NUMBER}' ~ LibreELEC Tvh-addon v'${ADDON_VERSION}'.'${PKG_REV}'"/g' -i ${PKG_BUILD}/support/version + sed -e 's|'/usr/bin/pngquant'|'${TOOLCHAIN}/bin/pngquant'|g' -i ${PKG_BUILD}/support/mkbundle +} + +pre_configure_target() { + PKG_CONFIGURE_OPTS_TARGET="--prefix=/usr \ + --arch=${TARGET_ARCH} \ + --cpu=${TARGET_CPU} \ + --cc=${CC} \ + ${PKG_TVH_TRANSCODING} \ + --enable-avahi \ + --enable-bundle \ + --disable-dbus_1 \ + --enable-dvbcsa \ + --disable-dvben50221 \ + --disable-dvbscan \ + --enable-hdhomerun_client \ + --disable-hdhomerun_static \ + --enable-epoll \ + --enable-inotify \ + --enable-pngquant \ + --disable-libmfx_static \ + --disable-nvenc \ + --disable-uriparser \ + --enable-tvhcsa \ + --enable-trace \ + --nowerror \ + --disable-bintray_cache \ + --python=${TOOLCHAIN}/bin/python" + +# fails to build in subdirs + cd ${PKG_BUILD} + rm -rf .${TARGET_NAME} + +# pass ffmpegx to build + CFLAGS+=" -I$(get_install_dir ffmpegx)/usr/local/include" + LDFLAGS+=" -L$(get_install_dir ffmpegx)/usr/local/lib" + +# pass libhdhomerun to build + CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/hdhomerun" + + export CROSS_COMPILE="${TARGET_PREFIX}" + export CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/iconv -L${SYSROOT_PREFIX}/usr/lib/iconv" +} + +post_make_target() { + ${CC} -O -fbuiltin -fomit-frame-pointer -fPIC -shared -o capmt_ca.so src/extra/capmt_ca.c -ldl +} + +post_makeinstall_target() { + mkdir -p ${INSTALL}/usr/lib + cp -p capmt_ca.so ${INSTALL}/usr/lib +} + +addon() { + mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin + + cp ${PKG_DIR}/addon.xml ${ADDON_BUILD}/${PKG_ADDON_ID} + + # set only version (revision will be added by buildsystem) + sed -e "s|@ADDON_VERSION@|${ADDON_VERSION}|g" \ + -i ${ADDON_BUILD}/${PKG_ADDON_ID}/addon.xml + + cp -P ${PKG_INSTALL}/usr/bin/tvheadend ${ADDON_BUILD}/${PKG_ADDON_ID}/bin + cp -P ${PKG_INSTALL}/usr/lib/capmt_ca.so ${ADDON_BUILD}/${PKG_ADDON_ID}/bin + cp -P $(get_install_dir comskip)/usr/bin/comskip ${ADDON_BUILD}/${PKG_ADDON_ID}/bin + + # dvb-scan files + mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/dvb-scan + cp -r $(get_install_dir tvh-dtv-scan-tables)/usr/share/dvbv5/* \ + ${ADDON_BUILD}/${PKG_ADDON_ID}/dvb-scan +} diff --git a/packages/addons/service/tvheadend43/patches/tvheadend43-01-dvb-scan-path.patch b/packages/addons/service/tvheadend43/patches/tvheadend43-01-dvb-scan-path.patch new file mode 100644 index 0000000000..6acc023bd9 --- /dev/null +++ b/packages/addons/service/tvheadend43/patches/tvheadend43-01-dvb-scan-path.patch @@ -0,0 +1,11 @@ +--- a/src/input/mpegts/scanfile.c ++++ b/src/input/mpegts/scanfile.c +@@ -921,7 +921,7 @@ scanfile_init ( const char *muxconf_path + #elif defined(PLATFORM_FREEBSD) + path = "/usr/local/share/dtv-scan-tables"; + #else +- path = "/usr/share/dvb"; ++ path = "/storage/.kodi/addons/service.tvheadend43/dvb-scan"; + #endif + + if (!initialized) { diff --git a/packages/addons/service/tvheadend43/patches/tvheadend43-02-hdhomerun-includes.patch b/packages/addons/service/tvheadend43/patches/tvheadend43-02-hdhomerun-includes.patch new file mode 100644 index 0000000000..f5fd399e2d --- /dev/null +++ b/packages/addons/service/tvheadend43/patches/tvheadend43-02-hdhomerun-includes.patch @@ -0,0 +1,35 @@ +fix libhdhomerun includes + +--- a/configure ++++ b/configure +@@ -419,7 +419,7 @@ if enabled hdhomerun_static; then + else + + if enabled_or_auto hdhomerun_client; then +- if check_cc_header 'libhdhomerun/hdhomerun' libhdhomerun; then ++ if check_cc_header 'hdhomerun' libhdhomerun; then + enable hdhomerun_client + LDFLAGS="$LDFLAGS -lhdhomerun" + fi +--- a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c ++++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c +@@ -17,7 +17,7 @@ + * along with this program. If not, see . + */ + +-#include "libhdhomerun/hdhomerun.h" ++#include "hdhomerun.h" + + #include "tvheadend.h" + #include "input.h" +--- a/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c ++++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c +@@ -17,7 +17,7 @@ + * along with this program. If not, see . + */ + +-#include "libhdhomerun/hdhomerun.h" ++#include "hdhomerun.h" + + #include + #include "tvheadend.h" diff --git a/packages/addons/service/tvheadend43/source/bin/tv_grab_file b/packages/addons/service/tvheadend43/source/bin/tv_grab_file new file mode 100755 index 0000000000..f2cf25ed88 --- /dev/null +++ b/packages/addons/service/tvheadend43/source/bin/tv_grab_file @@ -0,0 +1,76 @@ +#!/bin/sh + +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) + +if [ $# -lt 1 ] +then + . /etc/profile + + ADDON_HOME="$HOME/.kodi/userdata/addon_data/service.tvheadend43" + ADDON_SETTINGS="$ADDON_HOME/settings.xml" + XML_SETTINGS_VER="$(xmlstarlet sel -t -m settings -v @version $ADDON_SETTINGS)" + if [ "$XML_SETTINGS_VER" = "2" ]; then + XMLTV_TYPE="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_TYPE"]' $ADDON_SETTINGS)" + XMLTV_LOCATION_FILE="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_FILE"]' $ADDON_SETTINGS)" + XMLTV_LOCATION_WEB="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_WEB"]' $ADDON_SETTINGS | xmlstarlet unesc)" + XMLTV_LOCATION_SCRIPT="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_SCRIPT"]' $ADDON_SETTINGS)" + else + XMLTV_TYPE="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_TYPE"]' -v @value $ADDON_SETTINGS)" + XMLTV_LOCATION_FILE="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_FILE"]' -v @value $ADDON_SETTINGS)" + XMLTV_LOCATION_WEB="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_WEB"]' -v @value $ADDON_SETTINGS | xmlstarlet unesc)" + XMLTV_LOCATION_SCRIPT="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_SCRIPT"]' -v @value $ADDON_SETTINGS)" + fi + + if [ "$XMLTV_TYPE" = "FILE" ]; then + case "$XMLTV_LOCATION_FILE" in + *.gz | *.bz2 | *.xz) + zcat "$XMLTV_LOCATION_FILE" + ;; + *) + cat "$XMLTV_LOCATION_FILE" + ;; + esac + exit 0 + elif [ "$XMLTV_TYPE" = "SCRIPT" ]; then + if [ -e "$XMLTV_LOCATION_SCRIPT" ] ; then + exec "$XMLTV_LOCATION_SCRIPT" + fi + elif [ "$XMLTV_TYPE" = "WEB" ]; then + case "$XMLTV_LOCATION_WEB" in + *.gz | *.bz2 | *.xz) + wget -qO - "$XMLTV_LOCATION_WEB" | zcat + ;; + *) + wget -qO - "$XMLTV_LOCATION_WEB" + ;; + esac + exit 0 + fi +fi + +dflag= +vflag= +cflag= + +for a in "$@" +do + [ "$a" = "-d" -o "$a" = "--description" ] && dflag=1 + [ "$a" = "-v" -o "$a" = "--version" ] && vflag=1 + [ "$a" = "-c" -o "$a" = "--capabilities" ] && cflag=1 +done + +if [ -n "$dflag" ] +then + echo "tv_grab_file is a simple grabber that can be configured through the addon settings from Kodi" +fi + +if [ -n "$vflag" ] +then + echo "1.0" +fi + +if [ -n "$cflag" ] +then + echo "baseline" +fi diff --git a/packages/addons/service/tvheadend43/source/bin/tvheadend43.start b/packages/addons/service/tvheadend43/source/bin/tvheadend43.start new file mode 100755 index 0000000000..9bf07a3187 --- /dev/null +++ b/packages/addons/service/tvheadend43/source/bin/tvheadend43.start @@ -0,0 +1,177 @@ +#!/bin/sh + +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) + +. /etc/profile + +oe_setup_addon service.tvheadend43 + +ADDON_SETTINGS="$ADDON_HOME/settings.xml" + +COMSKIP_DIR="$ADDON_HOME/comskip" +COMSKIP_SETTINGS_FILE="$COMSKIP_DIR/comskip.ini" + +DVR_SETTINGS_DIR="$ADDON_HOME/dvr/config" +DVR_SETTINGS_FILE="$DVR_SETTINGS_DIR/8d0f5b7ae354d956d7fe5db25f5d0d24" + +EPGGRAB_SETTINGS_DIR="$ADDON_HOME/epggrab" +EPGGRAB_SETTINGS_FILE="$EPGGRAB_SETTINGS_DIR/config" + +TIMESHIFT_SETTINGS_DIR="$ADDON_HOME/timeshift" +TIMESHIFT_SETTINGS_FILE="$TIMESHIFT_SETTINGS_DIR/config" + +TVH_SETTINGS_DIR="$ADDON_HOME" +TVH_SETTINGS_FILE="$TVH_SETTINGS_DIR/config" + +XMLTV_SETTINGS_DIR="$ADDON_HOME/xmltv" +XMLTV_SETTINGS_FILE="$XMLTV_SETTINGS_DIR/config" + +TIMESHIFT_DIR="$ADDON_HOME/cache/timeshift" +XMLTV_FILE="$ADDON_DIR/bin/tv_grab_file" + +chmod a+x $ADDON_DIR/bin/* + +# workaround to support old 4.1.x version upgrade for Tvh after 4.1.2369 +if [ -f "$ADDON_HOME/dvr/config/dvr-config" ]; then + rm $ADDON_HOME/dvr/config/dvr-config +fi + +# workaround to create default Tvh directories without entering samba share +if [ ! -d "/storage/recordings" ]; then + mkdir -p /storage/recordings /storage/picons/tvh /storage/picons/vdr +fi + +if [ -f "$ADDON_HOME/channel/config/config.tmp" ]; then + rm $ADDON_HOME/channel/config/config.tmp +fi + +if [ -f "$ADDON_HOME/channel/config/tag.tmp" ]; then + rm $ADDON_HOME/channel/config/tag.tmp +fi + +# copy config files to userdata +if [ ! -f "$COMSKIP_SETTINGS_FILE" ]; then + mkdir -p $COMSKIP_DIR + cp $ADDON_DIR/defaults/comskip/comskip.ini $COMSKIP_SETTINGS_FILE +fi + +if [ ! -f "$DVR_SETTINGS_FILE" ]; then + mkdir -p $DVR_SETTINGS_DIR + cp $ADDON_DIR/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24 $DVR_SETTINGS_FILE +fi + +if [ ! -f "$EPGGRAB_SETTINGS_FILE" ]; then + mkdir -p $EPGGRAB_SETTINGS_DIR + cp $ADDON_DIR/defaults/epggrab/config $EPGGRAB_SETTINGS_FILE +fi + +if [ ! -f "$TIMESHIFT_SETTINGS_FILE" ]; then + mkdir -p $TIMESHIFT_DIR + mkdir -p $TIMESHIFT_SETTINGS_DIR + cp $ADDON_DIR/defaults/timeshift/config $TIMESHIFT_SETTINGS_FILE +fi + +if [ ! -f "$TVH_SETTINGS_FILE" ]; then + mkdir -p $TVH_SETTINGS_DIR + cp $ADDON_DIR/defaults/config $TVH_SETTINGS_FILE +fi + +if [ ! -f "$XMLTV_SETTINGS_FILE" ]; then + mkdir -p $XMLTV_SETTINGS_DIR + cp $ADDON_DIR/defaults/xmltv/config $XMLTV_SETTINGS_FILE +fi + +# delayed Tvh startup +if [ "$WORKAROUND_SLEEP" == "true" ]; then + sleep $WORKAROUND_SLEEP_TIME +fi + +# support FritzBox Sat>IP Server detection workaround for AVM-Repeater and AVM-6490 +if [ "$AVM_SATIP_SERVER" == "true" ]; then + if [ "$AVM_DEVICE" == "AVM_Repeater" ]; then + AVM_SATIP="--satip_xml http://${AVM_ROUTER_IP}:49000/satipdesc.xml" + fi + if [ "$AVM_DEVICE" == "AVM_6490" ]; then + AVM_SATIP="--satip_xml http://${AVM_ROUTER_FAKE_IP}:49000/satipdesc.xml" + AVM_NUM="4" + fi + + # add virtual ip as workaround for AVM limitation of one stream per ip + # AVM-Repeater (2 tuners) + ip address add ${AVM_IP1}/24 dev $AVM_ETH + ip address add ${AVM_IP2}/24 dev $AVM_ETH + + # AVM-6490 (4 tuners) + if [ "$AVM_NUM" = "4" ]; then + ip address add ${AVM_IP3}/24 dev $AVM_ETH + ip address add ${AVM_IP4}/24 dev $AVM_ETH + fi +fi + +# custom startup parameters +if [ "$CUSTOM_START" != "true" ]; then + CUSTOM_ARGS="" +fi + +# debug value generation +if [ "$DEBUG_LOG_TRACE_1" != "NONE" ]; then + DEBUG_LOG_ARG="$DEBUG_LOG_TRACE_1" +fi + +if [ "$DEBUG_LOG_TRACE_2" != "NONE" ]; then + DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_2" +fi + +if [ "$DEBUG_LOG_TRACE_3" != "NONE" ]; then + DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_3" +fi + +if [ "$DEBUG_LOG_TRACE_4" != "NONE" ]; then + DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_4" +fi + +if [ "$DEBUG_LOG_TRACE_5" != "NONE" ]; then + DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_5" +fi + +# if debuglog is activated and nothing selected to trace +if [ -z "$DEBUG_LOG_ARG" ];then + DEBUG_LOG_ARG="all" +fi + +# rename debuglog if already exist to prevent overwriting after crash +if [ -f "${DEBUG_LOG_PATH}" ]; then + cp ${DEBUG_LOG_PATH} ${DEBUG_LOG_PATH}_$(date '+%Y-%m-%d_%H.%M.%S').txt +fi + +# debug commandline +if [ "$DEBUG_LOG" = "true" ]; then + TVHEADEND_ARG="-B -C -u root -g video -c $ADDON_HOME $AVM_SATIP $CUSTOM_ARGS -l ${DEBUG_LOG_PATH} --trace $DEBUG_LOG_ARG" +else + TVHEADEND_ARG="-B -C -u root -g video -c $ADDON_HOME $AVM_SATIP $CUSTOM_ARGS" +fi + +# start userspace DVB driver/addon +for driver_dvb in $(find /storage/.kodi/addons/driver.dvb.*/bin/userspace-driver.sh -type f 2>/dev/null); do + driver_dvb_name=$(echo $driver_dvb | awk 'BEGIN {FS="/"} {printf("%s", $5)}') + logger -t Tvheadend "### Loading userspace DVB driver: $driver_dvb_name ###" + # use ". " because of variable export + . $driver_dvb +done + +if [ "$WAIT_FOR_FEINIT" == "true" ] ; then + while [ true ] ; do + if [ -e /dev/dvb/adapter$((NUM_ADAPTERS-1))/frontend0 ] ; then + break + fi + sleep 1 + done +fi + +if [ "$PRELOAD_CAPMT_CA" == "true" ] ; then + logger -t Tvheadend "### Preloading capmt_ca.so library ###" + LD_PRELOAD="$ADDON_DIR/bin/capmt_ca.so $LD_PRELOAD" exec $ADDON_DIR/bin/tvheadend $TVHEADEND_ARG &>$ADDON_LOG_FILE +else + exec $ADDON_DIR/bin/tvheadend $TVHEADEND_ARG &>$ADDON_LOG_FILE +fi diff --git a/packages/addons/service/tvheadend43/source/default.py b/packages/addons/service/tvheadend43/source/default.py new file mode 100644 index 0000000000..93af06affa --- /dev/null +++ b/packages/addons/service/tvheadend43/source/default.py @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) + +import subprocess +import xbmc +import xbmcaddon + + +class Monitor(xbmc.Monitor): + + def __init__(self, *args, **kwargs): + xbmc.Monitor.__init__(self) + self.id = xbmcaddon.Addon().getAddonInfo('id') + + def onSettingsChanged(self): + subprocess.call(['systemctl', 'restart', self.id]) + + +if __name__ == "__main__": + Monitor().waitForAbort() diff --git a/packages/addons/service/tvheadend43/source/defaults/comskip/comskip.ini b/packages/addons/service/tvheadend43/source/defaults/comskip/comskip.ini new file mode 100644 index 0000000000..bf857d44d8 --- /dev/null +++ b/packages/addons/service/tvheadend43/source/defaults/comskip/comskip.ini @@ -0,0 +1,83 @@ +; See comskip.txt in the distribution zip file for many settable parameters, read manual.html, tuning.html and debugwindow.html for how to tune and debug comskip +edl_mode=3 ; the mode specified in the generated edl file, 0=cut, 3=commercial break +mkv_time_offset=30.0 ; offset in seconds, to work around what appears to be an Kodi or ffmpeg bug +always_keep_first_seconds=2 ; Kodi has a bug that causes a segfault if we don't keep the start of the stream, I'll fix that when I get a chance + +detect_method=43 ; 1=black frame, 2=logo, 4=scene change, 8=fuzzy logic, 16=closed captions, 32=aspect ration, 64=silence, 128=cutscenes, 255=all +validate_silence=1 ; Default, set to 0 to force using this clues if selected above. +validate_uniform=1 ; Default, set to 0 to force using this clues (like pure white frames) if blackframe is selected above. +validate_scenechange=1 ; Default, set to 0 to force using this clues if selected above. +verbose=10 ; show a lot of extra info, level 5 is also OK, set to 0 to disable +max_brightness=60 ; frame not black if any pixels checked are greater than this (scale 0 to 255) +test_brightness=40 ; frame not pure black if any pixels checked are greater than this, will check average brightness (scale 0 to 255) +max_avg_brightness=25 ; maximum average brightness for a dim frame to be considered black (scale 0 to 255) 0 means autosetting +max_commercialbreak=600 ; maximum length in seconds to consider a segment a commercial break +min_commercialbreak=25 ; minimum length in seconds to consider a segment a commercial break +max_commercial_size=125 ; maximum time in seconds for a single commercial or multiple commercials if no breaks in between +min_commercial_size=4 ; mimimum time in seconds for a single commercial +min_show_segment_length=250 ; any segment longer than this will be scored towards show. +non_uniformity=500 ; Set to 0 to disable cutpoints based on uniform frames +max_volume=500 ; any frame with sound volume larger than this will not be regarded as black frame +min_silence=12 ; Any deep silence longer than this amount of frames is a possible cutpoint +ticker_tape=0 ; Amount of pixels from bottom to ignore in all processing +logo_at_bottom=0 ; Set to 1 to search only for logo at the lower half of the video, do not combine with subtitle setting +punish=0 ; Compare to average for sum of 1=brightness, 2=uniform 4=volume, 8=silence, 16=schange, set to 0 to disable +punish_threshold=1.3 ; Multiply when amount is above average * punish_threshold +punish_modifier=2 ; When above average * threshold multiply score by this value +intelligent_brightness=0 ; Set to 1 to use a USA specific algorithm to tune some of the settings, not adviced outside the USA +logo_percentile=0.92 ; if more then this amount of logo is found then logo detection will be disabled +logo_threshold=0.75 +punish_no_logo=1 ; Default, set to 0 to avoid show segments without logo to be scored towards commercial +aggressive_logo_rejection=0 +connect_blocks_with_logo=1 ; set to 1 if you want successive blocks with logo on the transition to be regarded as connected, set to 0 to disable +logo_filter=0 ; set the size of the filter to apply to bad logo detection, 4 seems to be a good value. +cut_on_ar_change=1 ; set to 1 if you want to cut also on aspect ratio changes when logo is present, set to 2 to force cuts on aspect ratio changes. set to 0 to disable +delete_show_after_last_commercial=0 ; set to 1 if you want to delete the last block if its a show and after a commercial +delete_show_before_or_after_current=0 ; set to 1 if you want to delete the previous and the next show in the recording, this can lead to the deletion of trailers of next show +delete_block_after_commercial=0 ; set to max size of block in seconds to be discarded, set to 0 to disable +remove_before=0 ; amount of seconds of show to be removed before ALL commercials +remove_after=0 ; amount of seconds of show to be removed after ALL commercials +shrink_logo=5 ; Reduce the duration of the logo with this amount of seconds +after_logo=0 ; set to number of seconds after logo disappears comskip should start to search for silence to insert an additional cutpoint +padding=0 +ms_audio_delay=5 +volume_slip=40 +skip_b_frames=0 ; Set to 1 to force Comskip to skip frames for higher processing speed. +hardware_decode=0 ; Set to 1 to enable hardware accelerated video decoding, only available in donator version +max_repair_size=200 ; Will repair maximum 200 missing MPEG frames in the timeline, set to 0 to disable repairing for players that don't use PTS. +disable_heuristics=4 ; bit pattern for disabling heuristics, adding 1 disables heristics 1, adding 2 disables heristics 2, adding 4 disables heristics 3, 255 disables all heuristics +delete_logo_file=0 ; set to 1 if you want comskip to tidy up after finishing +output_framearray=0 ; create a big excel file for detailed analysis, set to 0 to disable +output_data=0 ; create a dump of the user data channel, used for CC and XDS (such as V-Chip info). Can be use together with output_framearray to remote debug CC decoding +output_videoredo=0 ; The old videoredo format +output_videoredo3=0 ; The new videoredo v3 format. +output_womble=0 +output_mls=0 ; set to 1 if you want MPeg Video Wizard bookmark file output +output_cuttermaran=0 +output_mpeg2schnitt=0 +output_mpgtx=0 +output_dvrcut=0 +output_zoomplayer_chapter=0 +output_zoomplayer_cutlist=0 +output_edl=1 +output_dvrmstb=0 ; Set to 1 if you're running DVRMS-Toolbox +output_edlx=0 +output_vcf=0 +output_bsplayer=0 +output_btv=0 ; set to 1 if you want Beyond TV chapter cutlist output +output_projectx=0 ; set to 1 if you want ProjectX cutlist output (Xcl) +output_avisynth=0 +output_vdr=1 ; set to 1 if you want Kodi to skipping commercials +output_demux=0 ; set to 1 if you want comskip to demux the mpeg file while scanning +sage_framenumber_bug=0 +sage_minute_bug=0 +live_tv=0 ; set to 1 if you use parallelprocessing and need the output while recording +live_tv_retries=4 ; change to 16 when using live_tv in BTV, used for mpeg PS and TS +dvrms_live_tv_retries=300 ; only used for dvr_ms +standoff=0 ; change to 8000000 when using live_tv in BTV + +cuttermaran_options="cut=\"true\" unattended=\"true\" muxResult=\"false\" snapToCutPoints=\"true\" closeApp=\"true\"" +mpeg2schnitt_options="mpeg2schnitt.exe /S /E /R25 /Z %2 %1" +avisynth_options="LoadPlugin(\"MPEG2Dec3.dll\") \nMPEG2Source(\"%s\")\n" +dvrcut_options="dvrcut \"%s.dvr-ms\" \"%s_clean.dvr-ms\" " +windowtitle="Comskip - %s" \ No newline at end of file diff --git a/packages/addons/service/tvheadend43/source/defaults/config b/packages/addons/service/tvheadend43/source/defaults/config new file mode 100644 index 0000000000..de47b6a71c --- /dev/null +++ b/packages/addons/service/tvheadend43/source/defaults/config @@ -0,0 +1,14 @@ +{ + "wizard": "hello", + "uilevel": 1, + "uilevel_nochange": true, + "ui_quicktips": true, + "cookie_expires": 14, + "caclient_ui": true, + "epg_compress": true, + "prefer_picon": true, + "chiconpath": "file:///storage/picons/tvh/%C.png", + "chiconscheme": 2, + "piconpath": "file:///storage/picons/vdr/", + "piconscheme": 1 +} diff --git a/packages/addons/service/tvheadend43/source/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24 b/packages/addons/service/tvheadend43/source/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24 new file mode 100644 index 0000000000..95ffc1a31f --- /dev/null +++ b/packages/addons/service/tvheadend43/source/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24 @@ -0,0 +1,18 @@ +{ + "storage": "/storage/recordings", + "retention-days": 2147483646, + "removal-days": 2147483647, + "pre-extra-time": 0, + "post-extra-time": 0, + "day-dir": false, + "channel-dir": false, + "channel-in-title": true, + "date-in-title": true, + "time-in-title": true, + "whitespace-in-title": false, + "title-dir": true, + "episode-in-title": true, + "tag-files": true, + "windows-compatible-filenames": true, + "charset": "UTF-8" +} diff --git a/packages/addons/service/tvheadend43/source/defaults/epggrab/config b/packages/addons/service/tvheadend43/source/defaults/epggrab/config new file mode 100644 index 0000000000..230a1cd6f0 --- /dev/null +++ b/packages/addons/service/tvheadend43/source/defaults/epggrab/config @@ -0,0 +1,79 @@ +{ + "channel_rename": true, + "channel_renumber": false, + "channel_reicon": false, + "epgdb_periodicsave": 2, + "ota_initial": true, + "modules": { + "opentv-skyit": { + "class": "epggrab_mod_ota", + "name": "OpenTV: Sky Italia", + "type": "Over-the-air", + "enabled": true, + "priority": 2 + }, + "opentv-skynz": { + "class": "epggrab_mod_ota", + "name": "OpenTV: Sky NZ", + "type": "Over-the-air", + "enabled": true, + "priority": 2 + }, + "opentv-skyuk": { + "class": "epggrab_mod_ota", + "name": "OpenTV: Sky UK", + "type": "Over-the-air", + "enabled": true, + "priority": 2 + }, + "opentv-ausat": { + "class": "epggrab_mod_ota", + "name": "OpenTV: Ausat", + "type": "Over-the-air", + "enabled": true, + "priority": 2 + }, + "psip": { + "class": "epggrab_mod_ota", + "name": "PSIP: ATSC Grabber", + "type": "Over-the-air", + "enabled": true, + "priority": 1 + }, + "Bulsatcom_39E": { + "class": "epggrab_mod_ota", + "name": "Bulsatcom: Bula 39E", + "type": "Over-the-air", + "enabled": true, + "priority": 5 + }, + "viasat_baltic": { + "class": "epggrab_mod_ota", + "name": "VIASAT: Baltic", + "type": "Over-the-air", + "enabled": true, + "priority": 5 + }, + "uk_freeview": { + "class": "epggrab_mod_ota", + "name": "UK: Freeview", + "type": "Over-the-air", + "enabled": true, + "priority": 5 + }, + "uk_freesat": { + "class": "epggrab_mod_ota", + "name": "UK: Freesat", + "type": "Over-the-air", + "enabled": true, + "priority": 5 + }, + "eit": { + "class": "epggrab_mod_ota", + "name": "EIT: DVB Grabber", + "type": "Over-the-air", + "enabled": true, + "priority": 1 + } + } +} diff --git a/packages/addons/service/tvheadend43/source/defaults/timeshift/config b/packages/addons/service/tvheadend43/source/defaults/timeshift/config new file mode 100644 index 0000000000..dc040e68c7 --- /dev/null +++ b/packages/addons/service/tvheadend43/source/defaults/timeshift/config @@ -0,0 +1,9 @@ +{ + "enabled": 0, + "ondemand": 0, + "path": "/storage/.kodi/userdata/addon_data/service.tvheadend43/cache/timeshift", + "unlimited_period": 0, + "max_period": 3600, + "unlimited_size": 0, + "max_size": 3072 +} diff --git a/packages/addons/service/tvheadend43/source/defaults/xmltv/config b/packages/addons/service/tvheadend43/source/defaults/xmltv/config new file mode 100644 index 0000000000..b76d9b3fc6 --- /dev/null +++ b/packages/addons/service/tvheadend43/source/defaults/xmltv/config @@ -0,0 +1,14 @@ +{ + "grabbers": [ + { + "path": "/storage/.kodi/addons/service.tvheadend43/bin/tv_grab_file", + "description": "tv_grag_file is a simple grabber that just read the ~/.xmltv/tv_grab_file.xmltv file", + "version": "0.1\n", + "mtime": 1318774706, + "capabilities": 1 + } + ], + "grab-interval": 12, + "grab-enabled": 1, + "current-grabber": "/storage/.kodi/addons/service.tvheadend43/bin/tv_grab_file" +} diff --git a/packages/addons/service/tvheadend43/source/download.py b/packages/addons/service/tvheadend43/source/download.py new file mode 100644 index 0000000000..eb672e0740 --- /dev/null +++ b/packages/addons/service/tvheadend43/source/download.py @@ -0,0 +1,67 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) + +import urllib.request, urllib.parse, urllib.error, os, zipfile +from urllib.error import URLError +import xbmc, xbmcvfs, xbmcgui, xbmcaddon +import shutil +import sys + +url = 'https://github.com/tvheadend/dtv-scan-tables/archive/tvheadend.zip' +temp = xbmcvfs.translatePath('special://temp') +temp_folder = os.path.join(temp, 'dtv-scan-tables-tvheadend') +dest_folder = os.path.join(xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo('path')), 'dvb-scan') +archive = os.path.join(temp, 'dtv_scantables.zip') + +ADDON_NAME = xbmcaddon.Addon().getAddonInfo('name') +LS = xbmcaddon.Addon().getLocalizedString +SCANTABLES = ['atsc', 'channels-conf', 'dvb-c', 'dvb-s', 'dvb-t', 'isdb-t'] + +class DownLoader(): + + def __init__(self): + self.dp = xbmcgui.DialogProgressBG() + + def download(self, url, dest): + try: + self.dp.create(ADDON_NAME, LS(30042)) + urllib.request.urlretrieve(url, dest, reporthook=self._pbhook) + self.dp.close() + zip = zipfile.ZipFile(archive) + if zip.testzip() is not None: raise zipfile.BadZipfile + + if os.path.exists(temp_folder): shutil.rmtree(temp_folder) + if os.path.exists(dest_folder): shutil.rmtree(dest_folder) + + self.dp.create(ADDON_NAME, LS(30043)) + for idx, folder in enumerate(SCANTABLES): + self._pbhook(idx, 1, len(SCANTABLES) - 1) + for z in zip.filelist: + if folder in z.filename: zip.extract(z.filename, temp) + + self.dp.close() + for folder in SCANTABLES: + shutil.copytree(os.path.join(temp_folder, folder), os.path.join(dest_folder, folder)) + + xbmcgui.Dialog().notification(ADDON_NAME, LS(30039), xbmcgui.NOTIFICATION_INFO) + except URLError as e: + xbmc.log('Could not download file: %s' % e.reason, xbmc.LOGERROR) + self.dp.close() + xbmcgui.Dialog().notification(ADDON_NAME, LS(30040), xbmcgui.NOTIFICATION_ERROR) + except zipfile.BadZipfile: + xbmc.log('Could not extract files from zip, bad zipfile', xbmc.LOGERROR) + xbmcgui.Dialog().notification(ADDON_NAME, LS(30041), xbmcgui.NOTIFICATION_ERROR) + + def _pbhook(self, numblocks, blocksize, filesize): + percent = int((numblocks * blocksize * 100) / filesize) + self.dp.update(percent) + + +if __name__ == '__main__': + try: + if sys.argv[1] == 'getscantables': + dl = DownLoader() + dl.download(url, archive) + except IndexError: + pass + diff --git a/packages/addons/service/tvheadend43/source/resources/language/English/strings.po b/packages/addons/service/tvheadend43/source/resources/language/English/strings.po new file mode 100644 index 0000000000..3e854ccab1 --- /dev/null +++ b/packages/addons/service/tvheadend43/source/resources/language/English/strings.po @@ -0,0 +1,182 @@ +# Kodi Media Center language file +# Addon Name: tvheadend43 +# Addon id: service.tvheadend43 +# Addon Provider: Team LibreELEC +msgid "" +msgstr "" + +msgctxt "#30000" +msgid "XMLTV" +msgstr "" + +msgctxt "#30001" +msgid "DVB" +msgstr "" + +msgctxt "#30002" +msgid "DEBUG" +msgstr "" + +msgctxt "#30003" +msgid "FRITZ!Box Sat>IP" +msgstr "" + +msgctxt "#30004" +msgid "XMLTV Configuration" +msgstr "" + +msgctxt "#30005" +msgid "XMLTV source type" +msgstr "" + +msgctxt "#30006" +msgid "XMLTV File location" +msgstr "" + +msgctxt "#30007" +msgid "XMLTV Web location" +msgstr "" + +msgctxt "#30008" +msgid "XMLTV Script location" +msgstr "" + +msgctxt "#30009" +msgid "DVB Configuration" +msgstr "" + +msgctxt "#30010" +msgid "Unload DVB modules before suspend" +msgstr "" + +msgctxt "#30011" +msgid "Wait for frontend initialization" +msgstr "" + +msgctxt "#30012" +msgid "Number of adapters to wait for" +msgstr "" + +msgctxt "#30013" +msgid "Preload capmt_ca.so library" +msgstr "" + +msgctxt "#30014" +msgid "Delay the start of Tvheadend" +msgstr "" + +msgctxt "#30015" +msgid "Seconds delay" +msgstr "" + +msgctxt "#30016" +msgid "Custom start parameter" +msgstr "" + +msgctxt "#30017" +msgid "Parameter" +msgstr "" + +msgctxt "#30018" +msgid "FRITZ!Box Sat>IP server" +msgstr "" + +msgctxt "#30019" +msgid "AVM device" +msgstr "" + +msgctxt "#30020" +msgid "IP of the AVM Repeater" +msgstr "" + +msgctxt "#30021" +msgid "Router IP range (last digits are always .254)" +msgstr "" + +msgctxt "#30022" +msgid "Used network" +msgstr "" + +msgctxt "#30023" +msgid "Virtual IP #1" +msgstr "" + +msgctxt "#30024" +msgid "Virtual IP #2" +msgstr "" + +msgctxt "#30025" +msgid "Virtual IP #3" +msgstr "" + +msgctxt "#30026" +msgid "Virtual IP #4" +msgstr "" + +msgctxt "#30027" +msgid "TRACE Configuration" +msgstr "" + +msgctxt "#30028" +msgid "Path" +msgstr "" + +msgctxt "#30029" +msgid "Activate TRACE Debug" +msgstr "" + +msgctxt "#30030" +msgid "Debug Value #1" +msgstr "" + +msgctxt "#30031" +msgid "Debug Value #2" +msgstr "" + +msgctxt "#30032" +msgid "Debug Value #3" +msgstr "" + +msgctxt "#30033" +msgid "Debug Value #4" +msgstr "" + +msgctxt "#30034" +msgid "Debug Value #5" +msgstr "" + +msgctxt "#30035" +msgid "FRITZ!Box Configuration for FRITZ!OS 6.x (do not use for 7.x)" +msgstr "" + +msgctxt "#30036" +msgid "Scan Tables" +msgstr "" + +msgctxt "#30037" +msgid "Manage Scan-Tables" +msgstr "" + +msgctxt "#30038" +msgid "Download and install Scan-Tables" +msgstr "" + +msgctxt "#30039" +msgid "Download completed, tables installed" +msgstr "" + +msgctxt "#30040" +msgid "Could not download Scan-Tables" +msgstr "" + +msgctxt "#30041" +msgid "Could not extract zip files" +msgstr "" + +msgctxt "#30042" +msgid "Download Scan-Tables" +msgstr "" + +msgctxt "#30043" +msgid "Extract Scan-Tables" +msgstr "" diff --git a/packages/addons/service/tvheadend43/source/resources/screenshot-01.png b/packages/addons/service/tvheadend43/source/resources/screenshot-01.png new file mode 100644 index 0000000000..e049349cee Binary files /dev/null and b/packages/addons/service/tvheadend43/source/resources/screenshot-01.png differ diff --git a/packages/addons/service/tvheadend43/source/resources/screenshot-02.png b/packages/addons/service/tvheadend43/source/resources/screenshot-02.png new file mode 100644 index 0000000000..3baa01a479 Binary files /dev/null and b/packages/addons/service/tvheadend43/source/resources/screenshot-02.png differ diff --git a/packages/addons/service/tvheadend43/source/resources/screenshot-03.png b/packages/addons/service/tvheadend43/source/resources/screenshot-03.png new file mode 100644 index 0000000000..2b2759ac6f Binary files /dev/null and b/packages/addons/service/tvheadend43/source/resources/screenshot-03.png differ diff --git a/packages/addons/service/tvheadend43/source/resources/screenshot-04.png b/packages/addons/service/tvheadend43/source/resources/screenshot-04.png new file mode 100644 index 0000000000..acba7b4f9d Binary files /dev/null and b/packages/addons/service/tvheadend43/source/resources/screenshot-04.png differ diff --git a/packages/addons/service/tvheadend43/source/resources/settings.xml b/packages/addons/service/tvheadend43/source/resources/settings.xml new file mode 100644 index 0000000000..75820b68ca --- /dev/null +++ b/packages/addons/service/tvheadend43/source/resources/settings.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/addons/service/tvheadend43/source/settings-default.xml b/packages/addons/service/tvheadend43/source/settings-default.xml new file mode 100644 index 0000000000..567a10b6c1 --- /dev/null +++ b/packages/addons/service/tvheadend43/source/settings-default.xml @@ -0,0 +1,31 @@ + + + eth0 + 192.168.178.201 + 192.168.178.202 + 192.168.178.203 + 192.168.178.204 + 192.168.178.254 + 192.168.178.2 + false + + false + false + /storage/.kodi/userdata/addon_data/service.tvheadend43/debug.txt + NONE + NONE + NONE + NONE + NONE + + 1 + false + + false + false + 1 + + + http:// + NONE + diff --git a/packages/addons/service/tvheadend43/source/sleep.d/tvheadend.power b/packages/addons/service/tvheadend43/source/sleep.d/tvheadend.power new file mode 100755 index 0000000000..aced838807 --- /dev/null +++ b/packages/addons/service/tvheadend43/source/sleep.d/tvheadend.power @@ -0,0 +1,29 @@ +#!/bin/sh + +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) + +. /etc/profile + +oe_setup_addon service.tvheadend43 + +SERVICE="service.tvheadend43" + +case "$1" in + pre) + if systemctl is-active "$SERVICE" &>/dev/null ; then + systemctl stop "$SERVICE" + for module in $REMOVE_MODULES ; do + rmmod $module + done + fi + ;; + post) + if systemctl is-enabled "$SERVICE" &>/dev/null ; then + for module in $REMOVE_MODULES ; do + modprobe $module + done + systemctl start "$SERVICE" + fi + ;; +esac diff --git a/packages/addons/service/tvheadend43/source/system.d/service.tvheadend43.service b/packages/addons/service/tvheadend43/source/system.d/service.tvheadend43.service new file mode 100644 index 0000000000..d6bdcec021 --- /dev/null +++ b/packages/addons/service/tvheadend43/source/system.d/service.tvheadend43.service @@ -0,0 +1,13 @@ +[Unit] +Description=TVHeadend43 Service +After=network-online.service + +[Service] +ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.tvheadend43/bin/tvheadend43.start" +TimeoutStopSec=2 +Restart=always +RestartSec=2 +StartLimitInterval=0 + +[Install] +WantedBy=kodi.target