Compare commits

..

1 Commits

Author SHA1 Message Date
5801da97f3 feeds: import econlib 2023-01-11 10:47:27 +00:00
58 changed files with 193 additions and 1095 deletions

43
flake.lock generated
View File

@@ -56,12 +56,11 @@
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
"nixpkgs-unpatched" "nixpkgs-unpatched"
], ]
"patches": []
}, },
"locked": { "locked": {
"lastModified": 1, "lastModified": 1,
"narHash": "sha256-d3XSehPFkNwvwlOYy7gch0NLxOgdXuV7j5r/Qsn7kHc=", "narHash": "sha256-5eJxyBRYQCoRt92ZFUOdT237Z0VscuNRd0pktDYWJYE=",
"path": "nixpatches", "path": "nixpatches",
"type": "path" "type": "path"
}, },
@@ -72,27 +71,26 @@
}, },
"nixpkgs-stable": { "nixpkgs-stable": {
"locked": { "locked": {
"lastModified": 1673704454, "lastModified": 1673163619,
"narHash": "sha256-5Wdj1MgdOgn3+dMFIBtg+IAYZApjF8JzwLWDPieg0C4=", "narHash": "sha256-B33PFBL64ZgTWgMnhFL3jgheAN/DjHPsZ1Ih3z0VE5I=",
"owner": "nixos", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "a83ed85c14fcf242653df6f4b0974b7e1c73c6c6", "rev": "8c54d842d9544361aac5f5b212ba04e4089e8efe",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "id": "nixpkgs",
"ref": "nixos-22.11", "ref": "nixos-22.11",
"repo": "nixpkgs", "type": "indirect"
"type": "github"
} }
}, },
"nixpkgs-stable_2": { "nixpkgs-stable_2": {
"locked": { "locked": {
"lastModified": 1673740915, "lastModified": 1673100377,
"narHash": "sha256-MMH8zONfqahgHly3K8/A++X34800rajA/XgZ2DzNL/M=", "narHash": "sha256-mT76pTd0YFxT6CwtPhDgHJhuIgLY+ZLSMiQpBufwMG4=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "7c65528c3f8462b902e09d1ccca23bb9034665c2", "rev": "9f11a2df77cb945c115ae2a65f53f38121597d73",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -104,18 +102,17 @@
}, },
"nixpkgs-unpatched": { "nixpkgs-unpatched": {
"locked": { "locked": {
"lastModified": 1673631141, "lastModified": 1673226411,
"narHash": "sha256-AprpYQ5JvLS4wQG/ghm2UriZ9QZXvAwh1HlgA/6ZEVQ=", "narHash": "sha256-b6cGb5Ln7Zy80YO66+cbTyGdjZKtkoqB/iIIhDX9gRA=",
"owner": "nixos", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "befc83905c965adfd33e5cae49acb0351f6e0404", "rev": "aa1d74709f5dac623adb4d48fdfb27cc2c92a4d4",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "id": "nixpkgs",
"ref": "nixos-unstable", "ref": "nixos-unstable",
"repo": "nixpkgs", "type": "indirect"
"type": "github"
} }
}, },
"root": { "root": {
@@ -137,11 +134,11 @@
"nixpkgs-stable": "nixpkgs-stable_2" "nixpkgs-stable": "nixpkgs-stable_2"
}, },
"locked": { "locked": {
"lastModified": 1673752321, "lastModified": 1673147300,
"narHash": "sha256-EFfXY1ZHJq4FNaNQA9x0djtu/jiOhBbT0Xi+BT06cJw=", "narHash": "sha256-gR9OEfTzWfL6vG0qkbn1TlBAOlg4LuW8xK/u0V41Ihc=",
"owner": "Mic92", "owner": "Mic92",
"repo": "sops-nix", "repo": "sops-nix",
"rev": "e18eefd2b133a58309475298052c341c08470717", "rev": "2253120d2a6147e57bafb5c689e086221df8032f",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -1,47 +1,24 @@
# FLAKE FEEDBACK: # docs:
# - if flake inputs are meant to be human-readable, a human should be able to easily track them down given the URL. # - <https://nixos.wiki/wiki/Flakes>
# - this is not the case with registry URLs, like `nixpkgs/nixos-22.11`.
# - this is marginally the case with schemes like `github:nixos/nixpkgs`.
# - given the *existing* `git+https://` scheme, i propose expressing github URLs similarly:
# - `github+https://github.com/nixos/nixpkgs/tree/nixos-22.11`
# - need some way to apply local patches to inputs.
#
#
# DEVELOPMENT DOCS:
# - Flake docs: <https://nixos.wiki/wiki/Flakes>
# - Flake RFC: <https://github.com/tweag/rfcs/blob/flakes/rfcs/0049-flakes.md>
# - Discussion: <https://github.com/NixOS/rfcs/pull/49>
# - <https://serokell.io/blog/practical-nix-flakes> # - <https://serokell.io/blog/practical-nix-flakes>
{ {
# XXX: use the `github:` scheme instead of the more readable git+https: because it's *way* more efficient
# preferably, i would rewrite the human-readable https URLs to nix-specific github: URLs with a helper,
# but `inputs` is required to be a strict attrset: not an expression.
inputs = { inputs = {
# <https://github.com/nixos/nixpkgs/tree/nixos-22.11> nixpkgs-stable.url = "nixpkgs/nixos-22.11";
nixpkgs-stable.url = "github:nixos/nixpkgs?ref=nixos-22.11"; nixpkgs-unpatched.url = "nixpkgs/nixos-unstable";
# <https://github.com/nixos/nixpkgs/tree/nixos-unstable>
nixpkgs-unpatched.url = "github:nixos/nixpkgs?ref=nixos-unstable";
nixpkgs = { nixpkgs = {
url = "path:nixpatches"; url = "path:nixpatches";
inputs.nixpkgs.follows = "nixpkgs-unpatched"; inputs.nixpkgs.follows = "nixpkgs-unpatched";
# XXX: `path:` urls have poor UX in that they still get "locked" and require manual updates as if they were remote.
# by linking back to ourselves here, we can update `nixpatches/list.nix` *without* having to run `nix flake update` afterward.
inputs.patches.follows = "";
}; };
mobile-nixos = { mobile-nixos = {
# <https://github.com/nixos/mobile-nixos>
url = "github:nixos/mobile-nixos"; url = "github:nixos/mobile-nixos";
flake = false; flake = false;
}; };
home-manager = { home-manager = {
# <https://github.com/nix-community/home-manager/tree/release-22.05> url = "github:nix-community/home-manager/release-22.05";
url = "github:nix-community/home-manager?ref=release-22.05";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
sops-nix = { sops-nix = {
# <https://github.com/Mic92/sops-nix>
url = "github:Mic92/sops-nix"; url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
@@ -66,12 +43,10 @@
evalHost = { name, local, target }: evalHost = { name, local, target }:
let let
# XXX: we'd prefer to use `nixosSystem = (nixpkgsCompiledBy target).nixos` # XXX: we'd prefer to use `nixosSystem = (nixpkgsCompiledBy local).nixos`
# but it doesn't propagate config to the underlying pkgs, meaning it doesn't let you use # but it doesn't propagate config to the underlying pkgs, meaning it doesn't let you use
# non-free packages even after setting nixpkgs.allowUnfree. # non-free packages even after setting nixpkgs.allowUnfree.
# XXX: patch using the target -- not local -- otherwise the target will nixosSystem = import ((nixpkgsCompiledBy local).path + "/nixos/lib/eval-config.nix");
# need to emulate the host in order to rebuild!
nixosSystem = import ((nixpkgsCompiledBy target).path + "/nixos/lib/eval-config.nix");
in in
(nixosSystem { (nixosSystem {
# we use pkgs built for and *by* the target, i.e. emulation, by default. # we use pkgs built for and *by* the target, i.e. emulation, by default.
@@ -85,7 +60,6 @@
nixpkgs.overlays = [ nixpkgs.overlays = [
self.overlays.default self.overlays.default
self.overlays.passthru self.overlays.passthru
self.overlays.pins
]; ];
} }
]; ];
@@ -122,12 +96,11 @@
overlays = rec { overlays = rec {
default = pkgs; default = pkgs;
pkgs = import ./overlays/pkgs.nix; pkgs = import ./pkgs/overlay.nix;
pins = import ./overlays/pins.nix; # TODO: move to `nixpatches/` input
passthru = passthru =
let let
stable = next: prev: { stable = next: prev: {
stable = nixpkgs-stable.legacyPackages."${prev.stdenv.hostPlatform.system}"; stable = nixpkgs-stable.legacyPackages."${prev.stdenv.hostPlatform}";
}; };
mobile = (import "${mobile-nixos}/overlay/overlay.nix"); mobile = (import "${mobile-nixos}/overlay/overlay.nix");
uninsane = uninsane-dot-org.overlay; uninsane = uninsane-dot-org.overlay;
@@ -188,9 +161,6 @@
description = "python environment for data processing"; description = "python environment for data processing";
}; };
}; };
# unofficial output; used by inputs.nixpatches
nixpatches = import ./nixpatches/list.nix;
}; };
} }

View File

@@ -1,12 +1,5 @@
{ config, ... }: { ... }:
let
mkCrossFrom = localSystem: pkgs: import pkgs.path {
inherit localSystem;
crossSystem = pkgs.stdenv.hostPlatform.system;
inherit (config.nixpkgs) config overlays;
};
in
{ {
# the configuration of which specific package set `pkgs.cross` refers to happens elsewhere; # the configuration of which specific package set `pkgs.cross` refers to happens elsewhere;
# here we just define them all. # here we just define them all.
@@ -15,8 +8,8 @@ in
# non-emulated packages build *from* local *for* target. # non-emulated packages build *from* local *for* target.
# for large packages like the linux kernel which are expensive to build under emulation, # for large packages like the linux kernel which are expensive to build under emulation,
# the config can explicitly pull such packages from `pkgs.cross` to do more efficient cross-compilation. # the config can explicitly pull such packages from `pkgs.cross` to do more efficient cross-compilation.
crossFrom."x86_64-linux" = mkCrossFrom "x86_64-linux" next; crossFrom."x86_64-linux" = (prev.forceSystem "x86_64-linux" null).appendOverlays next.overlays;
crossFrom."aarch64-linux" = mkCrossFrom "aarch64-linux" next; crossFrom."aarch64-linux" = (prev.forceSystem "aarch64-linux" null).appendOverlays next.overlays;
}) })
]; ];
} }

