Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nixos/services.nitter: remove with lib; #338027

Merged
merged 1 commit into from
Aug 28, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
179 changes: 88 additions & 91 deletions nixos/modules/services/misc/nitter.nix
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
{ config, lib, pkgs, ... }:

with lib;

let
cfg = config.services.nitter;
configFile = pkgs.writeText "nitter.conf" ''
${generators.toINI {
${lib.generators.toINI {
# String values need to be quoted
mkKeyValue = generators.mkKeyValueDefault {
mkKeyValue = lib.generators.mkKeyValueDefault {
mkValueString = v:
if isString v then "\"" + (strings.escape ["\""] (toString v)) + "\""
else generators.mkValueStringDefault {} v;
if lib.isString v then "\"" + (lib.escape ["\""] (toString v)) + "\""
else lib.generators.mkValueStringDefault {} v;
} " = ";
} (lib.recursiveUpdate {
Server = cfg.server;
Expand Down Expand Up @@ -47,96 +44,96 @@ in
{
imports = [
# https://github.com/zedeus/nitter/pull/772
(mkRemovedOptionModule [ "services" "nitter" "replaceInstagram" ] "Nitter no longer supports this option as Bibliogram has been discontinued.")
(lib.mkRemovedOptionModule [ "services" "nitter" "replaceInstagram" ] "Nitter no longer supports this option as Bibliogram has been discontinued.")
];

options = {
services.nitter = {
enable = mkEnableOption "Nitter, an alternative Twitter front-end";
enable = lib.mkEnableOption "Nitter, an alternative Twitter front-end";

package = mkPackageOption pkgs "nitter" { };
package = lib.mkPackageOption pkgs "nitter" { };

server = {
address = mkOption {
type = types.str;
address = lib.mkOption {
type = lib.types.str;
default = "0.0.0.0";
example = "127.0.0.1";
description = "The address to listen on.";
};

port = mkOption {
type = types.port;
port = lib.mkOption {
type = lib.types.port;
default = 8080;
example = 8000;
description = "The port to listen on.";
};

https = mkOption {
type = types.bool;
https = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Set secure attribute on cookies. Keep it disabled to enable cookies when not using HTTPS.";
};

httpMaxConnections = mkOption {
type = types.int;
httpMaxConnections = lib.mkOption {
type = lib.types.int;
default = 100;
description = "Maximum number of HTTP connections.";
};

staticDir = mkOption {
type = types.path;
staticDir = lib.mkOption {
type = lib.types.path;
default = "${cfg.package}/share/nitter/public";
defaultText = literalExpression ''"''${config.services.nitter.package}/share/nitter/public"'';
defaultText = lib.literalExpression ''"''${config.services.nitter.package}/share/nitter/public"'';
description = "Path to the static files directory.";
};

title = mkOption {
type = types.str;
title = lib.mkOption {
type = lib.types.str;
default = "nitter";
description = "Title of the instance.";
};

hostname = mkOption {
type = types.str;
hostname = lib.mkOption {
type = lib.types.str;
default = "localhost";
example = "nitter.net";
description = "Hostname of the instance.";
};
};

cache = {
listMinutes = mkOption {
type = types.int;
listMinutes = lib.mkOption {
type = lib.types.int;
default = 240;
description = "How long to cache list info (not the tweets, so keep it high).";
};

rssMinutes = mkOption {
type = types.int;
rssMinutes = lib.mkOption {
type = lib.types.int;
default = 10;
description = "How long to cache RSS queries.";
};

redisHost = mkOption {
type = types.str;
redisHost = lib.mkOption {
type = lib.types.str;
default = "localhost";
description = "Redis host.";
};

redisPort = mkOption {
type = types.port;
redisPort = lib.mkOption {
type = lib.types.port;
default = 6379;
description = "Redis port.";
};

redisConnections = mkOption {
type = types.int;
redisConnections = lib.mkOption {
type = lib.types.int;
default = 20;
description = "Redis connection pool size.";
};

redisMaxConnections = mkOption {
type = types.int;
redisMaxConnections = lib.mkOption {
type = lib.types.int;
default = 30;
description = ''
Maximum number of connections to Redis.
Expand All @@ -149,30 +146,30 @@ in
};

config = {
base64Media = mkOption {
type = types.bool;
base64Media = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Use base64 encoding for proxied media URLs.";
};

enableRSS = mkEnableOption "RSS feeds" // { default = true; };
enableRSS = lib.mkEnableOption "RSS feeds" // { default = true; };

enableDebug = mkEnableOption "request logs and debug endpoints";
enableDebug = lib.mkEnableOption "request logs and debug endpoints";

proxy = mkOption {
type = types.str;
proxy = lib.mkOption {
type = lib.types.str;
default = "";
description = "URL to a HTTP/HTTPS proxy.";
};

proxyAuth = mkOption {
type = types.str;
proxyAuth = lib.mkOption {
type = lib.types.str;
default = "";
description = "Credentials for proxy.";
};

tokenCount = mkOption {
type = types.int;
tokenCount = lib.mkOption {
type = lib.types.int;
default = 10;
description = ''
Minimum amount of usable tokens.
Expand All @@ -187,114 +184,114 @@ in
};

preferences = {
replaceTwitter = mkOption {
type = types.str;
replaceTwitter = lib.mkOption {
type = lib.types.str;
default = "";
example = "nitter.net";
description = "Replace Twitter links with links to this instance (blank to disable).";
};

replaceYouTube = mkOption {
type = types.str;
replaceYouTube = lib.mkOption {
type = lib.types.str;
default = "";
example = "piped.kavin.rocks";
description = "Replace YouTube links with links to this instance (blank to disable).";
};

replaceReddit = mkOption {
type = types.str;
replaceReddit = lib.mkOption {
type = lib.types.str;
default = "";
example = "teddit.net";
description = "Replace Reddit links with links to this instance (blank to disable).";
};

mp4Playback = mkOption {
type = types.bool;
mp4Playback = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable MP4 video playback.";
};

hlsPlayback = mkOption {
type = types.bool;
hlsPlayback = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable HLS video streaming (requires JavaScript).";
};

proxyVideos = mkOption {
type = types.bool;
proxyVideos = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Proxy video streaming through the server (might be slow).";
};

muteVideos = mkOption {
type = types.bool;
muteVideos = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Mute videos by default.";
};

autoplayGifs = mkOption {
type = types.bool;
autoplayGifs = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Autoplay GIFs.";
};

theme = mkOption {
type = types.str;
theme = lib.mkOption {
type = lib.types.str;
default = "Nitter";
description = "Instance theme.";
};

infiniteScroll = mkOption {
type = types.bool;
infiniteScroll = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Infinite scrolling (requires JavaScript, experimental!).";
};

stickyProfile = mkOption {
type = types.bool;
stickyProfile = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Make profile sidebar stick to top.";
};

bidiSupport = mkOption {
type = types.bool;
bidiSupport = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Support bidirectional text (makes clicking on tweets harder).";
};

hideTweetStats = mkOption {
type = types.bool;
hideTweetStats = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Hide tweet stats (replies, retweets, likes).";
};

hideBanner = mkOption {
type = types.bool;
hideBanner = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Hide profile banner.";
};

hidePins = mkOption {
type = types.bool;
hidePins = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Hide pinned tweets.";
};

hideReplies = mkOption {
type = types.bool;
hideReplies = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Hide tweet replies.";
};

squareAvatars = mkOption {
type = types.bool;
squareAvatars = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Square profile pictures.";
};
};

settings = mkOption {
type = types.attrs;
settings = lib.mkOption {
type = lib.types.attrs;
default = {};
description = ''
Add settings here to override NixOS module generated settings.
Expand All @@ -304,8 +301,8 @@ in
'';
};

guestAccounts = mkOption {
type = types.path;
guestAccounts = lib.mkOption {
type = lib.types.path;
default = "/var/lib/nitter/guest_accounts.jsonl";
description = ''
Path to the guest accounts file.
Expand All @@ -321,21 +318,21 @@ in
'';
};

redisCreateLocally = mkOption {
type = types.bool;
redisCreateLocally = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Configure local Redis server for Nitter.";
};

openFirewall = mkOption {
type = types.bool;
openFirewall = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Open ports in the firewall for Nitter web interface.";
};
};
};

config = mkIf cfg.enable {
config = lib.mkIf cfg.enable {
assertions = [
{
assertion = !cfg.redisCreateLocally || (cfg.cache.redisHost == "localhost" && cfg.cache.redisPort == 6379);
Expand Down Expand Up @@ -397,7 +394,7 @@ in
port = cfg.cache.redisPort;
};

networking.firewall = mkIf cfg.openFirewall {
networking.firewall = lib.mkIf cfg.openFirewall {
allowedTCPPorts = [ cfg.server.port ];
};
};
Expand Down