# Copyright 2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

PYTHON_COMPAT=( python3_{12..14} )

inherit cmake desktop git-r3 python-single-r1 xdg

DESCRIPTION="Native Qt music player for Yandex Music, YouTube Music and local files"
HOMEPAGE="https://cloudmus.app/ https://github.com/cloudmus/cloudmus"
EGIT_REPO_URI="https://github.com/cloudmus/cloudmus.git"

# Manrope fonts and Ocean notification sounds are embedded in the executable.
LICENSE="CC-BY-SA-4.0 MIT OFL-1.1"
SLOT="0"
IUSE="+local test wayland X +yandex-music +youtube-music"
REQUIRED_USE="${PYTHON_REQUIRED_USE}"
RESTRICT="!test? ( test )"

DEPEND="
	>=dev-qt/qtbase-6.9:6[dbus,gui,network,widgets,wayland?,X?]
	dev-qt/qtsvg:6
	>=media-libs/taglib-2.2:0=
	media-video/mpv:=[libmpv]
	wayland? (
		dev-libs/wayland
		dev-qt/qtbase:6=
	)
	X? ( x11-libs/libxcb:= )
"
RDEPEND="${DEPEND}
	!media-sound/cloudmus-bin
	${PYTHON_DEPS}
	dev-qt/qtbase:6[ssl]
	$(python_gen_cond_dep '
		>=dev-python/jsonschema-4.17[${PYTHON_USEDEP}]
		>=dev-python/pyyaml-6[${PYTHON_USEDEP}]
		local? ( >=media-libs/mutagen-1.47[${PYTHON_USEDEP}] )
		yandex-music? ( >=dev-python/yandex-music-3.0[${PYTHON_USEDEP}] )
		youtube-music? (
			>=dev-python/ytmusicapi-1.8[${PYTHON_USEDEP}]
			<dev-python/ytmusicapi-2[${PYTHON_USEDEP}]
			>=net-misc/yt-dlp-2026.08.19[${PYTHON_USEDEP}]
		)
		yandex-music? ( >=dev-python/pysocks-1.7[${PYTHON_USEDEP}] )
		youtube-music? ( >=dev-python/pysocks-1.7[${PYTHON_USEDEP}] )
	')
"
BDEPEND="
	${PYTHON_DEPS}
	dev-qt/qttools:6[linguist]
	virtual/pkgconfig
	wayland? ( dev-util/wayland-scanner )
	$(python_gen_cond_dep '
		dev-python/jinja2[${PYTHON_USEDEP}]
		dev-python/pyyaml[${PYTHON_USEDEP}]
		test? (
			>=dev-python/pytest-8[${PYTHON_USEDEP}]
			>=dev-python/pytest-asyncio-0.23[${PYTHON_USEDEP}]
		)
	')
"

CMAKE_USE_DIR="${S}/fronts/qt"
PATCHES=( "${FILESDIR}/${PN}-0.6.2-system-integration.patch" )
DOCS=( LICENSE README.md CHANGELOG.md docs/development.md )

src_prepare() {
	# Formatting generated code is unnecessary and would detect clang-format
	# outside the declared build dependencies. Generate before cmake_src_prepare
	# so compilation also works with a read-only source directory.
	default
	sed -i '/_clang_format_inplace(\[models_h, rpc_methods_h, rpc_methods_cpp\])/d' \
		protocol/codegen/generate.py || die
	"${PYTHON}" protocol/codegen/generate.py --lang python cpp || die
	cmake_prepare
}

src_configure() {
	# Portage owns compiler/linker selection. Release telemetry credentials are
	# deliberately unset, and system TagLib prevents FetchContent downloads.
	local -x CLOUDMUS_GA4_MEASUREMENT_ID=
	local -x CLOUDMUS_SENTRY_DSN=
	local mycmakeargs=(
		-DBUILD_TESTING=$(usex test)
		-DCLOUDMUS_CCACHE=OFF
		-DCLOUDMUS_FAST_LINKER=OFF
		-DCLOUDMUS_PREGENERATED_PROTOCOL=ON
		-DCLOUDMUS_SENTRY=OFF
		-DCLOUDMUS_VERSION_OVERRIDE="${PV}"
		-DCLOUDMUS_WAYLAND=$(usex wayland)
		-DCLOUDMUS_X11=$(usex X)
		-DCMAKE_REQUIRE_FIND_PACKAGE_TagLib=ON
	)
	cmake_src_configure
}

src_test() {
	QT_QPA_PLATFORM=offscreen cmake_src_test

	local backend flag
	local tests=( backends/py-rpc-common/tests )
	local -x PYTHONPATH="${S}/backends/py-rpc-common"
	for backend in local-folder yandex-music youtube-music; do
		flag=${backend/local-folder/local}
		if use "${flag}"; then
			PYTHONPATH+=":${S}/backends/${backend}"
			tests+=( "backends/${backend}/tests" )
		fi
	done
	local EPYTEST_PLUGINS=( pytest-asyncio )
	epytest "${tests[@]}"
}

src_install() {
	# Upstream's CMake project only builds binaries; it has no install target.
	dobin "${BUILD_DIR}/bin/cloudmus-qt"
	python_domodule backends/py-rpc-common/rpc_common

	local backend flag
	for backend in local-folder yandex-music youtube-music; do
		flag=${backend/local-folder/local}
		use "${flag}" || continue
		python_domodule "backends/${backend}"/cloudmus_backend_*

		# Use the selected Python implementation and keep all paths relative to
		# the system manifest directory, leaving user configuration untouched.
		sed -e "s|\"python3\"|\"${PYTHON}\"|" \
			-e "s|\"icon.svg\"|\"${backend}.svg\"|" \
			"backends/${backend}/manifest.json" > "${T}/${backend}.json" || die
		insinto /usr/share/cloudmus/backends.d
		doins "${T}/${backend}.json"
		newins "backends/${backend}/icon.svg" "${backend}.svg"
	done

	domenu packaging/appimage/cloudmus-qt.desktop
	newicon -s scalable art/logo.svg cloudmus-qt.svg
	einstalldocs
	newdoc fronts/qt/resources/fonts/OFL.txt Manrope-OFL.txt
	newdoc fronts/qt/resources/sounds/LICENSE.md Ocean-sounds-LICENSE.md
}