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