From 1a40eac63ecd6523c196bcb4fb8ab800269a8c6a Mon Sep 17 00:00:00 2001 From: Patrick J Volkerding Date: Fri, 31 May 2024 23:52:07 +0000 Subject: Fri May 31 23:52:07 UTC 2024 d/luajit-2.0.1716656478-x86_64-1.txz: Added. Thanks to Erik Falor. n/proftpd-1.3.8b-x86_64-4.txz: Rebuilt. Build with mod_wrap2 and mod_wrap2_file instead of mod_wrap, which has problems with ipv6. Thanks to jayjwa. xap/mpv-0.38.0-x86_64-2.txz: Rebuilt. [PATCH 1/4] av_common: parent mp_get_lavf_demuxer contents to the list. [PATCH 2/4] stream: implement get_protocols method for stream_lavf. [PATCH 3/4] build: dynamically generate mpv.desktop file protocols. [PATCH 4/4] stream_lavf: don't add ffmpeg bluray or dvd protocols. Thanks to gmgf. Build against luajit. Thanks to pm_a_cup_of_tea. --- source/d/luajit/fetch-luajit.sh | 62 +++ source/d/luajit/luajit.SlackBuild | 137 ++++++ source/d/luajit/slack-desc | 19 + source/n/openssh/openssh.SlackBuild | 1 - source/n/proftpd/proftpd.SlackBuild | 4 +- ...namically_generate_desktop_file_protocols.patch | 462 +++++++++++++++++++++ source/xap/mpv/mpv.SlackBuild | 5 +- 7 files changed, 686 insertions(+), 4 deletions(-) create mode 100755 source/d/luajit/fetch-luajit.sh create mode 100755 source/d/luajit/luajit.SlackBuild create mode 100644 source/d/luajit/slack-desc create mode 100644 source/xap/mpv/dynamically_generate_desktop_file_protocols.patch (limited to 'source') diff --git a/source/d/luajit/fetch-luajit.sh b/source/d/luajit/fetch-luajit.sh new file mode 100755 index 000000000..d5201499c --- /dev/null +++ b/source/d/luajit/fetch-luajit.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +# Copyright 2024 Patrick J. Volkerding, Sebeka, Minnesota, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +PKGNAM=luajit + +# Pull a stable branch + patches +BRANCH=${1:-master} + +# Clear download area: +rm -rf ${PKGNAM} + +# Clone repository: +git clone https://luajit.org/git/luajit.git + +pushd luajit + PATCH="$(git show -s --format=%ct)" +popd + +# checkout $BRANCH: +( cd ${PKGNAM} + git checkout $BRANCH || exit 1 + # Add patch version: + echo $PATCH > .relver + # Use patchlevel, not ROLLING: + sed -i "s/ROLLING/$PATCH/g" etc/luajit.pc src/luajit_rolling.h +) +MAJOR=$(grep majver= ${PKGNAM}/etc/luajit.pc | cut -f 2 -d =) +MINOR=$(grep minver= ${PKGNAM}/etc/luajit.pc | cut -f 2 -d =) +PATCH=$(grep relver= ${PKGNAM}/etc/luajit.pc | cut -f 2 -d =) +HEADISAT="$( cd ${PKGNAM} && git log -1 --format=%h )" +DATE="$( cd ${PKGNAM} && git log -1 --format=%cd --date=format:%Y%m%d )" +LONGDATE="$( cd ${PKGNAM} && git log -1 --format=%cd --date=format:%c )" +# Cleanup. We're not packing up the whole git repo. +( cd ${PKGNAM} && find . -type d -name ".git*" -exec rm -rf {} \; 2> /dev/null ) +mv ${PKGNAM} ${PKGNAM}-${MAJOR}.${MINOR}.${PATCH} +tar cf ${PKGNAM}-${MAJOR}.${MINOR}.${PATCH}.tar ${PKGNAM}-${MAJOR}.${MINOR}.${PATCH} +plzip -9 -f ${PKGNAM}-${MAJOR}.${MINOR}.${PATCH}.tar +rm -rf ${PKGNAM}-${MAJOR}.${MINOR}.${PATCH} +touch -d "$LONGDATE" ${PKGNAM}-${MAJOR}.${MINOR}.${PATCH}.tar.lz +echo +echo "${PKGNAM} branch $BRANCH with HEAD at $HEADISAT packaged as ${PKGNAM}-${MAJOR}.${MINOR}.${PATCH}.tar.lz" +echo diff --git a/source/d/luajit/luajit.SlackBuild b/source/d/luajit/luajit.SlackBuild new file mode 100755 index 000000000..8f9ab0c7a --- /dev/null +++ b/source/d/luajit/luajit.SlackBuild @@ -0,0 +1,137 @@ +#!/bin/bash + +# Copyright 2018 Erik Falor , Logan, Utah, USA +# Copyright 2024 Patrick J. Volkerding, Sebeka, Minnesota, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +cd $(dirname $0) ; CWD=$(pwd) + +PKGNAM=luajit +VERSION=${VERSION:-$(echo $PKGNAM-*.tar.?z | rev | cut -f 3- -d . | cut -f 1 -d - | rev)} +BUILD=${BUILD:-1} + +# Automatically determine the architecture we're building on: +if [ -z "$ARCH" ]; then + case "$(uname -m)" in + i?86) ARCH=i586 ;; + arm*) readelf /usr/bin/file -A | egrep -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;; + # Unless $ARCH is already set, use uname -m for all other archs: + *) ARCH=$(uname -m) ;; + esac + export ARCH +fi + +# If the variable PRINT_PACKAGE_NAME is set, then this script will report what +# the name of the created package would be, and then exit. This information +# could be useful to other scripts. +if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then + echo "$PKGNAM-$VERSION-$ARCH-$BUILD.txz" + exit 0 +fi + +NUMJOBS=${NUMJOBS:-" -j $(expr $(nproc) + 1) "} + +if [ "$ARCH" = "i586" ]; then + SLKCFLAGS="-O2 -march=i586 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +elif [ "$ARCH" = "armv7hl" ]; then + SLKCFLAGS="-O3 -march=armv7-a -mfpu=vfpv3-d16" + LIBDIRSUFFIX="" +else + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +fi + +TMP=${TMP:-/tmp} +PKG=$TMP/package-$PKGNAM + +rm -rf $PKG +mkdir -p $TMP $PKG + +cd $TMP +rm -rf $PKGNAM-$VERSION +tar xvf $CWD/$PKGNAM-$VERSION.tar.?z || exit 1 +cd $PKGNAM-$VERSION || exit 1 + +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \+ -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \+ + +# Enable Lua 5.2 features: +sed -i -e '/-DLUAJIT_ENABLE_LUA52COMPAT/s/^#//' src/Makefile + +# preserve timestamps: +sed -i -e '/install -m/s/-m/-p -m/' Makefile + +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ +make $NUMJOBS \ + Q= \ + PREFIX=/usr \ + MULTILIB=lib${LIBDIRSUFFIX} \ + INSTALL_LIB=/usr/lib${LIBDIRSUFFIX} \ + INSTALL_MAN=/usr/man/man1 || exit 1 + +CFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS" \ +make install \ + Q= \ + DESTDIR=$PKG \ + PREFIX=/usr \ + MULTILIB=lib${LIBDIRSUFFIX} \ + INSTALL_LIB=$PKG/usr/lib${LIBDIRSUFFIX} \ + INSTALL_MAN=$PKG/usr/man/man1 || exit 1 + +# No static library: +rm -f $PKG/usr/lib${LIBDIRSUFFIX}/libluajit*.a + +# Strip binaries: +find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Compress manual pages: +find $PKG/usr/man -type f -exec gzip -9 {} \+ +for i in $( find $PKG/usr/man -type l ) ; do + ln -s $( readlink $i ).gz $i.gz + rm $i +done + +# Add a documentation directory: +mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION +cp -a \ + COPYRIGHT* README* \ + $PKG/usr/doc/${PKGNAM}-$VERSION + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +cd $PKG +/sbin/makepkg -l y -c n $TMP/$PKGNAM-$VERSION-$ARCH-$BUILD.txz diff --git a/source/d/luajit/slack-desc b/source/d/luajit/slack-desc new file mode 100644 index 000000000..367c9e126 --- /dev/null +++ b/source/d/luajit/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. +# Line up the first '|' above the ':' following the base package name, and +# the '|' on the right side marks the last column you can put a character in. +# You must make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':' except on otherwise blank lines. + + |-----handy-ruler------------------------------------------------------| +luajit: luajit (Just-In-Time Lua compiler) +luajit: +luajit: LuaJIT is a Just-In-Time (JIT) compiler for the Lua programming +luajit: language. +luajit: +luajit: Homepage: https://luajit.org/ +luajit: +luajit: +luajit: +luajit: +luajit: diff --git a/source/n/openssh/openssh.SlackBuild b/source/n/openssh/openssh.SlackBuild index 642194ff7..161ee7bf0 100755 --- a/source/n/openssh/openssh.SlackBuild +++ b/source/n/openssh/openssh.SlackBuild @@ -107,7 +107,6 @@ CFLAGS="$SLKCFLAGS" \ --sysconfdir=/etc/ssh \ $PAM_OPTIONS \ $SHADOW_OPTIONS \ - --with-md5-passwords \ --with-libedit \ --with-tcp-wrappers \ --with-default-path=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin \ diff --git a/source/n/proftpd/proftpd.SlackBuild b/source/n/proftpd/proftpd.SlackBuild index 902c1de66..b918d1a57 100755 --- a/source/n/proftpd/proftpd.SlackBuild +++ b/source/n/proftpd/proftpd.SlackBuild @@ -25,11 +25,11 @@ cd $(dirname $0) ; CWD=$(pwd) PKGNAM=proftpd VERSION=1.3.8b DIRVER=1.3.8b -BUILD=${BUILD:-3} +BUILD=${BUILD:-4} NUMJOBS=${NUMJOBS:-" -j$(expr $(nproc) + 1) "} -PROFTPD_MODS="mod_radius:mod_ban:mod_readme:mod_ratio:mod_tls:mod_wrap:mod_ctrls_admin:mod_quotatab:mod_quotatab_file:mod_sftp:mod_facl:mod_ldap" +PROFTPD_MODS="mod_radius:mod_ban:mod_readme:mod_ratio:mod_tls:mod_wrap2:mod_wrap2_file:mod_ctrls_admin:mod_quotatab:mod_quotatab_file:mod_sftp:mod_facl:mod_ldap" # Automatically determine the architecture we're building on: if [ -z "$ARCH" ]; then diff --git a/source/xap/mpv/dynamically_generate_desktop_file_protocols.patch b/source/xap/mpv/dynamically_generate_desktop_file_protocols.patch new file mode 100644 index 000000000..33320e1bc --- /dev/null +++ b/source/xap/mpv/dynamically_generate_desktop_file_protocols.patch @@ -0,0 +1,462 @@ +From f59d358752c2a63c94635511cd963bebb2706d64 Mon Sep 17 00:00:00 2001 +From: Dudemanguy +Date: Wed, 15 May 2024 09:03:14 -0500 +Subject: [PATCH 1/4] av_common: parent mp_get_lavf_demuxer contents to the + list + +The only usage of this function is freed in mpv's generic property code, +so no other changes are needed. +--- + common/av_common.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/common/av_common.c b/common/av_common.c +index 1a23d766b365..142699d4b4c6 100644 +--- a/common/av_common.c ++++ b/common/av_common.c +@@ -265,7 +265,7 @@ char **mp_get_lavf_demuxers(void) + const AVInputFormat *cur = av_demuxer_iterate(&iter); + if (!cur) + break; +- MP_TARRAY_APPEND(NULL, list, num, talloc_strdup(NULL, cur->name)); ++ MP_TARRAY_APPEND(NULL, list, num, talloc_strdup(list, cur->name)); + } + MP_TARRAY_APPEND(NULL, list, num, NULL); + return list; + +From 6692f87b61d48e1523d6e0ef3d311ffff6e89a6e Mon Sep 17 00:00:00 2001 +From: Dudemanguy +Date: Wed, 15 May 2024 19:22:32 -0500 +Subject: [PATCH 2/4] stream: implement get_protocols method for stream_lavf + +Previously, all stream protocols were a static list in mpv. This is okay +for own builtin stuff, but for protocols that depend on ffmpeg it's not +so great. Support for certain protocols may or may not be enabled in a +user's ffmpeg and the protocol list that mpv generates should ideally +match this. Fix this by implementing a get_protocols method for +stream_lavf that will have different results depending on the ffmpeg mpv +is built against. We keep the safe and unsafe protocols separation. The +former is essentially a whitelist. Any protocol that is found in ffmpeg +but is not in the safe whitelist is considered unsafe. In the stream +list, ffmpeg is moved to the bottom so any possible protocols that are +added in the future don't automatically take precedence over any builtin +mpv ones. +--- + common/av_common.c | 12 +++++ + common/av_common.h | 1 + + stream/stream.c | 44 ++++++++++++------- + stream/stream.h | 2 + + stream/stream_lavf.c | 102 ++++++++++++++++++++++++++++++++++++++----- + 5 files changed, 136 insertions(+), 25 deletions(-) + +diff --git a/common/av_common.c b/common/av_common.c +index 142699d4b4c6..a4fa5981ff9f 100644 +--- a/common/av_common.c ++++ b/common/av_common.c +@@ -271,6 +271,18 @@ char **mp_get_lavf_demuxers(void) + return list; + } + ++char **mp_get_lavf_protocols(void) ++{ ++ char **list = NULL; ++ int num = 0; ++ void *opaque = NULL; ++ const char *name; ++ while ((name = avio_enum_protocols(&opaque, 0))) ++ MP_TARRAY_APPEND(NULL, list, num, talloc_strdup(list, name)); ++ MP_TARRAY_APPEND(NULL, list, num, NULL); ++ return list; ++} ++ + int mp_codec_to_av_codec_id(const char *codec) + { + int id = AV_CODEC_ID_NONE; +diff --git a/common/av_common.h b/common/av_common.h +index c584085890c2..b019aa88e17a 100644 +--- a/common/av_common.h ++++ b/common/av_common.h +@@ -42,6 +42,7 @@ void mp_set_avcodec_threads(struct mp_log *l, AVCodecContext *avctx, int threads + void mp_add_lavc_decoders(struct mp_decoder_list *list, enum AVMediaType type); + void mp_add_lavc_encoders(struct mp_decoder_list *list); + char **mp_get_lavf_demuxers(void); ++char **mp_get_lavf_protocols(void); + int mp_codec_to_av_codec_id(const char *codec); + const char *mp_codec_from_av_codec_id(int codec_id); + bool mp_codec_is_lossless(const char *codec); +diff --git a/stream/stream.c b/stream/stream.c +index 06dd92930c01..eca44e4afb37 100644 +--- a/stream/stream.c ++++ b/stream/stream.c +@@ -66,8 +66,6 @@ static const stream_info_t *const stream_list[] = { + #if HAVE_CDDA + &stream_info_cdda, + #endif +- &stream_info_ffmpeg, +- &stream_info_ffmpeg_unsafe, + &stream_info_avdevice, + #if HAVE_DVBIN + &stream_info_dvb, +@@ -92,6 +90,8 @@ static const stream_info_t *const stream_list[] = { + &stream_info_slice, + &stream_info_fd, + &stream_info_cb, ++ &stream_info_ffmpeg, ++ &stream_info_ffmpeg_unsafe, + }; + + // Because of guarantees documented on STREAM_BUFFER_SIZE. +@@ -325,12 +325,17 @@ static int stream_create_instance(const stream_info_t *sinfo, + if (!sinfo->local_fs) + return STREAM_NO_MATCH; + } else { +- for (int n = 0; sinfo->protocols && sinfo->protocols[n]; n++) { +- path = match_proto(url, sinfo->protocols[n]); ++ char **get_protocols = sinfo->get_protocols ? sinfo->get_protocols() : NULL; ++ char **protocols = get_protocols ? get_protocols : (char **)sinfo->protocols; ++ ++ for (int n = 0; protocols && protocols[n]; n++) { ++ path = match_proto(url, protocols[n]); + if (path) + break; + } + ++ talloc_free(get_protocols); ++ + if (!path) + return STREAM_NO_MATCH; + } +@@ -864,16 +869,17 @@ char **stream_get_proto_list(void) + for (int i = 0; i < MP_ARRAY_SIZE(stream_list); i++) { + const stream_info_t *stream_info = stream_list[i]; + +- if (!stream_info->protocols) +- continue; ++ char **get_protocols = stream_info->get_protocols ? stream_info->get_protocols() : NULL; ++ char **protocols = get_protocols ? get_protocols : (char **)stream_info->protocols; + +- for (int j = 0; stream_info->protocols[j]; j++) { +- if (*stream_info->protocols[j] == '\0') +- continue; ++ for (int j = 0; protocols && protocols[j]; j++) { ++ if (*protocols[j] == '\0') ++ continue; + +- MP_TARRAY_APPEND(NULL, list, num, +- talloc_strdup(NULL, stream_info->protocols[j])); ++ MP_TARRAY_APPEND(NULL, list, num, talloc_strdup(list, protocols[j])); + } ++ ++ talloc_free(get_protocols); + } + MP_TARRAY_APPEND(NULL, list, num, NULL); + return list; +@@ -888,7 +894,6 @@ void stream_print_proto_list(struct mp_log *log) + for (int i = 0; list[i]; i++) { + mp_info(log, " %s://\n", list[i]); + count++; +- talloc_free(list[i]); + } + talloc_free(list); + mp_info(log, "\nTotal: %d protocols\n", count); +@@ -899,10 +904,19 @@ bool stream_has_proto(const char *proto) + for (int i = 0; i < MP_ARRAY_SIZE(stream_list); i++) { + const stream_info_t *stream_info = stream_list[i]; + +- for (int j = 0; stream_info->protocols && stream_info->protocols[j]; j++) { +- if (strcmp(stream_info->protocols[j], proto) == 0) +- return true; ++ bool match = false; ++ char **get_protocols = stream_info->get_protocols ? stream_info->get_protocols() : NULL; ++ char **protocols = get_protocols ? get_protocols : (char **)stream_info->protocols; ++ ++ for (int j = 0; protocols && protocols[j]; j++) { ++ if (strcmp(protocols[j], proto) == 0) { ++ match = true; ++ break; ++ } + } ++ ++ talloc_free(get_protocols); ++ return match; + } + + return false; +diff --git a/stream/stream.h b/stream/stream.h +index 58b55e1a43ca..866affe1fef0 100644 +--- a/stream/stream.h ++++ b/stream/stream.h +@@ -114,6 +114,8 @@ typedef struct stream_info_st { + // Alternative to open(). Only either open() or open2() can be set. + int (*open2)(struct stream *st, const struct stream_open_args *args); + const char *const *protocols; ++ // Alternative to protocols. For stream_lavf. ++ char **(*get_protocols)(void); + bool can_write; // correctly checks for READ/WRITE modes + bool local_fs; // supports STREAM_LOCAL_FS_ONLY + int stream_origin; // 0 or set of STREAM_ORIGIN_*; if 0, the same origin +diff --git a/stream/stream_lavf.c b/stream/stream_lavf.c +index a2db55146668..30c823c58f62 100644 +--- a/stream/stream_lavf.c ++++ b/stream/stream_lavf.c +@@ -238,6 +238,96 @@ void mp_setup_av_network_options(AVDictionary **dict, const char *target_fmt, + talloc_free(temp); + } + ++#define PROTO(...) (const char *[]){__VA_ARGS__, NULL} ++ ++// List of safe protocols and their aliases ++static const char **safe_protos[] = { ++ PROTO("data"), ++ PROTO("gopher"), ++ PROTO("gophers"), ++ PROTO("http", "dav", "webdav"), ++ PROTO("httpproxy"), ++ PROTO("https", "davs", "webdavs"), ++ PROTO("ipfs"), ++ PROTO("ipns"), ++ PROTO("mmsh", "mms", "mmshttp"), ++ PROTO("mmst"), ++ PROTO("rist"), ++ PROTO("rtmp"), ++ PROTO("rtmpe"), ++ PROTO("rtmps"), ++ PROTO("rtmpt"), ++ PROTO("rtmpte"), ++ PROTO("rtmpts"), ++ PROTO("rtp"), ++ PROTO("srt"), ++ PROTO("srtp"), ++ NULL, ++}; ++ ++static char **get_safe_protocols(void) ++{ ++ int num = 0; ++ char **protocols = NULL; ++ char **ffmpeg_demuxers = mp_get_lavf_demuxers(); ++ char **ffmpeg_protos = mp_get_lavf_protocols(); ++ ++ for (int i = 0; ffmpeg_protos[i]; i++) { ++ for (int j = 0; safe_protos[j]; j++) { ++ if (strcmp(ffmpeg_protos[i], safe_protos[j][0]) != 0) ++ continue; ++ for (int k = 0; safe_protos[j][k]; k++) ++ MP_TARRAY_APPEND(NULL, protocols, num, talloc_strdup(protocols, safe_protos[j][k])); ++ break; ++ } ++ } ++ ++ // rtsp is a demuxer not protocol in ffmpeg so it is handled separately ++ for (int i = 0; ffmpeg_demuxers[i]; i++) { ++ if (strcmp("rtsp", ffmpeg_demuxers[i]) == 0) { ++ MP_TARRAY_APPEND(NULL, protocols, num, talloc_strdup(protocols, "rtsp")); ++ MP_TARRAY_APPEND(NULL, protocols, num, talloc_strdup(protocols, "rtsps")); ++ break; ++ } ++ } ++ ++ MP_TARRAY_APPEND(NULL, protocols, num, NULL); ++ ++ talloc_free(ffmpeg_demuxers); ++ talloc_free(ffmpeg_protos); ++ ++ return protocols; ++} ++ ++static char **get_unsafe_protocols(void) ++{ ++ int num = 0; ++ char **protocols = NULL; ++ char **safe_protocols = get_safe_protocols(); ++ char **ffmpeg_protos = mp_get_lavf_protocols(); ++ ++ for (int i = 0; ffmpeg_protos[i]; i++) { ++ bool safe_protocol = false; ++ for (int j = 0; safe_protocols[j]; j++) { ++ if (strcmp(ffmpeg_protos[i], safe_protocols[j]) == 0) { ++ safe_protocol = true; ++ break; ++ } ++ } ++ if (!safe_protocol) ++ MP_TARRAY_APPEND(NULL, protocols, num, talloc_strdup(protocols, ffmpeg_protos[i])); ++ } ++ ++ MP_TARRAY_APPEND(NULL, protocols, num, talloc_strdup(protocols, "ffmpeg")); ++ MP_TARRAY_APPEND(NULL, protocols, num, talloc_strdup(protocols, "lavf")); ++ ++ MP_TARRAY_APPEND(NULL, protocols, num, NULL); ++ ++ talloc_free(ffmpeg_protos); ++ talloc_free(safe_protocols); ++ return protocols; ++} ++ + // Escape http URLs with unescaped, invalid characters in them. + // libavformat's http protocol does not do this, and a patch to add this + // in a 100% safe case (spaces only) was rejected. +@@ -431,12 +431,7 @@ done: + const stream_info_t stream_info_ffmpeg = { + .name = "ffmpeg", + .open = open_f, +- .protocols = (const char *const[]){ +- "rtmp", "rtsp", "rtsps", "http", "https", "mms", "mmst", "mmsh", "mmshttp", +- "rtp", "httpproxy", "rtmpe", "rtmps", "rtmpt", "rtmpte", "rtmpts", "srt", +- "rist", "srtp", "gopher", "gophers", "data", "ipfs", "ipns", "dav", +- "davs", "webdav", "webdavs", +- NULL }, ++ .get_protocols = get_safe_protocols, + .can_write = true, + .stream_origin = STREAM_ORIGIN_NET, + }; +@@ -448,10 +443,7 @@ const stream_info_t stream_info_ffmpeg = { + const stream_info_t stream_info_ffmpeg_unsafe = { + .name = "ffmpeg", + .open = open_f, +- .protocols = (const char *const[]){ +- "lavf", "ffmpeg", "udp", "ftp", "tcp", "tls", "unix", "sftp", "md5", +- "concat", "smb", +- NULL }, ++ .get_protocols = get_unsafe_protocols, + .stream_origin = STREAM_ORIGIN_UNSAFE, + .can_write = true, + }; + +From 0f4fa329357f27d0c57f8f13b426d7450a29cfa4 Mon Sep 17 00:00:00 2001 +From: Dudemanguy +Date: Tue, 14 May 2024 13:32:18 -0500 +Subject: [PATCH 3/4] build: dynamically generate mpv.desktop file protocols + +If we can run the built mpv binary, then it is possible to use a custom +target that reads the protocols we have available in mpv and write the +mpv.desktop file based on the output. For cases where this is not +possible (e.g. cross compiling), then just install the unmodified +mpv.desktop file like before. Fixes #8731 and fixes #14124. +--- + TOOLS/gen-mpv-desktop.py | 45 ++++++++++++++++++++++++++++++++++++++++ + meson.build | 17 ++++++++++++++- + 2 files changed, 61 insertions(+), 1 deletion(-) + create mode 100755 TOOLS/gen-mpv-desktop.py + +diff --git a/TOOLS/gen-mpv-desktop.py b/TOOLS/gen-mpv-desktop.py +new file mode 100755 +index 000000000000..2b05de1ec4cc +--- /dev/null ++++ b/TOOLS/gen-mpv-desktop.py +@@ -0,0 +1,45 @@ ++#!/usr/bin/env python3 ++ ++# Modify X-KDE-Protocols in the mpv.desktop file based on output from ++# mpv --list-protocols. ++ ++# ++# This file is part of mpv. ++# ++# mpv is free software; you can redistribute it and/or ++# modify it under the terms of the GNU Lesser General Public ++# License as published by the Free Software Foundation; either ++# version 2.1 of the License, or (at your option) any later version. ++# ++# mpv is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU Lesser General Public License for more details. ++# ++# You should have received a copy of the GNU Lesser General Public ++# License along with mpv. If not, see . ++# ++ ++import sys ++from subprocess import check_output ++ ++if __name__ == "__main__": ++ with open(sys.argv[1], "r", encoding="UTF-8") as f: ++ next(f) ++ mpv_desktop = dict([line.split("=", 1) for line in f]) ++ ++ if not mpv_desktop["X-KDE-Protocols"]: ++ raise ValueError("Missing X-KDE-Protocols entry in mpv.desktop file") ++ ++ mpv_protocols = check_output([sys.argv[2], "--list-protocols"], encoding="UTF-8") ++ mpv_protocols = set(line.strip(" :/") for line in mpv_protocols.splitlines() if "://" in line) ++ if len(mpv_protocols) == 0: ++ raise ValueError("Unable to parse any protocols from mpv '--list-protocols'") ++ ++ protocol_list = set(mpv_desktop["X-KDE-Protocols"].strip().split(",")) ++ mpv_desktop["X-KDE-Protocols"] = ",".join(sorted(mpv_protocols & protocol_list)) + "\n" ++ ++ with open(sys.argv[3], "w", encoding="UTF-8") as f: ++ f.write("[Desktop Entry]" + "\n") ++ for key, value in mpv_desktop.items(): ++ f.write(f"{key}={value}") +diff --git a/meson.build b/meson.build +index c14bf47d5614..ae1eb9cfd903 100644 +--- a/meson.build ++++ b/meson.build +@@ -581,6 +581,7 @@ tools_directory = join_paths(source_root, 'TOOLS') + docutils_wrapper = find_program(join_paths(tools_directory, 'docutils-wrapper.py')) + file2string = find_program(join_paths(tools_directory, 'file2string.py')) + matroska = find_program(join_paths(tools_directory, 'matroska.py')) ++mpv_desktop = find_program(join_paths(tools_directory, 'gen-mpv-desktop.py')) + + ebml_defs = custom_target('ebml_defs.inc', + output: 'ebml_defs.inc', +@@ -1796,7 +1797,6 @@ if get_option('cplayer') + zsh_install_dir = join_paths(datadir, 'zsh', 'site-functions') + install_data('etc/_mpv.zsh', install_dir: zsh_install_dir, rename: '_mpv') + +- install_data('etc/mpv.desktop', install_dir: join_paths(datadir, 'applications')) + install_data('etc/mpv.metainfo.xml', install_dir: join_paths(datadir, 'metainfo')) + install_data('etc/encoding-profiles.conf', install_dir: join_paths(confdir, 'mpv')) + +@@ -1827,6 +1827,21 @@ if get_option('cplayer') + command: [osxbundle, mpv.full_path(), '@SOURCE_ROOT@'], + ) + endif ++ ++ if not win32 and not darwin ++ if meson.can_run_host_binaries() ++ mpv_desktop_path = join_paths(source_root, 'etc', 'mpv.desktop') ++ custom_target('mpv.desktop', ++ depends: mpv, ++ output: 'mpv.desktop', ++ command: [mpv_desktop, mpv_desktop_path, mpv.full_path(), '@OUTPUT@'], ++ install: true, ++ install_dir: join_paths(datadir, 'applications'), ++ ) ++ else ++ install_data('etc/mpv.desktop', install_dir: join_paths(datadir, 'applications')) ++ endif ++ endif + endif + + if get_option('tests') + +From 00506d51892c48cd91d3c88423f31df7b9328499 Mon Sep 17 00:00:00 2001 +From: Dudemanguy +Date: Wed, 22 May 2024 10:27:40 -0500 +Subject: [PATCH 4/4] stream_lavf: don't add ffmpeg bluray or dvd protocols + +The naming of these conflict with existing mpv protocols, so skip if we +get them. Users can still use them via lavf://bluray: or lavf://dvd: if +they wish. +--- + stream/stream_lavf.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/stream/stream_lavf.c b/stream/stream_lavf.c +index 30c823c58f62..369f9cecc402 100644 +--- a/stream/stream_lavf.c ++++ b/stream/stream_lavf.c +@@ -314,6 +314,10 @@ static char **get_unsafe_protocols(void) + break; + } + } ++ // Skip to avoid name conflict with builtin mpv protocol. ++ if (strcmp(ffmpeg_protos[i], "bluray") == 0 || strcmp(ffmpeg_protos[i], "dvd") == 0) ++ continue; ++ + if (!safe_protocol) + MP_TARRAY_APPEND(NULL, protocols, num, talloc_strdup(protocols, ffmpeg_protos[i])); + } diff --git a/source/xap/mpv/mpv.SlackBuild b/source/xap/mpv/mpv.SlackBuild index 6fa808a8e..97c30b6e3 100755 --- a/source/xap/mpv/mpv.SlackBuild +++ b/source/xap/mpv/mpv.SlackBuild @@ -27,7 +27,7 @@ cd $(dirname $0) ; CWD=$(pwd) PKGNAM=mpv VERSION=${VERSION:-$(echo $PKGNAM-*.tar.?z | rev | cut -f 3- -d . | cut -f 1 -d - | rev)} -BUILD=${BUILD:-1} +BUILD=${BUILD:-2} # Automatically determine the architecture we're building on: if [ -z "$ARCH" ]; then @@ -88,6 +88,8 @@ find . \ \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ -exec chmod 644 {} \+ +cat $CWD/dynamically_generate_desktop_file_protocols.patch | patch -p1 --verbose || exit 1 + # Configure, build, and install: export CFLAGS="$SLKCFLAGS" export CXXFLAGS="$SLKCFLAGS" @@ -121,6 +123,7 @@ meson setup \ -Dpipewire=enabled \ -Dsdl2-audio=enabled \ -Dopenal=enabled \ + -Dlua=luajit \ .. || exit 1 "${NINJA:=ninja}" $NUMJOBS || exit 1 DESTDIR=$PKG $NINJA install || exit 1 -- cgit v1.2.3-80-g2a13