about summary refs log tree commit diff
path: root/users/Profpatsch/lyric/default.nix
blob: c20f28b187423a7c3dd4f86b7569309d77ddfec1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
{ pkgs, depot, lib, ... }:

let
  bins = depot.nix.getBins pkgs.sqlite-utils [ "sqlite-utils" ]
    // depot.nix.getBins pkgs.jq [ "jq" ];

  mpv-script = pkgs.writeTextFile {
    name = "lyric.lua";
    text =
      lib.replaceStrings
        [ "@get_subtitles_command@" ]
        [ (toString lyric-to-temp-file) ]
        (builtins.readFile ./lyric-mpv-script.lua);
    derivationArgs.passthru.scriptName = "lyric.lua";
  };

  lyric-to-temp-file = depot.nix.writeExecline "lyric-to-temp-file" { readNArgs = 1; } [
    "backtick"
    "-E"
    "cache"
    [ depot.users.Profpatsch.xdg-cache-home ]
    "if"
    [ "mkdir" "-p" "\${cache}/lyric/as-files" ]
    "if"
    [
      "redirfd"
      "-w"
      "1"
      "\${cache}/lyric/as-files/\${1}.lrc"
      lyric
      "$1"
    ]
    "printf"
    "\${cache}/lyric/as-files/\${1}.lrc"
  ];

  # Display lyrics for the given search string;
  # search string can contain a substring of band name, album name, song title
  #
  # Use the database dump from https://lrclib.net/db-dumps and place it in ~/.cache/lyric/lrclib-db-dump.sqlite3
  lyric =

    (depot.nix.writeExecline "lyric" { readNArgs = 1; } [
      "backtick"
      "-E"
      "cache"
      [ depot.users.Profpatsch.xdg-cache-home ]
      "pipeline"
      [
        bins.sqlite-utils
        "query"
        "\${cache}/lyric/lrclib-db-dump.sqlite3"
        ''
          select
              synced_lyrics,
              has_synced_lyrics,
              plain_lyrics
          from
              tracks_fts(:searchstring) tf
              join tracks t on t.rowid = tf.rowid
              join lyrics l on t.rowid = l.track_id
          order by
              has_synced_lyrics desc, t.id
          limit
              1
        ''
        "--param"
        "searchstring"
        "$1"
      ]
      bins.jq
      "-r"
      ''
        if .[0] == null
        then ""
        else
        .[0]
            | if .has_synced_lyrics == 1
            then .synced_lyrics
            else .plain_lyrics
            end
        end
      ''
    ]);


in
{
  inherit
    lyric
    mpv-script;
}