diff --git a/.github/workflows/updater.sh b/.github/workflows/updater.sh new file mode 100644 index 0000000..b87e755 --- /dev/null +++ b/.github/workflows/updater.sh @@ -0,0 +1,133 @@ +#!/bin/bash + +#================================================= +# FETCHING LATEST RELEASE AND ITS ASSETS +#================================================= + +# Fetching information +current_version=$(cat manifest.json | jq -j '.version|split("~")[0]') +repo=$(cat manifest.json | jq -j '.upstream.code|split("https://github.com/")[1]') +# Some jq magic is needed, because the latest upstream release is not always the latest version (e.g. security patches for older versions) +version=$(curl --silent "https://api.github.com/repos/$repo/releases" | jq -r '.[] | select( .prerelease != true ) | .tag_name' | sort -V | tail -1) +assets=($(curl --silent "https://api.github.com/repos/$repo/releases" | jq -r '[ .[] | select(.tag_name=="'$version'").assets[].browser_download_url ] | join(" ") | @sh' | tr -d "'")) + +# Later down the script, we assume the version has only digits and dots +# Sometimes the release name starts with a "v", so let's filter it out. +# You may need more tweaks here if the upstream repository has different naming conventions. +if [[ ${version:0:1} == "v" || ${version:0:1} == "V" ]]; then + version=${version:1} +fi + +# Setting up the environment variables +echo "Current version: $current_version" +echo "Latest release from upstream: $version" +echo "VERSION=$version" >> $GITHUB_ENV +# For the time being, let's assume the script will fail +echo "PROCEED=false" >> $GITHUB_ENV + +# Proceed only if the retrieved version is greater than the current one +if ! dpkg --compare-versions "$current_version" "lt" "$version" ; then + echo "::warning ::No new version available" + exit 0 +# Proceed only if a PR for this new version does not already exist +elif git ls-remote -q --exit-code --heads https://github.com/$GITHUB_REPOSITORY.git ci-auto-update-v$version ; then + echo "::warning ::A branch already exists for this update" + exit 0 +fi + +# Each release can hold multiple assets (e.g. binaries for different architectures, source code, etc.) +echo "${#assets[@]} available asset(s)" + +#================================================= +# UPDATE SOURCE FILES +#================================================= + +# Here we use the $assets variable to get the resources published in the upstream release. +# Here is an example for Grav, it has to be adapted in accordance with how the upstream releases look like. + +# Let's loop over the array of assets URLs +for asset_url in ${assets[@]}; do + +echo "Handling asset at $asset_url" + +# Assign the asset to a source file in conf/ directory +# Here we base the source file name upon a unique keyword in the assets url +# Leave $src empty to ignore the asset +case $asset_url in + *"arm64.tgz"*) + src="app.arm64" + ;; + *"armel.tgz"*) + src="app.armel" + ;; + *"armhf.tgz"*) + src="app.armhf" + ;; + *"x86_64.tgz"*) + src="app.x86_64" + ;; + *"x86.tgz"*) + src="app.x86" + ;; + *) + src="" + ;; +esac + +# If $src is not empty, let's process the asset +if [ ! -z "$src" ]; then + +# Create the temporary directory +tempdir="$(mktemp -d)" + +# Download sources and calculate checksum +filename=${asset_url##*/} +curl --silent -4 -L $asset_url -o "$tempdir/$filename" +checksum=$(sha256sum "$tempdir/$filename" | head -c 64) + +# Delete temporary directory +rm -rf $tempdir + +# Get extension +if [[ $filename == *.tgz ]]; then + extension=tgz +else + extension=${filename##*.} +fi + +# Rewrite source file +cat < conf/$src.src +SOURCE_URL=$asset_url +SOURCE_SUM=$checksum +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=$extension +SOURCE_EXTRACT=false +EOT +echo "... conf/$src.src updated" + +else +echo "... asset ignored" +fi + +done + +#================================================= +# SPECIFIC UPDATE STEPS +#================================================= + +# Any action on the app's source code can be done. +# The GitHub Action workflow takes care of committing all changes after this script ends. + +#================================================= +# GENERIC FINALIZATION +#================================================= + +# Replace new version in manifest +echo "$(jq -s --indent 4 ".[] | .version = \"$version~ynh1\"" manifest.json)" > manifest.json +echo "$(jq -s --indent 4 ".[] | .upstream.version = \"$version\"" manifest.json)" > manifest.json + +# No need to update the README, yunohost-bot takes care of it + +# The Action will proceed only if the PROCEED environment variable is set to true +echo "PROCEED=true" >> $GITHUB_ENV +exit 0 \ No newline at end of file diff --git a/README.md b/README.md index 3848e52..1db787c 100644 --- a/README.md +++ b/README.md @@ -15,17 +15,21 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview -A DLNA, UPnP and HTTP(S) Media Server +Universal Media Server is a DLNA-compliant UPnP Media Server. It is capable of sharing video, audio and images between most modern devices. -**Shipped version:** 11.5.0 +The program streams or transcodes many different media formats with little or no configuration. It is powered by FFmpeg, MediaInfo, OpenSubtitles, Crowdin, MEncoder, tsMuxeR, AviSynth, VLC and more, which combine to offer support for a wide range of media formats. + +**Shipped version:** 13.0.0 ## Screenshots -![Screenshot of Universal Media Server](./doc/screenshots/screenshot.gif) +![Screenshot of Universal Media Server](./doc/screenshots/screenshot.png) ## Disclaimers / important information ### Configuration +At first run, UMS will ask you to create an admin user. This can be disable later on in the settings + Once installed, UMS will create config file in `/home/yunohost.app/ums/.config/UMS/` All settings are pretty well documented directly in the files. @@ -34,9 +38,8 @@ The default setting will use the shared multimedia directory by default (located ### Limitations - No multi-instance + - No User integration with Yunohost - work only on its own subdomain (ums.mydomain.tld, not on mydomain.tld/ums) - - No user management - - Not tested that much ### Other infos @@ -53,7 +56,7 @@ On small device (Raspberry for example), transco may be requiring too much power * Official app website: * Official admin documentation: -* Upstream app code repository: +* Upstream app code repository: * YunoHost documentation for this app: * Report a bug: diff --git a/README_fr.md b/README_fr.md index be75d2c..816f02a 100644 --- a/README_fr.md +++ b/README_fr.md @@ -15,17 +15,20 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour ## Vue d'ensemble -Un Serveur Multimedia DLNA, UPnP et HTTP(S) +Universal Media Server est un serveur multimédia UPnP compatible DLNA. Il peut partager des vidéos, de l'audio et des images avec la pluparts des équipements modernes. +Le programme stream ou transcode de nombreux formats média différents avec peu ou pas de configuration. Il utilise par FFmpeg, MediaInfo, OpenSubtitles, Crowdin, MEncoder, tsMuxeR, AviSynth, VLC et d'autres, qui se combinent pour offrir une grande variété de formats. -**Version incluse :** 11.5.0 +**Version incluse :** 13.0.0 ## Captures d'écran -![Capture d'écran de Universal Media Server](./doc/screenshots/screenshot.gif) +![Capture d'écran de Universal Media Server](./doc/screenshots/screenshot.png) ## Avertissements / informations importantes ### Configuration +A la première connexion, UMS vous demandera de créer un user administrateur. Cela peut-être désactivé plus tard dans les réglages. + Une fois installé, tous les réglages peuvent être trouvés dans `/home/yunohost.app/ums/.config/UMS/` Les réglages sont plutôt bien documentés, vous pouvez les changer directement dans le fichier. Le réglage par défaut utilisera le répertoire multimédia partagé (situé dans `/home/yunohost.multimedia/share`). Vous pouvez changer ce réglage dans le fichier `/home/yunohost.app/ums/.config/UMS/UMS.conf` sur le réglage "folders". @@ -33,8 +36,8 @@ Le réglage par défaut utilisera le répertoire multimédia partagé (situé da ### Limitations - pas de multiinstance + - Pas d'intégration des utilisateurs avec Yunohost - fonctionne uniquement en sous-domaine (ums.mydomain.tld, et non mydomain.tld/ums) - - pas de gestion d'utilisateur - pas énormément testé ### Autres infos @@ -51,7 +54,7 @@ Sur de petits appareils (par exemple un raspberry), la transco peut demander tro * Site officiel de l'app : * Documentation officielle de l'admin : -* Dépôt de code officiel de l'app : +* Dépôt de code officiel de l'app : * Documentation YunoHost pour cette app : * Signaler un bug : diff --git a/conf/app.arm64.src b/conf/app.arm64.src new file mode 100644 index 0000000..117e9b1 --- /dev/null +++ b/conf/app.arm64.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/UniversalMediaServer/UniversalMediaServer/releases/download/13.0.0/UMS-13.0.0-arm64.tgz +SOURCE_SUM=b0f3bd25e718713484e449878c8ada2f32576fb1bc10f39e57e4ec0ae0e3e04c +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=tgz +SOURCE_EXTRACT=false diff --git a/conf/app.armel.src b/conf/app.armel.src new file mode 100644 index 0000000..cd27c9d --- /dev/null +++ b/conf/app.armel.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/UniversalMediaServer/UniversalMediaServer/releases/download/13.0.0/UMS-13.0.0-armel.tgz +SOURCE_SUM=c8405c8347cee916eed4d6850a4ebde28f87b5031c196106859c2f43f5f01a68 +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=tgz +SOURCE_EXTRACT=false diff --git a/conf/app.armhf.src b/conf/app.armhf.src new file mode 100644 index 0000000..f76c51a --- /dev/null +++ b/conf/app.armhf.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/UniversalMediaServer/UniversalMediaServer/releases/download/13.0.0/UMS-13.0.0-armhf.tgz +SOURCE_SUM=4bbf09e93b0ac2887d0e1579f320f35d701d84ed48cb02a61aa464bd5a148520 +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=tgz +SOURCE_EXTRACT=false diff --git a/conf/app.src.default b/conf/app.x86.src similarity index 50% rename from conf/app.src.default rename to conf/app.x86.src index 9e41bbb..75902a4 100644 --- a/conf/app.src.default +++ b/conf/app.x86.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/UniversalMediaServer/UniversalMediaServer/releases/download/__UPSTREAM_VERSION__/UMS-__UPSTREAM_VERSION__-__MACH__.tgz -SOURCE_SUM=__SHA256__ -SOURCE_FORMAT=tgz +SOURCE_URL=https://github.com/UniversalMediaServer/UniversalMediaServer/releases/download/13.0.0/UMS-13.0.0-x86.tgz +SOURCE_SUM=8de48d05cadaacc10daeaf8d0c5b317f1caf04423dc397bc68aa6990bb0452bc SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=tgz SOURCE_EXTRACT=false diff --git a/conf/app.x86_64.src b/conf/app.x86_64.src new file mode 100644 index 0000000..29b00ce --- /dev/null +++ b/conf/app.x86_64.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/UniversalMediaServer/UniversalMediaServer/releases/download/13.0.0/UMS-13.0.0-x86_64.tgz +SOURCE_SUM=49fa721ad68440b73306149e02a112aae18bf114efcca997df6e919365a22c82 +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=tgz +SOURCE_EXTRACT=false diff --git a/conf/systemd.service b/conf/systemd.service index 7c3df4b..9ffb0c3 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -15,19 +15,19 @@ StandardError=inherit # Depending on specificities of your service/app, you may need to tweak these # .. but this should be a good baseline # Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html -NoNewPrivileges=yes +#NoNewPrivileges=yes PrivateTmp=yes -PrivateDevices=yes -RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 -RestrictNamespaces=yes -RestrictRealtime=yes +#PrivateDevices=yes +#RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 +#RestrictNamespaces=yes +#RestrictRealtime=yes DevicePolicy=closed ProtectSystem=full ProtectControlGroups=yes -ProtectKernelModules=yes -ProtectKernelTunables=yes -LockPersonality=yes -SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap +#ProtectKernelModules=yes +#ProtectKernelTunables=yes +#LockPersonality=yes +#SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap # Denying access to capabilities that should not be relevant for webapps # Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html @@ -38,7 +38,7 @@ CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE -CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW +#CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG [Install] diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..b33367a --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1,3 @@ +Universal Media Server is a DLNA-compliant UPnP Media Server. It is capable of sharing video, audio and images between most modern devices. + +The program streams or transcodes many different media formats with little or no configuration. It is powered by FFmpeg, MediaInfo, OpenSubtitles, Crowdin, MEncoder, tsMuxeR, AviSynth, VLC and more, which combine to offer support for a wide range of media formats. \ No newline at end of file diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md new file mode 100644 index 0000000..2400e98 --- /dev/null +++ b/doc/DESCRIPTION_fr.md @@ -0,0 +1,2 @@ +Universal Media Server est un serveur multimédia UPnP compatible DLNA. Il peut partager des vidéos, de l'audio et des images avec la pluparts des équipements modernes. +Le programme stream ou transcode de nombreux formats média différents avec peu ou pas de configuration. Il utilise par FFmpeg, MediaInfo, OpenSubtitles, Crowdin, MEncoder, tsMuxeR, AviSynth, VLC et d'autres, qui se combinent pour offrir une grande variété de formats. \ No newline at end of file diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md index 72c4a15..7536da5 100644 --- a/doc/DISCLAIMER.md +++ b/doc/DISCLAIMER.md @@ -1,5 +1,7 @@ ### Configuration +At first run, UMS will ask you to create an admin user. This can be disable later on in the settings + Once installed, UMS will create config file in `/home/yunohost.app/ums/.config/UMS/` All settings are pretty well documented directly in the files. @@ -8,9 +10,8 @@ The default setting will use the shared multimedia directory by default (located ### Limitations - No multi-instance + - No User integration with Yunohost - work only on its own subdomain (ums.mydomain.tld, not on mydomain.tld/ums) - - No user management - - Not tested that much ### Other infos diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md index 8783bbd..894107a 100644 --- a/doc/DISCLAIMER_fr.md +++ b/doc/DISCLAIMER_fr.md @@ -1,5 +1,7 @@ ### Configuration +A la première connexion, UMS vous demandera de créer un user administrateur. Cela peut-être désactivé plus tard dans les réglages. + Une fois installé, tous les réglages peuvent être trouvés dans `/home/yunohost.app/ums/.config/UMS/` Les réglages sont plutôt bien documentés, vous pouvez les changer directement dans le fichier. Le réglage par défaut utilisera le répertoire multimédia partagé (situé dans `/home/yunohost.multimedia/share`). Vous pouvez changer ce réglage dans le fichier `/home/yunohost.app/ums/.config/UMS/UMS.conf` sur le réglage "folders". @@ -7,8 +9,8 @@ Le réglage par défaut utilisera le répertoire multimédia partagé (situé da ### Limitations - pas de multiinstance + - Pas d'intégration des utilisateurs avec Yunohost - fonctionne uniquement en sous-domaine (ums.mydomain.tld, et non mydomain.tld/ums) - - pas de gestion d'utilisateur - pas énormément testé ### Autres infos diff --git a/doc/screenshots/screenshot.gif b/doc/screenshots/screenshot.gif deleted file mode 100644 index 4bdbd88..0000000 Binary files a/doc/screenshots/screenshot.gif and /dev/null differ diff --git a/doc/screenshots/screenshot.png b/doc/screenshots/screenshot.png new file mode 100644 index 0000000..dab23e6 Binary files /dev/null and b/doc/screenshots/screenshot.png differ diff --git a/manifest.json b/manifest.json index e7cc0da..3cac019 100644 --- a/manifest.json +++ b/manifest.json @@ -6,14 +6,14 @@ "en": "A DLNA, UPnP and HTTP(S) Media Server", "fr": "Un Serveur Multimedia DLNA, UPnP et HTTP(S)" }, - "version": "11.5.0~ynh1", + "version": "13.0.0~ynh1", "url": "www.universalmediaserver.com", "upstream": { - "version": "11.5.0", + "version": "13.0.0", "license": "GPL-2.0-or-later", "website": "www.universalmediaserver.com", "admindoc": "https://github.com/UniversalMediaServer/UniversalMediaServer/wiki", - "code": "https://github.com/UniversalMediaServer" + "code": "https://github.com/UniversalMediaServer/UniversalMediaServer" }, "license": "GPL-2.0-or-later", "maintainer": { @@ -28,28 +28,28 @@ "nginx" ], "arguments": { - "install" : [ + "install": [ { "name": "domain", "type": "domain", "help": { "en": "UMS require its own subdomain", "fr": "UMS a besoin de son propre sous-domaine" - } + } }, { "name": "is_public", "type": "boolean", "default": true, "help": { - "en" : "Everybody will be able to access your media on the internet without connecting to Yunohost", - "fr" : "Tout le monde pourra voir vos media sans se connecter à Yunohost" + "en": "Everybody will be able to access your media on the internet without connecting to Yunohost", + "fr": "Tout le monde pourra voir vos media sans se connecter à Yunohost" } }, { - "name":"server_name", - "type":"string", - "example":"MyUMS", + "name": "server_name", + "type": "string", + "example": "MyUMS", "default": "UniversalMediaServer", "ask": { "en": "By which name should UMS be identified by your renderer", @@ -61,17 +61,17 @@ } }, { - "name":"interface", + "name": "interface", "type": "string", "default": "eth0", - "ask": { - "en" : "Which network interface do you want to use?", - "fr" : "Quel réseau souhaitez vous utiliser?" - }, - "help": { - "en": "On lan, the interface is usually eth0, on wifi it s usually wlan0", - "fr": "En filaire, l interface est souvent eth0, en wifi wlan0" - } + "ask": { + "en": "Which network interface do you want to use?", + "fr": "Quel réseau souhaitez vous utiliser?" + }, + "help": { + "en": "On lan, the interface is usually eth0, on wifi it s usually wlan0", + "fr": "En filaire, l interface est souvent eth0, en wifi wlan0" + } } ] } diff --git a/scripts/_common.sh b/scripts/_common.sh index dc06006..1b69d9d 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -9,33 +9,20 @@ pkg_dependencies="mediainfo dcraw p7zip" mach=`uname -m` -sha256_arm64=13b2aa5067c29fcb77956e0804ee96935cf731d1a88d3a24c15dd70964d45c73 -sha256_armel=f0f9b517fbcedd4b4883ef5de1a6bd96ba1740658220f52037fdb6a4a14d8543 -sha256_armhf=864924728649edb50a0b679fd058dcf0e6e4abbcf96a4ceb0c63e48f6b5514ce -sha256_x86_64=32cd336096e373bf8b05d2b654bdac688b6daba3e0317be8ae63436820bdb6a4 -sha256_x86=18e897527abe618d477036198f963fadac737cf37ad12234cb40ba701afc736d - case "$mach" in "armv6l" ) mach="armel" - sha256=$sha256_armel #for some reason, jre is not in the tarball pkg_dependencies="$pkg_dependencies openjdk-17-jre" ;; "armv7l" ) if [ $(dpkg --print-architecture) = "armhf" ]; then mach="armhf" - sha256=$sha256_armhf else mach="armel" - sha256=$sha256_armel fi pkg_dependencies="$pkg_dependencies openjdk-17-jre";; "armv8l" ) mach="arm64" - sha256=$sha256_arm64 pkg_dependencies="$pkg_dependencies openjdk-17-jre" ;; "aarch64" ) mach="arm64" - sha256=$sha256_arm64 pkg_dependencies="$pkg_dependencies openjdk-17-jre" ;; - "x86_64" ) mach="x86_64" - sha256=$sha256_x86_64 ;; - * ) mach="x86" - sha256=$sha256_x86 ;; + "x86_64" ) mach="x86_64" ;; + * ) mach="x86" ;; esac diff --git a/scripts/install b/scripts/install index c0bafb2..86ba412 100755 --- a/scripts/install +++ b/scripts/install @@ -104,7 +104,7 @@ ynh_script_progression --message="Setting up source files..." --weight=12 # Download, check integrity, uncompress and patch the source from app.src # Create an app.src for the correct compiled version of UMS # match string are fulfilled in _common.sh -ynh_add_config --template="../conf/app.src.default" --destination="../conf/app.src" +ynh_add_config --template="../conf/app.$mach.src" --destination="../conf/app.src" ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src diff --git a/scripts/upgrade b/scripts/upgrade index 7c607fe..43bbe47 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -89,7 +89,7 @@ then ynh_script_progression --message="Upgrading source files..." --weight=5 # Download, check integrity, uncompress and patch the source from app.src - ynh_add_config --template="../conf/app.src.default" --destination="../conf/app.src" + ynh_add_config --template="../conf/app.$mach.src" --destination="../conf/app.src" ynh_setup_source --dest_dir="$final_path" tar xfvz $final_path/app.tgz --strip-component=1 --directory=$final_path/ ynh_secure_remove $final_path/app.tgz