summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSolderpunk <solderpunk@sdf.org>2020-07-07 14:00:18 +0200
committerSolderpunk <solderpunk@sdf.org>2020-07-07 14:00:18 +0200
commit2c58b4a576324753e67221ddb1e72e962990053b (patch)
treea4905627ac354fecc5370ddd46eb98dc1eb8b3da
parent91d6d075bc03768c59d16ebce4811a4e74f64f96 (diff)
Add --mtime option to use file modification time, not creation/update time, as that can be manually set via touch.
-rwxr-xr-xgemfeed.py28
1 files changed, 16 insertions, 12 deletions
diff --git a/gemfeed.py b/gemfeed.py
index 7143263..93d5886 100755
--- a/gemfeed.py
+++ b/gemfeed.py
@@ -50,7 +50,7 @@ def get_feed_title(directory):
return extract_first_heading(index_file, default)
return default
-def find_files(directory, n=10):
+def find_files(directory, time_func, n=10):
"""
Return the n most recently created world readable files with extensions of
.gmi or .gemini, as a list sorted from most to least recent.
@@ -63,7 +63,7 @@ def find_files(directory, n=10):
if index in files:
files.remove(index)
files = [f for f in files if is_world_readable(f)]
- files.sort(key=os.path.getctime, reverse=True)
+ files.sort(key=time_func, reverse=True)
return files[0:n]
def urljoin(base, url):
@@ -85,7 +85,7 @@ def urljoin(base, url):
joined = joined._replace(scheme="gemini")
return urllib.parse.urlunsplit(joined)
-def populate_entry_from_file(filename, base_url, entry):
+def populate_entry_from_file(filename, base_url, entry, time_func):
"""
Set the id, title, updated and link attributes of the provided
FeedGenerator entry object according the contents of the named
@@ -94,13 +94,13 @@ def populate_entry_from_file(filename, base_url, entry):
url = urljoin(base_url, os.path.basename(filename))
entry.guid(url)
entry.link(href=url, rel="alternate")
- updated = get_update_time(filename)
+ updated = get_update_time(filename, time_func)
entry.updated(updated)
default_title = os.path.splitext(os.path.basename(filename))[0]
title = extract_first_heading(filename, default_title)
entry.title(title)
-def get_update_time(filename):
+def get_update_time(filename, time_func):
"""
Return an update time for a Gemini file.
@@ -115,11 +115,11 @@ def get_update_time(filename):
date = basename[0:10] + " Z" # Add UTC marker
return datetime.datetime.strptime(date, "%Y-%m-%d %z")
else:
- updated = os.path.getctime(filename)
+ updated = time_func(filename)
return datetime.datetime.fromtimestamp(updated, tz=datetime.timezone.utc)
-def build_feed(directory, base_url, output="atom.xml", n=10, title="",
- subtitle="", author="", email="", verbose=False):
+def build_feed(directory, time_func, base_url, output="atom.xml", n=10,
+ title="", subtitle="", author="", email="", verbose=False):
"""
Build an Atom feed for all world readable Gemini files in the current
directory, and write it to atom.xml.
@@ -150,14 +150,14 @@ def build_feed(directory, base_url, output="atom.xml", n=10, title="",
feed.link(href=base_url, rel='alternate')
# Add one entry per .gmi file
- files = find_files(directory, n)
+ files = find_files(directory, time_func, n)
if not files:
if verbose:
print("No world-readable Gemini content found! :(")
return
for n, filename in enumerate(files):
entry = feed.add_entry()
- populate_entry_from_file(filename, base_url, entry)
+ populate_entry_from_file(filename, base_url, entry, time_func)
if n == 0:
feed.updated(entry.updated())
if verbose:
@@ -199,6 +199,8 @@ def main():
help='feed subtitle')
parser.add_argument('-t', '--title', dest='title', type=str,
help='feed title')
+ parser.add_argument('--mtime', action="store_true",
+ help='Use file modification time, not file update time, in feeds')
args = parser.parse_args()
# Normalise base URL
@@ -212,8 +214,10 @@ def main():
args.base_url += "/"
# Build the feed
- build_feed(args.directory, args.base_url, args.output, args.n, args.title,
- args.subtitle, args.author, args.email, args.verbose)
+ time_function = os.path.getmtime if args.mtime else os.path.getctime
+ build_feed(args.directory, time_function, args.base_url, args.output,
+ args.n, args.title, args.subtitle, args.author, args.email,
+ args.verbose)
if __name__ == "__main__":
main()