View File

@@ -39,11 +39,6 @@
nix.extraOptions = '' nix.extraOptions = ''
experimental-features = nix-command flakes experimental-features = nix-command flakes
''; '';
# allow `nix-shell` (and probably nix-index?) to locate our patched and custom packages
nix.nixPath = [
"nixpkgs=${pkgs.path}"
"nixpkgs-overlays=${../..}/overlays"
];
# TODO: move this into home-manager? # TODO: move this into home-manager?
fonts = { fonts = {

View File

@@ -1,4 +1,4 @@
{ lib, sane-data, ... }: { ... }:
let let
hourly = { freq = "hourly"; }; hourly = { freq = "hourly"; };
daily = { freq = "daily"; }; daily = { freq = "daily"; };
@@ -12,8 +12,6 @@ let
tech = { cat = "tech"; }; tech = { cat = "tech"; };
uncat = { cat = "uncat"; }; uncat = { cat = "uncat"; };
text = { format = "text"; };
mkRss = format: url: { inherit url format; } // uncat // infrequent; mkRss = format: url: { inherit url format; } // uncat // infrequent;
# format-specific helpers # format-specific helpers
mkText = mkRss "text"; mkText = mkRss "text";
@@ -23,74 +21,48 @@ let
# host-specific helpers # host-specific helpers
mkSubstack = subdomain: { substack = subdomain; }; mkSubstack = subdomain: { substack = subdomain; };
fromDb = name:
let
raw = sane-data.feeds."${name}";
in {
url = raw.url;
# not sure the exact mapping with velocity here: entries per day?
freq = lib.mkDefault (
if raw.velocity or 0 > 2 then
"hourly"
else if raw.velocity or 0 > 0.5 then
"daily"
else if raw.velocity or 0 > 0.1 then
"weekly"
else
"infrequent"
);
} // lib.optionalAttrs (raw.is_podcast or false) {
format = "podcast";
} // lib.optionalAttrs (raw.title or "" != "") {
title = lib.mkDefault raw.title;
};
podcasts = [ podcasts = [
(fromDb "lexfridman.com/podcast" // rat) (mkPod "https://lexfridman.com/feed/podcast/" // rat // weekly)
# (mkPod "https://lexfridman.com/feed/podcast/" // rat // weekly)
## Astral Codex Ten ## Astral Codex Ten
(fromDb "sscpodcast.libsyn.com" // rat) (mkPod "http://feeds.libsyn.com/108018/rss" // rat // daily)
## Econ Talk ## Econ Talk
(fromDb "feeds.simplecast.com/wgl4xEgL" // rat) (mkPod "https://feeds.simplecast.com/wgl4xEgL" // rat // daily)
## Cory Doctorow -- both podcast & text entries ## Cory Doctorow
(fromDb "craphound.com" // pol) (mkPod "https://feeds.feedburner.com/doctorow_podcast" // pol // infrequent)
(mkPod "https://congressionaldish.libsyn.com/rss" // pol // infrequent) (mkPod "https://congressionaldish.libsyn.com/rss" // pol // infrequent)
## Civboot -- https://anchor.fm/civboot ## Civboot
(fromDb "anchor.fm/s/34c7232c/podcast/rss" // tech) (mkPod "https://anchor.fm/s/34c7232c/podcast/rss" // tech // infrequent)
(fromDb "feeds.feedburner.com/80000HoursPodcast" // rat) (mkPod "https://feeds.feedburner.com/80000HoursPodcast" // rat // weekly)
(fromDb "allinchamathjason.libsyn.com" // pol) (mkPod "https://allinchamathjason.libsyn.com/rss" // pol // weekly)
(fromDb "acquired.libsyn.com" // tech) (mkPod "https://acquired.libsyn.com/rss" // tech // infrequent)
# The Intercept - Deconstructed; also available: <rss.acast.com/deconstructed> (mkPod "https://rss.acast.com/deconstructed" // pol // infrequent)
(fromDb "rss.prod.firstlook.media/deconstructed/podcast.rss" // pol)
## The Daily ## The Daily
(mkPod "https://feeds.simplecast.com/54nAGcIl" // pol // daily) (mkPod "https://feeds.simplecast.com/54nAGcIl" // pol // daily)
# The Intercept - Intercepted; also available: <https://rss.acast.com/intercepted-with-jeremy-scahill> (mkPod "https://rss.acast.com/intercepted-with-jeremy-scahill" // pol // weekly)
(fromDb "rss.prod.firstlook.media/intercepted/podcast.rss" // pol) (mkPod "https://podcast.posttv.com/itunes/post-reports.xml" // pol // weekly)
(fromDb "podcast.posttv.com/itunes/post-reports.xml" // pol)
## Eric Weinstein ## Eric Weinstein
(fromDb "rss.art19.com/the-portal" // rat) (mkPod "https://rss.art19.com/the-portal" // rat // infrequent)
(fromDb "darknetdiaries.com" // tech) (mkPod "https://feeds.megaphone.fm/darknetdiaries" // tech // infrequent)
## Radiolab -- also available here, but ONLY OVER HTTP: <http://feeds.wnyc.org/radiolab> (mkPod "http://feeds.wnyc.org/radiolab" // pol // infrequent)
(fromDb "feeds.feedburner.com/radiolab" // pol) (mkPod "https://wakingup.libsyn.com/rss" // pol // infrequent)
## Sam Harris ## 99% Invisible
(fromDb "wakingup.libsyn.com" // pol) (mkPod "https://feeds.simplecast.com/BqbsxVfO" // pol // infrequent)
## 99% Invisible -- also available here: <https://feeds.simplecast.com/BqbsxVfO> (mkPod "https://rss.acast.com/ft-tech-tonic" // tech // infrequent)
(fromDb "feeds.99percentinvisible.org/99percentinvisible" // pol) (mkPod "https://feeds.feedburner.com/dancarlin/history?format=xml" // rat // infrequent)
(fromDb "rss.acast.com/ft-tech-tonic" // tech) ## 60 minutes (NB: this features more than *just* audio?)
(fromDb "feeds.feedburner.com/dancarlin/history" // rat) (mkPod "https://www.cbsnews.com/latest/rss/60-minutes" // pol // infrequent)
(fromDb "rss.art19.com/60-minutes" // pol)
## The Verge - Decoder ## The Verge - Decoder
(fromDb "feeds.megaphone.fm/recodedecode" // tech) (mkPod "https://feeds.megaphone.fm/recodedecode" // tech // weekly)
## Matrix (chat) Live ## Matrix (chat) Live
(fromDb "feed.podbean.com/matrixlive/feed.xml" // tech) (mkPod "https://feed.podbean.com/matrixlive/feed.xml" // tech // weekly)
## Michael Malice - Your Welcome -- also available here: <https://origin.podcastone.com/podcast?categoryID2=2232> ## Michael Malice - Your Welcome
(fromDb "rss.art19.com/your-welcome" // pol) (mkPod "https://www.podcastone.com/podcast?categoryID2=2232" // pol // weekly)
]; ];
texts = [ texts = [
# AGGREGATORS (> 1 post/day) # AGGREGATORS (> 1 post/day)
(fromDb "lesswrong.com" // rat) (mkText "https://www.lesswrong.com/feed.xml" // rat // hourly)
(fromDb "econlib.org" // pol) (mkText "http://www.econlib.org/index.xml" // pol // hourly)
# AGGREGATORS (< 1 post/day) # AGGREGATORS (< 1 post/day)
(mkText "https://palladiummag.com/feed" // uncat // weekly) (mkText "https://palladiummag.com/feed" // uncat // weekly)
@@ -103,10 +75,10 @@ let
(mkText "https://www.rifters.com/crawl/?feed=rss2" // uncat // weekly) (mkText "https://www.rifters.com/crawl/?feed=rss2" // uncat // weekly)
# DEVELOPERS # DEVELOPERS
(fromDb "uninsane.org" // tech) (mkText "https://uninsane.org/atom.xml" // infrequent // tech)
(fromDb "mg.lol" // tech) (mkText "https://mg.lol/blog/rss/" // infrequent // tech)
## Ken Shirriff ## Ken Shirriff
(fromDb "righto.com" // tech) (mkText "https://www.righto.com/feeds/posts/default" // tech // infrequent)
## Vitalik Buterin ## Vitalik Buterin
(mkText "https://vitalik.ca/feed.xml" // tech // infrequent) (mkText "https://vitalik.ca/feed.xml" // tech // infrequent)
## ian (Sanctuary) ## ian (Sanctuary)
@@ -122,7 +94,7 @@ let
(mkText "https://pomeroyb.com/feed.xml" // tech // infrequent) (mkText "https://pomeroyb.com/feed.xml" // tech // infrequent)
# (TECH; POL) COMMENTATORS # (TECH; POL) COMMENTATORS
(fromDb "edwardsnowden.substack.com" // pol // text) (mkSubstack "edwardsnowden" // pol // infrequent)
(mkText "http://benjaminrosshoffman.com/feed" // pol // weekly) (mkText "http://benjaminrosshoffman.com/feed" // pol // weekly)
## Ben Thompson ## Ben Thompson
(mkText "https://www.stratechery.com/rss" // pol // weekly) (mkText "https://www.stratechery.com/rss" // pol // weekly)
@@ -176,11 +148,4 @@ let
in in
{ {
sane.feeds = texts ++ images ++ podcasts; sane.feeds = texts ++ images ++ podcasts;
assertions = builtins.map
(p: {
assertion = p.format or "unknown" == "podcast";
message = ''${p.url} is not a podcast: ${p.format or "unknown"}'';
})
podcasts;
} }

View File

@@ -86,7 +86,6 @@ in
"Pictures" "Pictures"
"Videos" "Videos"
".cache/nix"
".cargo" ".cargo"
".rustup" ".rustup"
]; ];

View File

@@ -125,9 +125,6 @@ in
# aarch64-unknown-linux-gnu-gcc: error: unrecognized command line option '-mfpu=neon' # aarch64-unknown-linux-gnu-gcc: error: unrecognized command line option '-mfpu=neon'
# make[3]: *** [../scripts/Makefile.build:289: drivers/video/fbdev/sun5i-eink-neon.o] Error 1 # make[3]: *** [../scripts/Makefile.build:289: drivers/video/fbdev/sun5i-eink-neon.o] Error 1
FB_SUN5I_EINK = no; FB_SUN5I_EINK = no;
# used by the pinephone pro, but fails to compile with:
# ../drivers/media/i2c/ov8858.c:1834:27: error: implicit declaration of function 'compat_ptr'
VIDEO_OV8858 = no;
}) })
)) ))
]; ];

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 1369733,
"content_type": "application/rss+xml; charset=utf-8",
"description": "Every company has a story. Learn the playbooks that built the worlds greatest companies — and how you can apply them as a founder, operator, or investor.",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 173,
"last_seen": "2023-01-11T15:26:37.515527+00:00",
"last_updated": "2022-12-19T07:22:28+00:00",
"score": 18,
"self_url": "https://acquired.libsyn.com/rss",
"site_name": null,
"site_url": null,
"title": "Acquired",
"url": "https://acquired.libsyn.com/rss",
"velocity": 0.066,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 1030773,
"content_type": "application/rss+xml; charset=utf-8",
"description": "Industry veterans, degenerate gamblers & besties Chamath Palihapitiya, Jason Calacanis, David Sacks & David Friedberg cover all things economic, tech, political, social & poker.",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 124,
"last_seen": "2023-01-11T12:44:53.606606+00:00",
"last_updated": "2023-01-06T10:51:00+00:00",
"score": 18,
"self_url": "https://allinchamathjason.libsyn.com/rss",
"site_name": "All-In with Chamath, Jason, Sacks & Friedberg",
"site_url": "https://allinchamathjason.libsyn.com",
"title": "All-In with Chamath, Jason, Sacks & Friedberg",
"url": "https://allinchamathjason.libsyn.com/rss",
"velocity": 0.12,
"version": "rss20"
}

View File

@@ -1,23 +0,0 @@
{
"bozo": 0,
"content_length": 13316,
"content_type": "application/rss+xml; charset=utf-8",
"description": "A podcast around the idea of creating a Civilizational Bootstrapper, a set of tools and technology that can be used to replicate the foundations of civilization along with itself.",
"favicon": null,
"hubs": [
"https://pubsubhubbub.appspot.com/"
],
"is_podcast": true,
"is_push": true,
"item_count": 6,
"last_seen": "2023-01-11T16:11:01.720399+00:00",
"last_updated": "2022-04-13T19:37:17+00:00",
"score": 22,
"self_url": "https://anchor.fm/s/34c7232c/podcast/rss",
"site_name": "Anchor",
"site_url": "https://anchor.fm",
"title": "Civboot",
"url": "https://anchor.fm/s/34c7232c/podcast/rss",
"velocity": 0.009,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 12669,
"content_type": "application/rss+xml; charset=utf-8",
"description": "The territory is a map of the map.",
"favicon": "http://benjaminrosshoffman.com/favicon.ico",
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 10,
"last_seen": "2023-01-11T12:32:52.176940+00:00",
"last_updated": "2023-01-09T04:33:31+00:00",
"score": -15,
"self_url": "http://benjaminrosshoffman.com/comments/feed/",
"site_name": "Compass Rose",
"site_url": "http://benjaminrosshoffman.com",
"title": "Comments for Compass Rose",
"url": "http://benjaminrosshoffman.com/comments/feed/",
"velocity": 0.312,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 56666,
"content_type": "application/rss+xml; charset=utf-8",
"description": "Cory Doctorow's Literary Works",
"favicon": "https://craphound.com/favicon.ico",
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 20,
"last_seen": "2023-01-11T12:55:10.545856+00:00",
"last_updated": "2022-12-12T14:46:35+00:00",
"score": 12,
"self_url": "https://craphound.com/feed/",
"site_name": "Cory Doctorow's craphound.com | Cory Doctorow's Literary Works",
"site_url": "https://craphound.com",
"title": "Cory Doctorow's craphound.com",
"url": "https://craphound.com/feed/",
"velocity": 0.069,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 227480,
"content_type": "application/xml; charset=utf-8",
"description": "True stories from the dark side of the Internet",
"favicon": "https://darknetdiaries.com/imgs/favicon.png",
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 131,
"last_seen": "2023-01-11T14:49:53.136566+00:00",
"last_updated": "2022-12-27T08:00:00+00:00",
"score": 20,
"self_url": "https://darknetdiaries.com/feedfree.xml",
"site_name": "Darknet Diaries True stories from the dark side of the Internet.",
"site_url": "https://darknetdiaries.com",
"title": "Darknet Diaries (ad free)",
"url": "https://darknetdiaries.com/feedfree.xml",
"velocity": 0.067,
"version": "rss20"
}

View File

@@ -1,6 +1,6 @@
{ {
"bozo": 0, "bozo": 0,
"content_length": 66775, "content_length": 27184,
"content_type": "application/rss+xml; charset=utf-8", "content_type": "application/rss+xml; charset=utf-8",
"description": "The Library of Economics and Liberty", "description": "The Library of Economics and Liberty",
"favicon": null, "favicon": null,
@@ -9,13 +9,13 @@
"is_push": false, "is_push": false,
"item_count": 10, "item_count": 10,
"last_seen": "2023-01-11T10:46:38.526754+00:00", "last_seen": "2023-01-11T10:46:38.526754+00:00",
"last_updated": "2023-01-10T05:21:31+00:00", "last_updated": "2023-01-09T11:30:25+00:00",
"score": 14, "score": -18,
"self_url": "https://www.econlib.org/feed/", "self_url": "http://www.econtalk.org/feed/",
"site_name": "Econlib", "site_name": null,
"site_url": "https://www.econlib.org", "site_url": null,
"title": "Econlib", "title": "EconTalk Podcast Econlib",
"url": "https://www.econlib.org/feed/", "url": "http://www.econtalk.org/feed/",
"velocity": 2.549, "velocity": 0.143,
"version": "rss20" "version": "rss20"
} }

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 27185,
"content_type": "application/rss+xml; charset=utf-8",
"description": "The Library of Economics and Liberty",
"favicon": null,
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 10,
"last_seen": "2023-01-11T13:05:47.318206+00:00",
"last_updated": "2023-01-09T11:30:25+00:00",
"score": 14,
"self_url": "https://www.econtalk.org/feed/",
"site_name": null,
"site_url": null,
"title": "EconTalk Podcast Econlib",
"url": "https://www.econtalk.org/feed",
"velocity": 0.143,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 429348,
"content_type": "application/rss+xml; charset=utf-8",
"description": "The world's most famous whistleblower writes from exile on the intersection of technology, humanity, and power.",
"favicon": "https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2a7d3aa2-3c2f-4196-ab7c-31541be1272e/favicon.ico",
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 16,
"last_seen": "2023-01-11T12:32:02.320483+00:00",
"last_updated": "2022-09-20T13:03:59+00:00",
"score": 14,
"self_url": "https://edwardsnowden.substack.com/feed",
"site_name": "Continuing Ed — with Edward Snowden",
"site_url": "https://edwardsnowden.substack.com",
"title": "Continuing Ed — with Edward Snowden",
"url": "https://edwardsnowden.substack.com/feed",
"velocity": 0.032,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 281377,
"content_type": "text/xml; charset=utf-8",
"description": "Matrix Live, now as an audio podcast",
"favicon": "https://feed.podbean.com/favicon.ico",
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 100,
"last_seen": "2023-01-11T15:54:24.440541+00:00",
"last_updated": "2023-01-06T16:45:00+00:00",
"score": 18,
"self_url": "https://feed.podbean.com/matrixlive/feed.xml",
"site_name": null,
"site_url": "https://feed.podbean.com",
"title": "Matrix Live",
"url": "https://feed.podbean.com/matrixlive/feed.xml",
"velocity": 0.12,
"version": "rss20"
}

View File

@@ -1,23 +0,0 @@
{
"bozo": 0,
"content_length": 1600578,
"content_type": "application/xml; charset=utf-8",
"description": "Design is everywhere in our lives, perhaps most importantly in the places where we've just stopped noticing. 99% Invisible is a weekly exploration of the process and power of design and architecture. From award winning producer Roman Mars. Learn more at 99percentinvisible.org.",
"favicon": null,
"hubs": [
"https://simplecast.superfeedr.com/"
],
"is_podcast": true,
"is_push": true,
"item_count": 577,
"last_seen": "2023-01-11T15:25:01.536556+00:00",
"last_updated": "2023-01-10T23:46:05+00:00",
"score": 4,
"self_url": "https://feeds.simplecast.com/BqbsxVfO",
"site_name": null,
"site_url": null,
"title": "99% Invisible",
"url": "https://feeds.simplecast.com/BqbsxVfO",
"velocity": 0.128,
"version": "rss20"
}

View File

@@ -1,23 +0,0 @@
{
"bozo": 0,
"content_length": 1505641,
"content_type": "text/xml; charset=utf-8",
"description": "<p>Unusually in-depth conversations about the world's most pressing problems and what you can do to solve them.<br /></p>",
"favicon": null,
"hubs": [
"https://pubsubhubbub.appspot.com/"
],
"is_podcast": true,
"is_push": true,
"item_count": 181,
"last_seen": "2023-01-11T13:29:43.501516+00:00",
"last_updated": "2023-01-09T22:57:00+00:00",
"score": 14,
"self_url": "https://feeds.backtracks.fm/feeds/80000hours/80000-hours-podcast-with-rob-wiblin/feed.xml",
"site_name": null,
"site_url": null,
"title": "80,000 Hours Podcast with Rob Wiblin",
"url": "https://feeds.feedburner.com/80000HoursPodcast",
"velocity": 0.087,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 23712,
"content_type": "text/xml; charset=utf-8",
"description": "This isn't academic history (and Carlin isn't a historian) but the podcast's unique blend of high drama, masterful narration and Twilight Zone-style twists has entertained millions of listeners.",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 13,
"last_seen": "2023-01-11T15:05:34.359948+00:00",
"last_updated": "2022-03-06T19:08:44+00:00",
"score": 2,
"self_url": "https://feeds.feedburner.com/dancarlin/history?format=xml",
"site_name": null,
"site_url": null,
"title": "Dan Carlin's Hardcore History",
"url": "https://feeds.feedburner.com/dancarlin/history",
"velocity": 0.005,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 62633,
"content_type": "text/xml; charset=utf-8",
"description": "Articles, speeches, stories and novels by an award-winning science fiction writer, read aloud in small regular chunks",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 20,
"last_seen": "2023-01-11T12:57:50.103797+00:00",
"last_updated": "2022-12-12T14:46:35+00:00",
"score": 4,
"self_url": "https://craphound.com/category/podcast/feed/",
"site_name": null,
"site_url": null,
"title": "Podcast Cory Doctorow's craphound.com",
"url": "https://feeds.feedburner.com/doctorow_podcast",
"velocity": 0.068,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 1315558,
"content_type": "text/xml; charset=utf-8",
"description": "Radiolab",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 150,
"last_seen": "2023-01-11T15:01:17.273650+00:00",
"last_updated": "2023-01-06T15:00:00+00:00",
"score": 4,
"self_url": "https://www.wnycstudios.org/feeds/series/podcasts",
"site_name": null,
"site_url": null,
"title": "Radiolab",
"url": "https://feeds.feedburner.com/radiolab",
"velocity": 0.139,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 2976783,
"content_type": "application/xml; charset=utf-8",
"description": "A business show about big ideas — and other problems.",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 660,
"last_seen": "2023-01-11T15:51:13.652417+00:00",
"last_updated": "2023-01-10T10:00:00+00:00",
"score": 14,
"self_url": "https://feeds.megaphone.fm/recodedecode",
"site_name": null,
"site_url": null,
"title": "Decoder with Nilay Patel",
"url": "https://feeds.megaphone.fm/recodedecode",
"velocity": 0.24,
"version": "rss20"
}

View File

@@ -1,23 +0,0 @@
{
"bozo": 0,
"content_length": 2940192,
"content_type": "application/xml; charset=utf-8",
"description": "EconTalk: Conversations for the Curious is an award-winning weekly podcast hosted by Russ Roberts of Shalem College in Jerusalem and Stanford's Hoover Institution. The eclectic guest list includes authors, doctors, psychologists, historians, philosophers, economists, and more. Learn how the health care system really works, the serenity that comes from humility, the challenge of interpreting data, how potato chips are made, what it's like to run an upscale Manhattan restaurant, what caused the 2008 financial crisis, the nature of consciousness, and more. EconTalk has been taking the Monday out of Mondays since 2006. All 800+ episodes are available in the archive. Go to EconTalk.org for transcripts, related resources, and comments.",
"favicon": null,
"hubs": [
"https://simplecast.superfeedr.com/"
],
"is_podcast": true,
"is_push": true,
"item_count": 875,
"last_seen": "2023-01-11T14:31:49.308489+00:00",
"last_updated": "2023-01-09T11:30:00+00:00",
"score": 24,
"self_url": "https://feeds.simplecast.com/wgl4xEgL",
"site_name": null,
"site_url": null,
"title": "EconTalk",
"url": "https://feeds.simplecast.com/wgl4xEgL",
"velocity": 0.142,
"version": "rss20"
}

View File

@@ -10,7 +10,7 @@
"is_podcast": true, "is_podcast": true,
"is_push": true, "is_push": true,
"item_count": 300, "item_count": 300,
"last_seen": "2023-01-11T12:40:59.343327+00:00", "last_seen": "2023-01-08T23:41:32.928322+00:00",
"last_updated": "2022-12-29T17:35:50+00:00", "last_updated": "2022-12-29T17:35:50+00:00",
"score": 20, "score": 20,
"self_url": "https://lexfridman.com/feed/podcast/", "self_url": "https://lexfridman.com/feed/podcast/",

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 83074,
"content_type": "text/xml; charset=utf-8",
"description": "projects & research",
"favicon": null,
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 14,
"last_seen": "2023-01-11T12:28:34.383284+00:00",
"last_updated": "2021-07-29T05:10:05+00:00",
"score": 14,
"self_url": "https://mg.lol/blog/rss/",
"site_name": null,
"site_url": "https://mg.lol",
"title": "MG",
"url": "https://mg.lol/blog/rss/",
"velocity": 0.004,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 3568150,
"content_type": "application/rss+xml; charset=utf-8",
"description": "Post Reports",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 1070,
"last_seen": "2023-01-11T14:37:23.650030+00:00",
"last_updated": "2023-01-10T21:40:40+00:00",
"score": 14,
"self_url": "https://podcast.posttv.com/itunes/post-reports.xml",
"site_name": null,
"site_url": null,
"title": "Post Reports",
"url": "https://podcast.posttv.com/itunes/post-reports.xml",
"velocity": 0.711,
"version": "rss20"
}

View File

@@ -1,23 +0,0 @@
{
"bozo": 0,
"content_length": 862917,
"content_type": "application/atom+xml; charset=utf-8",
"description": "Computer history, restoring vintage computers, IC reverse engineering, and whatever",
"favicon": "https://www.blogger.com/about/favicon/favicon.ico",
"hubs": [
"http://pubsubhubbub.appspot.com/"
],
"is_podcast": false,
"is_push": true,
"item_count": 25,
"last_seen": "2023-01-11T12:29:19.820378+00:00",
"last_updated": "2023-01-10T18:21:20.265000+00:00",
"score": -2,
"self_url": "https://www.blogger.com/feeds/6264947694886887540/posts/default",
"site_name": "Blogger.com - Create a unique and beautiful blog easily.",
"site_url": "https://www.blogger.com",
"title": "Ken Shirriff's blog",
"url": "https://www.blogger.com/feeds/6264947694886887540/posts/default",
"velocity": 0.12,
"version": "atom10"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 550915,
"content_type": "application/xml; charset=utf-8",
"description": "The show that looks at the way technology is changing our economies, societies and daily lives.",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 160,
"last_seen": "2023-01-11T15:31:40.303733+00:00",
"last_updated": "2022-11-22T05:00:36+00:00",
"score": 10,
"self_url": "https://feeds.acast.com/public/shows/125ef5a6-6c61-4024-b70e-3487a971a26c",
"site_name": null,
"site_url": null,
"title": "FT Tech Tonic",
"url": "https://feeds.acast.com/public/shows/125ef5a6-6c61-4024-b70e-3487a971a26c",
"velocity": 0.072,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 1041745,
"content_type": "application/rss+xml; charset=utf-8",
"description": "<p>Get the best reporting and storytelling on television from 60 Minutes - on your schedule. Now you can listen to the show in its entirety every week. 60 Minutes is the most successful broadcast in television history with more than 80 Emmys under its belt. 60 Minutes offers unbiased reporting on politics, in-depth investigations and important adventures from around the world- like no one else. </p>",
"favicon": "https://rss.art19.com/favicon.ico",
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 374,
"last_seen": "2023-01-11T15:45:07.189940+00:00",
"last_updated": "2023-01-09T03:00:00+00:00",
"score": 18,
"self_url": "https://rss.art19.com/60-minutes",
"site_name": null,
"site_url": "https://rss.art19.com",
"title": "60 Minutes",
"url": "https://rss.art19.com/60-minutes",
"velocity": 0.082,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 235911,
"content_type": "application/xml; charset=utf-8",
"description": "<p>The Portal is an exploration into discovery, including conversations with thought leaders. Host Eric Weinstein, Managing Director of Thiel Capital, brings his unique expertise and diverse roster of guests for a wide range of discussions, including science, culture, business, and capitalism. The show will feature people whose lives demonstrate that portals into what we would normally consider impossible, are indeed possible.&nbsp;&nbsp;Guests include presidential candidate Andrew Yang, NY Times bestselling author Sam Harris, and retired Navy Seal and creator of the hit business podcast Jocko Willink.</p>",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 44,
"last_seen": "2023-01-11T14:47:44.995855+00:00",
"last_updated": "2020-12-02T07:50:55+00:00",
"score": -12,
"self_url": "https://www.omnycontent.com/d/playlist/9b7dacdf-a925-4f95-84dc-ac46003451ff/1713c520-edb6-43a3-b1b9-acb8002fdae7/58e33a0c-f86b-41c5-a11c-acb8002fdaf5/podcast.rss",
"site_name": null,
"site_url": null,
"title": "The Portal",
"url": "https://www.omnycontent.com/d/playlist/9b7dacdf-a925-4f95-84dc-ac46003451ff/1713c520-edb6-43a3-b1b9-acb8002fdae7/58e33a0c-f86b-41c5-a11c-acb8002fdaf5/podcast.rss",
"velocity": 0.082,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 1462485,
"content_type": "text/xml; charset=utf-8",
"description": "Michael Malice brings his unique perspective and plenty of sick burns as he discusses everything from north Korea to American politics and culture with a bevy of guests.",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 238,
"last_seen": "2023-01-11T15:58:45.264936+00:00",
"last_updated": "2023-01-04T10:40:00+00:00",
"score": -10,
"self_url": "http://origin.podcastone.com/podcast?categoryID2=2232",
"site_name": null,
"site_url": null,
"title": "\"YOUR WELCOME\" with Michael Malice",
"url": "https://www.podcastone.com/podcast?categoryID2=2232",
"velocity": 0.141,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 809084,
"content_type": "application/xml+rss; charset=utf-8",
"description": "A show that cuts through all the political drivel and media misinformation to give you a straight take on one big news story of the week.",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 217,
"last_seen": "2023-01-11T13:40:50.240217+00:00",
"last_updated": "2023-01-06T10:37:50+00:00",
"score": 16,
"self_url": "https://feeds.acast.com/public/shows/1d1223a2-9d05-473b-9e79-c2b65b71d676",
"site_name": null,
"site_url": null,
"title": "Deconstructed",
"url": "https://rss.prod.firstlook.media/deconstructed/podcast.rss",
"velocity": 0.122,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 1034995,
"content_type": "application/xml+rss; charset=utf-8",
"description": "The people behind The Intercepts fearless reporting and incisive commentary discuss the crucial issues of our time.",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 243,
"last_seen": "2023-01-11T14:04:41.283509+00:00",
"last_updated": "2022-12-21T10:30:43+00:00",
"score": 16,
"self_url": "https://feeds.acast.com/public/shows/f5b64019-68c3-57d4-b70b-043e63e5cbf6",
"site_name": null,
"site_url": null,
"title": "Intercepted",
"url": "https://rss.prod.firstlook.media/intercepted/podcast.rss",
"velocity": 0.112,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 3905927,
"content_type": "application/rss+xml; charset=utf-8",
"description": "The official audio version of Astral Codex Ten, with an archive of posts from Slate Star Codex. It's just me reading Scott Alexander's blog posts.",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 739,
"last_seen": "2023-01-11T11:05:40.604126+00:00",
"last_updated": "2023-01-11T05:13:00+00:00",
"score": 18,
"self_url": "https://sscpodcast.libsyn.com/rss",
"site_name": "Astral Codex Ten Podcast",
"site_url": "https://sscpodcast.libsyn.com",
"title": "Astral Codex Ten Podcast",
"url": "https://sscpodcast.libsyn.com/rss",
"velocity": 0.384,
"version": "rss20"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 1,
"content_length": 178687,
"content_type": "text/xml; charset=utf-8",
"description": null,
"favicon": null,
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 6,
"last_seen": "2023-01-11T10:51:13.435393+00:00",
"last_updated": "2022-10-13T00:00:00+00:00",
"score": -4,
"self_url": "https://uninsane.org/atom.xml",
"site_name": "Perfectly Sane",
"site_url": "https://uninsane.org",
"title": "Perfectly Sane",
"url": "https://uninsane.org/atom.xml",
"velocity": 0.025,
"version": "atom10"
}

View File

@@ -1,21 +0,0 @@
{
"bozo": 0,
"content_length": 825822,
"content_type": "application/rss+xml; charset=utf-8",
"description": "Join neuroscientist, philosopher, and best-selling author Sam Harris as he explores questions about the human mind, society, and current events.",
"favicon": null,
"hubs": [],
"is_podcast": true,
"is_push": false,
"item_count": 326,
"last_seen": "2023-01-11T15:13:28.154435+00:00",
"last_updated": "2023-01-05T18:36:25+00:00",
"score": 18,
"self_url": "https://wakingup.libsyn.com/rss",
"site_name": "Making Sense with Sam Harris",
"site_url": "https://wakingup.libsyn.com",
"title": "Making Sense with Sam Harris",
"url": "https://wakingup.libsyn.com/rss",
"velocity": 0.096,
"version": "rss20"
}

View File

@@ -21,10 +21,4 @@
servo.root = root; servo.root = root;
}; };
}; };
com.github = rec {
# documented here: <https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints>
# Github actually uses multiple keys -- one per format
root = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl";
};
} }

View File

@@ -1,4 +1,4 @@
{ lib, sane-data, ... }: { lib, ... }:
with lib; with lib;
let let
@@ -16,10 +16,6 @@ let
type = types.enum [ "text" "image" "podcast" ]; type = types.enum [ "text" "image" "podcast" ];
default = "text"; default = "text";
}; };
title = mkOption {
type = types.nullOr types.str;
default = null;
};
url = mkOption { url = mkOption {
type = types.str; type = types.str;
description = '' description = ''

View File

@@ -1,7 +1,6 @@
https://search.nixos.org/options?channel=unstable&query= https://search.nixos.org/options?channel=unstable&query=
https://search.nixos.org/packages?channel=unstable&query= https://search.nixos.org/packages?channel=unstable&query=
https://nixos.wiki/index.php?go=Go&search= https://nixos.wiki/index.php?go=Go&search=
https://nixos.org/manual/nix/stable/language/builtins.html
https://github.com/nixos/nixpkgs/pulls?q= https://github.com/nixos/nixpkgs/pulls?q=
https://nur.nix-community.org/ https://nur.nix-community.org/
https://nix-community.github.io/home-manager/options.html https://nix-community.github.io/home-manager/options.html

View File

@@ -12,24 +12,8 @@ rec {
# transform a list of feeds into an attrs mapping cat => [ feed0 feed1 ... ] # transform a list of feeds into an attrs mapping cat => [ feed0 feed1 ... ]
partitionByCat = feeds: builtins.groupBy (f: f.cat) feeds; partitionByCat = feeds: builtins.groupBy (f: f.cat) feeds;
xmlTag = tag: close: attrs:
let
fmt-attrs = builtins.concatStringsSep
" "
(lib.mapAttrsToList (name: value: ''${lib.escapeXML name}="${lib.escapeXML value}"'') attrs);
fmt-close = if close then "/" else "";
in
''<${tag} ${fmt-attrs} ${fmt-close}>'';
# represents a single RSS feed. # represents a single RSS feed.
opmlTerminal = feed: xmlTag "outline" true ( opmlTerminal = feed: ''<outline xmlUrl="${feed.url}" type="rss"/>'';
{
xmlUrl = feed.url;
type = "rss";
} // lib.optionalAttrs (feed.title != null) {
title = feed.title;
}
);
# a list of RSS feeds. # a list of RSS feeds.
opmlTerminals = feeds: lib.concatStringsSep "\n" (builtins.map opmlTerminal feeds); opmlTerminals = feeds: lib.concatStringsSep "\n" (builtins.map opmlTerminal feeds);
# one node which packages some flat grouping of terminals. # one node which packages some flat grouping of terminals.

View File

@@ -102,9 +102,7 @@ let
gnome.gnome-terminal # works on phosh gnome.gnome-terminal # works on phosh
gnome.gnome-weather gnome.gnome-weather
# XXX: we preserve the whole thing because if we only preserve gPodder/Downloads { pkg = gpodder-configured; dir = [ "gPodder/Downloads" ]; }
# then startup is SLOW during feed import, and we might end up with zombie eps in the dl dir.
{ pkg = gpodder-configured; dir = [ "gPodder" ]; }
gthumb gthumb
handbrake handbrake
@@ -153,9 +151,7 @@ let
# vlc remembers play position in ~/.config/vlc/vlc-qt-interface.conf # vlc remembers play position in ~/.config/vlc/vlc-qt-interface.conf
{ pkg = vlc; dir = [ ".config/vlc" ]; } { pkg = vlc; dir = [ ".config/vlc" ]; }
# pleroma client (Electron). input is broken on phosh. whalebird # pleroma client. input is broken on phosh
{ pkg = whalebird; private = [ ".config/Whalebird" ]; }
xdg-utils # for xdg-open xdg-utils # for xdg-open
xterm # broken on phosh xterm # broken on phosh
] ]

View File

@@ -103,7 +103,7 @@ let
(orig: lib.recursiveUpdate (orig: lib.recursiveUpdate
(builtins.removeAttrs orig ["user" "group" "mode" ]) (builtins.removeAttrs orig ["user" "group" "mode" ])
{ {
acl = sane-lib.filterByName ["user" "group" "mode"] orig; acl = sane-lib.filterByName ["user" "group" "mode"] (orig.acl or {});
} }
) )
to; to;

View File

@@ -1,14 +1,13 @@
{ {
inputs = { inputs = {
nixpkgs = {}; nixpkgs.url = "nixpkgs/nixos-22.11";
patches = {};
}; };
outputs = { self, nixpkgs, patches }@inputs: outputs = { self, nixpkgs }:
let let
patchedPkgsFor = system: nixpkgs.legacyPackages.${system}.applyPatches { patchedPkgsFor = system: nixpkgs.legacyPackages.${system}.applyPatches {
name = "nixpkgs-patched-uninsane"; name = "nixpkgs-patched-uninsane";
src = nixpkgs; src = nixpkgs;
patches = inputs.patches.nixpatches { patches = import ./list.nix {
inherit (nixpkgs.legacyPackages.${system}) fetchpatch; inherit (nixpkgs.legacyPackages.${system}) fetchpatch;
inherit (nixpkgs.lib) fakeHash; inherit (nixpkgs.lib) fakeHash;
}; };

View File

@@ -13,11 +13,10 @@
sha256 = "sha256-t4sG+xLDaxbJ/mV5G18N4ag8EC3IXPgtN5FJGANh1Dc="; sha256 = "sha256-t4sG+xLDaxbJ/mV5G18N4ag8EC3IXPgtN5FJGANh1Dc=";
}) })
# whalebird: 4.6.5 -> 4.7.4 # kiwix-tools: init at 3.4.0
(fetchpatch { (fetchpatch {
# url = "https://git.uninsane.org/colin/nixpkgs/compare/master...pr.whalebird-4.7.4.diff"; url = "https://github.com/NixOS/nixpkgs/pull/206254.diff";
url = "https://git.uninsane.org/colin/nixpkgs/commit/f5c7c70dde720e990fa7e0748d1dc4764d6e4406.diff"; sha256 = "sha256-Z4V9mOv4HYg3kDnWoYcxz3ch03I/1USrLjzlq4X9YqI=";
sha256 = "sha256-L9Ie80loaP6yl5ZFnJ1b5WMDpvO1QFE8tbrW5HBauko=";
}) })
./2022-12-19-i2p-aarch64.patch ./2022-12-19-i2p-aarch64.patch

View File

@@ -1,24 +0,0 @@
(next: prev: {
inherit (next.stable)
# TODO(unpin): broken on 2023/01/14 via mtxclient dep, aarch64-only:
# error: builder for '/nix/store/gwidl0c9ksxjgx0dgwnjssix4ikq73v5-mtxclient-0.9.0.drv' failed with exit code 2;
# last 10 log lines:
# > make[2]: *** [CMakeFiles/matrix_client.dir/build.make:370: CMakeFiles/matrix_client.dir/lib/structs/events/encrypted.cpp.o] Error 1
# > In file included from /build/source/include/mtxclient/crypto/client.hpp:17,
# > from /build/source/lib/crypto/utils.cpp:17:
# > /build/source/include/mtx/identifiers.hpp:12:10: fatal error: compare: No such file or directory
# > 12 | #include <compare>
# > | ^~~~~~~~~
# > compilation terminated.
# > make[2]: *** [CMakeFiles/matrix_client.dir/build.make:132: CMakeFiles/matrix_client.dir/lib/crypto/utils.cpp.o] Error 1
# > make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/matrix_client.dir/all] Error 2
# > make: *** [Makefile:136: all] Error 2
# For full logs, run 'nix log /nix/store/gwidl0c9ksxjgx0dgwnjssix4ikq73v5-mtxclient-0.9.0.drv'.
# error: 1 dependencies of derivation '/nix/store/4i2d1qdh4x6n23h1jbcbhm8q9q2hch9a-nheko-0.11.0.drv' failed to build
# error: 1 dependencies of derivation '/nix/store/k4f7k7cvjp8rb7clhlfq3yxgs6lbfmk7-home-manager-path.drv' failed to build
# error: 1 dependencies of derivation '/nix/store/67d9k554188lh4ddl4ar6j74mpc3r4sv-home-manager-generation.drv' failed to build
# error: 1 dependencies of derivation '/nix/store/5qjxzhsw1jvh2d7jypbcam9409ivb472-user-environment.drv' failed to build
# error: 1 dependencies of derivation '/nix/store/hrb3qpdbisqh0lzlyz1g9g4164khmqwn-etc.drv' failed to build
# error: 1 dependencies of derivation '/nix/store/ny21xyicbgim5wy7ksg2hibd9gn7i01b-nixos-system-moby-23.05pre-git.drv' failed to build
nheko;
})

View File

@@ -1,67 +0,0 @@
(next: prev:
let
sane = rec {
#### my own, non-upstreamable packages:
sane-scripts = prev.callPackage ../pkgs/sane-scripts { };
feeds = prev.callPackage ../pkgs/feeds { };
tow-boot-pinephone = prev.callPackage ../pkgs/tow-boot-pinephone { };
tow-boot-rpi4 = prev.callPackage ../pkgs/tow-boot-rpi4 { };
bootpart-uefi-x86_64 = prev.callPackage ../pkgs/bootpart-uefi-x86_64 { };
bootpart-tow-boot-rpi-aarch64 = prev.callPackage ../pkgs/bootpart-tow-boot-rpi-aarch64 {
# not sure why i can't just do `next.callPackage` instead
inherit tow-boot-rpi4;
};
bootpart-u-boot-rpi-aarch64 = prev.callPackage ../pkgs/bootpart-u-boot-rpi-aarch64 {
# not sure why i can't just do `next.callPackage` instead
inherit ubootRaspberryPi4_64bit;
};
rtl8723cs-firmware = prev.callPackage ../pkgs/rtl8723cs-firmware { };
linux-megous = prev.callPackage ../pkgs/linux-megous {
kernelPatches = [
prev.kernelPatches.bridge_stp_helper
prev.kernelPatches.request_key_helper
];
};
sublime-music-mobile = prev.callPackage ../pkgs/sublime-music-mobile { };
#### customized packages
fluffychat-moby = prev.callPackage ../pkgs/fluffychat-moby { };
gpodder-configured = prev.callPackage ../pkgs/gpodder-configured { };
# nixos-unstable pleroma is too far out-of-date for our db
pleroma = prev.callPackage ../pkgs/pleroma { };
# jackett doesn't allow customization of the bind address: this will probably always be here.
jackett = prev.callPackage ../pkgs/jackett { inherit (prev) jackett; };
# mozilla keeps nerfing itself and removing configuration options
firefox-unwrapped = prev.callPackage ../pkgs/firefox-unwrapped { };
# patch rpi uboot with something that fixes USB HDD boot
ubootRaspberryPi4_64bit = prev.callPackage ../pkgs/ubootRaspberryPi4_64bit { };
gocryptfs = prev.callPackage ../pkgs/gocryptfs { inherit (prev) gocryptfs; };
browserpass = prev.callPackage ../pkgs/browserpass { inherit (prev) browserpass; inherit sane-scripts; };
fractal-latest = prev.callPackage ../pkgs/fractal-latest { };
#### TEMPORARY: PACKAGES WAITING TO BE UPSTREAMED
pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [
(py-final: py-prev: {
feedsearch-crawler = py-final.callPackage ../pkgs/feedsearch-crawler { };
})
];
kaiteki = prev.callPackage ../pkgs/kaiteki { };
lightdm-mobile-greeter = prev.callPackage ../pkgs/lightdm-mobile-greeter { };
browserpass-extension = prev.callPackage ../pkgs/browserpass-extension { };
gopass-native-messaging-host = prev.callPackage ../pkgs/gopass-native-messaging-host { };
tokodon = prev.libsForQt5.callPackage ../pkgs/tokodon { };
signaldctl = prev.callPackage ../pkgs/signaldctl { };
splatmoji = prev.callPackage ../pkgs/splatmoji { };
# trust-dns = prev.callPackage ../pkgs/trust-dns { };
# kaiteki = prev.kaiteki;
};
in sane // { inherit sane; }
)

View File

@@ -26,17 +26,12 @@
passthru.initFeedScript = pkgs.writeShellScript passthru.initFeedScript = pkgs.writeShellScript
"init-feed" "init-feed"
'' ''
sources_dir=modules/data/feeds/sources #!/usr/bin/env nix-shell
#!nix-shell -i bash -p git
name="$1" name="$1"
url="https://$name" mkdir modules/data/feeds/sources/"$name"
json_path="$sources_dir/$name/default.json" touch modules/data/feeds/sources/"$name"/default.json
git add modules/data/feeds/sources/"$name"/default.json
# the name could have slashes in it, so we want to mkdir -p that
# but in a way where the least could go wrong.
pushd "$sources_dir"; mkdir -p "$name"; popd
${./update.py} "$url" "$json_path"
cat "$json_path"
''; '';
} }
)) ))

View File

@@ -14,7 +14,10 @@ stdenv.mkDerivation {
src = fetchurl { src = fetchurl {
inherit url; inherit url;
}; };
passthru.updateScript = [ ./update.py url jsonPath ]; passthru.updateScript = [ ./update.sh url jsonPath ];
# passthru.updateScript = callPackage ./update.nix {
# inherit url jsonPath;
# };
meta = { meta = {
description = "metadata about any feeds available at ${feedName}"; description = "metadata about any feeds available at ${feedName}";
homepage = feedName; homepage = feedName;

18
pkgs/feeds/update.nix Normal file
View File

@@ -0,0 +1,18 @@
{ lib
, curl
, jq
, runtimeShell
, writeScript
# feed-specific args
, jsonPath
, url
}:
let
apiQuery = "https://feedsearch.dev/api/v1/search?url=${url}";
in
writeScript "update-feed" ''
#!${runtimeShell}
PATH=${lib.makeBinPath [ curl jq ]}
curl -X GET '${apiQuery}' | jq '.[-1]' > '${jsonPath}'
''

View File

@@ -1,24 +0,0 @@
#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p "python3.withPackages (ps: [ ps.feedsearch-crawler ])"
from feedsearch_crawler import search, sort_urls
from feedsearch_crawler.crawler import coerce_url
import json
import sys
url, jsonPath = sys.argv[1:]
url = coerce_url(url, default_scheme="https")
items = search(url)
items = sort_urls(items)
# print all results
serialized = [item.serialize() for item in items]
for item in serialized:
print(json.dumps(item, sort_keys=True, indent=2))
# save the first result to disk
keep = serialized[0] if serialized else {}
results = json.dumps(keep, sort_keys=True, indent=2)
with open(jsonPath, "w") as out:
out.write(results)

10
pkgs/feeds/update.sh Executable file
View File

@@ -0,0 +1,10 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p curl jq
set -xeu -o pipefail
url="$1"
jsonPath="$2"
apiQuery="https://feedsearch.dev/api/v1/search?url=$url"
curl -X GET "$apiQuery" | jq '.[-1]' > "$jsonPath"

View File

@@ -1,65 +0,0 @@
{ lib
, buildPythonPackage
, fetchFromGitHub
# nativeBuildInputs python packages
, poetry-core
# propagatedBuildInputs python packages
, aiodns
, aiohttp
, beautifulsoup4
, brotlipy
, cchardet
, feedparser
, python-dateutil
, uvloop
, w3lib
, yarl
}:
buildPythonPackage rec {
pname = "feedsearch-crawler";
version = "2022-05-28";
format = "pyproject";
src = fetchFromGitHub {
owner = "DBeath";
repo = "feedsearch-crawler";
rev = "f49a6f5a07e796e359c4482fd29305b1a019f71f";
hash = "sha256-pzvyeXzqdi8pRjk2+QjKhJfgtxbgVT6C08K9fhVFVmY=";
};
nativeBuildInputs = [
poetry-core
];
postPatch = ''
substituteInPlace pyproject.toml \
--replace 'w3lib = "^1.22.0"' 'w3lib = "*"' \
--replace 'aiodns = "^2.0.0"' 'aiodns = "*"' \
--replace 'uvloop = "^0.15.2"' 'uvloop = "*"'
'';
propagatedBuildInputs = [
aiodns
aiohttp
beautifulsoup4
brotlipy
cchardet
feedparser
python-dateutil
uvloop
w3lib
yarl
];
pythonImportsCheck = [
"feedsearch_crawler"
];
meta = with lib; {
homepage = "https://feedsearch.dev";
description = "Crawl sites for RSS, Atom, and JSON feeds";
license = licenses.mit;
maintainers = with maintainers; [ colinsane ];
};
}

View File

@@ -1,28 +1,22 @@
{ makeWrapper { makeWrapper
, gpodder , gpodder
, linkFarm
, symlinkJoin , symlinkJoin
, writeShellScript
, config
}: }:
let
remove-extra = linkFarm "gpodder-remove-extra" [
{ name = "bin/gpodder-remove-extra"; path = ./remove_extra.py; }
];
in
# we use a symlinkJoin so that we can inherit the .desktop and icon files from the original gPodder
(symlinkJoin { (symlinkJoin {
name = "gpodder-configured"; name = "gpodder-configured";
paths = [ gpodder remove-extra ]; paths = [ gpodder ];
buildInputs = [ makeWrapper ]; buildInputs = [ makeWrapper ];
# gpodder keeps all its feeds in a sqlite3 database. # gpodder keeps all its feeds in a sqlite3 database.
# we can configure the feeds externally by wrapping gpodder and just instructing it to import # we can configure the feeds externally by wrapping gpodder and just instructing it to import
# a feedlist every time we run it. # a feedlist every time we run it.
# repeat imports are deduplicated by url, even when offline. # repeat imports are deduplicated -- assuming network access (not sure how it behaves when disconnected).
postBuild = '' postBuild = ''
makeWrapper $out/bin/gpodder $out/bin/gpodder-configured \ makeWrapper $out/bin/gpodder $out/bin/gpodder-configured \
--run "$out/bin/gpodder-remove-extra ~/.config/gpodderFeeds.opml" \ --run "$out/bin/gpo import ~/.config/gpodderFeeds.opml"
--run "$out/bin/gpo import ~/.config/gpodderFeeds.opml" \
# fix up the .desktop file to invoke our wrapped application # fix up the .desktop file to invoke our wrapped application
orig_desktop=$(readlink $out/share/applications/gpodder.desktop) orig_desktop=$(readlink $out/share/applications/gpodder.desktop)

View File

@@ -1,79 +0,0 @@
#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p "python3.withPackages (ps: [gnome-feeds.listparser])" -p gpodder
from dataclasses import dataclass, field
import listparser
import subprocess
import sys
@dataclass(repr=True)
class Feed:
url: str
title: str # Optional
def __init__(self, url: str, title: str):
self.url = url
self.title = title if title else None
def __eq__(self, other: 'Feed') -> bool:
return self.url == other.url and \
(self.title == other.title or None in [self.title, other.title])
@dataclass(init=True)
class Partitioned:
has_not_wanted: list[Feed] = field(default_factory=list)
wanted_not_has: list[Feed] = field(default_factory=list)
intersection: list[Feed] = field(default_factory=list)
def wanted_feeds(opml_file: str):
parsed = listparser.parse(open(opml_file).read())
return [Feed(url=p['url'], title=p['title']) for p in parsed.feeds]
def has_feeds():
listing = subprocess.check_output(["gpo", "list"]).decode()
feeds = []
title = None
for line in listing.split("\n"):
if line.startswith("# "): # title
title = line[2:].strip()
elif line.startswith("http"): # feed URL:
feeds.append(Feed(url=line, title=title))
title = None
return feeds
def partition_feeds(wanted: list[Feed], has: list[Feed]) -> Partitioned:
p = Partitioned()
for f in wanted + has:
w, h = f in wanted, f in has
if h and not w:
p.has_not_wanted.append(f)
elif w and not h:
p.wanted_not_has.append(f)
else:
assert w and h
p.intersection.append(f)
return p
def remove_feed(feed: Feed):
subprocess.check_output(['gpo', 'unsubscribe', feed.url])
def rationalize_feeds(opml_file: str):
wanted = wanted_feeds(opml_file)
has = has_feeds()
partitioned = partition_feeds(wanted, has)
print("extra feeds:", "" if partitioned.has_not_wanted else "(none)")
for f in partitioned.has_not_wanted:
print(" ", f)
print()
for f in partitioned.has_not_wanted:
remove_feed(f)
if __name__ == "__main__":
wanted_opml, = sys.argv[1:]
rationalize_feeds(wanted_opml)

View File

@@ -5,7 +5,7 @@ with lib;
let let
base = "6.1.0"; base = "6.1.0";
# set to empty if not a release candidate # set to empty if not a release candidate
rc = "-rc8"; rc = "-rc7";
in buildLinux (args // rec { in buildLinux (args // rec {
version = base + rc; version = base + rc;
@@ -16,15 +16,9 @@ in buildLinux (args // rec {
extraMeta.branch = versions.majorMinor version; extraMeta.branch = versions.majorMinor version;
src = fetchFromGitHub { src = fetchFromGitHub {
# HOW TO UPDATE:
# - `git fetch` from megous' github.
# - there should be some new tag, like `orange-pi-6.1-blah`. use that.
# - megi publishes release notes as the most recent commit on any stable branch, so just `git log`.
# - orange-pi is listed as the "main integration branch".
# - specific branches like `pp` (pinephone) are dev branches, and probably less stable.
owner = "megous"; owner = "megous";
repo = "linux"; repo = "linux";
rev = "orange-pi-6.1-20221211-1046"; rev = "orange-pi-6.1-20221128-1027";
hash = "sha256-TgFXH8bHWHs26rlf7a/zNO9zubFazC8Ie6J1gj4gLgw="; hash = "sha256-kEujs4v5rPHPYy4YLyEWHa1Bu0sxoXLgSvmOH9QPWos=";
}; };
} // (args.argsOverride or { })) } // (args.argsOverride or { }))

60
pkgs/overlay.nix Normal file
View File

@@ -0,0 +1,60 @@
(next: prev:
let
sane = rec {
#### my own, non-upstreamable packages:
sane-scripts = prev.callPackage ./sane-scripts { };
feeds = prev.callPackage ./feeds { };
tow-boot-pinephone = prev.callPackage ./tow-boot-pinephone { };
tow-boot-rpi4 = prev.callPackage ./tow-boot-rpi4 { };
bootpart-uefi-x86_64 = prev.callPackage ./bootpart-uefi-x86_64 { };
bootpart-tow-boot-rpi-aarch64 = prev.callPackage ./bootpart-tow-boot-rpi-aarch64 {
# not sure why i can't just do `next.callPackage` instead
inherit tow-boot-rpi4;
};
bootpart-u-boot-rpi-aarch64 = prev.callPackage ./bootpart-u-boot-rpi-aarch64 {
# not sure why i can't just do `next.callPackage` instead
inherit ubootRaspberryPi4_64bit;
};
rtl8723cs-firmware = prev.callPackage ./rtl8723cs-firmware { };
linux-megous = prev.callPackage ./linux-megous {
kernelPatches = [
prev.kernelPatches.bridge_stp_helper
prev.kernelPatches.request_key_helper
];
};
sublime-music-mobile = prev.callPackage ./sublime-music-mobile { };
#### customized packages
fluffychat-moby = prev.callPackage ./fluffychat-moby { };
gpodder-configured = prev.callPackage ./gpodder-configured { };
# nixos-unstable pleroma is too far out-of-date for our db
pleroma = prev.callPackage ./pleroma { };
# jackett doesn't allow customization of the bind address: this will probably always be here.
jackett = prev.callPackage ./jackett { inherit (prev) jackett; };
# mozilla keeps nerfing itself and removing configuration options
firefox-unwrapped = prev.callPackage ./firefox-unwrapped { };
# patch rpi uboot with something that fixes USB HDD boot
ubootRaspberryPi4_64bit = prev.callPackage ./ubootRaspberryPi4_64bit { };
gocryptfs = prev.callPackage ./gocryptfs { inherit (prev) gocryptfs; };
browserpass = prev.callPackage ./browserpass { inherit (prev) browserpass; inherit sane-scripts; };
fractal-latest = prev.callPackage ./fractal-latest { };
#### TEMPORARY: PACKAGES WAITING TO BE UPSTREAMED
kaiteki = prev.callPackage ./kaiteki { };
lightdm-mobile-greeter = prev.callPackage ./lightdm-mobile-greeter { };
browserpass-extension = prev.callPackage ./browserpass-extension { };
gopass-native-messaging-host = prev.callPackage ./gopass-native-messaging-host { };
tokodon = prev.libsForQt5.callPackage ./tokodon { };
signaldctl = prev.callPackage ./signaldctl { };
splatmoji = prev.callPackage ./splatmoji { };
# trust-dns = prev.callPackage ./trust-dns { };
# kaiteki = prev.kaiteki;
};
in sane // { inherit sane; }
)

View File

@@ -1,5 +1,4 @@
#!/usr/bin/env nix-shell #!/usr/bin/env python
#!nix-shell -i python3 -p "python3.withPackages (ps: [ ps.natsort ps.requests ])"
""" """
usage: sane-bt-search <query_string> usage: sane-bt-search <query_string>
@@ -68,6 +67,5 @@ q = " ".join(sys.argv[1:])
client = Client() client = Client()
res = client.query(q) res = client.query(q)
print(f"found {len(res)} result(s)")
for r in res[:5]: for r in res[:5]:
print(r) print(r)