Add --mtime option to use file modification time, not creation/update time, as that can be manually set via touch.

This commit is contained in:
Solderpunk 2020-07-07 14:00:18 +02:00
parent 91d6d075bc
commit 2c58b4a576
1 changed files with 16 additions and 12 deletions

View File

@ -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()