diff --git a/flake.nix b/flake.nix index e832717..a16456c 100644 --- a/flake.nix +++ b/flake.nix @@ -57,6 +57,7 @@ fonts = import ./home-manager/modules/fonts.nix; gaming = import ./home-manager/modules/gaming.nix inputs; gamerenv = import ./home-manager/modules/gamerenv.nix; + mopidy = import ./home-manager/modules/mopidy.nix; all = import ./home-manager/modules/default.nix inputs; }; diff --git a/home-manager/modules/default.nix b/home-manager/modules/default.nix index f548670..1693b93 100644 --- a/home-manager/modules/default.nix +++ b/home-manager/modules/default.nix @@ -11,5 +11,6 @@ inputs: (import ./gaming.nix inputs) ./gamerenv.nix ./fonts.nix + ./mopidy.nix ]; } diff --git a/home-manager/modules/ezpcusr.nix b/home-manager/modules/ezpcusr.nix index 5e7e32e..5c9312f 100644 --- a/home-manager/modules/ezpcusr.nix +++ b/home-manager/modules/ezpcusr.nix @@ -65,11 +65,6 @@ let ${pkgs.procps}/bin/pkill -2 wf-recorder ''; - um = pkgs.writeScript "update-music.sh" '' - #!${pkgs.bash}/bin/bash - ${pkgs.mpc_cli}/bin/mpc update --wait && ${pkgs.mpc_cli}/bin/mpc clear && ${pkgs.mpc_cli}/bin/mpc ls | ${pkgs.mpc_cli}/bin/mpc add - ''; - ezDrv = pkgs.runCommand "ez-commands" { } ('' mkdir -p $out/bin ln -s ${selshot} $out/bin/selshot @@ -78,8 +73,6 @@ let ln -s ${scrsaveclip} $out/bin/scrsaveclip ln -s ${scrvidsaveclip} $out/bin/scrvidsaveclip ln -s ${scrvidstop} $out/bin/scrvidstop - - ln -s ${um} $out/bin/um '' + ( if cfg.uploadScript != null then '' ln -s ${cfg.uploadScript} $out/bin/upload_file @@ -203,11 +196,6 @@ in keybindings = let - musicRofi = pkgs.writeScript "music-rofi" '' - #!${pkgs.fish}/bin/fish - ${pkgs.mpc_cli}/bin/mpc -f "%position% - %artist% - %album% - %title%" playlist | ${pkgs.rofi}/bin/rofi -dmenu -i | ${pkgs.coreutils}/bin/cut -d " " -f 1 | ${pkgs.findutils}/bin/xargs ${pkgs.mpc_cli}/bin/mpc play - ''; - # ugly stupid way of doing things but im lazy bwRofi = pkgs.writeScript "bw-rofi" '' #!${pkgs.bash}/bin/bash @@ -302,7 +290,39 @@ in "XF86AudioPause" = "exec ${pkgs.playerctl}/bin/playerctl play-pause"; "${modifier}+backslash" = "exec ${pkgs.playerctl}/bin/playerctl play-pause"; - "${modifier}+m" = "exec ${musicRofi}"; + "${modifier}+m" = + let + musicRofi = pkgs.writeShellScript "music-rofi" '' + SONGN=$(${pkgs.mpc_cli}/bin/mpc -f "%position% - %artist% - %album% - %title%" playlist | ${pkgs.rofi}/bin/rofi -dmenu -i | ${pkgs.coreutils}/bin/cut -d " " -f 1) + [ ! -z "$SONGN" ] && ${pkgs.mpc_cli}/bin/mpc play "$SONGN" + ''; + in + "exec ${musicRofi}"; + "${modifier}+k" = "exec ${pkgs.mpc_cli}/bin/mpc clear"; + "${config.wayland.windowManager.sway.config.modifier}+Shift+k" = lib.mkForce "exec ${pkgs.mpc_cli}/bin/mpc ls \"Local media/Tracks\" | ${pkgs.mpc_cli}/bin/mpc add"; + "${config.wayland.windowManager.sway.config.modifier}+Shift+m" = + let + mopidySearch = pkgs.writeShellScript "mopidy-search.sh" '' + QUERY=$(${pkgs.rofi}/bin/rofi -dmenu) + [ -z "$QUERY" ] && exit + RESULTS=$(${pkgs.mpc_cli}/bin/mpc search -f '%file% / %artist% - %title%' any "$QUERY") + USERLIST=$(echo "$RESULTS" | ${pkgs.gawk}/bin/awk -F' / ' '{print $2}') + + CHOSEN=$(echo "$USERLIST" | ${pkgs.rofi}/bin/rofi -dmenu -i) + [ -z "$CHOSEN" ] && exit + NTH=$(echo "$USERLIST" | ${pkgs.gnugrep}/bin/grep -n "^$CHOSEN$" | cut -d':' -f1) + + LINE=$(echo "$RESULTS" | ${pkgs.coreutils}/bin/tail "-n+$NTH" | ${pkgs.coreutils}/bin/head -1) + NAME=$(echo "$LINE" | ${pkgs.gawk}/bin/awk -F' / ' '{print $1}') + + ${pkgs.mpc_cli}/bin/mpc add "$NAME" + PLAYLIST=$(${pkgs.mpc_cli}/bin/mpc -f "%position% / %file%" playlist) + PLAYLIST_ENTRY=$(echo "$PLAYLIST" | ${pkgs.gnugrep}/bin/grep -E "^.* / $NAME$" | head -1) + PLAYLIST_ENTRY_POSITION=$(echo "$PLAYLIST_ENTRY" | ${pkgs.gawk}/bin/awk -F' / ' '{print $1}') + ${pkgs.mpc_cli}/bin/mpc play "$PLAYLIST_ENTRY_POSITION" + ''; + in + "exec ${mopidySearch}"; "${modifier}+p" = "exec ${bwRofi}"; "${modifier}+t" = "exec ${bwRofiOtp}"; @@ -585,15 +605,45 @@ in services.blueman-applet.enable = lib.mkDefault cfg.bluetooth; - services.mpris-proxy.enable = true; + services.mpris-proxy.enable = lib.mkDefault true; - services.mpdris2.enable = true; - services.playerctld.enable = true; - services.mpd = { + services.mopidy = { enable = lib.mkDefault true; - musicDirectory = lib.mkDefault "${config.home.homeDirectory}/Music"; + extensionPackages = with pkgs; [ + mopidy-mpris + mopidy-youtube + mopidy-local + (mopidy-mpd.overrideAttrs (old: { + src = builtins.fetchGit { + url = "git+ssh://git@github.com/mopidy/mopidy-mpd.git"; + rev = "a8c4debc139020fbb17066b66a746644a915296c"; + }; + })) + ]; + settings = { + youtube = { + enabled = lib.mkDefault true; + }; + + file = { + media_dirs = lib.mkDefault "${config.home.homeDirectory}/Music"; + }; + + local = { + enabled = lib.mkDefault true; + media_dir = lib.mkDefault "${config.home.homeDirectory}/Music"; + }; + + mpd = { + enabled = lib.mkDefault true; + hostname = lib.mkDefault "::"; + command_blacklist = lib.mkDefault ""; + }; + }; }; + services.playerctld.enable = lib.mkDefault true; + gtk = { enable = lib.mkDefault true; iconTheme = { diff --git a/home-manager/modules/mopidy.nix b/home-manager/modules/mopidy.nix new file mode 100644 index 0000000..0c9241f --- /dev/null +++ b/home-manager/modules/mopidy.nix @@ -0,0 +1,60 @@ +{ config, lib, pkgs, ... }: + +with pkgs; +with lib; + +let + cfg = config.services.mopidy; + + mopidyEnv = buildEnv { + name = "mopidy-with-extensions-${mopidy.version}"; + paths = closePropagation cfg.extensionPackages; + pathsToLink = [ "/${mopidyPackages.python.sitePackages}" ]; + buildInputs = [ makeWrapper ]; + postBuild = '' + makeWrapper ${mopidy}/bin/mopidy $out/bin/mopidy \ + --prefix PYTHONPATH : $out/${mopidyPackages.python.sitePackages} + ''; + }; +in +{ + options = { + services.mopidy = { + enable = mkEnableOption "Mopidy, a music player daemon"; + + extensionPackages = mkOption { + default = [ ]; + type = types.listOf types.package; + example = literalExpression "[ pkgs.mopidy-spotify ]"; + description = '' + Mopidy extensions that should be loaded by the service. + ''; + }; + + settings = mkOption { + default = { }; + type = with types; attrsOf (attrsOf (oneOf [ str int bool ])); + description = '' + The settings that Mopidy should use. + ''; + }; + }; + }; + + config = mkIf cfg.enable { + xdg.configFile."mopidy/mopidy.conf".text = lib.generators.toINI { } cfg.settings; + + home.packages = [ mopidyEnv ]; + + systemd.user.services.mopidy = { + Unit = { + Description = "mopidy music player daemon"; + After = [ "network.target" "sound.target" ]; + }; + Install = { WantedBy = [ "graphical-session.target" ]; }; + Service = { + ExecStart = "${mopidyEnv}/bin/mopidy"; + }; + }; + }; +} diff --git a/modules/workstation.nix b/modules/workstation.nix index cf96706..101e5f6 100644 --- a/modules/workstation.nix +++ b/modules/workstation.nix @@ -196,7 +196,7 @@ in # Shit breaks without this lol programs.dconf.enable = lib.mkDefault true; - services.dbus.packages = with pkgs; [ gnome3.dconf ]; + services.dbus.packages = with pkgs; [ dconf ]; # better default swap boot.kernel.sysctl = { "vm.swappiness" = lib.mkDefault 45; };