podflow 20250130.3__py3-none-any.whl → 20250212__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Podflow/__init__.py CHANGED
@@ -19,6 +19,7 @@ default_config = {
19
19
  "token": "", # token认证, 如为null或""将不启用token
20
20
  "delete_incompletement": False, # 是否删除下载中断媒体(下载前处理流程)
21
21
  "remove_media": True, # 是否删除无用的媒体文件
22
+ "upload": False, # 是否将长期媒体进行上传
22
23
  "channelid_youtube": { # Youtube频道列表
23
24
  "youtube": {
24
25
  "update_size": 15, # 每次获取频道媒体数量
@@ -100,9 +101,7 @@ class Application_gVar:
100
101
  self.channelid_bilibili_ids_update = {} # 需更新的哔哩哔哩频道字典
101
102
  self.bilibili_content_bvid_update = {} # 需下载哔哩哔哩视频字典
102
103
  self.channelid_bilibili_rss = {} # 哔哩哔哩频道最新Rss Response字典
103
- self.bilibili_content_bvid_backward_update = (
104
- {}
105
- ) # 向后更新需下载哔哩哔哩视频字典
104
+ self.bilibili_content_bvid_backward_update = {} # 向后更新需下载哔哩哔哩视频字典
106
105
  self.video_id_failed = [] # YouTube&哔哩哔哩视频下载失败列表
107
106
  self.video_id_update_format = {} # YouTube和哔哩哔哩视频下载的详细信息字典
108
107
  self.hash_rss_original = "" # 原始rss哈希值文本
@@ -115,6 +114,8 @@ class Application_gVar:
115
114
  self.overall_rss = "" # 更新后的rss文本
116
115
  self.make_up_file_format = {} # 补全缺失媒体字典
117
116
  self.make_up_file_format_fail = {} # 补全缺失媒体失败字典
117
+
118
+ self.upload_original = {} # 原始上传信息字典
118
119
 
119
120
  self.shortcuts_url = {} # 输出至shortcut的url字典
120
121
 
Podflow/bilibili/build.py CHANGED
@@ -144,9 +144,9 @@ def bilibili_xml_items(output_dir):
144
144
  )
145
145
  if item["description"] and item["description"][0] == "『":
146
146
  original_judgment = False
147
- entry_num += 1
148
- if entry_num >= channelid_bilibili_value["update_size"]:
149
- break
147
+ entry_num += 1
148
+ if entry_num >= channelid_bilibili_value["update_size"]:
149
+ break
150
150
  items_guid = re.findall(r"(?<=<guid>).+?(?=</guid>)", "".join(items_list))
151
151
  # 存量接入
152
152
  entry_count = channelid_bilibili_value["last_size"] - len(items_guid)
@@ -6,8 +6,8 @@ from Podflow.config.get_config import get_config
6
6
  from Podflow.basic.folder_build import folder_build
7
7
  from Podflow.config.get_channelid import get_channelid
8
8
  from Podflow.config.correct_config import correct_config
9
- from Podflow.config.correct_channelid import correct_channelid
10
9
  from Podflow.config.get_channelid_id import get_channelid_id
10
+ from Podflow.config.correct_channelid import correct_channelid
11
11
 
12
12
 
13
13
  def build_original():
@@ -101,3 +101,8 @@ def correct_config():
101
101
  config["remove_media"], bool
102
102
  ):
103
103
  config["remove_media"] = default_config["remove_media"]
104
+ # 对upload进行纠正
105
+ if "upload" not in config or not isinstance(
106
+ config["upload"], bool
107
+ ):
108
+ config["upload"] = default_config["upload"]
@@ -75,9 +75,11 @@ class bottle_app:
75
75
  if flag_judgment:
76
76
  gVar.server_process_print_flag[0] = "keep"
77
77
  if (
78
- gVar.server_process_print_flag[0] == "keep" and self.bottle_print
78
+ gVar.server_process_print_flag[0] == "keep"
79
+ and self.bottle_print
79
80
  ): # 如果设置为保持输出, 则打印日志
80
- print("\n".join(self.bottle_print))
81
+ for info_print in self.bottle_print:
82
+ print(info_print)
81
83
  self.bottle_print.clear()
82
84
 
83
85
  # 主路由处理根路径请求
Podflow/main.py CHANGED
@@ -58,12 +58,17 @@ from Podflow.remove.remove_dir import remove_dir
58
58
  # 处理 YouTube 信息模块
59
59
  from Podflow.youtube.build import get_youtube_introduction
60
60
 
61
+ # 长期媒体进行上传模块
62
+ from Podflow.upload.get_upload_original import get_upload_original
63
+
61
64
 
62
65
  def main():
63
66
  # 获取传入的参数
64
67
  parse_arguments()
65
68
  # 开始运行
66
- print(f"{datetime.now().strftime('%H:%M:%S')}|Podflow|{version('Podflow')}开始运行.....")
69
+ print(
70
+ f"{datetime.now().strftime('%H:%M:%S')}|Podflow|{version('Podflow')}开始运行....."
71
+ )
67
72
  # 判断是否安装ffmpeg
68
73
  ffmpeg_judge()
69
74
  # 初始化
@@ -116,6 +121,12 @@ def main():
116
121
  gVar.xmls_original, gVar.hash_rss_original, gVar.xmls_original_fail = (
117
122
  get_original_rss()
118
123
  )
124
+ # 初始化原始上传信息
125
+ if gVar.config["upload"]:
126
+ if upload_original := get_upload_original():
127
+ gVar.upload_original = upload_original
128
+ else:
129
+ gVar.config["upload"] = False
119
130
  # 更新Youtube和哔哩哔哩频道xml
120
131
  update_youtube_bilibili_rss()
121
132
  # 判断是否有更新内容
@@ -135,7 +135,7 @@ error_reason = [
135
135
  "text",
136
136
  ],
137
137
  [
138
- r"Got error: HTTPSConnectionPool\(host='rr4---sn-.{8}\.googlevideo.com', port=443\): Read timed out\.",
138
+ r"Got error: HTTPSConnectionPool\(host='rr[0-9]---sn-.{8}\.googlevideo.com', port=443\): Read timed out\. \(read timeout=20\.0\)",
139
139
  "\033[31m响应超时\033[0m",
140
140
  "regexp",
141
141
  ],
@@ -144,6 +144,8 @@ error_reason = [
144
144
 
145
145
  # 失败信息初始化模块
146
146
  def fail_message_initialize(message_error, video_url):
147
+ if video_url[:2] == "BV":
148
+ video_url = video_url[:12]
147
149
  fail_message = (
148
150
  str(message_error)
149
151
  .replace("ERROR: ", "")
@@ -48,7 +48,9 @@ def get_original_rss():
48
48
  get_xmls_original = {}
49
49
  rss_original = ""
50
50
  # 如原始xml无对应的原频道items, 将尝试从对应频道的xml中获取
51
- for channelid_key in (gVar.channelid_youtube_ids | gVar.channelid_bilibili_ids).keys():
51
+ for channelid_key in (
52
+ gVar.channelid_youtube_ids | gVar.channelid_bilibili_ids
53
+ ).keys():
52
54
  if channelid_key not in get_xmls_original.keys():
53
55
  try:
54
56
  with open(
@@ -0,0 +1,2 @@
1
+ # Podflow/upload/__init__.py
2
+ # coding: utf-8
@@ -0,0 +1,105 @@
1
+ # Podflow/upload/get_upload_original.py
2
+ # coding: utf-8
3
+
4
+ import re
5
+ import json
6
+ from collections import Counter
7
+ from email.utils import parsedate_tz, mktime_tz
8
+ from Podflow import gVar
9
+ from Podflow.basic.file_save import file_save
10
+ from Podflow.basic.write_log import write_log
11
+
12
+
13
+ # 获取原始上传数据模块
14
+ def get_upload_original():
15
+ xmls_original = gVar.xmls_original
16
+ try:
17
+ # 尝试打开并读取 JSON 文件
18
+ with open("channel_data/upload.json", "r") as file:
19
+ upload_original = file.read() # 读取原始上传数据
20
+ upload_original = json.loads(
21
+ upload_original
22
+ ) # 将读取的字符串转换为 Python 对象(列表或字典)
23
+ except Exception:
24
+ # 如果读取或解析失败,将 upload_original 初始化为空列表
25
+ upload_original = []
26
+
27
+ # 如果 upload_original 不为空
28
+ if upload_original:
29
+ # 提取每个条目的 channel_id
30
+ channel_ids = [item.get("channel_id") for item in upload_original]
31
+
32
+ # 统计每个 channel_id 的出现次数
33
+ channelid_counts = Counter(channel_ids)
34
+
35
+ # 将出现次数转换为字典
36
+ age_counts = dict(channelid_counts)
37
+
38
+ # 统计 xmls_original 中每个键对应的 <guid> 标签内的元素数量
39
+ xmls_original_counts = {
40
+ key: len(re.findall(r"(?<=<guid>).+(?=</guid>)", value))
41
+ for key, value in xmls_original.items()
42
+ }
43
+
44
+ # 如果两个计数字典不相等,清空 upload_original
45
+ if age_counts != xmls_original_counts:
46
+ upload_original = []
47
+
48
+ # 如果 upload_original 仍然为空
49
+ if not upload_original:
50
+ # 遍历 xmls_original 的每个键值对
51
+ for xmls_original_key, xmls_original_value in xmls_original.items():
52
+ # 如果当前键在 channelid_youtube_ids 中
53
+ if xmls_original_key in gVar.channelid_youtube_ids:
54
+ # 使用正则表达式解析包含特定格式媒体ID的字符串
55
+ media = re.findall(
56
+ r"(?:/UC.{22}/)(.{11}\.m4a|.{11}\.mp4)(?=\"|\?)",
57
+ xmls_original_value,
58
+ )
59
+ # 如果当前键在 channelid_bilibili_ids 中
60
+ elif xmls_original_key in gVar.channelid_bilibili_ids:
61
+ media = re.findall(
62
+ r"(?:/[0-9]+/)(BV.{10}\.m4a|BV.{10}\.mp4|BV.{10}_p[0-9]+\.m4a|BV.{10}_p[0-9]+\.mp4|BV.{10}_[0-9]{9}\.m4a|BV.{10}_[0-9]{9}\.mp4)(?=\"|\?)",
63
+ xmls_original_value,
64
+ )
65
+ else:
66
+ media = []
67
+
68
+ # 查找每个上传条目的发布时间
69
+ upload_time = re.findall(
70
+ r"(?<=<pubDate>).+(?=</pubDate>)",
71
+ xmls_original_value,
72
+ )
73
+
74
+ # 将日期字符串列表转换为 Unix 时间戳列表
75
+ timestamps = [
76
+ mktime_tz(
77
+ parsedate_tz(date_string)
78
+ ) # 解析和转换每个日期字符串为 Unix 时间戳
79
+ for date_string in upload_time
80
+ if parsedate_tz(date_string) # 确保解析成功
81
+ ]
82
+
83
+ # 如果媒体和时间戳的数量不匹配,记录错误并清空 upload_original
84
+ if len(media) != len(timestamps):
85
+ write_log("获取原始上传内容失败") # 错误日志
86
+ upload_original.clear() # 清空 upload_original
87
+ break # 退出循环
88
+
89
+ # 如果数量匹配,则整合 media_id、channel_id 和上传时间到 upload_original 列表
90
+ upload_original += [
91
+ {
92
+ "media_id": key,
93
+ "channel_id": xmls_original_key,
94
+ "media_time": value,
95
+ "upload": False,
96
+ }
97
+ for value, key in zip(
98
+ timestamps, media
99
+ ) # 使用 zip() 将 media 和 timestamps 组合成对
100
+ ]
101
+
102
+ # 如果成功填充 upload_original
103
+ if upload_original:
104
+ file_save(upload_original, "upload.json", "channel_data") # 保存到文件
105
+ return upload_original
Podflow/youtube/build.py CHANGED
@@ -194,7 +194,6 @@ def youtube_xml_items(output_dir):
194
194
  guid, item, channelid_title, title_change, output_dir
195
195
  ):
196
196
  items_list.append(f"{xml_item_text}<!-- {output_dir} -->")
197
- entry_num += 1
198
197
  if (
199
198
  gVar.video_id_update_format[guid]["description"]
200
199
  and gVar.video_id_update_format[guid]["description"][0] == "『"
@@ -214,9 +213,9 @@ def youtube_xml_items(output_dir):
214
213
  items_list.append(
215
214
  f"{youtube_xml_item(entry, title_change)}<!-- {output_dir} -->"
216
215
  )
217
- entry_num += 1
218
216
  if re.search(r"(?<=<media:description>)『", entry):
219
217
  original_judgment = False
218
+ entry_num += 1
220
219
  if entry_num >= update_size:
221
220
  break
222
221
  items_guid = re.findall(r"(?<=<guid>).+?(?=</guid>)", "".join(items_list))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: podflow
3
- Version: 20250130.3
3
+ Version: 20250212
4
4
  Summary: A podcast server that includes YouTube and BiliBili
5
5
  Home-page: https://github.com/gruel-zxz/podflow
6
6
  Author: gruel_zxz
@@ -21,7 +21,7 @@ Requires-Dist: cherrypy>=18.10.0
21
21
  Requires-Dist: requests>=2.32.3
22
22
  Requires-Dist: pycryptodome>=3.21.0
23
23
  Requires-Dist: ffmpeg-python>=0.2.0
24
- Requires-Dist: BeautifulSoup4>=4.12.3
24
+ Requires-Dist: BeautifulSoup4>=4.13.3
25
25
 
26
26
  # Podflow
27
27
 
@@ -1,6 +1,6 @@
1
- Podflow/__init__.py,sha256=fkPG1o_2qAA_qeUgBPs9FPWc5-7p8WuQ-h2FqrgsZS4,6803
1
+ Podflow/__init__.py,sha256=lXlJ6btdmA-rtsJH7fH4gvaRobCe5woXRuD5PCtXMRM,6908
2
2
  Podflow/ffmpeg_judge.py,sha256=krttVs1PDot_0CDq5rmtUIpchiaiqtAkPYFQRLG6OQM,1275
3
- Podflow/main.py,sha256=wIpxvDoC62Feeig43GU8VmJ557MFJ1tsLAwP3llHdJo,9757
3
+ Podflow/main.py,sha256=k_rb5ssdHZIqkdb7GCPtsGALPQnM_gpGpxGtF3uDJsM,10120
4
4
  Podflow/parse_arguments.py,sha256=qa5228sralPV7s4JdB6UgS1ug66rBqckDvSOwjz2tIc,2171
5
5
  Podflow/basic/__init__.py,sha256=SyFA_F_0-zn1VejCL83IPeZx1k2HCiqNY-0l0bp1N88,44
6
6
  Podflow/basic/file_save.py,sha256=mstWM6njYtCpq2sa28JD_neClvVLcjJOrGlCXBjUnZs,696
@@ -17,14 +17,14 @@ Podflow/basic/time_stamp.py,sha256=vf0p6FIK2-ZN2p2sotbpf4dewQMy-Vior-aREYfT0Zc,1
17
17
  Podflow/basic/vary_replace.py,sha256=aecFDuAOvQjTpgtoSW5uDu8Tx_YTs4bCFF9imVFkfVY,211
18
18
  Podflow/basic/write_log.py,sha256=Sm6qzTSb1x6X2uQnnmVD4dU6BsY1PONxenwsWAdFxso,1358
19
19
  Podflow/bilibili/__init__.py,sha256=ekvpCzR4bg6ar73Gq0YWQcPXND4TEqP46pb9iLyke9g,47
20
- Podflow/bilibili/build.py,sha256=G-MhhURoTRmGNJGRySltraFsslIEDtJxhL93_DnqlfY,7948
20
+ Podflow/bilibili/build.py,sha256=Z62hEUDT0YB_NNR9rDpmvvOYrSOBR644Kvkdc05FGU0,7936
21
21
  Podflow/bilibili/get.py,sha256=PXPh_H8B_zP9dhqe6sA_QCeJcdnriBCpbF7mPq46xMw,20337
22
22
  Podflow/bilibili/login.py,sha256=aYKEj5re-JYXnA0aCOKUF9Cqwwd7FTOuAu_yvcaqdag,10944
23
23
  Podflow/config/__init__.py,sha256=BroaS1uvdLb00OQeJXc1i7QeuErD-U-2QjynQH5IDdE,45
24
- Podflow/config/build_original.py,sha256=wfHpze2Z-0IjKMqkA5nBz5gwM8zPnnMx7wtl4owYKAs,1809
24
+ Podflow/config/build_original.py,sha256=tZtsGUi1rG6DH6cxaiaVQPRtIl6U0-FqOdeho7CXl0s,1809
25
25
  Podflow/config/channge_icon.py,sha256=z2tFFiP7aZFiMP1RqXkrovWAxBOI77rTHKhuzzhFfn0,5653
26
26
  Podflow/config/correct_channelid.py,sha256=o88DH1RJVloeXHI2ZKP7vb-3VUqM2yQaaUWRq3V_rfg,9252
27
- Podflow/config/correct_config.py,sha256=DCN2TuuEmzwBYYMdFrI_uhaE_2Vs7eUj2J-fSA9MFiE,3791
27
+ Podflow/config/correct_config.py,sha256=faER2s7jBB7siX0b5XNoMgjnR88CddQK2Yl53xVdQSI,3958
28
28
  Podflow/config/get_channelid.py,sha256=3Eeh_GN1qUJGhNl5uVDUZHZpcY-fa16BtfwWpJ4Yyjg,641
29
29
  Podflow/config/get_channelid_id.py,sha256=JAZ1nf_AnfOa19j4PTEwN2aITojvAvDFQj56FOWH8g8,586
30
30
  Podflow/config/get_config.py,sha256=xM_C1Vk5EUAdPKwR7guPSo2IVR_QOZ-EFHfbmtMtm30,1326
@@ -36,7 +36,7 @@ Podflow/download/show_progress.py,sha256=7oGzhj_frO2A1o5JeGuHn7bHtma5oPpD_IWcctI
36
36
  Podflow/download/wait_animation.py,sha256=E2V3cm-10e5Iif40oU722OfzDe7YiLMbDqsjZ6dshBE,1056
37
37
  Podflow/download/youtube_and_bilibili_download.py,sha256=jt6CWb8ZJ-dyIom7fJ_K1qve9pSzoW0hNwfWnZiju7w,1228
38
38
  Podflow/httpfs/__init__.py,sha256=agnAtd2Xe0qfOrElKgoBattAVqUBdj79wU2e2UOpcJM,45
39
- Podflow/httpfs/app_bottle.py,sha256=s0UA7MqvhrAcI0IvhVoEGzZ7TwWgmZnt539TSSEWIzM,9286
39
+ Podflow/httpfs/app_bottle.py,sha256=B5rGSxSNFbrjZfmtH7GVYdHCNDZ0T_7Jxrh4_oM8-FU,9333
40
40
  Podflow/httpfs/port_judge.py,sha256=OSNyE-aWRFB8aPmv2LJugRSQdBkwoxrqv7_rEP7OFzM,565
41
41
  Podflow/makeup/__init__.py,sha256=HaBchKbUjRqqXSGCkMfEqLOyx3tlqB2htXvTDs59owI,45
42
42
  Podflow/makeup/del_makeup_yt_format_fail.py,sha256=j2QCpfL-UslUfVYBwBxlJnZdp6BMNLpS-D3zjGwTakc,638
@@ -47,9 +47,9 @@ Podflow/message/__init__.py,sha256=SC42QCYhGwCvzvBnxiBz6L1MN-l57WHbH7PIh-UyPdI,4
47
47
  Podflow/message/backup_zip_save.py,sha256=cU1oLO68INKSlmckYNCWmdZKu51T-HNuVFSHYzA9a-8,1740
48
48
  Podflow/message/create_main_rss.py,sha256=pbi5h0EOPLtX9rh9IUZ4QWdXQnQXNRPTE35XCUqiiqw,1773
49
49
  Podflow/message/display_qrcode_and_url.py,sha256=72DwF1H2-cmVxsRlTb93Othc-6fkgFWEVHl3djm3acE,1183
50
- Podflow/message/fail_message_initialize.py,sha256=prmi-aKI1QZgLqbd2mN7ogoFIQFf5zKotkAkOBvdSbg,6038
50
+ Podflow/message/fail_message_initialize.py,sha256=ilLoRBtHaDvcz9vZ3R57Ut1AknUOQxioR0mLWsLMFL0,6130
51
51
  Podflow/message/format_time.py,sha256=2Z7rPh3rrU68UoDO5fFF_ipV_SEmtotziBmBBl0mHdc,909
52
- Podflow/message/get_original_rss.py,sha256=CK_Q5enOzUafgL2l5OlXBpC08Nj_B7AKPzw5DomXLwA,2369
52
+ Podflow/message/get_original_rss.py,sha256=QRtpHEYeS9rDh4Cv_EkTIC89eSw0I6540ykrTT3yr-4,2383
53
53
  Podflow/message/get_video_format.py,sha256=RIX0fxuPYkoQPRWt-ulJPhfEWtMkyxwOEVqcuRsp4v8,4770
54
54
  Podflow/message/get_video_format_multithread.py,sha256=ZXzY9RwT59eOvP6Lmx-I07P3C1CWCl-4l_uw_pkozqE,1406
55
55
  Podflow/message/get_youtube_and_bilibili_video_format.py,sha256=RuaxL3JwZs3_Bqm77g9SIcyV8o-WJu_qOCWhEnD15WE,4321
@@ -69,12 +69,14 @@ Podflow/netscape/get_cookie_dict.py,sha256=ptT2H8ZwFseK8EmpH0jn-lhzh-KCciOOPwpAJ
69
69
  Podflow/remove/__init__.py,sha256=kns-jfTXH8lXh9OQ5E5-llsrAPlET5rl6RYpjoZKav8,45
70
70
  Podflow/remove/remove_dir.py,sha256=tah3LCD0bCcf5dDg3NrHuseaje3-31C5NLNupMg15TU,1099
71
71
  Podflow/remove/remove_file.py,sha256=R8Gr0d6bIAYKQ7YEfFl5_QJ_CcumTu_8XejP7xuRm2k,981
72
+ Podflow/upload/__init__.py,sha256=9uOIL8vr_vP_XYrhfZ4IDZmfSGyCf0_MpLOc-KnbpSY,45
73
+ Podflow/upload/get_upload_original.py,sha256=JLepP_0ROLexVNUV-Ji8r1kq81pACfJqdA4ewIgmujw,4194
72
74
  Podflow/youtube/__init__.py,sha256=-bdMyuw-wxoz2miVkp284amS4Qg0k7VN0JPuGF-cXlM,46
73
- Podflow/youtube/build.py,sha256=y1R5KI_R8ydYjjxZKvMtNaHUiyMm4iBa-MIEMbA92FY,11210
75
+ Podflow/youtube/build.py,sha256=010SwUpvtYrAOxZEWOqt70XByPpPrnZ0HQZOCD96Qhg,11171
74
76
  Podflow/youtube/get.py,sha256=dFLyiHttygqdJltwC29jD_v8wwoLynE5NUdow_0wERI,16970
75
77
  Podflow/youtube/login.py,sha256=DlS_ZG4g6CKWqS5ojE4UwFJSCSZDsXbeuDVgHtQAa4A,1380
76
- podflow-20250130.3.dist-info/METADATA,sha256=x0_wmiJMycxjmcYEGofzzcO9ME8MbY0cnH_U9adgkE8,13803
77
- podflow-20250130.3.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
78
- podflow-20250130.3.dist-info/entry_points.txt,sha256=44nj8jJB7bo1JLNrKQZmwMGEA1OalrALJ0tF_G0yXLY,131
79
- podflow-20250130.3.dist-info/top_level.txt,sha256=KcvRCiz_DRWWc9i-PgpARvFB0J4CKmpZOZgPqOdG-Lk,8
80
- podflow-20250130.3.dist-info/RECORD,,
78
+ podflow-20250212.dist-info/METADATA,sha256=ikAvsNny5lZfu8dkgprsW2R3uLKCyHxpqNwlPp2F6yo,13801
79
+ podflow-20250212.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
80
+ podflow-20250212.dist-info/entry_points.txt,sha256=44nj8jJB7bo1JLNrKQZmwMGEA1OalrALJ0tF_G0yXLY,131
81
+ podflow-20250212.dist-info/top_level.txt,sha256=KcvRCiz_DRWWc9i-PgpARvFB0J4CKmpZOZgPqOdG-Lk,8
82
+ podflow-20250212.dist-info/RECORD,,