{ lib, stdenv , fetchFromGitHub , python3Packages , sox , flac , lame , wrapQtAppsHook , ffmpeg , vorbis-tools , pulseaudio , nodejs , youtube-dl , opusTools , gst_all_1 , enableSonos ? true , qtwayland }: let packages = [ vorbis-tools sox flac lame opusTools gst_all_1.gstreamer nodejs ffmpeg youtube-dl ] ++ lib.optionals stdenv.isLinux [ pulseaudio ]; in python3Packages.buildPythonApplication { pname = "mkchromecast-unstable"; version = "2022-10-31"; src = fetchFromGitHub { owner = "muammar"; repo = "mkchromecast"; rev = "0de9fd78c4122dec4f184aeae2564790b45fe6dc"; sha256 = "sha256-dxsIcBPrZaXlsfzOEXhYj2qoK5LRducJG2ggMrMMl9Y="; }; buildInputs = lib.optional stdenv.isLinux qtwayland; propagatedBuildInputs = with python3Packages; ([ pychromecast psutil mutagen flask netifaces requests pyqt5 ] ++ lib.optionals enableSonos [ soco ]); postPatch = '' substituteInPlace setup.py \ --replace 'platform.system() == "Darwin"' 'False' \ --replace 'platform.system() == "Linux"' 'True' ''; nativeBuildInputs = [ wrapQtAppsHook ]; # Relies on an old version (0.7.7) of PyChromecast unavailable in Nixpkgs. # Is also I/O bound and impure, testing an actual device, so we disable. doCheck = false; dontWrapQtApps = true; makeWrapperArgs = [ "\${qtWrapperArgs[@]}" "--prefix PATH : ${lib.makeBinPath packages}" ]; postInstall = '' substituteInPlace $out/${python3Packages.python.sitePackages}/mkchromecast/video.py \ --replace '/usr/share/mkchromecast/nodejs/' '${placeholder "out"}/share/mkchromecast/nodejs/' '' + lib.optionalString stdenv.isDarwin '' install -Dm 755 -t $out/bin bin/audiodevice substituteInPlace $out/${python3Packages.python.sitePackages}/mkchromecast/audio_devices.py \ --replace './bin/audiodevice' '${placeholder "out"}/bin/audiodevice' ''; meta = with lib; { homepage = "https://mkchromecast.com/"; description = "Cast macOS and Linux Audio/Video to your Google Cast and Sonos Devices"; license = licenses.mit; maintainers = with maintainers; [ shou ]; mainProgram = "mkchromecast"; }; }