aboutsummaryrefslogtreecommitdiff
path: root/home-manager/modules/programs/newsboat.nix
blob: 793b30680bf7d2d4f513dfc12b87feedafc97c41 (plain)
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
{ config, lib, pkgs, ... }:

with lib;

let
  cfg = config.programs.newsboat;
  wrapQuote = x: ''"${x}"'';

in {
  options = {
    programs.newsboat = {
      enable = mkEnableOption "the Newsboat feed reader";

      urls = mkOption {
        type = types.listOf (types.submodule {
          options = {
            url = mkOption {
              type = types.str;
              example = "http://example.com";
              description = "Feed URL.";
            };

            tags = mkOption {
              type = types.listOf types.str;
              default = [ ];
              example = [ "foo" "bar" ];
              description = "Feed tags.";
            };

            title = mkOption {
              type = types.nullOr types.str;
              default = null;
              example = "ORF News";
              description = "Feed title.";
            };
          };
        });
        default = [ ];
        example = [{
          url = "http://example.com";
          tags = [ "foo" "bar" ];
        }];
        description = "List of news feeds.";
      };

      maxItems = mkOption {
        type = types.int;
        default = 0;
        description = "Maximum number of items per feed, 0 for infinite.";
      };

      reloadThreads = mkOption {
        type = types.int;
        default = 5;
        description = "How many threads to use for updating the feeds.";
      };

      autoReload = mkOption {
        type = types.bool;
        default = false;
        description = ''
          Whether to enable automatic reloading while newsboat is running.
        '';
      };

      reloadTime = mkOption {
        type = types.nullOr types.int;
        default = 60;
        description = "Time in minutes between reloads.";
      };

      browser = mkOption {
        type = types.str;
        default = "${pkgs.xdg_utils}/bin/xdg-open";
        description = "External browser to use.";
      };

      queries = mkOption {
        type = types.attrsOf types.str;
        default = { };
        example = { "foo" = ''rssurl =~ "example.com"''; };
        description = "A list of queries to use.";
      };

      extraConfig = mkOption {
        type = types.lines;
        default = "";
        description = ''
          Extra configuration values that will be appended to the end.
        '';
      };
    };
  };

  config = mkIf cfg.enable {
    home.packages = [ pkgs.newsboat ];
    home.file.".newsboat/urls".text = let
      mkUrlEntry = u:
        concatStringsSep " " ([ u.url ] ++ map wrapQuote u.tags
          ++ optional (u.title != null) (wrapQuote "~${u.title}"));
      urls = map mkUrlEntry cfg.urls;

      mkQueryEntry = n: v: ''"query:${n}:${escape [ ''"'' ] v}"'';
      queries = mapAttrsToList mkQueryEntry cfg.queries;
    in concatStringsSep "\n"
    (if versionAtLeast config.home.stateVersion "20.03" then
      queries ++ urls
    else
      urls ++ queries) + "\n";

    home.file.".newsboat/config".text = ''
      max-items ${toString cfg.maxItems}
      browser ${cfg.browser}
      reload-threads ${toString cfg.reloadThreads}
      auto-reload ${if cfg.autoReload then "yes" else "no"}
      ${optionalString (cfg.reloadTime != null)
      (toString "reload-time ${toString cfg.reloadTime}")}
      prepopulate-query-feeds yes

      ${cfg.extraConfig}
    '';
  };
}