mimeo: fix infinite loop when dispatching non-specialized http/s URLs
This commit is contained in:
@@ -44,7 +44,7 @@
|
|||||||
./lemoa.nix
|
./lemoa.nix
|
||||||
./mako.nix
|
./mako.nix
|
||||||
./mepo.nix
|
./mepo.nix
|
||||||
./mimeo.nix
|
./mimeo
|
||||||
./mopidy.nix
|
./mopidy.nix
|
||||||
./mpv.nix
|
./mpv.nix
|
||||||
./msmtp.nix
|
./msmtp.nix
|
||||||
|
@@ -204,8 +204,6 @@ in
|
|||||||
"x-scheme-handler/about" = desktop;
|
"x-scheme-handler/about" = desktop;
|
||||||
"x-scheme-handler/unknown" = desktop;
|
"x-scheme-handler/unknown" = desktop;
|
||||||
};
|
};
|
||||||
# TODO: cleanup mimeo and remove this
|
|
||||||
mime.urlAssociations."^https?://.*" = "librewolf --name librewolf %U";
|
|
||||||
|
|
||||||
# env.BROWSER = "${package}/bin/${cfg.browser.libName}";
|
# env.BROWSER = "${package}/bin/${cfg.browser.libName}";
|
||||||
env.BROWSER = cfg.browser.libName; # used by misc tools like xdg-email, as fallback
|
env.BROWSER = cfg.browser.libName; # used by misc tools like xdg-email, as fallback
|
||||||
|
@@ -1,42 +0,0 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
|
||||||
let
|
|
||||||
# [ ProgramConfig ]
|
|
||||||
enabledPrograms = builtins.filter
|
|
||||||
(p: p.enabled)
|
|
||||||
(builtins.attrValues config.sane.programs);
|
|
||||||
|
|
||||||
fmtAssoc = regex: cmd: ''
|
|
||||||
${cmd}
|
|
||||||
${regex}
|
|
||||||
'';
|
|
||||||
assocs = builtins.map
|
|
||||||
(program: lib.mapAttrsToList fmtAssoc program.mime.urlAssociations)
|
|
||||||
enabledPrograms;
|
|
||||||
assocs' = lib.flatten assocs;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
sane.programs.mimeo = {
|
|
||||||
package = pkgs.mimeo.overridePythonAttrs (upstream: {
|
|
||||||
nativeBuildInputs = (upstream.nativeBuildInputs or []) ++ [
|
|
||||||
pkgs.copyDesktopItems
|
|
||||||
];
|
|
||||||
desktopItems = [
|
|
||||||
(pkgs.makeDesktopItem {
|
|
||||||
name = "mimeo";
|
|
||||||
desktopName = "Mimeo";
|
|
||||||
exec = "mimeo %U";
|
|
||||||
comment = "Open files by MIME-type or file name using regular expressions.";
|
|
||||||
})
|
|
||||||
];
|
|
||||||
installPhase = ''
|
|
||||||
runHook preInstall
|
|
||||||
${upstream.installPhase}
|
|
||||||
runHook postInstall
|
|
||||||
'';
|
|
||||||
});
|
|
||||||
fs.".config/mimeo/associations.txt".symlink.text = lib.concatStringsSep "\n" assocs';
|
|
||||||
mime.priority = 20;
|
|
||||||
mime.associations."x-scheme-handler/http" = "mimeo.desktop";
|
|
||||||
mime.associations."x-scheme-handler/https" = "mimeo.desktop";
|
|
||||||
};
|
|
||||||
}
|
|
78
hosts/common/programs/mimeo/default.nix
Normal file
78
hosts/common/programs/mimeo/default.nix
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# mimeo is an exec dispatcher like xdg-open, but why allows mapping different URL regexes to different handlers.
|
||||||
|
# my setup sets mimeo as the default http/https handler,
|
||||||
|
# and from there it dispatches specialized rules, falling back to the original http/https handler if no URL specialization exists
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
mimeo-open-desktop = pkgs.static-nix-shell.mkPython3Bin {
|
||||||
|
pname = "mimeo-open-desktop";
|
||||||
|
src = ./.;
|
||||||
|
pkgs = [ "mimeo" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# [ProgramConfig]
|
||||||
|
enabledPrograms = builtins.filter
|
||||||
|
(p: p.enabled)
|
||||||
|
(builtins.attrValues config.sane.programs);
|
||||||
|
|
||||||
|
# [ProgramConfig]
|
||||||
|
sortedPrograms = builtins.sort
|
||||||
|
(l: r: l.priority or 1000 < r.priority or 1000)
|
||||||
|
enabledPrograms;
|
||||||
|
|
||||||
|
fmtAssoc = regex: desktop: ''
|
||||||
|
${mimeo-open-desktop}/bin/mimeo-open-desktop ${desktop} %U
|
||||||
|
${regex}
|
||||||
|
'';
|
||||||
|
assocs = builtins.map
|
||||||
|
(program: lib.mapAttrsToList fmtAssoc program.mime.urlAssociations)
|
||||||
|
sortedPrograms;
|
||||||
|
assocs' = lib.flatten assocs;
|
||||||
|
|
||||||
|
fmtFallbackAssoc = mimeType: desktop: if mimeType == "x-scheme-handler/http" then ''
|
||||||
|
${mimeo-open-desktop}/bin/mimeo-open-desktop ${desktop} %U
|
||||||
|
^http://.*
|
||||||
|
'' else if mimeType == "x-scheme-handler/https" then ''
|
||||||
|
${mimeo-open-desktop}/bin/mimeo-open-desktop ${desktop} %U
|
||||||
|
^https://.*
|
||||||
|
'' else "";
|
||||||
|
fmtFallbackAssoc' = mimeType: desktop:
|
||||||
|
lib.optionalString (desktop != "mimeo.desktop") (fmtFallbackAssoc mimeType desktop);
|
||||||
|
|
||||||
|
fallbackAssocs = builtins.map
|
||||||
|
(program: lib.mapAttrsToList fmtFallbackAssoc' program.mime.associations)
|
||||||
|
sortedPrograms;
|
||||||
|
fallbackAssocs' = lib.flatten fallbackAssocs;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
sane.programs.mimeo = {
|
||||||
|
package = pkgs.mimeo.overridePythonAttrs (upstream: {
|
||||||
|
nativeBuildInputs = (upstream.nativeBuildInputs or []) ++ [
|
||||||
|
pkgs.copyDesktopItems
|
||||||
|
];
|
||||||
|
desktopItems = [
|
||||||
|
(pkgs.makeDesktopItem {
|
||||||
|
name = "mimeo";
|
||||||
|
desktopName = "Mimeo";
|
||||||
|
exec = "mimeo %U";
|
||||||
|
comment = "Open files by MIME-type or file name using regular expressions.";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
# upstream mimeo doesn't run preInstall/postInstall hooks, but we need that for the .desktop file
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
${upstream.installPhase}
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = (upstream.passthru or {}) // {
|
||||||
|
inherit mimeo-open-desktop;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.".config/mimeo/associations.txt".symlink.text = lib.concatStringsSep "\n" (assocs' ++ fallbackAssocs');
|
||||||
|
mime.priority = 20;
|
||||||
|
mime.associations."x-scheme-handler/http" = "mimeo.desktop";
|
||||||
|
mime.associations."x-scheme-handler/https" = "mimeo.desktop";
|
||||||
|
};
|
||||||
|
}
|
41
hosts/common/programs/mimeo/mimeo-open-desktop
Executable file
41
hosts/common/programs/mimeo/mimeo-open-desktop
Executable file
@@ -0,0 +1,41 @@
|
|||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#!nix-shell -i python3 -p "python3.withPackages (ps: [ ])" -p mimeo
|
||||||
|
|
||||||
|
# TODO: migrate nixpkgs mimeo to be `buildPythonPackage` to make it importable here.
|
||||||
|
# see <doc/languages-frameworks/python.section.md>
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
desktop = sys.argv[1]
|
||||||
|
opener_args = sys.argv[2:]
|
||||||
|
|
||||||
|
desktop_fields=subprocess.check_output([
|
||||||
|
"mimeo",
|
||||||
|
"--desk2field",
|
||||||
|
"Exec",
|
||||||
|
desktop
|
||||||
|
]).decode('utf-8')
|
||||||
|
# print(f"fields: {desktop_fields!r}")
|
||||||
|
|
||||||
|
desktop_exec = '\n'.join(desktop_fields.split('\n')[1:])
|
||||||
|
# print(f"exec: {desktop_exec!r}")
|
||||||
|
|
||||||
|
# TODO: this is obviously not correct if any of the args included spaces
|
||||||
|
desktop_argv = [f.strip() for f in desktop_exec.split(' ') if f.strip()]
|
||||||
|
# print(f"desktop_argv: {desktop_argv!r}")
|
||||||
|
|
||||||
|
# fields explained: <https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s07.html>
|
||||||
|
# - %U = all URLs
|
||||||
|
# - %U = just the first URL
|
||||||
|
substituted_argv = []
|
||||||
|
for arg in desktop_argv:
|
||||||
|
if arg == '%U':
|
||||||
|
substituted_argv += opener_args
|
||||||
|
elif arg == '%u':
|
||||||
|
substituted_argv += opener_args[:1]
|
||||||
|
else:
|
||||||
|
substituted_argv += [arg]
|
||||||
|
|
||||||
|
# print(f"argv: {substituted_argv}")
|
||||||
|
print(subprocess.check_output(substituted_argv).decode())
|
@@ -126,7 +126,7 @@ in
|
|||||||
mime.associations."video/quicktime" = "mpv.desktop";
|
mime.associations."video/quicktime" = "mpv.desktop";
|
||||||
mime.associations."video/webm" = "mpv.desktop";
|
mime.associations."video/webm" = "mpv.desktop";
|
||||||
mime.associations."video/x-matroska" = "mpv.desktop";
|
mime.associations."video/x-matroska" = "mpv.desktop";
|
||||||
mime.urlAssociations."^https?://(www.)?youtube.com/watch\?.*v=" = "mpv --player-operation-mode=pseudo-gui -- %U";
|
mime.urlAssociations."^https?://(www.)?youtube.com/watch\?.*v=" = "mpv.desktop";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user