generate atom feed for releases
This commit is contained in:
parent
0b2ff9352f
commit
abc83cbed6
55
generate_feed.py
Executable file
55
generate_feed.py
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
import lxml.html
|
||||||
|
from lxml import etree
|
||||||
|
|
||||||
|
document = lxml.html.parse("static_tmp/releases.html").getroot()
|
||||||
|
releases = document.body.cssselect("#changelog h3")
|
||||||
|
|
||||||
|
updated = None
|
||||||
|
entries = []
|
||||||
|
|
||||||
|
for release in releases:
|
||||||
|
title = release.attrib["id"]
|
||||||
|
time = datetime.strptime(title, "%Y.%m.%d.%H").isoformat() + "Z"
|
||||||
|
if updated is None:
|
||||||
|
updated = time
|
||||||
|
content = []
|
||||||
|
element = release.getnext()
|
||||||
|
while element is not None and element.tag != "h3":
|
||||||
|
content.append(etree.tostring(element).decode())
|
||||||
|
element = element.getnext()
|
||||||
|
entry = f"""\
|
||||||
|
<entry>
|
||||||
|
<id>https://grapheneos.org/releases#{title}</id>
|
||||||
|
<link href="https://grapheneos.org/releases#{title}"/>
|
||||||
|
<title>{title}</title>
|
||||||
|
<updated>{time}</updated>
|
||||||
|
<content type="xhtml">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
{"".join(content)}
|
||||||
|
</div>
|
||||||
|
</content>
|
||||||
|
</entry>"""
|
||||||
|
entries.append(entry)
|
||||||
|
|
||||||
|
feed = f"""<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<feed xmlns="http://www.w3.org/2005/Atom">
|
||||||
|
<id>https://grapheneos.org/releases#changelog</id>
|
||||||
|
<link href="http://grapheneos.org/releases#changelog"/>
|
||||||
|
<link rel="self" href="https://grapheneos.org/releases.atom"/>
|
||||||
|
<title>GrapheneOS changelog</title>
|
||||||
|
<updated>{updated}</updated>
|
||||||
|
<author>
|
||||||
|
<name>GrapheneOS</name>
|
||||||
|
<email>contact@grapheneos.org</email>
|
||||||
|
<uri>https://grapheneos.org/</uri>
|
||||||
|
</author>
|
||||||
|
{"".join(entries)}
|
||||||
|
</feed>
|
||||||
|
"""
|
||||||
|
|
||||||
|
with open("static_tmp/releases.atom", "w") as f:
|
||||||
|
f.write(feed)
|
@ -156,7 +156,7 @@ http {
|
|||||||
gzip_static off;
|
gzip_static off;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ "\.(json|pdf|txt|xml)$" {
|
location ~ "\.(atom|json|pdf|txt|xml)$" {
|
||||||
include /etc/nginx/snippets/security-headers.conf;
|
include /etc/nginx/snippets/security-headers.conf;
|
||||||
add_header Cache-Control "public, max-age=1800";
|
add_header Cache-Control "public, max-age=1800";
|
||||||
}
|
}
|
||||||
|
@ -12,10 +12,16 @@ for file in static_tmp/**/*.@(json|webmanifest); do
|
|||||||
json_reformat -m < "$file" | sponge "$file"
|
json_reformat -m < "$file" | sponge "$file"
|
||||||
done
|
done
|
||||||
|
|
||||||
find static_tmp -name '*.xml' -exec xmllint --noblanks {} --output {} \;
|
|
||||||
find static_tmp -name '*.css' -exec csso {} -o {} \;
|
|
||||||
find static_tmp -name '*.html' -exec html-minifier --collapse-whitespace --process-scripts "application/ld+json" --collapse-boolean-attributes --remove-attribute-quotes --remove-comments --remove-empty-attributes --remove-redundant-attributes --remove-script-type-attributes --remove-style-link-type-attributes --sort-attributes --sort-class-name {} -o {} \;
|
find static_tmp -name '*.html' -exec html-minifier --collapse-whitespace --process-scripts "application/ld+json" --collapse-boolean-attributes --remove-attribute-quotes --remove-comments --remove-empty-attributes --remove-redundant-attributes --remove-script-type-attributes --remove-style-link-type-attributes --sort-attributes --sort-class-name {} -o {} \;
|
||||||
|
|
||||||
|
./generate_feed.py
|
||||||
|
|
||||||
|
for file in static_tmp/**/*.@(atom|xml); do
|
||||||
|
xmllint --noblanks "$file" --output "$file"
|
||||||
|
done
|
||||||
|
|
||||||
|
find static_tmp -name '*.css' -exec csso {} -o {} \;
|
||||||
find static_tmp -name '*.js' -exec terser --module -cmo {} {} \;
|
find static_tmp -name '*.js' -exec terser --module -cmo {} {} \;
|
||||||
find static_tmp -regex '\(.+/LICENSE\|.+\.\(css\|html\|ico\|js\|json\|pdf\|svg\|txt\|webmanifest\|xml\)\)' \
|
find static_tmp -regex '\(.+/LICENSE\|.+\.\(atom\|css\|html\|ico\|js\|json\|pdf\|svg\|txt\|webmanifest\|xml\)\)' \
|
||||||
-exec zopfli {} \; -exec touch -r {} {}.gz \; \
|
-exec zopfli {} \; -exec touch -r {} {}.gz \; \
|
||||||
-exec brotli -k {} \;
|
-exec brotli -k {} \;
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
<link rel="stylesheet" href="/grapheneos.css?20"/>
|
<link rel="stylesheet" href="/grapheneos.css?20"/>
|
||||||
<link rel="manifest" href="/manifest.webmanifest"/>
|
<link rel="manifest" href="/manifest.webmanifest"/>
|
||||||
<link rel="canonical" href="https://grapheneos.org/releases"/>
|
<link rel="canonical" href="https://grapheneos.org/releases"/>
|
||||||
|
<link rel="alternate" type="application/atom+xml" href="/releases.atom"/>
|
||||||
<script type="module" src="/releases.js?13"></script>
|
<script type="module" src="/releases.js?13"></script>
|
||||||
<script type="module" src="/redirect.js?7"></script>
|
<script type="module" src="/redirect.js?7"></script>
|
||||||
</head>
|
</head>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user