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 "Accept": "*/*",
16 "Accept-Language": "zh-CN,zh-Hans;q=0.9",
17 "Accept-Encoding": "gzip, deflate, br",
18 "User-Agent": "Podcasts/4025.610.1 CFNetwork/3860.600.12 Darwin/25.5.0",
19}
20
21
22def clean_feed_url(url: str) -> str:
23 if not url:
24 return ""
25 return url.removesuffix("?utm_source=rss")
26
27
28def feed_saved_target(feed_url: str) -> str:
29 # encode url if needed
30 key = bare_url(feed_url)
31 if any(c not in string.ascii_letters + string.digits + "-._=" for c in key):
32 key = base64.urlsafe_b64encode(feed_url.encode()).decode().rstrip("=")[-60:] + ".xml"
33 if PODCAST.FS_ENGINE == "CF-R2":
34 return DB.CF_R2_PUBLIC_URL.rstrip("/") + f"/Podcast/feeds/{key}"
35 if PODCAST.FS_ENGINE == "alist":
36 return DB.ALIST_SERVER.rstrip("/") + "/d/" + DB.ALIST_BASR_PATH.strip("/") + "/" + key
37 logger.error("Unknown PODCAST_FS_ENGINE: " + PODCAST.FS_ENGINE)
38 return feed_url
39
40
41def get_pubdate(entry: dict) -> datetime:
42 struct_time = glom(entry, Coalesce("published_parsed", "updated_parsed", "feed.published_parsed", "feed.updated_parsed"), default=nowdt().timetuple())
43 return datetime(*struct_time[:6], tzinfo=UTC).astimezone(ZoneInfo(TZ))