zimPackages: init
this includes wikipedia snapshots, though currently only their smaller ones (simply because the larger ones will take time to download)
This commit is contained in:
70
pkgs/by-name/directoryListingUpdater2/list-directory-versions
Executable file
70
pkgs/by-name/directoryListingUpdater2/list-directory-versions
Executable file
@@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env nix-shell
|
||||
#!nix-shell -i python3 -p python3 -p python3.pkgs.beautifulsoup4 -p python3.pkgs.requests
|
||||
|
||||
import argparse
|
||||
import requests
|
||||
import os
|
||||
import subprocess
|
||||
import json
|
||||
import re
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Get all available versions listed for a package in a site."
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--pname",
|
||||
default=os.environ.get("UPDATE_NIX_PNAME"),
|
||||
required="UPDATE_NIX_PNAME" not in os.environ,
|
||||
help="name of the package",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--attr-path",
|
||||
default=os.environ.get("UPDATE_NIX_ATTR_PATH"),
|
||||
help="attribute path of the package",
|
||||
)
|
||||
parser.add_argument("--url", help="url of the page that lists the package versions")
|
||||
parser.add_argument("--file", help="file name for writing debugging information")
|
||||
|
||||
parser.add_argument("--extra-regex", help="additional regex to filter versions with")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = parser.parse_args()
|
||||
|
||||
pname = args.pname
|
||||
|
||||
attr_path = args.attr_path or pname
|
||||
|
||||
url = args.url or json.loads(
|
||||
subprocess.check_output(
|
||||
[
|
||||
"nix-instantiate",
|
||||
"--json",
|
||||
"--eval",
|
||||
"-E",
|
||||
f"with import ./. {{}}; dirOf (lib.head {attr_path}.src.urls)",
|
||||
],
|
||||
text=True,
|
||||
)
|
||||
)
|
||||
|
||||
# print a debugging message
|
||||
if args.file:
|
||||
with open(args.file, "a") as f:
|
||||
f.write(f"# Listing versions for {pname} from {url}\n")
|
||||
|
||||
page = requests.get(url)
|
||||
soup = BeautifulSoup(page.content, "html.parser")
|
||||
links = soup.find_all("a")
|
||||
for link in links:
|
||||
link_url = link.get("href", None)
|
||||
if link_url is not None:
|
||||
match = re.fullmatch(
|
||||
rf"(.*/)?{args.pname}_([\d.]+?(-[\d\w.-]+?)?)(\.tar)?(\.[^.]*)", link_url
|
||||
)
|
||||
if match:
|
||||
version = match.group(2)
|
||||
if (not args.extra_regex) or re.fullmatch(args.extra_regex, version):
|
||||
print(version)
|
46
pkgs/by-name/directoryListingUpdater2/package.nix
Normal file
46
pkgs/by-name/directoryListingUpdater2/package.nix
Normal file
@@ -0,0 +1,46 @@
|
||||
# heavily based on <repo:nixos/nixpkgs:pkgs/common-updater/scripts.nix>
|
||||
# and <repo:nixos/nixpkgs:pkgs/common-updater/scripts/list-directory-versions>.
|
||||
# main difference is that it does fuzzier matching.
|
||||
{
|
||||
lib,
|
||||
genericUpdater,
|
||||
static-nix-shell,
|
||||
}:
|
||||
|
||||
{
|
||||
pname ? null,
|
||||
version ? null,
|
||||
attrPath ? null,
|
||||
allowedVersions ? "",
|
||||
ignoredVersions ? "",
|
||||
rev-prefix ? "",
|
||||
odd-unstable ? false,
|
||||
patchlevel-unstable ? false,
|
||||
url ? null,
|
||||
extraRegex ? null,
|
||||
}:
|
||||
let
|
||||
list-directory-versions = static-nix-shell.mkPython3 {
|
||||
pname = "list-directory-versions";
|
||||
srcRoot = ./.;
|
||||
pkgs = [
|
||||
"python3.pkgs.beautifulsoup4"
|
||||
"python3.pkgs.requests"
|
||||
];
|
||||
};
|
||||
in
|
||||
genericUpdater {
|
||||
inherit
|
||||
pname
|
||||
version
|
||||
attrPath
|
||||
allowedVersions
|
||||
ignoredVersions
|
||||
rev-prefix
|
||||
odd-unstable
|
||||
patchlevel-unstable
|
||||
;
|
||||
versionLister = "${lib.getExe list-directory-versions} ${
|
||||
lib.optionalString (url != null) "--url=${lib.escapeShellArg url}"
|
||||
} ${lib.optionalString (extraRegex != null) "--extra-regex=${lib.escapeShellArg extraRegex}"}";
|
||||
}
|
51
pkgs/by-name/zimPackages/mkVersionedHttpZim.nix
Normal file
51
pkgs/by-name/zimPackages/mkVersionedHttpZim.nix
Normal file
@@ -0,0 +1,51 @@
|
||||
# primary use case here is wikipedia.
|
||||
# see list of wikipedia mirrors, which mostly include the .zim files:
|
||||
# - <https://dumps.wikimedia.org/backup-index.html>
|
||||
{
|
||||
directoryListingUpdater2,
|
||||
fetchurl,
|
||||
stdenv,
|
||||
}:
|
||||
{
|
||||
pname,
|
||||
version,
|
||||
owner ? null, #< same meaning as in e.g. `fetchFromGitHub`
|
||||
hash ? "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
||||
}@args:
|
||||
let
|
||||
tail = "${pname}_${version}.zim";
|
||||
prefix = if owner != null then "${owner}/" else "";
|
||||
in
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
inherit pname version;
|
||||
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://download.kiwix.org/zim/${prefix}${tail}"
|
||||
"https://dumps.wikimedia.org/other/kiwix/zim/${prefix}${tail}"
|
||||
"https://mirror.accum.se/mirror/wikimedia.org/other/kiwix/zim/${prefix}${tail}"
|
||||
];
|
||||
inherit hash;
|
||||
};
|
||||
|
||||
dontUnpack = true;
|
||||
dontBuild = true;
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out/share/zim
|
||||
ln -s ${finalAttrs.src} $out/share/zim/${pname}.zim
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
passthru.updateScript = directoryListingUpdater2 {
|
||||
url = "https://download.kiwix.org/zim/${prefix}";
|
||||
};
|
||||
# required so that directoryListingUpdater2 can know in which file the `version` variable can be updated in.
|
||||
passthru.meta.position = let
|
||||
position = builtins.unsafeGetAttrPos "version" args;
|
||||
in
|
||||
"${position.file}:${toString position.line}";
|
||||
})
|
18
pkgs/by-name/zimPackages/package.nix
Normal file
18
pkgs/by-name/zimPackages/package.nix
Normal file
@@ -0,0 +1,18 @@
|
||||
# .zim files are web dumps (html + images, etc) designed for read-only mirroring.
|
||||
# so they package search indexes and such too.
|
||||
# use together with kiwix.
|
||||
#
|
||||
# zim downloads:
|
||||
# - https://mirror.accum.se/mirror/wikimedia.org/other/kiwix/zim
|
||||
# - https://dumps.wikimedia.org/other/kiwix/zim
|
||||
# - https://download.kiwix.org/zim
|
||||
{
|
||||
lib,
|
||||
newScope,
|
||||
}:
|
||||
lib.recurseIntoAttrs (lib.makeScope newScope (self: with self; {
|
||||
mkVersionedHttpZim = callPackage ./mkVersionedHttpZim.nix { };
|
||||
|
||||
wikipedia_en_100 = callPackage ./wikipedia_en_100.nix { };
|
||||
wikipedia_en_all_mini = callPackage ./wikipedia_en_all_mini.nix { };
|
||||
}))
|
6
pkgs/by-name/zimPackages/wikipedia_en_100.nix
Normal file
6
pkgs/by-name/zimPackages/wikipedia_en_100.nix
Normal file
@@ -0,0 +1,6 @@
|
||||
{ mkVersionedHttpZim }: mkVersionedHttpZim {
|
||||
owner = "wikipedia";
|
||||
pname = "wikipedia_en_100";
|
||||
version = "2024-06";
|
||||
hash = "sha256-Uafkv2QdVFOXjSUNHI6j6z77+89AL7J5aW93pPsk5wo=";
|
||||
}
|
6
pkgs/by-name/zimPackages/wikipedia_en_all_mini.nix
Normal file
6
pkgs/by-name/zimPackages/wikipedia_en_all_mini.nix
Normal file
@@ -0,0 +1,6 @@
|
||||
{ mkVersionedHttpZim }: mkVersionedHttpZim {
|
||||
owner = "wikipedia";
|
||||
pname = "wikipedia_en_all_mini";
|
||||
version = "2024-04";
|
||||
hash = "sha256-svHyb2hOMvfMnkLLWbon3oZCCG6bv9RdtKbD36et/Ss=";
|
||||
}
|
Reference in New Issue
Block a user