diff --git a/multimedia/gerbera/Makefile b/multimedia/gerbera/Makefile index 1f4090db80..a708d342dc 100644 --- a/multimedia/gerbera/Makefile +++ b/multimedia/gerbera/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gerbera -PKG_VERSION:=1.10.0 +PKG_VERSION:=1.11.0 PKG_RELEASE:=$(AUTORELEASE) PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/gerbera/gerbera/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=bd6c7b2c6380e2e265a998bbc0df9eec14b9c6a65bc91e7f2c0ae0b67fd0c9cf +PKG_HASH:=0c13049792a28ec0e3086ba61c7f9675626a1dbadb043650a452192727418be7 PKG_MAINTAINER:= PKG_LICENSE:=GPL-2.0-or-later @@ -24,7 +24,7 @@ PKG_CONFIG_DEPENDS:=CONFIG_BUILD_PATENTED include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/nls.mk -include $(INCLUDE_DIR)/cmake.mk +include $(INCLUDE_DIR)/meson.mk define Package/gerbera SECTION:=multimedia @@ -43,31 +43,28 @@ define Package/gerbera/conffiles /etc/config/gerbera endef -CMAKE_OPTIONS += \ - -DCMAKE_LINK_WHAT_YOU_USE=$(if $(CONFIG_HOST_OS_MACOS),OFF,ON) \ - -DIconv_INCLUDE_DIR=$(ICONV_PREFIX)/include \ - -DIconv_LIBRARY=$(ICONV_PREFIX)/lib/libiconv.a \ - -DWITH_MAGIC=ON \ - -DWITH_MYSQL=OFF \ - -DWITH_CURL=ON \ - -DWITH_INOTIFY=ON \ - -DWITH_JS=OFF \ - -DWITH_TAGLIB=ON \ - -DWITH_AVCODEC=$(if $(CONFIG_BUILD_PATENTED),ON,OFF) \ - -DWITH_FFMPEGTHUMBNAILER=OFF \ - -DWITH_EXIF=ON \ - -DWITH_EXIV2=OFF \ - -DWITH_MATROSKA=ON \ - -DWITH_SYSTEMD=OFF \ - -DWITH_LASTFM=OFF \ - -DWITH_DEBUG=OFF \ - -DWITH_TESTS=OFF \ - -DWITH_NPUPNP=ON +MESON_ARGS += \ + -Db_lto=true \ + -Davcodec=$(if $(CONFIG_BUILD_PATENTED),en,dis)abled \ + -Dcurl=enabled \ + -Dexif=enabled \ + -Dexiv2=disabled \ + -Dffmpegthumbnailer=disabled \ + -Dinotify=enabled \ + -Djs=disabled \ + -Dlastfm=disabled \ + -Dmagic=enabled \ + -Dmatroska=enabled \ + -Dmysql=disabled \ + -Dnpupnp=enabled \ + -Dsystemd=disabled \ + -Dtaglib=enabled \ + -Dtests=disabled \ + -Dwavpack=disabled TARGET_CFLAGS += \ -ffunction-sections \ - -fdata-sections \ - -flto + -fdata-sections TARGET_LDFLAGS += -Wl,--gc-sections diff --git a/multimedia/gerbera/patches/010-matroska-memory-leak.patch b/multimedia/gerbera/patches/010-matroska-memory-leak.patch index da58fc6285..4c75a90cc3 100644 --- a/multimedia/gerbera/patches/010-matroska-memory-leak.patch +++ b/multimedia/gerbera/patches/010-matroska-memory-leak.patch @@ -12,7 +12,7 @@ Signed-off-by: Rosen Penev +++ b/src/metadata/matroska_handler.cc @@ -137,8 +137,6 @@ void MatroskaHandler::parseMKV(const std - delete (elL1->SkipData(ebmlStream, elL1->Generic().Context)); + delete (elL1->SkipData(ebmlStream, EBML_CONTEXT(elL1))); delete elL1; - if (activeFlag == 0) // terminate search - break; diff --git a/multimedia/gerbera/patches/020-m3u.patch b/multimedia/gerbera/patches/020-m3u.patch deleted file mode 100644 index 0b43a6ccd0..0000000000 --- a/multimedia/gerbera/patches/020-m3u.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 97c5a5fbc27452ee5970f9c7be946d3819a79d05 Mon Sep 17 00:00:00 2001 -From: Karlchen -Date: Sat, 26 Feb 2022 23:32:42 +0100 -Subject: [PATCH] Fix playlist parser error - -closes #2463 ---- - src/content/scripting/playlist_parser_script.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/src/content/scripting/playlist_parser_script.cc -+++ b/src/content/scripting/playlist_parser_script.cc -@@ -218,8 +218,8 @@ void PlaylistParserScript::processPlayli - auto item = std::static_pointer_cast(obj); - - log_debug("Checking playlist {} ...", obj->getLocation().string()); -+ GrbFile file(item->getLocation()); - if (item->getMimeType() != MIME_TYPE_ASX_PLAYLIST) { -- GrbFile file(item->getLocation()); - currentHandle = file.open("r"); - } else { - pugi::xml_parse_result result = xmlDoc->load_file(item->getLocation().c_str()); diff --git a/multimedia/gerbera/patches/020-meson.patch b/multimedia/gerbera/patches/020-meson.patch new file mode 100644 index 0000000000..e3c14b27f3 --- /dev/null +++ b/multimedia/gerbera/patches/020-meson.patch @@ -0,0 +1,969 @@ +From 942e250593fd7c62457ccd1e2242ecf7e44d603f Mon Sep 17 00:00:00 2001 +From: Rosen Penev +Date: Sat, 27 Mar 2021 21:00:09 -0700 +Subject: [PATCH] add meson build system + +Modern build system. Has the concept of wraps, which simplify +dependencies when they are missing from the OS. + +Also has a clang-format ninja target, which can remove the separate CI +for it. + +Signed-off-by: Rosen Penev +--- + .gitignore | 2 + + meson.build | 422 ++++++++++++++++++ + meson_options.txt | 63 +++ + subprojects/.gitignore | 2 + + subprojects/fmt.wrap | 12 + + subprojects/gtest.wrap | 15 + + subprojects/lastfmlib.wrap | 10 + + subprojects/libebml.wrap | 12 + + subprojects/libexif.wrap | 12 + + subprojects/libffmpegthumbnailer.wrap | 12 + + subprojects/libmatroska.wrap | 12 + + subprojects/libnpupnp.wrap | 13 + + subprojects/libupnp.wrap | 12 + + .../packagefiles/lastfmlib/meson.build | 60 +++ + subprojects/pugixml.wrap | 12 + + subprojects/spdlog.wrap | 12 + + subprojects/sqlite3.wrap | 12 + + subprojects/taglib.wrap | 12 + + test/config/meson.build | 14 + + test/content/meson.build | 12 + + test/core/meson.build | 18 + + test/database/meson.build | 25 ++ + test/meson.build | 10 + + test/scripting/meson.build | 24 + + test/util/meson.build | 14 + + 25 files changed, 824 insertions(+) + create mode 100644 meson.build + create mode 100644 meson_options.txt + create mode 100644 subprojects/.gitignore + create mode 100644 subprojects/fmt.wrap + create mode 100644 subprojects/gtest.wrap + create mode 100644 subprojects/lastfmlib.wrap + create mode 100644 subprojects/libebml.wrap + create mode 100644 subprojects/libexif.wrap + create mode 100644 subprojects/libffmpegthumbnailer.wrap + create mode 100644 subprojects/libmatroska.wrap + create mode 100644 subprojects/libnpupnp.wrap + create mode 100644 subprojects/libupnp.wrap + create mode 100644 subprojects/packagefiles/lastfmlib/meson.build + create mode 100644 subprojects/pugixml.wrap + create mode 100644 subprojects/spdlog.wrap + create mode 100644 subprojects/sqlite3.wrap + create mode 100644 subprojects/taglib.wrap + create mode 100644 test/config/meson.build + create mode 100644 test/content/meson.build + create mode 100644 test/core/meson.build + create mode 100644 test/database/meson.build + create mode 100644 test/meson.build + create mode 100644 test/scripting/meson.build + create mode 100644 test/util/meson.build + +--- a/.gitignore ++++ b/.gitignore +@@ -16,6 +16,8 @@ build.ninja + .ninja_log + compile_commands.json + ++subprojects/packagecache ++ + Testing/ + + **/node_modules/ +--- /dev/null ++++ b/meson.build +@@ -0,0 +1,422 @@ ++project( ++ 'gerbera', ++ 'c', ++ 'cpp', ++ version : '1.11.0', ++ default_options : [ 'cpp_std=c++17', 'warning_level=1', 'default_library=static' ], ++ meson_version : '>=0.60', ++) ++ ++cpp = meson.get_compiler('cpp') ++if cpp.get_id() == 'gcc' and cpp.version().version_compare('<8.4') ++ error('Your GCC version is too old. You need at least version 8.4.') ++elif cpp.get_id() == 'clang' and cpp.version().version_compare('<7') ++ error('Your clang version is too old. You need at least version 7.') ++endif ++ ++add_project_arguments( ++ '-DGERBERA_VERSION="@0@"'.format(meson.project_version()), ++ '-DPACKAGE_DATADIR="@0@"'.format( ++ join_paths(get_option('prefix'), get_option('datadir'), meson.project_name()), ++ ), ++ language : 'cpp', ++) ++ ++# This makes assumptions that the libcpp is the GNU one on Linux systems ++if cpp.version().version_compare('>=9') ++ fs_dep = dependency('', required : false) ++elif host_machine.system() == 'linux' ++ fs_dep = cpp.find_library('stdc++fs') ++elif cpp.get_id() == 'clang' ++ fs_dep = cpp.find_library('c++fs') ++endif ++ ++fmt_dep = dependency('fmt', version : '>=7.1.3') ++pugixml_dep = dependency('pugixml') ++spdlog_dep = dependency('spdlog', version : '>=1.8.2') ++sqlite3_dep = dependency('sqlite3', version : '>=3.7.11') ++iconv_dep = dependency('iconv') ++ ++if cpp.links( ++ ''' ++ #include ++ int main(void) { ++ uint32_t x32 = 0; ++ uint64_t x64 = 0; ++ __atomic_load_n(&x32, __ATOMIC_SEQ_CST); ++ __atomic_load_n(&x64, __ATOMIC_SEQ_CST); ++ return 0; ++ }''', ++ name : 'built-in atomics', ++) ++ libatomic_dep = dependency('', required : false) ++else ++ libatomic_dep = cpp.find_library('atomic') ++endif ++ ++libgerbera_args = [] ++ ++if (cpp.has_function('nl_langinfo')) ++ libgerbera_args += '-DHAVE_NL_LANGINFO' ++endif ++ ++if (cpp.has_function('setlocale')) ++ libgerbera_args += '-DHAVE_SETLOCALE' ++endif ++ ++uuid_dep = dependency('uuid', required : host_machine.system() == 'linux') ++if not uuid_dep.found() ++ libgerbera_args += '-DBSD_NATIVE_UUID' ++endif ++ ++nsl_dep = dependency('nsl', required : host_machine.system() == 'sunos') ++socket_dep = dependency('socket', required : host_machine.system() == 'sunos') ++ ++if host_machine.system() == 'sunos' ++ libgerbera_args += '-DSOLARIS' ++elif host_machine.system() != 'linux' ++ libgerbera_args += '-DBSD' ++endif ++ ++if get_option('debug') ++ libgerbera_args += '-DTOMBDEBUG' ++ libgerbera_args += '-DSPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_DEBUG' ++else ++ libgerbera_args += '-DSPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_INFO' ++endif ++ ++avcodec_dep = dependency('libavcodec', required : get_option('avcodec')) ++avfilter_dep = dependency('libavfilter', required : get_option('avcodec')) ++avformat_dep = dependency('libavformat', required : get_option('avcodec')) ++avutil_dep = dependency('libavutil', required : get_option('avcodec')) ++if avcodec_dep.found() and avfilter_dep.found() and avformat_dep.found() and avutil_dep.found() ++ libgerbera_args += '-DHAVE_FFMPEG' ++ if cpp.has_member( ++ 'struct AVStream', ++ 'codecpar', ++ prefix : '#include ', ++ dependencies : avformat_dep, ++ ) ++ libgerbera_args += '-DHAVE_AVSTREAM_CODECPAR' ++ endif ++endif ++ ++curl_dep = dependency('libcurl', required : get_option('curl')) ++if curl_dep.found() ++ libgerbera_args += '-DHAVE_CURL' ++ libgerbera_args += '-DONLINE_SERVICES' ++ libgerbera_args += '-DATRAILERS' ++endif ++ ++exif_dep = dependency('libexif', required : get_option('exif')) ++if exif_dep.found() ++ libgerbera_args += '-DHAVE_LIBEXIF' ++endif ++ ++exiv2_dep = dependency('exiv2', required : get_option('exiv2')) ++if exiv2_dep.found() ++ libgerbera_args += '-DHAVE_EXIV2' ++ if exiv2_dep.version().version_compare('<0.28') ++ libgerbera_args += '-D_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR' ++ endif ++endif ++ ++ffmpegthumbnailer_dep = dependency('libffmpegthumbnailer', required : get_option('ffmpegthumbnailer')) ++if ffmpegthumbnailer_dep.found() ++ libgerbera_args += '-DHAVE_FFMPEGTHUMBNAILER' ++endif ++ ++if host_machine.system() == 'linux' or host_machine.system() == 'sunos' ++ inotify_dep = dependency('', required : false) ++ inotify_found = not get_option('inotify').disabled() ++else ++ inotify_dep = dependency('inotify', required : get_option('inotify')) ++ inotify_found = inotify_dep.found() ++endif ++ ++if inotify_found ++ libgerbera_args += '-DHAVE_INOTIFY' ++endif ++ ++duktape_dep = dependency('duktape', required : get_option('js')) ++if duktape_dep.found() ++ libgerbera_args += '-DHAVE_JS' ++endif ++ ++lastfm_dep = dependency('liblastfm', required : get_option('lastfm')) ++if lastfm_dep.found() ++ libgerbera_args += '-DHAVE_LASTFMLIB' ++endif ++ ++magic_dep = cpp.find_library('magic', required : get_option('magic')) ++if magic_dep.found() ++ libgerbera_args += '-DHAVE_MAGIC' ++endif ++ ++ebml_dep = dependency('libebml', required : get_option('matroska')) ++matroska_dep = dependency('libmatroska', required : get_option('matroska')) ++if ebml_dep.found() and matroska_dep.found() ++ libgerbera_args += '-DHAVE_MATROSKA' ++endif ++ ++mysql_dep = dependency('libmariadb', required : get_option('mysql')) ++if mysql_dep.found() ++ libgerbera_args += '-DHAVE_MYSQL' ++endif ++ ++upnp_dep = dependency('libnpupnp', version : '>= 4.2.1', required : get_option('npupnp')) ++if upnp_dep.found() ++ libgerbera_args += '-DUSING_NPUPNP' ++else ++ upnp_dep = dependency('libupnp', version : '>= 1.14.6') ++endif ++ ++taglib_dep = dependency('taglib', version : '>= 1.12', required : get_option('taglib')) ++if taglib_dep.found() ++ libgerbera_args += '-DHAVE_TAGLIB' ++endif ++ ++wavpack_dep = dependency('wavpack', required : get_option('wavpack')) ++if wavpack_dep.found() ++ libgerbera_args += '-DHAVE_WAVPACK' ++endif ++ ++gmock_dep = dependency('gmock', required : get_option('tests')) ++gtest_dep = dependency('gtest', required : get_option('tests')) ++ ++systemd = dependency('systemd', required : get_option('systemd')) ++if systemd.found() ++ systemd_conf = configuration_data() ++ systemd_conf.set('CMAKE_INSTALL_PREFIX', get_option('prefix')) ++ if mysql_dep.found() ++ systemd_conf.set('SYSTEMD_DESCRIPTION', 'Gerbera Media Server with MySQL') ++ systemd_conf.set('SYSTEMD_AFTER_TARGET', 'mysql.target network-online.target') ++ else ++ systemd_conf.set('SYSTEMD_DESCRIPTION', 'Gerbera Media Server') ++ systemd_conf.set('SYSTEMD_AFTER_TARGET', 'network.target network-online.target') ++ endif ++ ++ configure_file(input: 'scripts/systemd/gerbera.service.cmake', ++ output: 'gerbera.service', ++ configuration: systemd_conf, ++ format: 'cmake', ++ install_dir: join_paths(get_option('prefix'), 'lib/systemd/user/') ++ ) ++endif ++ ++libgerbera_deps = [ ++ avcodec_dep, ++ avfilter_dep, ++ avformat_dep, ++ avutil_dep, ++ curl_dep, ++ duktape_dep, ++ ebml_dep, ++ exif_dep, ++ exiv2_dep, ++ fs_dep, ++ fmt_dep, ++ ffmpegthumbnailer_dep, ++ iconv_dep, ++ inotify_dep, ++ lastfm_dep, ++ libatomic_dep, ++ magic_dep, ++ matroska_dep, ++ mysql_dep, ++ nsl_dep, ++ pugixml_dep, ++ socket_dep, ++ spdlog_dep, ++ sqlite3_dep, ++ taglib_dep, ++ upnp_dep, ++ uuid_dep, ++ wavpack_dep, ++] ++ ++compile_info = [ ++ 'WITH_MAGIC=' + magic_dep.found().to_string('YES', 'NO'), ++ 'WITH_MYSQL=' + mysql_dep.found().to_string('YES', 'NO'), ++ 'WITH_CURL=' + curl_dep.found().to_string('YES', 'NO'), ++ 'WITH_INOTIFY=' + inotify_found.to_string('YES', 'NO'), ++ 'WITH_JS=' + duktape_dep.found().to_string('YES', 'NO'), ++ 'WITH_TAGLIB=' + taglib_dep.found().to_string('YES', 'NO'), ++ 'WITH_AVCODEC=' + avcodec_dep.found().to_string('YES', 'NO'), ++ 'WITH_FFMPEGTHUMBNAILER=' + ffmpegthumbnailer_dep.found().to_string('YES', 'NO'), ++ 'WITH_EXIF=' + exif_dep.found().to_string('YES', 'NO'), ++ 'WITH_EXIV2=' + exiv2_dep.found().to_string('YES', 'NO'), ++ 'WITH_SYSTEMD=' + systemd.found().to_string('YES', 'NO'), ++ 'WITH_LASTFM=' + lastfm_dep.found().to_string('YES', 'NO'), ++ 'WITH_DEBUG=' + get_option('debug').to_string('YES', 'NO'), ++ 'WITH_TESTS=' + gtest_dep.found().to_string('YES', 'NO'), ++] ++ ++add_project_arguments('-DCOMPILE_INFO="@0@"'.format('\\n'.join(compile_info)), language : 'cpp') ++ ++gchash = run_command('git', 'rev-parse', 'HEAD', check : false, capture : true) ++if gchash.returncode() == 0 ++ add_project_arguments('-DGIT_COMMIT_HASH="@0@"'.format(gchash.stdout().strip()), language : 'cpp') ++else ++ add_project_arguments('-DGIT_COMMIT_HASH=""', language : 'cpp') ++endif ++ ++gbranch = run_command('git', 'rev-parse', '--symbolic-full-name', 'HEAD', check : false, capture : true) ++if gbranch.returncode() == 0 ++ add_project_arguments('-DGIT_BRANCH="@0@"'.format(gbranch.stdout().strip()), language : 'cpp') ++else ++ add_project_arguments('-DGIT_BRANCH=""', language : 'cpp') ++endif ++ ++libgerbera_incdir = include_directories('src') ++ ++libgerbera = static_library( ++ 'gerbera', ++ 'src/action_request.cc', ++ 'src/cds_objects.cc', ++ 'src/cds_resource.cc', ++ 'src/config/client_config.cc', ++ 'src/config/config_definition.cc', ++ 'src/config/config_generator.cc', ++ 'src/config/config_manager.cc', ++ 'src/config/config_options.cc', ++ 'src/config/config_setup.cc', ++ 'src/config/directory_tweak.cc', ++ 'src/config/dynamic_content.cc', ++ 'src/config/setup/config_setup_array.cc', ++ 'src/config/setup/config_setup_autoscan.cc', ++ 'src/config/setup/config_setup_bool.cc', ++ 'src/config/setup/config_setup_client.cc', ++ 'src/config/setup/config_setup_dictionary.cc', ++ 'src/config/setup/config_setup_dynamic.cc', ++ 'src/config/setup/config_setup_int.cc', ++ 'src/config/setup/config_setup_path.cc', ++ 'src/config/setup/config_setup_string.cc', ++ 'src/config/setup/config_setup_transcoding.cc', ++ 'src/config/setup/config_setup_tweak.cc', ++ 'src/config/setup/config_setup_vector.cc', ++ 'src/content/autoscan.cc', ++ 'src/content/autoscan_list.cc', ++ 'src/content/autoscan_inotify.cc', ++ 'src/content/content_manager.cc', ++ 'src/content/layout/builtin_layout.cc', ++ 'src/content/layout/js_layout.cc', ++ 'src/content/onlineservice/atrailers_content_handler.cc', ++ 'src/content/onlineservice/atrailers_service.cc', ++ 'src/content/onlineservice/curl_online_service.cc', ++ 'src/content/onlineservice/lastfm_scrobbler.cc', ++ 'src/content/onlineservice/online_service.cc', ++ 'src/content/onlineservice/online_service_helper.cc', ++ 'src/content/onlineservice/task_processor.cc', ++ 'src/content/scripting/import_script.cc', ++ 'src/content/scripting/js_functions.cc', ++ 'src/content/scripting/playlist_parser_script.cc', ++ 'src/content/scripting/scripting_runtime.cc', ++ 'src/content/scripting/script.cc', ++ 'src/content/update_manager.cc', ++ 'src/context.cc', ++ 'src/contrib/md5.c', ++ 'src/device_description_handler.cc', ++ 'src/exceptions.cc', ++ 'src/file_request_handler.cc', ++ 'src/iohandler/buffered_io_handler.cc', ++ 'src/iohandler/curl_io_handler.cc', ++ 'src/iohandler/file_io_handler.cc', ++ 'src/iohandler/io_handler_buffer_helper.cc', ++ 'src/iohandler/io_handler.cc', ++ 'src/iohandler/io_handler_chainer.cc', ++ 'src/iohandler/mem_io_handler.cc', ++ 'src/iohandler/process_io_handler.cc', ++ 'src/metadata/exiv2_handler.cc', ++ 'src/metadata/ffmpeg_handler.cc', ++ 'src/metadata/ffmpeg_thumbnailer_handler.cc', ++ 'src/metadata/libexif_handler.cc', ++ 'src/metadata/matroska_handler.cc', ++ 'src/metadata/metacontent_handler.cc', ++ 'src/metadata/metadata_handler.cc', ++ 'src/metadata/resolution.cc', ++ 'src/metadata/taglib_handler.cc', ++ 'src/metadata/wavpack_handler.cc', ++ 'src/request_handler.cc', ++ 'src/server.cc', ++ 'src/database/mysql/mysql_database.cc', ++ 'src/database/sqlite3/sqlite_database.cc', ++ 'src/database/sql_database.cc', ++ 'src/database/database.cc', ++ 'src/database/search_handler.cc', ++ 'src/subscription_request.cc', ++ 'src/transcoding/transcode_dispatcher.cc', ++ 'src/transcoding/transcode_ext_handler.cc', ++ 'src/transcoding/transcode_handler.cc', ++ 'src/transcoding/transcoding.cc', ++ 'src/upnp_cds.cc', ++ 'src/upnp_cm.cc', ++ 'src/upnp_mrreg.cc', ++ 'src/upnp_xml.cc', ++ 'src/url_request_handler.cc', ++ 'src/util/generic_task.cc', ++ 'src/util/grb_fs.cc', ++ 'src/util/grb_net.cc', ++ 'src/util/jpeg_resolution.cc', ++ 'src/util/mime.cc', ++ 'src/util/mt_inotify.cc', ++ 'src/util/process_executor.cc', ++ 'src/util/string_converter.cc', ++ 'src/util/thread_executor.cc', ++ 'src/util/timer.cc', ++ 'src/util/tools.cc', ++ 'src/util/upnp_clients.cc', ++ 'src/util/upnp_headers.cc', ++ 'src/util/upnp_quirks.cc', ++ 'src/util/url.cc', ++ 'src/util/url_utils.cc', ++ 'src/util/xml_to_json.cc', ++ 'src/web/action.cc', ++ 'src/web/add.cc', ++ 'src/web/add_object.cc', ++ 'src/web/auth.cc', ++ 'src/web/clients.cc', ++ 'src/web/config_load.cc', ++ 'src/web/config_save.cc', ++ 'src/web/containers.cc', ++ 'src/web/directories.cc', ++ 'src/web/edit_load.cc', ++ 'src/web/edit_save.cc', ++ 'src/web/files.cc', ++ 'src/web/items.cc', ++ 'src/web/pages.cc', ++ 'src/web/remove.cc', ++ 'src/web/web_request_handler.cc', ++ 'src/web/session_manager.cc', ++ 'src/web/tasks.cc', ++ 'src/web/web_autoscan.cc', ++ 'src/web/web_update.cc', ++ include_directories : libgerbera_incdir, ++ dependencies : libgerbera_deps, ++ cpp_args : libgerbera_args, ++) ++ ++gerbera = executable( ++ 'gerbera', ++ 'src/main.cc', ++ include_directories : libgerbera_incdir, ++ link_with : libgerbera, ++ dependencies : libgerbera_deps, ++ install : true, ++) ++ ++install_data( ++ 'src/database/mysql/mysql.sql', ++ 'src/database/mysql/mysql-upgrade.xml', ++ 'src/database/sqlite3/sqlite3.sql', ++ 'src/database/sqlite3/sqlite3-upgrade.xml', ++) ++ ++install_subdir('scripts/js', install_dir : 'share/gerbera') ++install_subdir('web', install_dir : 'share/gerbera') ++ ++install_man('doc/gerbera.1') ++ ++if gmock_dep.found() and gtest_dep.found() ++ subdir('test') ++endif +--- /dev/null ++++ b/meson_options.txt +@@ -0,0 +1,63 @@ ++option('avcodec', type : 'feature', ++ description : 'Use ffmpeg/libav to extract file metadata', ++) ++ ++option('curl', type : 'feature', ++ description : 'CURL required for online services', ++) ++ ++option('exif', type : 'feature', ++ description : 'Use libexif to extract image metadata', ++) ++ ++option('exiv2', type : 'feature', ++ description : 'Use libexiv2 to extract image metadata', ++) ++ ++option('ffmpegthumbnailer', type : 'feature', ++ description : 'Enable Thumbnail generation', ++) ++ ++option('inotify', type : 'feature', ++ description : 'Enable Inotify file monitoring support', ++) ++ ++option('js', type : 'feature', ++ description : 'Enable JavaScript for scripting', ++) ++ ++option('lastfm', type : 'feature', ++ description : 'Enable scrobbling to LastFM', ++) ++ ++option('magic', type : 'feature', ++ description : 'Use libmagic to identify file mime types', ++) ++ ++option('matroska', type : 'feature', ++ description : 'Use libmatroska to extract video/mkv metadata', ++) ++ ++option('mysql', type : 'feature', ++ description : 'Store media information in MySQL DB', ++) ++ ++option('npupnp', type : 'feature', ++ description : 'Use npupnp instead of libupnp', ++) ++ ++option('systemd', type : 'feature', ++ description : 'Install Systemd unit file', ++) ++ ++option('taglib', type : 'feature', ++ description : 'Use TagLib to extract audio file metadata', ++) ++ ++option('tests', type : 'feature', ++ description : 'Build unit tests', ++) ++ ++option('wavpack', type : 'feature', ++ description : 'Use wavpack to extract audio file metadata', ++) +--- /dev/null ++++ b/subprojects/.gitignore +@@ -0,0 +1,2 @@ ++/*/ ++!packagefiles/ +--- /dev/null ++++ b/subprojects/fmt.wrap +@@ -0,0 +1,12 @@ ++[wrap-file] ++directory = fmt-8.1.1 ++source_url = https://github.com/fmtlib/fmt/archive/8.1.1.tar.gz ++source_filename = fmt-8.1.1.tar.gz ++source_hash = 3d794d3cf67633b34b2771eb9f073bde87e846e0d395d254df7b211ef1ec7346 ++patch_filename = fmt_8.1.1-1_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/fmt_8.1.1-1/get_patch ++patch_hash = 6035a67c7a8c90bed74c293c7265c769f47a69816125f7566bccb8e2543cee5e ++ ++[provide] ++fmt = fmt_dep ++ +--- /dev/null ++++ b/subprojects/gtest.wrap +@@ -0,0 +1,15 @@ ++[wrap-file] ++directory = googletest-release-1.11.0 ++source_url = https://github.com/google/googletest/archive/release-1.11.0.tar.gz ++source_filename = gtest-1.11.0.tar.gz ++source_hash = b4870bf121ff7795ba20d20bcdd8627b8e088f2d1dab299a031c1034eddc93d5 ++patch_filename = gtest_1.11.0-2_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/gtest_1.11.0-2/get_patch ++patch_hash = 764530d812ac161c9eab02a8cfaec67c871fcfc5548e29fd3d488070913d4e94 ++ ++[provide] ++gtest = gtest_dep ++gtest_main = gtest_main_dep ++gmock = gmock_dep ++gmock_main = gmock_main_dep ++ +--- /dev/null ++++ b/subprojects/lastfmlib.wrap +@@ -0,0 +1,10 @@ ++[wrap-file] ++directory = lastfmlib-15db6feb930f77bd771fc3f207ff4ca4b7ba5962 ++source_url = https://github.com/dirkvdb/lastfmlib/archive/15db6feb930f77bd771fc3f207ff4ca4b7ba5962.tar.gz ++source_filename = lastfmlib-15db6feb930f77bd771fc3f207ff4ca4b7ba5962.tar.gz ++source_hash = a19bdcb9834c0b68e0e026f2f695748d90cd1f9e0f88f0bd8bf58ad7c29066cf ++patch_directory = lastfmlib ++ ++[provide] ++lastfmlib = lastfm_dep ++ +--- /dev/null ++++ b/subprojects/libebml.wrap +@@ -0,0 +1,12 @@ ++[wrap-file] ++directory = libebml-release-1.4.2 ++source_url = https://github.com/Matroska-Org/libebml/archive/refs/tags/release-1.4.2.tar.gz ++source_filename = release-1.4.2.tar.gz ++source_hash = 66486742fd4f443553ad1917505208404c8c4240c0ab26cedaf41d9476efc665 ++patch_filename = libebml_1.4.2-1_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/libebml_1.4.2-1/get_patch ++patch_hash = 5dd901f705e873287d6383791e5017d78452f074011533c332f7665e79f2f2c5 ++ ++[provide] ++libebml = libebml_dep ++ +--- /dev/null ++++ b/subprojects/libexif.wrap +@@ -0,0 +1,12 @@ ++[wrap-file] ++directory = libexif-0.6.24 ++source_url = https://github.com/libexif/libexif/releases/download/v0.6.24/libexif-0.6.24.tar.bz2 ++source_filename = libexif-0.6.24.tar.gz ++source_hash = d47564c433b733d83b6704c70477e0a4067811d184ec565258ac563d8223f6ae ++patch_filename = libexif_0.6.24-3_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/libexif_0.6.24-3/get_patch ++patch_hash = 3c83b87a7e1ec3a88e96e4144797993c85c84231e07d290823a242b45ca368be ++ ++[provide] ++libexif = exif_dep ++ +--- /dev/null ++++ b/subprojects/libffmpegthumbnailer.wrap +@@ -0,0 +1,12 @@ ++[wrap-file] ++directory = ffmpegthumbnailer-2.2.2 ++source_url = https://github.com/dirkvdb/ffmpegthumbnailer/releases/download/2.2.2/ffmpegthumbnailer-2.2.2.tar.bz2 ++source_filename = ffmpegthumbnailer-2.2.2.tar.bz2 ++source_hash = 1cb24059c38223f657b300c84dd80491b7040d4b69471c4fea69be862bc99b5b ++patch_filename = libffmpegthumbnailer_2.2.2-1_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/libffmpegthumbnailer_2.2.2-1/get_patch ++patch_hash = 20e79224a0fdba0710becae3da373c7bd6a0c4e708ad79201fcfbd1c9894847d ++ ++[provide] ++libffmpegthumbnailer = libffmpegthumbnailer_dep ++ +--- /dev/null ++++ b/subprojects/libmatroska.wrap +@@ -0,0 +1,12 @@ ++[wrap-file] ++directory = libmatroska-release-1.6.3 ++source_url = https://github.com/Matroska-Org/libmatroska/archive/refs/tags/release-1.6.3.tar.gz ++source_filename = release-1.6.3.tar.gz ++source_hash = 0c8c875ae26ac69a722f7fd0f4a4fecb4fdff681f2a165f09c06a40cbf1d0de6 ++patch_filename = libmatroska_1.6.3-1_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/libmatroska_1.6.3-1/get_patch ++patch_hash = 36cf38c80cc3712aecc3002bcdfe2f6b37c6db0768ab2391b284438e953cb2ba ++ ++[provide] ++libmatroska = libmatroska_dep ++ +--- /dev/null ++++ b/subprojects/libnpupnp.wrap +@@ -0,0 +1,13 @@ ++[wrap-file] ++directory = libnpupnp-4.2.2 ++source_url = https://www.lesbonscomptes.com/upmpdcli/downloads/libnpupnp-4.2.2.tar.gz ++source_filename = libnpupnp-4.2.2.tar.gz ++source_hash = cb3968773d30e2bfc765547df514fdc8927b9a37ecccca2e260ee8b612e756bc ++patch_filename = libnpupnp_4.2.2-2_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/libnpupnp_4.2.2-2/get_patch ++patch_hash = b20cc5efa3f64f278ed6eb0399eb7c7c11524eda414ea27ce30b1c8bd7992599 ++wrapdb_version = 4.2.2-2 ++ ++[provide] ++libnpupnp = libnpupnp_dep ++ +--- /dev/null ++++ b/subprojects/libupnp.wrap +@@ -0,0 +1,12 @@ ++[wrap-file] ++directory = libupnp-1.14.12 ++source_url = https://github.com/pupnp/pupnp/releases/download/release-1.14.12/libupnp-1.14.12.tar.bz2 ++source_filename = libupnp-1.14.12.tar.bz2 ++source_hash = 091c80aada1e939c2294245c122be2f5e337cc932af7f7d40504751680b5b5ac ++patch_filename = libupnp_1.14.12-1_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/libupnp_1.14.12-1/get_patch ++patch_hash = 74abd99af4242907b0dcd88fc8fcc98f00db39c64f9f6904e6f84282800e412d ++ ++[provide] ++libupnp = libupnp_dep ++ +--- /dev/null ++++ b/subprojects/packagefiles/lastfmlib/meson.build +@@ -0,0 +1,60 @@ ++project('lastfmlib', 'c', 'cpp', ++ version : '0.4.0', ++ default_options : ['warning_level=3', 'cpp_std=c++98'], ++) ++ ++curl_dep = dependency('libcurl') ++thread_dep = dependency('threads') ++ ++lastfmlib = library('lastfmlib', ++ 'lastfmlib/nowplayinginfo.cpp', ++ 'lastfmlib/urlclient.cpp', ++ 'lastfmlib/submissioninfocollection.cpp', ++ 'lastfmlib/lastfmscrobbler.cpp', ++ 'lastfmlib/submissioninfo.cpp', ++ 'lastfmlib/lastfmclient.cpp', ++ 'lastfmlib/lastfmscrobblerc.cpp', ++ 'lastfmlib/md5/md5.c', ++ 'lastfmlib/utils/scopedlock.cpp', ++ 'lastfmlib/utils/log.cpp', ++ 'lastfmlib/utils/thread.cpp', ++ 'lastfmlib/utils/condition.cpp', ++ 'lastfmlib/utils/mutex.cpp', ++ 'lastfmlib/utils/stringoperations.cpp', ++ 'lastfmlib/utils/numericoperations.cpp', ++ dependencies : [ curl_dep, thread_dep ], ++ install : true, ++) ++ ++pkg = import('pkgconfig') ++pkg.generate(lastfmlib) ++ ++install_headers( ++ 'lastfmlib/lastfmscrobbler.h', ++ 'lastfmlib/lastfmtypes.h', ++ 'lastfmlib/lastfmclient.h', ++ 'lastfmlib/lastfmscrobblerc.h', ++ 'lastfmlib/nowplayinginfo.h', ++ 'lastfmlib/submissioninfocollection.h', ++ 'lastfmlib/urlclient.h', ++ 'lastfmlib/submissioninfo.h', ++ 'lastfmlib/lastfmexceptions.h', ++ subdir : 'lastfmlib', ++) ++ ++install_headers( ++ 'lastfmlib/utils/log.h', ++ 'lastfmlib/utils/types.h', ++ 'lastfmlib/utils/condition.h', ++ 'lastfmlib/utils/scopedlock.h', ++ 'lastfmlib/utils/mutex.h', ++ 'lastfmlib/utils/thread.h', ++ subdir : 'lastfmlib/utils' ++) ++ ++lastfm_inc = include_directories('.') ++ ++lastfm_dep = declare_dependency( ++ include_directories : lastfm_inc, ++ link_with : lastfmlib, ++) +--- /dev/null ++++ b/subprojects/pugixml.wrap +@@ -0,0 +1,12 @@ ++[wrap-file] ++directory = pugixml-1.12.1 ++source_url = https://github.com/zeux/pugixml/archive/v1.12.1.tar.gz ++source_filename = pugixml-1.12.1.tar.gz ++source_hash = 1e28ab24b6e04e013d96f45d25e9f2d04c921dc68c613fd010ecaaad3892c14d ++patch_filename = pugixml_1.12.1-1_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/pugixml_1.12.1-1/get_patch ++patch_hash = 7227b08f5c9f6526177bef2f49dc5c7ccbbc43d8edd65349eb4a13bc56e92b28 ++ ++[provide] ++pugixml = pugixml_dep ++ +--- /dev/null ++++ b/subprojects/spdlog.wrap +@@ -0,0 +1,12 @@ ++[wrap-file] ++directory = spdlog-1.10.0 ++source_url = https://github.com/gabime/spdlog/archive/v1.10.0.tar.gz ++source_filename = v1.10.0.tar.gz ++source_hash = 697f91700237dbae2326b90469be32b876b2b44888302afbc7aceb68bcfe8224 ++patch_filename = spdlog_1.10.0-2_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/spdlog_1.10.0-2/get_patch ++patch_hash = f4c75e2b869c4299559656a7d97c91a1d6ff850f9810a6b7c81590e2cfe848a6 ++ ++[provide] ++spdlog = spdlog_dep ++ +--- /dev/null ++++ b/subprojects/sqlite3.wrap +@@ -0,0 +1,12 @@ ++[wrap-file] ++directory = sqlite-amalgamation-3380000 ++source_url = https://sqlite.org/2022/sqlite-amalgamation-3380000.zip ++source_filename = sqlite-amalgamation-3380000.zip ++source_hash = e055f6054e97747a135c89e36520c0a423249e8a91c5fc445163f4a6adb20df6 ++patch_filename = sqlite3_3.38.0-1_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.38.0-1/get_patch ++patch_hash = 49e30bf010ff63ab772d5417885e6905379025ceac80382e292c6dbd3a9da744 ++ ++[provide] ++sqlite3 = sqlite3_dep ++ +--- /dev/null ++++ b/subprojects/taglib.wrap +@@ -0,0 +1,12 @@ ++[wrap-file] ++directory = taglib-1.12 ++source_url = https://github.com/taglib/taglib/releases/download/v1.12/taglib-1.12.tar.gz ++source_filename = taglig-1.12.tar.gz ++source_hash = 7fccd07669a523b07a15bd24c8da1bbb92206cb19e9366c3692af3d79253b703 ++patch_filename = taglib_1.12-2_patch.zip ++patch_url = https://wrapdb.mesonbuild.com/v2/taglib_1.12-2/get_patch ++patch_hash = 618a70fa06b814ff1e42229c33ce7cd21225e3cfb55459555599bf55a6b37425 ++ ++[provide] ++taglib = taglib_dep ++ +--- /dev/null ++++ b/test/config/meson.build +@@ -0,0 +1,14 @@ ++libgerbera_args += '-DCMAKE_BINARY_DIR="@0@"'.format(meson.project_source_root()) ++ ++testconfig = executable( ++ 'testconfig', ++ 'main.cc', ++ 'test_configgenerator.cc', ++ 'test_configmanager.cc', ++ cpp_args : libgerbera_args, ++ dependencies : libgerbera_deps, ++ include_directories : libgerbera_incdir, ++ link_with : libgerbera, ++) ++ ++test('testconfig', testconfig, workdir : meson.current_source_dir()) +--- /dev/null ++++ b/test/content/meson.build +@@ -0,0 +1,12 @@ ++testcontent = executable( ++ 'testcontent', ++ 'main.cc', ++ 'test_autoscan_list.cc', ++ 'test_resolution.cc', ++ cpp_args : libgerbera_args, ++ dependencies : libgerbera_deps, ++ include_directories : libgerbera_incdir, ++ link_with : libgerbera, ++) ++ ++test('testcontent', testcontent) +--- /dev/null ++++ b/test/core/meson.build +@@ -0,0 +1,18 @@ ++libgerbera_args += '-UCMAKE_BINARY_DIR' ++libgerbera_args += '-DCMAKE_BINARY_DIR="@0@"'.format(meson.project_build_root()) ++ ++testcore = executable( ++ 'testcore', ++ 'main.cc', ++ 'test_searchhandler.cc', ++ 'test_server.cc', ++ 'test_upnp_xml.cc', ++ 'test_ffmpeg_cache_paths.cc', ++ 'test_url_utils.cc', ++ cpp_args : libgerbera_args, ++ dependencies : libgerbera_deps, ++ include_directories : libgerbera_incdir, ++ link_with : libgerbera, ++) ++ ++test('testcore', testcore, workdir : meson.current_source_dir()) +--- /dev/null ++++ b/test/database/meson.build +@@ -0,0 +1,25 @@ ++configure_file(input : meson.project_source_root() / 'src/database/sqlite3/sqlite3.sql', output : 'sqlite3.sql', copy : true) ++configure_file( ++ input : meson.project_source_root() / 'src/database/sqlite3/sqlite3-upgrade.xml', ++ output : 'sqlite3-upgrade.xml', ++ copy : true, ++) ++configure_file(input : meson.project_source_root() / 'src/database/mysql/mysql.sql', output : 'mysql.sql', copy : true) ++configure_file( ++ input : meson.project_source_root() / 'src/database/mysql/mysql-upgrade.xml', ++ output : 'mysql-upgrade.xml', ++ copy : true, ++) ++ ++testdatabase = executable( ++ 'testdatabase', ++ 'main.cc', ++ 'test_database.cc', ++ 'test_sql_generators.cc', ++ cpp_args : libgerbera_args, ++ dependencies : libgerbera_deps, ++ include_directories : libgerbera_incdir, ++ link_with : libgerbera, ++) ++ ++test('testdatabase', testdatabase, workdir : meson.current_build_dir()) +--- /dev/null ++++ b/test/meson.build +@@ -0,0 +1,10 @@ ++libgerbera_deps += [ gmock_dep, gtest_dep ] ++ ++subdir('config') ++subdir('content') ++subdir('core') ++subdir('database') ++if duktape_dep.found() and curl_dep.found() ++ subdir('scripting') ++endif ++subdir('util') +--- /dev/null ++++ b/test/scripting/meson.build +@@ -0,0 +1,24 @@ ++libgerbera_args += '-DSCRIPTS_DIR="@0@/scripts"'.format(meson.project_source_root()) ++ ++testscripting = executable( ++ 'testscripting', ++ 'main.cc', ++ 'mock/duk_helper.cc', ++ 'mock/script_test_fixture.cc', ++ 'test_common_script.cc', ++ 'test_external_asx_playlist.cc', ++ 'test_external_m3u_playlist.cc', ++ 'test_external_pls_playlist.cc', ++ 'test_import_script.cc', ++ 'test_import_struct_script.cc', ++ 'test_internal_m3u_playlist.cc', ++ 'test_internal_m3u8_playlist.cc', ++ 'test_internal_pls_playlist.cc', ++ 'test_runtime.cc', ++ cpp_args : libgerbera_args, ++ dependencies : libgerbera_deps, ++ include_directories : libgerbera_incdir, ++ link_with : libgerbera, ++) ++ ++test('testscripting', testscripting, workdir : meson.current_source_dir()) +--- /dev/null ++++ b/test/util/meson.build +@@ -0,0 +1,14 @@ ++testutil = executable( ++ 'testutil', ++ 'main.cc', ++ 'test_jpeg_res.cc', ++ 'test_tools.cc', ++ 'test_upnp_clients.cc', ++ 'test_upnp_headers.cc', ++ cpp_args : libgerbera_args, ++ dependencies : libgerbera_deps, ++ include_directories : libgerbera_incdir, ++ link_with : libgerbera, ++) ++ ++test('testutil', testutil, workdir : meson.current_source_dir()) diff --git a/multimedia/gerbera/patches/030-ffmpeg.patch b/multimedia/gerbera/patches/030-ffmpeg.patch deleted file mode 100644 index b41ae5d7c4..0000000000 --- a/multimedia/gerbera/patches/030-ffmpeg.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 1ee40116ece90a5504cd33a23d6bc7002d00b68a Mon Sep 17 00:00:00 2001 -From: Ian Whyman -Date: Tue, 8 Mar 2022 17:36:37 +0000 -Subject: [PATCH] Fix default tag matches with ffmpeg_handler - -Some of the keys were uppercase e.g. ARTIST when returned from the FLAC -parser, so lowercase the keys first. - -Fixes: https://github.com/gerbera/gerbera/issues/2176 ---- - src/metadata/ffmpeg_handler.cc | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - ---- a/src/metadata/ffmpeg_handler.cc -+++ b/src/metadata/ffmpeg_handler.cc -@@ -93,8 +93,9 @@ void FfmpegHandler::addFfmpegMetadataFie - auto sc = StringConverter::m2i(CFG_IMPORT_LIBOPTS_FFMPEG_CHARSET, item->getLocation(), config); - - while ((e = av_dict_get(pFormatCtx->metadata, "", e, AV_DICT_IGNORE_SUFFIX))) { -- std::string key = e->key; -+ std::string key = toLower(e->key); - std::string value = e->value; -+ log_debug("FFMpeg tag: {}: {}", key, value); - auto it = specialPropertyMap.find(e->key); - if (it != specialPropertyMap.end()) { - // only use ffmpeg meta data if not found by other handler -@@ -105,7 +106,9 @@ void FfmpegHandler::addFfmpegMetadataFie - } - } - auto pIt = std::find_if(propertyMap.begin(), propertyMap.end(), -- [&](auto&& p) { return p.second == key && item->getMetaData(p.first).empty(); }); -+ [&](auto&& p) { -+ return p.second == key && item->getMetaData(p.first).empty(); -+ }); - if (pIt != propertyMap.end()) { - log_debug("Identified default metadata '{}': {}", pIt->second, value); - const auto field = pIt->first; -@@ -128,7 +131,7 @@ void FfmpegHandler::addFfmpegMetadataFie - constexpr auto field = M_CREATION_DATE; - if (item->getMetaData(field).empty()) { - log_debug("Identified metadata 'creation_time': {}", e->value); -- std::tm tmWork; -+ std::tm tmWork {}; - if (strptime(e->value, "%Y-%m-%dT%T.000000%Z", &tmWork)) { - // convert creation_time to local time - auto utcTime = timegm(&tmWork);