mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-28 21:26:49 +00:00
tvheadend42: remove addon, mark as broken/unmaintained
Signed-off-by: Matthias Reichl <hias@horus.com>
This commit is contained in:
parent
de48ac1832
commit
e6c4ed1a16
@ -1,34 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<addon id="@PKG_ADDON_ID@"
|
||||
name="@ADDON_NAME@"
|
||||
version="@ADDON_VERSION@"
|
||||
provider-name="@PROVIDER_NAME@">
|
||||
<requires>
|
||||
<import addon="xbmc.python" version="3.0.0"/>
|
||||
@REQUIRES@
|
||||
</requires>
|
||||
<extension point="xbmc.service" library="default.py">
|
||||
<provides>@PKG_ADDON_PROVIDES@</provides>
|
||||
</extension>
|
||||
<extension point="xbmc.python.script" library="download.py">
|
||||
<provides>@PKG_ADDON_PROVIDES@</provides>
|
||||
</extension>
|
||||
<extension point="xbmc.addon.metadata">
|
||||
<summary>@PKG_SHORTDESC@</summary>
|
||||
<description>
|
||||
@PKG_LONGDESC@
|
||||
</description>
|
||||
<disclaimer>
|
||||
@PKG_DISCLAIMER@
|
||||
</disclaimer>
|
||||
<platform>all</platform>
|
||||
<news>
|
||||
@PKG_ADDON_NEWS@
|
||||
</news>
|
||||
<assets>
|
||||
<icon>resources/icon.png</icon>
|
||||
<fanart>resources/fanart.png</fanart>
|
||||
@PKG_ADDON_SCREENSHOT@
|
||||
</assets>
|
||||
</extension>
|
||||
</addon>
|
@ -1 +0,0 @@
|
||||
initial release
|
Binary file not shown.
Before Width: | Height: | Size: 19 KiB |
@ -2,135 +2,25 @@
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="tvheadend42"
|
||||
PKG_VERSION="5bdcfd8ac97b3337e1c7911ae24127df76fa693a"
|
||||
PKG_SHA256="b562a26248cdc02dc94cc62038deea172668fa4c079b2ea4e1b4220f3b1d34f5"
|
||||
PKG_VERSION_NUMBER="4.2.8-36"
|
||||
PKG_REV="2"
|
||||
PKG_VERSION="1.0"
|
||||
PKG_REV="3"
|
||||
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 argtable2 avahi comskip curl dvb-apps libdvbcsa libhdhomerun \
|
||||
libiconv openssl pngquant:host Python3:host dtv-scan-tables"
|
||||
PKG_DEPENDS_CONFIG="ffmpegx"
|
||||
PKG_SITE=""
|
||||
PKG_URL=""
|
||||
PKG_DEPENDS_TARGET="toolchain"
|
||||
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_SHORTDESC="Add-on removed"
|
||||
PKG_LONGDESC="Add-on removed"
|
||||
PKG_TOOLCHAIN="manual"
|
||||
|
||||
PKG_ADDON_BROKEN="Tvheadend 4.2 is no longer maintained and has been superseded by Tvheadend 4.3."
|
||||
|
||||
PKG_IS_ADDON="yes"
|
||||
PKG_ADDON_NAME="Tvheadend Server 4.2"
|
||||
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 \
|
||||
--disable-libav \
|
||||
--disable-libfdkaac \
|
||||
--disable-libopus \
|
||||
--disable-libvorbis \
|
||||
--disable-libx264"
|
||||
|
||||
# hw specific transcoding options
|
||||
if [ "${TARGET_ARCH}" = "x86_64" ]; then
|
||||
PKG_DEPENDS_TARGET+=" libva"
|
||||
# specific transcoding options
|
||||
PKG_TVH_TRANSCODING="${PKG_TVH_TRANSCODING} \
|
||||
--disable-vaapi \
|
||||
--disable-libvpx \
|
||||
--disable-libx265"
|
||||
else
|
||||
# for != "x86_64" targets
|
||||
# specific transcoding options
|
||||
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
|
||||
}
|
||||
PKG_ADDON_TYPE="xbmc.broken"
|
||||
|
||||
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
|
||||
|
||||
if [ "${TARGET_ARCH}" = "x86_64" ]; then
|
||||
mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib.private
|
||||
cp -P $(get_install_dir x265)/usr/lib/libx265.so.215 ${ADDON_BUILD}/${PKG_ADDON_ID}/lib.private
|
||||
patchelf --add-rpath '${ORIGIN}/../lib.private' ${ADDON_BUILD}/${PKG_ADDON_ID}/bin/{comskip,tvheadend}
|
||||
fi
|
||||
|
||||
# dvb-scan files
|
||||
mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/dvb-scan
|
||||
cp -r $(get_install_dir dtv-scan-tables)/usr/share/dvbv5/* \
|
||||
${ADDON_BUILD}/${PKG_ADDON_ID}/dvb-scan
|
||||
:
|
||||
}
|
||||
|
||||
|
@ -1,11 +0,0 @@
|
||||
--- a/src/input/mpegts/scanfile.c
|
||||
+++ b/src/input/mpegts/scanfile.c
|
||||
@@ -906,7 +906,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.tvheadend42/dvb-scan";
|
||||
#endif
|
||||
|
||||
if (!initialized) {
|
@ -1,24 +0,0 @@
|
||||
fix libhdhomerun includes
|
||||
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -394,7 +394,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_private.h
|
||||
+++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun_private.h
|
||||
@@ -24,7 +24,7 @@
|
||||
#include "htsbuf.h"
|
||||
#include "tvhdhomerun.h"
|
||||
|
||||
-#include "libhdhomerun/hdhomerun.h"
|
||||
+#include "hdhomerun.h"
|
||||
|
||||
typedef struct tvhdhomerun_device_info tvhdhomerun_device_info_t;
|
||||
typedef struct tvhdhomerun_device tvhdhomerun_device_t;
|
@ -1,25 +0,0 @@
|
||||
https://github.com/tvheadend/tvheadend/commit/13cd23c371e3377973502f8dc65654b6a0ff372b
|
||||
|
||||
From: Michael Marley <michael@michaelmarley.com>
|
||||
Date: Wed, 26 Jun 2019 19:35:50 -0400
|
||||
Subject: [PATCH] Fix compilation with libhdhomerun 20190621
|
||||
|
||||
They renamed the symbol that was used to determine whether the
|
||||
"hdhomerun_discover_find_devices_custom" needed to be aliased,
|
||||
causing an FTBFS. Instead, recognize both the old and new symbols.
|
||||
---
|
||||
src/input/mpegts/tvhdhomerun/tvhdhomerun.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c
|
||||
+++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c
|
||||
@@ -28,7 +28,8 @@
|
||||
#include <arpa/inet.h>
|
||||
#include <openssl/sha.h>
|
||||
|
||||
-#ifdef HDHOMERUN_TAG_DEVICE_AUTH_BIN
|
||||
+#if defined(HDHOMERUN_TAG_DEVICE_AUTH_BIN) \
|
||||
+ || defined(HDHOMERUN_TAG_DEVICE_AUTH_BIN_DEPRECATED)
|
||||
#define hdhomerun_discover_find_devices_custom \
|
||||
hdhomerun_discover_find_devices_custom_v2
|
||||
#endif
|
@ -1,46 +0,0 @@
|
||||
From 8a2942a361e95ccdbd30c1edc7627df3862cdbbe Mon Sep 17 00:00:00 2001
|
||||
From: James Le Cuirot <chewi@gentoo.org>
|
||||
Date: Fri, 15 May 2020 17:45:30 +0100
|
||||
Subject: [PATCH] Fix building with -fno-common (default from GCC 10)
|
||||
|
||||
---
|
||||
src/input.h | 4 ++--
|
||||
src/input/mpegts.c | 2 ++
|
||||
src/input/mpegts.h | 2 +-
|
||||
3 files changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/src/input.h
|
||||
+++ b/src/input.h
|
||||
@@ -128,8 +128,8 @@ void tvh_hardware_delete ( tvh_hardware_
|
||||
extern const idclass_t tvh_input_class;
|
||||
extern const idclass_t tvh_input_instance_class;
|
||||
|
||||
-tvh_input_list_t tvh_inputs;
|
||||
-tvh_hardware_list_t tvh_hardware;
|
||||
+extern tvh_input_list_t tvh_inputs;
|
||||
+extern tvh_hardware_list_t tvh_hardware;
|
||||
|
||||
#define TVH_INPUT_FOREACH(x) LIST_FOREACH(x, &tvh_inputs, ti_link)
|
||||
#define TVH_HARDWARE_FOREACH(x) LIST_FOREACH(x, &tvh_hardware, th_link)
|
||||
--- a/src/input/mpegts.c
|
||||
+++ b/src/input/mpegts.c
|
||||
@@ -20,6 +20,8 @@
|
||||
#include "mpegts/fastscan.h"
|
||||
#include "memoryinfo.h"
|
||||
|
||||
+struct mpegts_listeners mpegts_listeners;
|
||||
+
|
||||
extern memoryinfo_t mpegts_input_queue_memoryinfo;
|
||||
extern memoryinfo_t mpegts_input_table_memoryinfo;
|
||||
|
||||
--- a/src/input/mpegts.h
|
||||
+++ b/src/input/mpegts.h
|
||||
@@ -1132,7 +1132,7 @@ typedef struct mpegts_listener
|
||||
void (*ml_mux_delete) (mpegts_mux_t *mm, void *p);
|
||||
} mpegts_listener_t;
|
||||
|
||||
-LIST_HEAD(,mpegts_listener) mpegts_listeners;
|
||||
+extern LIST_HEAD(mpegts_listeners, mpegts_listener) mpegts_listeners;
|
||||
|
||||
#define mpegts_add_listener(ml)\
|
||||
LIST_INSERT_HEAD(&mpegts_listeners, ml, ml_link)
|
@ -1,41 +0,0 @@
|
||||
Fix query urls for imdb.com and thetvdb.com
|
||||
Based on tvheadend master branch
|
||||
https://github.com/tvheadend/tvheadend/commit/d8a31e57a492be6628b685488fcc7f1d9d262679
|
||||
https://github.com/tvheadend/tvheadend/commit/ce09077056f9c6558c188d135cec3be85cc9c200
|
||||
|
||||
--- a/src/webui/static/app/epg.js
|
||||
+++ b/src/webui/static/app/epg.js
|
||||
@@ -287,13 +287,11 @@ tvheadend.epgDetails = function(event) {
|
||||
win.show();
|
||||
|
||||
function searchIMDB() {
|
||||
- window.open('http://akas.imdb.com/find?q=' +
|
||||
- encodeURIComponent(event.title), '_blank');
|
||||
+ window.open('https://www.imdb.com/find?q=' + encodeURIComponent(event.title), '_blank');
|
||||
}
|
||||
|
||||
function searchTheTVDB(){
|
||||
- window.open('http://thetvdb.com/?string='+
|
||||
- encodeURIComponent(event.title)+'&searchseriesid=&tab=listseries&function=Search','_blank');
|
||||
+ window.open('https://www.thetvdb.com/search?query=' + encodeURIComponent(event.title), '_blank');
|
||||
}
|
||||
|
||||
function playProgram() {
|
||||
--- a/src/webui/static/app/dvr.js
|
||||
+++ b/src/webui/static/app/dvr.js
|
||||
@@ -87,13 +87,11 @@ tvheadend.dvrDetails = function(uuid) {
|
||||
}));
|
||||
|
||||
function searchIMDB() {
|
||||
- window.open('http://akas.imdb.com/find?q=' +
|
||||
- encodeURIComponent(title), '_blank');
|
||||
+ window.open('https://www.imdb.com/find?q=' + encodeURIComponent(title), '_blank');
|
||||
}
|
||||
|
||||
function searchTheTVDB(){
|
||||
- window.open('http://thetvdb.com/?string='+
|
||||
- encodeURIComponent(title)+'&searchseriesid=&tab=listseries&function=Search','_blank');
|
||||
+ window.open('https://www.thetvdb.com/search?query=' + encodeURIComponent(title),'_blank');
|
||||
}
|
||||
|
||||
var win = new Ext.Window({
|
@ -1,39 +0,0 @@
|
||||
From 1ebf9bf548540f935ff4ce1d380f5ce7849572f3 Mon Sep 17 00:00:00 2001
|
||||
From: Matthieu Poullet <matthieu.poullet@gmail.com>
|
||||
Date: Tue, 15 Mar 2022 10:40:44 +0100
|
||||
Subject: [PATCH] SAT>IP client: UPnP header field names are case insensitive
|
||||
|
||||
- SAT>IP Protocol Specification 1.2.2: 3.3.2 Server Advertisements
|
||||
---
|
||||
src/input/mpegts/satip/satip.c | 14 +++++++-------
|
||||
1 file changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/src/input/mpegts/satip/satip.c
|
||||
+++ b/src/input/mpegts/satip/satip.c
|
||||
@@ -1125,19 +1125,19 @@ satip_discovery_service_received
|
||||
if (ptr == NULL)
|
||||
break;
|
||||
if (http_tokenize(ptr, argv, 2, ':') == 2) {
|
||||
- if (strcmp(argv[0], "ST") == 0)
|
||||
+ if (strcasecmp(argv[0], "ST") == 0)
|
||||
st = argv[1];
|
||||
- else if (strcmp(argv[0], "LOCATION") == 0)
|
||||
+ else if (strcasecmp(argv[0], "LOCATION") == 0)
|
||||
location = argv[1];
|
||||
- else if (strcmp(argv[0], "SERVER") == 0)
|
||||
+ else if (strcasecmp(argv[0], "SERVER") == 0)
|
||||
server = argv[1];
|
||||
- else if (strcmp(argv[0], "BOOTID.UPNP.ORG") == 0)
|
||||
+ else if (strcasecmp(argv[0], "BOOTID.UPNP.ORG") == 0)
|
||||
bootid = argv[1];
|
||||
- else if (strcmp(argv[0], "CONFIGID.UPNP.ORG") == 0)
|
||||
+ else if (strcasecmp(argv[0], "CONFIGID.UPNP.ORG") == 0)
|
||||
configid = argv[1];
|
||||
- else if (strcmp(argv[0], "DEVICEID.SES.COM") == 0)
|
||||
+ else if (strcasecmp(argv[0], "DEVICEID.SES.COM") == 0)
|
||||
deviceid = argv[1];
|
||||
- else if (strcmp(argv[0], "USN") == 0) {
|
||||
+ else if (strcasecmp(argv[0], "USN") == 0) {
|
||||
n = http_tokenize(argv[1], argv, ARRAY_SIZE(argv), ':');
|
||||
for (i = 0; i < n-1; i++)
|
||||
if (argv[i] && strcmp(argv[i], "uuid") == 0) {
|
@ -1,22 +0,0 @@
|
||||
diff --git a/src/htsmsg.h b/src/htsmsg.h
|
||||
index 5cdcaa4867..d15c547e58 100644
|
||||
--- a/src/htsmsg.h
|
||||
+++ b/src/htsmsg.h
|
||||
@@ -75,7 +75,7 @@ typedef struct htsmsg_field {
|
||||
} bin;
|
||||
htsmsg_t *msg;
|
||||
double dbl;
|
||||
- int bool;
|
||||
+ int boolean;
|
||||
} u;
|
||||
|
||||
#if ENABLE_SLOW_MEMORYINFO
|
||||
@@ -91,7 +91,7 @@ typedef struct htsmsg_field {
|
||||
#define hmf_bin u.bin.data
|
||||
#define hmf_binsize u.bin.len
|
||||
#define hmf_dbl u.dbl
|
||||
-#define hmf_bool u.bool
|
||||
+#define hmf_bool u.boolean
|
||||
|
||||
// backwards compat
|
||||
#define htsmsg_get_map_by_field(f) htsmsg_field_get_map(f)
|
@ -1,71 +0,0 @@
|
||||
#!/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.tvheadend42"
|
||||
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
|
@ -1,177 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
. /etc/profile
|
||||
|
||||
oe_setup_addon service.tvheadend42
|
||||
|
||||
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
|
@ -1,20 +0,0 @@
|
||||
# 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()
|
@ -1,83 +0,0 @@
|
||||
; 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"
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"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
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
@ -1,79 +0,0 @@
|
||||
{
|
||||
"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
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
{
|
||||
"enabled": 0,
|
||||
"ondemand": 0,
|
||||
"path": "/storage/.kodi/userdata/addon_data/service.tvheadend42/cache/timeshift",
|
||||
"unlimited_period": 0,
|
||||
"max_period": 3600,
|
||||
"unlimited_size": 0,
|
||||
"max_size": 3072
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"grabbers": [
|
||||
{
|
||||
"path": "/storage/.kodi/addons/service.tvheadend42/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.tvheadend42/bin/tv_grab_file"
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import urllib.request
|
||||
import subprocess
|
||||
import re
|
||||
import xbmc, xbmcvfs, xbmcgui, xbmcaddon
|
||||
|
||||
ADDON_NAME = xbmcaddon.Addon().getAddonInfo("name")
|
||||
LS = xbmcaddon.Addon().getLocalizedString
|
||||
|
||||
|
||||
def clear_directory(directory):
|
||||
try:
|
||||
for file_name in os.listdir(directory):
|
||||
file_path = os.path.join(directory, file_name)
|
||||
if os.path.isfile(file_path):
|
||||
os.unlink(file_path)
|
||||
elif os.path.isdir(file_path):
|
||||
shutil.rmtree(file_path)
|
||||
except Exception as e:
|
||||
xbmcgui.Dialog().notification(ADDON_NAME, LS(30041), xbmcgui.NOTIFICATION_INFO)
|
||||
exit(1)
|
||||
|
||||
|
||||
def download_and_extract(url, destination, extract_path):
|
||||
try:
|
||||
# Download the file
|
||||
urllib.request.urlretrieve(url, destination)
|
||||
|
||||
# Extract the file to the specified directory, ignoring the root path
|
||||
subprocess.run(["tar", "xf", destination, "--strip-components=3", "-C", extract_path])
|
||||
|
||||
except Exception as e:
|
||||
xbmcgui.Dialog().notification(ADDON_NAME, LS(30040), xbmcgui.NOTIFICATION_INFO)
|
||||
exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
scan_tables_path = os.path.join(xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo("path")), "dvb-scan")
|
||||
download_url = "https://linuxtv.org/downloads/dtv-scan-tables/dtv-scan-tables-LATEST.tar.bz2"
|
||||
downloaded_file_path = "/tmp/dtv-scan-tables-LATEST.tar.bz2"
|
||||
|
||||
# Clear the contents of the dvb_scan directory
|
||||
clear_directory(scan_tables_path)
|
||||
|
||||
# Download and extract the file using subprocess
|
||||
download_and_extract(download_url, downloaded_file_path, scan_tables_path)
|
||||
|
||||
# Clean up the downloaded file
|
||||
os.remove(downloaded_file_path)
|
||||
|
||||
# Notify download complete
|
||||
xbmcgui.Dialog().notification(ADDON_NAME, LS(30039), xbmcgui.NOTIFICATION_INFO)
|
@ -1,174 +0,0 @@
|
||||
# Kodi Media Center language file
|
||||
# Addon Name: tvheadend42
|
||||
# Addon id: service.tvheadend42
|
||||
# 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 ""
|
Binary file not shown.
Before Width: | Height: | Size: 128 KiB |
Binary file not shown.
Before Width: | Height: | Size: 136 KiB |
Binary file not shown.
Before Width: | Height: | Size: 167 KiB |
Binary file not shown.
Before Width: | Height: | Size: 77 KiB |
@ -1,55 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<settings>
|
||||
<!-- HTS TVHEADEND -->
|
||||
<category label="30000">
|
||||
<setting label="30004" type="lsep"/>
|
||||
<setting type="sep" />
|
||||
<setting id="XMLTV_TYPE" type="labelenum" label="30005" values="NONE|FILE|SCRIPT|WEB" sort="yes" default="NONE"/>
|
||||
<setting id="XMLTV_LOCATION_FILE" type="file" label="30006" default="" enable="eq(-1,1)"/>
|
||||
<setting id="XMLTV_LOCATION_WEB" type="text" label="30007" default="http://" enable="eq(-2,3)"/>
|
||||
<setting id="XMLTV_LOCATION_SCRIPT" type="file" label="30008" default="" enable="eq(-3,2)"/>
|
||||
</category>
|
||||
<category label="30001">
|
||||
<setting label="30009" type="lsep"/>
|
||||
<setting type="sep" />
|
||||
<setting id="WAIT_FOR_FEINIT" type="bool" label="30011" default="false" />
|
||||
<setting id="NUM_ADAPTERS" type="slider" range="1,16" option="int" label="30012" default="1" enable="eq(-1,true)" />
|
||||
<setting id="REMOVE_MODULES" type="text" label="30010" values="" default=""/>
|
||||
<setting id="PRELOAD_CAPMT_CA" type="bool" label="30013" default="false" />
|
||||
<setting id="WORKAROUND_SLEEP" type="bool" label="30014" default="false" />
|
||||
<setting id="WORKAROUND_SLEEP_TIME" type="slider" range="1,30" option="int" label="30015" default="1" enable="eq(-1,true)" />
|
||||
</category>
|
||||
<category label="30002">
|
||||
<setting label="30027" type="lsep"/>
|
||||
<setting type="sep" />
|
||||
<setting id="DEBUG_LOG" type="bool" label="30029" default="false" />
|
||||
<setting type="sep" />
|
||||
<setting id="DEBUG_LOG_PATH" type="text" label="30028" default="/storage/.kodi/userdata/addon_data/service.tvheadend42/debug.txt" enable="eq(-2,true)"/>
|
||||
<setting id="DEBUG_LOG_TRACE_1" type="select" default="NONE" visible="eq(-3,true)" enable="eq(-3,true)" label="30030" values="NONE|all|access|api|avahi|bat|bonjour|bouquet|caclient|capmt|channel|charset|config|CPU|cron|csa|cwc|dbus|descrambler|diseqc|dvb|dvbcam|dvr|epg|epgdb|epggrab|esfilter|fastscan|fsmonitor|globalheaders|gtimer|hevc|htsp|htsp-ans|htsp-req|htsp-sub|http|httpc|idnode|imagecache|iptv|iptv-pcr|libav|linuxdvb|lock|main|mkv|mpegts|mtimer|muxer|muxsched|opentv|parser|pass|pat|pmt|profile|psip|pyepg|rtsp|satip|satips|scanfile|service|service-mapper|settings|spawn|subscription|tbl|tbl-atsc|tbl-base|tbl-csa|tbl-eit|tbl-pass|tbl-satip|tbl-time|tcp|thread|time|timeshift|transcode|TS|tsfile|tsfix|tvhdhomerun|tvhpoll|upnp|url|uuid|webui|xmltv" />
|
||||
<setting id="DEBUG_LOG_TRACE_2" type="select" default="NONE" visible="eq(-4,true)" enable="!eq(-1,NONE)+eq(-4,true)" label="30031" values="NONE|access|api|avahi|bat|bonjour|bouquet|caclient|capmt|channel|charset|config|CPU|cron|csa|cwc|dbus|descrambler|diseqc|dvb|dvbcam|dvr|epg|epgdb|epggrab|esfilter|fastscan|fsmonitor|globalheaders|gtimer|hevc|htsp|htsp-ans|htsp-req|htsp-sub|http|httpc|idnode|imagecache|iptv|iptv-pcr|libav|linuxdvb|lock|main|mkv|mpegts|mtimer|muxer|muxsched|opentv|parser|pass|pat|pmt|profile|psip|pyepg|rtsp|satip|satips|scanfile|service|service-mapper|settings|spawn|subscription|tbl|tbl-atsc|tbl-base|tbl-csa|tbl-eit|tbl-pass|tbl-satip|tbl-time|tcp|thread|time|timeshift|transcode|TS|tsfile|tsfix|tvhdhomerun|tvhpoll|upnp|url|uuid|webui|xmltv" />
|
||||
<setting id="DEBUG_LOG_TRACE_3" type="select" default="NONE" visible="eq(-5,true)" enable="!eq(-1,NONE)+!eq(-2,NONE)+eq(-5,true)" label="30032" values="NONE|access|api|avahi|bat|bonjour|bouquet|caclient|capmt|channel|charset|config|CPU|cron|csa|cwc|dbus|descrambler|diseqc|dvb|dvbcam|dvr|epg|epgdb|epggrab|esfilter|fastscan|fsmonitor|globalheaders|gtimer|hevc|htsp|htsp-ans|htsp-req|htsp-sub|http|httpc|idnode|imagecache|iptv|iptv-pcr|libav|linuxdvb|lock|main|mkv|mpegts|mtimer|muxer|muxsched|opentv|parser|pass|pat|pmt|profile|psip|pyepg|rtsp|satip|satips|scanfile|service|service-mapper|settings|spawn|subscription|tbl|tbl-atsc|tbl-base|tbl-csa|tbl-eit|tbl-pass|tbl-satip|tbl-time|tcp|thread|time|timeshift|transcode|TS|tsfile|tsfix|tvhdhomerun|tvhpoll|upnp|url|uuid|webui|xmltv" />
|
||||
<setting id="DEBUG_LOG_TRACE_4" type="select" default="NONE" visible="eq(-6,true)" enable="!eq(-1,NONE)+!eq(-2,NONE)+!eq(-3,NONE)+eq(-6,true)" label="30033" values="NONE|access|api|avahi|bat|bonjour|bouquet|caclient|capmt|channel|charset|config|CPU|cron|csa|cwc|dbus|descrambler|diseqc|dvb|dvbcam|dvr|epg|epgdb|epggrab|esfilter|fastscan|fsmonitor|globalheaders|gtimer|hevc|htsp|htsp-ans|htsp-req|htsp-sub|http|httpc|idnode|imagecache|iptv|iptv-pcr|libav|linuxdvb|lock|main|mkv|mpegts|mtimer|muxer|muxsched|opentv|parser|pass|pat|pmt|profile|psip|pyepg|rtsp|satip|satips|scanfile|service|service-mapper|settings|spawn|subscription|tbl|tbl-atsc|tbl-base|tbl-csa|tbl-eit|tbl-pass|tbl-satip|tbl-time|tcp|thread|time|timeshift|transcode|TS|tsfile|tsfix|tvhdhomerun|tvhpoll|upnp|url|uuid|webui|xmltv" />
|
||||
<setting id="DEBUG_LOG_TRACE_5" type="select" default="NONE" visible="eq(-7,true)" enable="!eq(-1,NONE)+!eq(-2,NONE)+!eq(-3,NONE)+!eq(-4,NONE)+eq(-7,true)" label="30034" values="NONE|access|api|avahi|bat|bonjour|bouquet|caclient|capmt|channel|charset|config|CPU|cron|csa|cwc|dbus|descrambler|diseqc|dvb|dvbcam|dvr|epg|epgdb|epggrab|esfilter|fastscan|fsmonitor|globalheaders|gtimer|hevc|htsp|htsp-ans|htsp-req|htsp-sub|http|httpc|idnode|imagecache|iptv|iptv-pcr|libav|linuxdvb|lock|main|mkv|mpegts|mtimer|muxer|muxsched|opentv|parser|pass|pat|pmt|profile|psip|pyepg|rtsp|satip|satips|scanfile|service|service-mapper|settings|spawn|subscription|tbl|tbl-atsc|tbl-base|tbl-csa|tbl-eit|tbl-pass|tbl-satip|tbl-time|tcp|thread|time|timeshift|transcode|TS|tsfile|tsfix|tvhdhomerun|tvhpoll|upnp|url|uuid|webui|xmltv" />
|
||||
<setting type="sep" />
|
||||
<setting id="CUSTOM_START" type="bool" label="30016" default="false" />
|
||||
<setting id="CUSTOM_ARGS" type="text" label="30017" default="" enable="eq(-1,true)" />
|
||||
</category>
|
||||
<category label="30003">
|
||||
<setting label="30035" type="lsep"/>
|
||||
<setting type="sep" />
|
||||
<setting id="AVM_SATIP_SERVER" type="bool" label="30018" default="false"/>
|
||||
<setting id="AVM_DEVICE" type="labelenum" label="30019" values="AVM_Repeater|AVM_6490" visible="eq(-1,true)"/>
|
||||
<setting id="AVM_ROUTER_IP" type="ipaddress" label="30020" default="192.168.178.2" visible="eq(-2,true)+eq(-1,0)"/>
|
||||
<setting id="AVM_ROUTER_FAKE_IP" type="ipaddress" label="30021" default="192.168.178.254" visible="eq(-3,true)+eq(-2,1)"/>
|
||||
<setting id="AVM_ETH" type="labelenum" label="30022" default="eth0" visible="eq(-4,true)" values="eth0|wlan0|eth1|wlan1" />
|
||||
<setting type="sep" visible="eq(-5,true)"/>
|
||||
<setting id="AVM_IP1" type="ipaddress" label="30023" default="192.168.178.201" visible="eq(-6,true)"/>
|
||||
<setting id="AVM_IP2" type="ipaddress" label="30024" default="192.168.178.202" visible="eq(-7,true)"/>
|
||||
<setting id="AVM_IP3" type="ipaddress" label="30025" default="192.168.178.203" visible="eq(-8,true)+eq(-7,1)"/>
|
||||
<setting id="AVM_IP4" type="ipaddress" label="30026" default="192.168.178.204" visible="eq(-9,true)+eq(-8,1)"/>
|
||||
</category>
|
||||
<category label="30036">
|
||||
<setting label="30037" type="lsep"/>
|
||||
<setting id="DOWNLOAD_SCAN_TABLES" type="action" label="30038" option="close" action="RunScript(service.tvheadend42,download.py)"/>
|
||||
</category>
|
||||
</settings>
|
@ -1,31 +0,0 @@
|
||||
<settings version="2">
|
||||
<setting id="AVM_DEVICE" default="true"></setting>
|
||||
<setting id="AVM_ETH" default="true">eth0</setting>
|
||||
<setting id="AVM_IP1" default="true">192.168.178.201</setting>
|
||||
<setting id="AVM_IP2" default="true">192.168.178.202</setting>
|
||||
<setting id="AVM_IP3" default="true">192.168.178.203</setting>
|
||||
<setting id="AVM_IP4" default="true">192.168.178.204</setting>
|
||||
<setting id="AVM_ROUTER_FAKE_IP" default="true">192.168.178.254</setting>
|
||||
<setting id="AVM_ROUTER_IP" default="true">192.168.178.2</setting>
|
||||
<setting id="AVM_SATIP_SERVER" default="true">false</setting>
|
||||
<setting id="CUSTOM_ARGS" default="true"></setting>
|
||||
<setting id="CUSTOM_START" default="true">false</setting>
|
||||
<setting id="DEBUG_LOG" default="true">false</setting>
|
||||
<setting id="DEBUG_LOG_PATH" default="true">/storage/.kodi/userdata/addon_data/service.tvheadend42/debug.txt</setting>
|
||||
<setting id="DEBUG_LOG_TRACE_1" default="true">NONE</setting>
|
||||
<setting id="DEBUG_LOG_TRACE_2" default="true">NONE</setting>
|
||||
<setting id="DEBUG_LOG_TRACE_3" default="true">NONE</setting>
|
||||
<setting id="DEBUG_LOG_TRACE_4" default="true">NONE</setting>
|
||||
<setting id="DEBUG_LOG_TRACE_5" default="true">NONE</setting>
|
||||
<setting id="DOWNLOAD_SCAN_TABLES" default="true"></setting>
|
||||
<setting id="NUM_ADAPTERS">1</setting>
|
||||
<setting id="PRELOAD_CAPMT_CA" default="true">false</setting>
|
||||
<setting id="REMOVE_MODULES" default="true"></setting>
|
||||
<setting id="WAIT_FOR_FEINIT" default="true">false</setting>
|
||||
<setting id="WORKAROUND_SLEEP" default="true">false</setting>
|
||||
<setting id="WORKAROUND_SLEEP_TIME">1</setting>
|
||||
<setting id="XMLTV_LOCATION_FILE" default="true"></setting>
|
||||
<setting id="XMLTV_LOCATION_SCRIPT" default="true"></setting>
|
||||
<setting id="XMLTV_LOCATION_WEB" default="true">http://</setting>
|
||||
<setting id="XMLTV_TYPE" default="true">NONE</setting>
|
||||
</settings>
|
@ -1,29 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
. /etc/profile
|
||||
|
||||
oe_setup_addon service.tvheadend42
|
||||
|
||||
SERVICE="service.tvheadend42"
|
||||
|
||||
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
|
@ -1,13 +0,0 @@
|
||||
[Unit]
|
||||
Description=TVHeadend42 Service
|
||||
After=network-online.service
|
||||
|
||||
[Service]
|
||||
ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.tvheadend42/bin/tvheadend42.start"
|
||||
TimeoutStopSec=2
|
||||
Restart=always
|
||||
RestartSec=2
|
||||
StartLimitInterval=0
|
||||
|
||||
[Install]
|
||||
WantedBy=kodi.target
|
Loading…
x
Reference in New Issue
Block a user