main
1#!/venv/bin/python
2# -*- coding: utf-8 -*-
3import base64
4import string
5from datetime import UTC, datetime
6from zoneinfo import ZoneInfo
7
8from glom import Coalesce, glom
9from loguru import logger
10
11from config import DB, PODCAST, TZ
12from utils import bare_url, nowdt
13
14HEADERS = {
15 "User-Agent": "feedparser/6.0.11 +https://github.com/kurtmckee/feedparser/",
16 "Accept": "application/atom+xml,application/rdf+xml,application/rss+xml,application/x-netcdf,application/xml;q=0.9,text/xml;q=0.2,*/*;q=0.1",
17}
18
19
20def clean_feed_url(url: str) -> str:
21 if not url:
22 return ""
23 return url.removesuffix("?utm_source=rss")
24
25
26def feed_saved_target(feed_url: str) -> str:
27 # encode url if needed
28 key = bare_url(feed_url)
29 if any(c not in string.ascii_letters + string.digits + "-._=" for c in key):
30 key = base64.urlsafe_b64encode(feed_url.encode()).decode().rstrip("=")[-60:] + ".xml"
31 if PODCAST.FS_ENGINE == "CF-R2":
32 return DB.CF_R2_PUBLIC_URL.rstrip("/") + f"/Podcast/feeds/{key}"
33 if PODCAST.FS_ENGINE == "alist":
34 return DB.ALIST_SERVER.rstrip("/") + "/d/" + DB.ALIST_BASR_PATH.strip("/") + "/" + key
35 logger.error("Unknown PODCAST_FS_ENGINE: " + PODCAST.FS_ENGINE)
36 return feed_url
37
38
39def get_pubdate(entry: dict) -> datetime:
40 struct_time = glom(entry, Coalesce("published_parsed", "updated_parsed", "feed.published_parsed", "feed.updated_parsed"), default=nowdt().timetuple())
41 return datetime(*struct_time[:6], tzinfo=UTC).astimezone(ZoneInfo(TZ))