podflow 20250415.2__py3-none-any.whl → 20250417.1__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
@@ -125,7 +125,7 @@ class Application_gVar:
125
125
  "podflow": [], # 主窗口信息列表
126
126
  "http": [], # httpfs窗口信息列表
127
127
  "enter": True, # 是否换行
128
- "schedule": [], # 进度条信息列表
128
+ "schedule": [0, "准备中"], # 进度条信息列表
129
129
  }
130
130
 
131
131
 
podflow/bilibili/build.py CHANGED
@@ -6,11 +6,10 @@ import html
6
6
  import contextlib
7
7
  from datetime import datetime, timezone
8
8
  from podflow import gVar
9
- from podflow.message.xml_rss import xml_rss
10
- from podflow.basic.file_save import file_save
11
9
  from podflow.message.xml_item import xml_item
12
10
  from podflow.bilibili.get import get_bilibili_cid
13
11
  from podflow.message.format_time import format_time
12
+ from podflow.httpfs.progress_bar import progress_bar
14
13
  from podflow.basic.get_file_list import get_file_list
15
14
  from podflow.message.xml_original_item import xml_original_item
16
15
 
@@ -23,6 +22,7 @@ def get_items_list(
23
22
  items_counts,
24
23
  output_dir,
25
24
  items_list,
25
+ ratio_part,
26
26
  ):
27
27
  pubDate = datetime.fromtimestamp(item["created"], timezone.utc).strftime(
28
28
  "%Y-%m-%dT%H:%M:%S%z"
@@ -63,6 +63,7 @@ def get_items_list(
63
63
  title_change,
64
64
  )
65
65
  items_list.append(f"{xml_item_text}<!-- {output_dir} -->")
66
+ progress_bar(ratio_part[0], ratio_part[1])
66
67
  elif guid_edgeinfos and items_counts[guid] == len(guid_edgeinfos):
67
68
  cid_edgeinfos = {
68
69
  guid_edgeinfo["cid"]: guid_edgeinfo["title"]
@@ -100,6 +101,7 @@ def get_items_list(
100
101
  title_change,
101
102
  )
102
103
  items_list.append(f"{xml_item_text}<!-- {output_dir} -->")
104
+ progress_bar(ratio_part[0], ratio_part[1])
103
105
  else:
104
106
  xml_item_text = xml_item(
105
107
  item["bvid"],
@@ -113,10 +115,11 @@ def get_items_list(
113
115
  title_change,
114
116
  )
115
117
  items_list.append(f"{xml_item_text}<!-- {output_dir} -->")
118
+ progress_bar(ratio_part[0], ratio_part[1])
116
119
 
117
120
 
118
121
  # 生成哔哩哔哩对应channel的需更新的items模块
119
- def bilibili_xml_items(output_dir):
122
+ def bilibili_xml_items(output_dir, ratio_part):
120
123
  channelid_bilibili_value = gVar.channelid_bilibili[
121
124
  gVar.channelid_bilibili_ids[output_dir]
122
125
  ]
@@ -141,6 +144,7 @@ def bilibili_xml_items(output_dir):
141
144
  items_counts,
142
145
  output_dir,
143
146
  items_list,
147
+ ratio_part,
144
148
  )
145
149
  if item["description"] and item["description"][0] == "『":
146
150
  original_judgment = False
@@ -162,6 +166,7 @@ def bilibili_xml_items(output_dir):
162
166
  items_list.append(
163
167
  f"{xml_original_item(xml, channelid_title, original_judgment, title_change)}<!-- {output_dir} -->"
164
168
  )
169
+ progress_bar(ratio_part[0], ratio_part[1])
165
170
  xml_num += 1
166
171
  if xml_num >= entry_count:
167
172
  break
@@ -182,6 +187,7 @@ def bilibili_xml_items(output_dir):
182
187
  items_counts,
183
188
  output_dir,
184
189
  items_list,
190
+ ratio_part,
185
191
  )
186
192
  # 生成对应xml
187
193
  description = html.escape(output_dir_value["content"]["sign"])
podflow/bilibili/get.py CHANGED
@@ -12,6 +12,7 @@ from hashlib import md5
12
12
  from functools import reduce
13
13
  from podflow import gVar
14
14
  from podflow.basic.http_client import http_client
15
+ from podflow.httpfs.progress_bar import progress_bar
15
16
  from podflow.basic.get_file_list import get_file_list
16
17
  from podflow.basic.list_merge_tidy import list_merge_tidy
17
18
 
@@ -19,10 +20,70 @@ from podflow.basic.list_merge_tidy import list_merge_tidy
19
20
  # WBI签名模块
20
21
  def WBI_signature(params={}, img_key="", sub_key=""):
21
22
  mixinKeyEncTab = [
22
- 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,
23
- 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,
24
- 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11,
25
- 36, 20, 34, 44, 52,
23
+ 46,
24
+ 47,
25
+ 18,
26
+ 2,
27
+ 53,
28
+ 8,
29
+ 23,
30
+ 32,
31
+ 15,
32
+ 50,
33
+ 10,
34
+ 31,
35
+ 58,
36
+ 3,
37
+ 45,
38
+ 35,
39
+ 27,
40
+ 43,
41
+ 5,
42
+ 49,
43
+ 33,
44
+ 9,
45
+ 42,
46
+ 19,
47
+ 29,
48
+ 28,
49
+ 14,
50
+ 39,
51
+ 12,
52
+ 38,
53
+ 41,
54
+ 13,
55
+ 37,
56
+ 48,
57
+ 7,
58
+ 16,
59
+ 24,
60
+ 55,
61
+ 40,
62
+ 61,
63
+ 26,
64
+ 17,
65
+ 0,
66
+ 1,
67
+ 60,
68
+ 51,
69
+ 30,
70
+ 4,
71
+ 22,
72
+ 25,
73
+ 54,
74
+ 21,
75
+ 56,
76
+ 59,
77
+ 6,
78
+ 63,
79
+ 57,
80
+ 62,
81
+ 11,
82
+ 36,
83
+ 20,
84
+ 34,
85
+ 44,
86
+ 52,
26
87
  ]
27
88
 
28
89
  def getMixinKey(orig: str):
@@ -302,7 +363,9 @@ def bilibili_json_update(bilibili_key, bilibili_value):
302
363
  else:
303
364
  return bilibili_card_json["code"]
304
365
  # 查询哔哩哔哩用户投稿视频明细
305
- for num in range(math.ceil(gVar.channelid_bilibili[bilibili_value]["update_size"] / 25)):
366
+ for num in range(
367
+ math.ceil(gVar.channelid_bilibili[bilibili_value]["update_size"] / 25)
368
+ ):
306
369
  num += 1
307
370
  bilibili_entry, bilibili_list = get_bilibili_vlist(
308
371
  bilibili_key,
@@ -325,6 +388,7 @@ def bilibili_rss_update(
325
388
  rss_update_lock,
326
389
  ):
327
390
  bilibili_content_bvid_backward = [] # 初始化向后更新的内容列表
391
+ last_size = gVar.channelid_bilibili[bilibili_value]["last_size"]
328
392
  # 获取已下载文件列表
329
393
  bilibili_content_bvid_original = get_file_list(
330
394
  bilibili_key, gVar.channelid_bilibili[bilibili_value]["media"]
@@ -358,13 +422,13 @@ def bilibili_rss_update(
358
422
  "content": bilibili_space,
359
423
  "type": "int",
360
424
  } # 设置为整型内容
361
- gVar.xmls_quantity[bilibili_key]["update"] = 0
425
+ bilibili_space_new = guids
362
426
  elif bilibili_space is None:
363
427
  gVar.channelid_bilibili_rss[bilibili_key] = {
364
428
  "content": bilibili_space_original,
365
429
  "type": "json",
366
430
  } # 使用原始json内容
367
- gVar.xmls_quantity[bilibili_key]["update"] = 0
431
+ bilibili_space_new = guids
368
432
  else:
369
433
  gVar.channelid_bilibili_rss[bilibili_key] = {
370
434
  "content": bilibili_space,
@@ -377,7 +441,6 @@ def bilibili_rss_update(
377
441
  bilibili_content_bvid = bilibili_space["list"][
378
442
  : gVar.channelid_bilibili[bilibili_value]["update_size"]
379
443
  ]
380
- gVar.xmls_quantity[bilibili_key]["update"] = len(bilibili_content_bvid)
381
444
  bilibili_space_new = list_merge_tidy(
382
445
  bilibili_content_bvid, guids
383
446
  ) # 合并新内容和原内容
@@ -387,7 +450,9 @@ def bilibili_rss_update(
387
450
  for exclude in bilibili_content_bvid
388
451
  if exclude not in bilibili_content_bvid_original # 筛选新增的内容
389
452
  ]:
390
- gVar.channelid_bilibili_ids_update[bilibili_key] = bilibili_value # 需要更新ID
453
+ gVar.channelid_bilibili_ids_update[bilibili_key] = (
454
+ bilibili_value # 需要更新ID
455
+ )
391
456
  gVar.bilibili_content_bvid_update[bilibili_key] = (
392
457
  bilibili_content_bvid # 更新新增内容
393
458
  )
@@ -395,9 +460,9 @@ def bilibili_rss_update(
395
460
  if (
396
461
  gVar.channelid_bilibili[bilibili_value]["BackwardUpdate"] and guids
397
462
  ): # 如果设置了向后更新
398
- backward_update_size = gVar.channelid_bilibili[bilibili_value][
399
- "last_size"
400
- ] - len(bilibili_space_new) # 计算需要向后更新的数量
463
+ backward_update_size = last_size - len(
464
+ bilibili_space_new
465
+ ) # 计算需要向后更新的数量
401
466
  if backward_update_size > 0:
402
467
  backward_update_size = min(
403
468
  backward_update_size,
@@ -483,10 +548,9 @@ def bilibili_rss_update(
483
548
  gVar.bilibili_content_bvid_backward_update[bilibili_key] = (
484
549
  bilibili_content_bvid_backward # 更新最终的向后更新内容
485
550
  )
486
- gVar.xmls_quantity[bilibili_key]["backward"] = len(bilibili_content_bvid_backward)
551
+ gVar.xmls_quantity[bilibili_key] = min(last_size, len(bilibili_space_new)) + len(
552
+ bilibili_content_bvid_backward
553
+ )
487
554
  # 更新进度条
488
555
  with rss_update_lock:
489
- ratio = gVar.index_message["schedule"][1] + ratio_thread
490
- if ratio > 0.09:
491
- ratio = 0.09
492
- gVar.index_message["schedule"][1] = ratio
556
+ progress_bar(ratio_thread, 0.09)
@@ -0,0 +1,32 @@
1
+ # podflow/httpfs/progress_bar.py
2
+ # coding: utf-8
3
+
4
+ import random
5
+ from podflow import gVar
6
+
7
+
8
+ def progress_update(
9
+ ratio,
10
+ added=False,
11
+ refresh=0,
12
+ num=0
13
+ ):
14
+ state = {
15
+ 1: "准备中",
16
+ 2: "构建中",
17
+ 3: "已完成",
18
+ }
19
+ if num != 0:
20
+ ratio +=random.uniform(0, num)
21
+ if added:
22
+ ratio += gVar.index_message["schedule"][1]
23
+ gVar.index_message["schedule"][1] = ratio
24
+ if refresh != 0:
25
+ gVar.index_message["schedule"][0] = state[refresh]
26
+
27
+
28
+ def progress_bar(ratio_part, maximum):
29
+ ratio = gVar.index_message["schedule"][1] + ratio_part
30
+ if ratio > maximum:
31
+ ratio = maximum
32
+ progress_update(ratio)
podflow/main_podcast.py CHANGED
@@ -4,7 +4,6 @@
4
4
  import sys
5
5
  import json
6
6
  import time
7
- import random
8
7
  import urllib
9
8
  import subprocess
10
9
 
@@ -18,6 +17,7 @@ from podflow.basic.time_print import time_print
18
17
  # 网络和 HTTP 模块
19
18
  from podflow.httpfs.browser import open_url
20
19
  from podflow.httpfs.port_judge import port_judge
20
+ from podflow.httpfs.progress_bar import progress_update
21
21
  from podflow.httpfs.app_bottle import bottle_app_instance
22
22
 
23
23
  # 下载和视频处理模块
@@ -49,8 +49,8 @@ from podflow.makeup.del_makeup_format_fail import del_makeup_format_fail
49
49
  from podflow.makeup.make_up_file_format_mod import make_up_file_format_mod
50
50
 
51
51
  # 移除模块
52
- from podflow.remove.remove_file import remove_file
53
52
  from podflow.remove.remove_dir import remove_dir
53
+ from podflow.remove.remove_file import remove_file
54
54
 
55
55
  # 处理 YouTube 信息模块
56
56
  from podflow.youtube.build import print_fail_youtube
@@ -109,32 +109,27 @@ def main_podcast():
109
109
  # 主流程
110
110
  while parse.update_num > 0 or parse.update_num == -1: # 循环主更新
111
111
  # 主进度条
112
- gVar.index_message["schedule"] = ["准备中", 0]
112
+ progress_update(0, refresh=1)
113
113
  # 暂停进程打印
114
114
  gVar.server_process_print_flag[0] = "pause"
115
115
  # 获取YouTube cookie
116
116
  gVar.youtube_cookie = get_youtube_cookie(gVar.channelid_youtube_ids_original)
117
- gVar.index_message["schedule"][1] = 0.01 + random.uniform(0, 0.0049)
117
+ progress_update(0.01 ,num=0.0049)
118
118
  # 更新哔哩哔哩data
119
119
  gVar.channelid_bilibili_ids, gVar.bilibili_data = get_bilibili_data(
120
120
  gVar.channelid_bilibili_ids_original
121
121
  )
122
- gVar.index_message["schedule"][1] = 0.02 + random.uniform(0, 0.0049)
122
+ progress_update(0.02, num=0.0049)
123
123
  # 恢复进程打印
124
124
  bottle_app_instance.cherry_print()
125
125
  # 获取原始xml字典和rss文本
126
- (
127
- gVar.xmls_original,
128
- gVar.hash_rss_original,
129
- gVar.xmls_original_fail,
130
- gVar.xmls_quantity,
131
- ) = get_original_rss()
132
- gVar.index_message["schedule"][1] = 0.025 + random.uniform(0, 0.0024)
126
+ gVar.xmls_original, gVar.hash_rss_original, gVar.xmls_original_fail = get_original_rss()
127
+ progress_update(0.025, num=-0.0024)
133
128
  # 暂停进程打印
134
129
  gVar.server_process_print_flag[0] = "pause"
135
130
  # 连接上传服务器
136
131
  upload_url = connect_upload_server()
137
- gVar.index_message["schedule"][1] = 0.03 + random.uniform(0, 0.0024)
132
+ progress_update(0.03, num=0.0024)
138
133
  # 恢复进程打印
139
134
  bottle_app_instance.cherry_print()
140
135
  # 登陆上传服务器
@@ -144,20 +139,20 @@ def main_podcast():
144
139
  gVar.config["upload"] = False
145
140
  else:
146
141
  gVar.config["upload"] = False
147
- gVar.index_message["schedule"][1] = 0.035 + random.uniform(0, 0.0024)
142
+ progress_update(0.035, num=0.0024)
148
143
  # 初始化原始上传信息
149
144
  get_upload_original()
150
- gVar.index_message["schedule"][1] = 0.04
145
+ progress_update(0.04)
151
146
  # 更新Youtube和哔哩哔哩频道xml
152
147
  update_youtube_bilibili_rss()
153
- gVar.index_message["schedule"][1] = 0.1
148
+ progress_update(0.1)
154
149
  # 判断是否有更新内容
155
150
  if gVar.channelid_youtube_ids_update or gVar.channelid_bilibili_ids_update:
156
151
  gVar.update_generate_rss = True
157
152
  if gVar.update_generate_rss:
158
153
  # 根据日出日落修改封面(只适用原封面)
159
154
  channge_icon()
160
- gVar.index_message["schedule"][1] = 0.11 + random.uniform(0, 0.0049)
155
+ progress_update(0.11, num=0.0049)
161
156
  # 输出需要更新的信息
162
157
  update_information_display(
163
158
  gVar.channelid_youtube_ids_update,
@@ -171,12 +166,12 @@ def main_podcast():
171
166
  gVar.bilibili_content_bvid_backward_update,
172
167
  "BiliBili",
173
168
  )
174
- gVar.index_message["schedule"][1] = 0.12
169
+ progress_update(0.12)
175
170
  # 暂停进程打印
176
171
  gVar.server_process_print_flag[0] = "pause"
177
172
  # 获取视频格式信息
178
173
  get_video_format()
179
- gVar.index_message["schedule"][1] = 0.199
174
+ progress_update(0.199)
180
175
  # 恢复进程打印
181
176
  bottle_app_instance.cherry_print()
182
177
  # 优化下载顺序
@@ -184,63 +179,63 @@ def main_podcast():
184
179
  # 删除中断下载的媒体文件
185
180
  if gVar.config["delete_incompletement"]:
186
181
  delete_part(gVar.channelid_youtube_ids | gVar.channelid_bilibili_ids)
187
- gVar.index_message["schedule"] = ["构建中", 0.20]
182
+ progress_update(0.20, refresh=2)
188
183
  # 暂停进程打印
189
184
  gVar.server_process_print_flag[0] = "pause"
190
185
  # 下载并构建YouTube和哔哩哔哩视频
191
186
  download_and_build()
192
- gVar.index_message["schedule"][1] = 0.8
187
+ progress_update(0.8)
193
188
  # 添加新媒体至上传列表
194
189
  add_upload()
195
- gVar.index_message["schedule"][1] = 0.81 + random.uniform(0, 0.0049)
190
+ progress_update(0.81, num=0.0049)
196
191
  # 恢复进程打印
197
192
  bottle_app_instance.cherry_print()
198
193
  # 打印无法保留原节目信息
199
194
  original_rss_fail_print(gVar.xmls_original_fail)
200
- gVar.index_message["schedule"][1] = 0.82 + random.uniform(0, 0.0049)
195
+ progress_update(0.82, num=0.0049)
201
196
  # 打印无法获取youtube信息
202
197
  print_fail_youtube()
203
- gVar.index_message["schedule"][1] = 0.83 + random.uniform(0, 0.0049)
198
+ progress_update(0.83, num=0.0049)
204
199
  if gVar.config["remove_media"]:
205
200
  # 删除不在rss中的媒体文件
206
201
  remove_file()
207
202
  # 删除已抛弃的媒体文件夹
208
203
  remove_dir()
209
- gVar.index_message["schedule"][1] = 0.84
204
+ progress_update(0.84)
210
205
  # 补全缺失媒体文件到字典
211
206
  make_up_file()
212
- gVar.index_message["schedule"][1] = 0.85
207
+ progress_update(0.85)
213
208
  # 按参数获取需要补全的最大个数
214
209
  gVar.make_up_file_format = split_dict(
215
210
  gVar.make_up_file_format,
216
211
  gVar.config["completion_count"],
217
212
  True,
218
213
  )[0]
219
- gVar.index_message["schedule"][1] = 0.86 + random.uniform(0, 0.0049)
214
+ progress_update(0.86, num=0.0049)
220
215
  # 暂停进程打印
221
216
  gVar.server_process_print_flag[0] = "pause"
222
217
  # 补全在rss中缺失的媒体格式信息
223
218
  make_up_file_format_mod()
224
- gVar.index_message["schedule"][1] = 0.90 + random.uniform(0, 0.0049)
219
+ progress_update(0.90, num=0.0049)
225
220
  # 恢复进程打印
226
221
  bottle_app_instance.cherry_print()
227
- gVar.index_message["schedule"][1] = 0.91 + random.uniform(0, 0.0049)
222
+ progress_update(0.91, num=0.0049)
228
223
  # 删除无法补全的媒体
229
224
  del_makeup_format_fail()
230
- gVar.index_message["schedule"][1] = 0.92 + random.uniform(0, 0.0049)
225
+ progress_update(0.92, num=0.0049)
231
226
  # 暂停进程打印
232
227
  gVar.server_process_print_flag[0] = "pause"
233
228
  # 保存rss文件模块
234
229
  save_rss()
235
- gVar.index_message["schedule"][1] = 0.93 + random.uniform(0, 0.0049)
230
+ progress_update(0.93, num=0.0049)
236
231
  # 下载补全Youtube和哔哩哔哩视频模块
237
232
  make_up_file_mod()
238
- gVar.index_message["schedule"][1] = 0.99 + random.uniform(0, 0.0099)
233
+ progress_update(0.99, num=0.0099)
239
234
  # 恢复进程打印
240
235
  bottle_app_instance.cherry_print()
241
236
  # 更新并保存上传列表
242
237
  update_upload()
243
- gVar.index_message["schedule"] = ["已完成", 1]
238
+ progress_update(1, refresh=3)
244
239
  else:
245
240
  time_print("频道无更新内容")
246
241
  # 清空变量内数据
@@ -3,6 +3,7 @@
3
3
 
4
4
  import os
5
5
  from podflow import gVar
6
+ from podflow.httpfs.progress_bar import progress_bar
6
7
 
7
8
 
8
9
  # 补全缺失媒体文件到字典模块
@@ -36,8 +37,7 @@ def make_up_file():
36
37
  video_id_format["quality"] = video_quality
37
38
  gVar.make_up_file_format[main] = video_id_format
38
39
  # 更新进度条
39
- ratio = gVar.index_message["schedule"][1] + ratio_part
40
- gVar.index_message["schedule"][1] = ratio
40
+ progress_bar(ratio_part, 0.85)
41
41
 
42
42
  for output_dir, name in channelid_bilibili_ids.items():
43
43
  bilibili_os_list = os.listdir(f"channel_audiovisual/{output_dir}")
@@ -61,7 +61,4 @@ def make_up_file():
61
61
  video_id_format["quality"] = video_quality
62
62
  gVar.make_up_file_format[main] = video_id_format
63
63
  # 更新进度条
64
- ratio = gVar.index_message["schedule"][1] + ratio_part
65
- if ratio > 0.85:
66
- ratio = 0.85
67
- gVar.index_message["schedule"][1] = ratio
64
+ progress_bar(ratio_part, 0.85)
@@ -29,7 +29,7 @@ def create_main_rss():
29
29
  }
30
30
  all_channelid = list(gVar.all_items.keys())
31
31
 
32
- ratio_part = 0.6 / len(all_channelid) if all_channelid else 0
32
+ ratio_part = 0.6 / sum(gVar.xmls_quantity.values()) if all_channelid else 0
33
33
 
34
34
  while all_channelid:
35
35
  for index, output_dir in enumerate(all_channelid):
@@ -39,7 +39,7 @@ def create_main_rss():
39
39
  if output_dir in channelid_youtube_ids:
40
40
  output_dir_youtube = channelid_youtube_ids[output_dir]
41
41
  channelid_youtube_value = gVar.channelid_youtube[output_dir_youtube]
42
- items = youtube_xml_items(output_dir)
42
+ items = youtube_xml_items(output_dir, [ratio_part, 0.8])
43
43
  items["DisplayRSSaddress"] = channelid_youtube_value[
44
44
  "DisplayRSSaddress"
45
45
  ]
@@ -56,7 +56,7 @@ def create_main_rss():
56
56
  channelid_bilibili_value = gVar.channelid_bilibili[
57
57
  output_dir_bilibili
58
58
  ]
59
- items = bilibili_xml_items(output_dir)
59
+ items = bilibili_xml_items(output_dir, [ratio_part, 0.8])
60
60
  items["DisplayRSSaddress"] = channelid_bilibili_value[
61
61
  "DisplayRSSaddress"
62
62
  ]
@@ -68,10 +68,5 @@ def create_main_rss():
68
68
  "bilibili", items["items"]
69
69
  )
70
70
  gVar.all_items[output_dir] = items
71
- # 主进度条更新
72
- ratio = gVar.index_message["schedule"][1] + ratio_part
73
- if ratio > 0.8:
74
- ratio = 0.8
75
- gVar.index_message["schedule"][1] = ratio
76
71
  del all_channelid[index]
77
72
  break
@@ -30,7 +30,6 @@ def rss_create_hash(data):
30
30
  # 获取原始xml模块
31
31
  def get_original_rss():
32
32
  xmls_original_fail = []
33
- xmls_quantity = {}
34
33
  # 获取原始总xml文件
35
34
  try:
36
35
  with open(
@@ -62,21 +61,9 @@ def get_original_rss():
62
61
  f"<!-- {{{channelid_key}}} -->\n"
63
62
  )[1]
64
63
  get_xmls_original[channelid_key] = get_xmls_original_key
65
- xmls_quantity[channelid_key] = {
66
- "original": len(
67
- get_xmls_original_key.split(f"<!-- {channelid_key} -->")
68
- )
69
- }
70
64
  except FileNotFoundError: # 文件不存在直接更新
71
65
  xmls_original_fail.append(channelid_key)
72
- xmls_quantity[channelid_key] = {"original": 0}
73
- else:
74
- xmls_quantity[channelid_key] = {
75
- "original": len(
76
- get_xmls_original[channelid_key].split(f"<!-- {channelid_key} -->")
77
- )
78
- }
79
66
  # 生成原始rss的哈希值
80
67
  hash_rss_original = rss_create_hash(rss_original)
81
68
 
82
- return get_xmls_original, hash_rss_original, xmls_original_fail, xmls_quantity
69
+ return get_xmls_original, hash_rss_original, xmls_original_fail
@@ -3,6 +3,7 @@
3
3
 
4
4
  from podflow import gVar
5
5
  from podflow.basic.write_log import write_log
6
+ from podflow.httpfs.progress_bar import progress_bar
6
7
  from podflow.message.media_format import media_format
7
8
 
8
9
 
@@ -107,7 +108,4 @@ def get_youtube_and_bilibili_video_format(
107
108
  del gVar.video_id_update_format[id_num]
108
109
  with ratio_part_lock:
109
110
  # 主进度条更新
110
- ratio = gVar.index_message["schedule"][1] + ratio_part
111
- if ratio > 0.199:
112
- ratio = 0.199
113
- gVar.index_message["schedule"][1] = ratio
111
+ progress_bar(ratio_part, 0.199)
@@ -10,18 +10,10 @@ from podflow.basic.time_print import time_print
10
10
  def optimize_download():
11
11
  xmls_quantity = gVar.xmls_quantity
12
12
  video_id_update_format = gVar.video_id_update_format
13
- channel_sums = {}
14
13
  sorted_video_id_update_format = {}
15
- time_print("开始计算频道媒体数量")
16
- # 计算每个频道的总和
17
- for channel_id, values in xmls_quantity.items():
18
- total = values["original"] + values["update"] + values["backward"]
19
- channel_sums[channel_id] = total
20
- gVar.xmls_quantity[channel_id]["total"] = total
21
- time_print("开始对频道进行排序")
22
- # 按总和从大到小排序
23
- sorted_channels = sorted(channel_sums.items(), key=lambda x: x[1], reverse=True)
24
14
  time_print("开始优化下载顺序")
15
+ # 按总和从大到小排序
16
+ sorted_channels = sorted(xmls_quantity.items(), key=lambda x: x[1], reverse=True)
25
17
  # 根据总和排序数据
26
18
  for channel_id, _ in sorted_channels:
27
19
  for key, value in video_id_update_format.items():
@@ -9,6 +9,7 @@ from podflow.basic.write_log import write_log
9
9
  from podflow.youtube.get import youtube_rss_update
10
10
  from podflow.basic.folder_build import folder_build
11
11
  from podflow.bilibili.get import bilibili_rss_update
12
+ from podflow.httpfs.progress_bar import progress_bar
12
13
 
13
14
 
14
15
  # 更新Youtube和哔哩哔哩频道xml多线程模块
@@ -115,8 +116,7 @@ def update_youtube_bilibili_rss():
115
116
  del gVar.channelid_youtube_ids[youtube_key]
116
117
  write_log(f"YouTube频道 {youtube_value} 无法更新")
117
118
  # 更新进度条
118
- ratio = gVar.index_message["schedule"][1] + ratio_part
119
- gVar.index_message["schedule"][1] = ratio
119
+ progress_bar(ratio_part, 0.1)
120
120
 
121
121
  # 更新哔哩哔哩频道
122
122
  for bilibili_key, bilibili_value in gVar.channelid_bilibili_ids.copy().items():
@@ -136,7 +136,4 @@ def update_youtube_bilibili_rss():
136
136
  # 构建频道文件夹
137
137
  folder_build(bilibili_key, "channel_audiovisual")
138
138
  # 更新进度条
139
- ratio = gVar.index_message["schedule"][1] + ratio_part
140
- if ratio > 0.1:
141
- ratio = 0.1
142
- gVar.index_message["schedule"][1] = ratio
139
+ progress_bar(ratio_part, 0.1)
@@ -148,9 +148,6 @@
148
148
  width: 100%;
149
149
  max-width: 520px;
150
150
  padding: 2px;
151
- border: 1px solid var(--input-border);
152
- border-radius: 4px;
153
- background-color: var(--input-bg);
154
151
  color: var(--text-color);
155
152
  transition: background-color 0.3s, color 0.3s, border-color 0.3s;
156
153
  box-sizing: border-box;
@@ -163,19 +160,40 @@
163
160
  white-space: pre-wrap; /* 保留换行并允许自动换行 */
164
161
  }
165
162
  textarea {
166
- height: 350px;
163
+ height: 250px;
167
164
  font-size: 16px;
165
+ border: 1px solid var(--input-border);
166
+ border-radius: 4px;
167
+ background-color: var(--input-bg);
168
+ }
169
+ #messageDownload {
170
+ max-height: 200px;
171
+ height: auto;
172
+ font-size: 12px;
173
+ border: 0px;
174
+ border-radius: 4px;
175
+ background-color: var(--bg-color);
168
176
  }
169
177
  #messageArea {
170
- height: 350px;
178
+ height: 200px;
171
179
  font-size: 12px;
180
+ border: 1px solid var(--input-border);
181
+ border-radius: 4px;
182
+ background-color: var(--input-bg);
172
183
  }
173
184
  #messageHttp {
174
- height: 150px;
185
+ height: 100px;
175
186
  font-size: 12px;
187
+ border: 1px solid var(--input-border);
188
+ border-radius: 4px;
189
+ background-color: var(--input-bg);
176
190
  }
177
191
  .button-container {
178
192
  margin-top: 10px;
193
+ display: flex;
194
+ justify-content: center; /* 水平居中 */
195
+ flex-wrap: wrap; /* 换行 */
196
+ gap: 10px; /* 按钮间距 */
179
197
  }
180
198
  button {
181
199
  background-color: var(--button-bg);
@@ -353,6 +371,8 @@
353
371
  <div class="status-text" id="progressStatus">准备中</div>
354
372
  <div class="percentage-text" id="progressPercentage">0.00%</div>
355
373
  </div>
374
+ <label id="downloadLabel">下载进度:</label>
375
+ <div class="common-area" id="messageDownload"></div>
356
376
  <label>构建服务:</label><br>
357
377
  <div class="common-area" id="messageArea"></div>
358
378
  <label>收发服务:</label><br>
@@ -361,28 +381,7 @@
361
381
  </section>
362
382
  </main>
363
383
  <script>
364
- (function() {
365
- // 生成单个二维码的函数
366
- function generateQRCodeForNode(container) {
367
- const rootStyles = getComputedStyle(document.documentElement);
368
- const textColor = rootStyles.getPropertyValue('--text-color');
369
- const inputBg = rootStyles.getPropertyValue('--input-bg');
370
- const url = container.dataset.url;
371
- container.innerHTML = '';
372
- if (url) {
373
- new QRCode(container, {
374
- text: url,
375
- width: 220,
376
- height: 220,
377
- colorDark: textColor,
378
- colorLight: inputBg,
379
- correctLevel: QRCode.CorrectLevel.L
380
- });
381
- } else {
382
- container.textContent = 'URL 未提供';
383
- }
384
- }
385
-
384
+ (function() {
386
385
  // 缓存常用节点
387
386
  const menu = document.getElementById('menu');
388
387
  const toggleMenuBtn = document.getElementById('toggleMenu');
@@ -401,9 +400,32 @@
401
400
  const progressPercentage = document.getElementById('progressPercentage');
402
401
  const messageArea = document.getElementById('messageArea');
403
402
  const messageHttp = document.getElementById('messageHttp');
403
+ const messageDownload = document.getElementById('messageDownload');
404
404
 
405
- let lastMessage = { podflow: [], http: [], schedule: [] };
405
+ let lastMessage = { podflow: [], http: [], schedule: [], download: [] };
406
406
  let pollingTimer = null;
407
+ let userScrolled = false;
408
+
409
+ // 生成单个二维码的函数
410
+ function generateQRCodeForNode(container) {
411
+ const rootStyles = getComputedStyle(document.documentElement);
412
+ const textColor = rootStyles.getPropertyValue('--text-color').trim();
413
+ const inputBg = rootStyles.getPropertyValue('--input-bg').trim();
414
+ const url = container.dataset.url;
415
+ container.innerHTML = '';
416
+ if (url) {
417
+ new QRCode(container, {
418
+ text: url,
419
+ width: 220,
420
+ height: 220,
421
+ colorDark: textColor,
422
+ colorLight: inputBg,
423
+ correctLevel: QRCode.CorrectLevel.L
424
+ });
425
+ } else {
426
+ container.textContent = 'URL 未提供';
427
+ }
428
+ }
407
429
 
408
430
  // 菜单切换函数
409
431
  function toggleMenu() {
@@ -426,15 +448,15 @@
426
448
  if (window.innerWidth <= 600 && !menu.classList.contains('hidden')) {
427
449
  toggleMenu();
428
450
  }
429
- pageId === 'pageMessage' ? startMessagePolling() : stopMessagePolling();
451
+ if (pageId === 'pageMessage') {
452
+ startMessage();
453
+ updateDownloadLabelVisibility();
454
+ } else {
455
+ stopMessage();
456
+ }
430
457
  }
431
458
  }
432
459
 
433
- // 初始化默认页面
434
- showPage('pageMessage');
435
-
436
- let userScrolled = false;
437
-
438
460
  // 监听滚动事件,检测用户是否手动滚动
439
461
  function onUserScroll(event) {
440
462
  const element = event.target;
@@ -442,10 +464,7 @@
442
464
  const nearBottom = element.scrollHeight - element.scrollTop <= element.clientHeight + 10;
443
465
  userScrolled = !nearBottom;
444
466
  }
445
-
446
- messageArea.addEventListener('scroll', onUserScroll);
447
- messageHttp.addEventListener('scroll', onUserScroll);
448
-
467
+
449
468
  // 轮询消息更新,更新 messageArea 与 messageHttp
450
469
  function getMessages() {
451
470
  fetch('message')
@@ -561,21 +580,40 @@
561
580
  }
562
581
  }
563
582
 
583
+ // 判断是否隐藏下载进度
584
+ function updateDownloadLabelVisibility() {
585
+ const messageDownload = document.getElementById('messageDownload');
586
+ const downloadLabel = document.getElementById('downloadLabel');
587
+ if (messageDownload.textContent.trim() === '') {
588
+ // 没有内容,隐藏label
589
+ downloadLabel.style.display = 'none';
590
+ } else {
591
+ // 有内容,显示label
592
+ downloadLabel.style.display = '';
593
+ }
594
+ }
595
+
564
596
  // 启动消息轮询
565
- function startMessagePolling() {
597
+ function startMessage() {
566
598
  getMessages();
567
- pollingTimer = setInterval(getMessages, 500);
599
+ pollingTimer = setInterval(getMessages, 250);
568
600
  }
569
601
 
570
602
  // 停止消息轮询
571
- function stopMessagePolling() {
603
+ function stopMessage() {
572
604
  if (pollingTimer !== null) {
573
605
  clearInterval(pollingTimer);
574
606
  pollingTimer = null;
575
607
  }
576
608
  }
577
609
 
578
- // startMessagePolling();
610
+ // 滚动事件监听器
611
+ messageArea.addEventListener('scroll', onUserScroll);
612
+ messageHttp.addEventListener('scroll', onUserScroll);
613
+ messageDownload.addEventListener('scroll', onUserScroll);
614
+
615
+ // 初始化默认页面
616
+ showPage('pageMessage');
579
617
 
580
618
  // 表单异步提交(获取 Channel-ID)
581
619
  inputForm && inputForm.addEventListener('submit', function(event) {
@@ -653,7 +691,7 @@
653
691
 
654
692
  // 菜单切换按钮事件绑定
655
693
  toggleMenuBtn.addEventListener('click', toggleMenu);
656
-
694
+
657
695
  // 针对手机端,初始化时隐藏菜单
658
696
  if (window.innerWidth <= 600) {
659
697
  menu.classList.add('hidden');
@@ -661,6 +699,6 @@
661
699
  toggleMenuBtn.textContent = '❯';
662
700
  }
663
701
  })();
664
- </script>
702
+ </script>
665
703
  </body>
666
704
  </html>
@@ -8,6 +8,7 @@ from datetime import datetime
8
8
  from podflow import gVar
9
9
  from podflow.upload.time_key import time_key
10
10
  from podflow.basic.time_print import time_print
11
+ from podflow.httpfs.progress_bar import progress_update
11
12
 
12
13
 
13
14
  BROADCAST_PORT = 37001
@@ -75,6 +76,7 @@ def connect_upload_server():
75
76
  time_print(" " * terminal_width, True, True, False)
76
77
  # 打印尝试广播端口
77
78
  time_print(f"{time_text}尝试广播端口{current_port}...", True, True, False)
79
+ progress_update(0.0005, added=True)
78
80
  servers = discover_server(current_port, TIMEOUT)
79
81
  if servers:
80
82
  break
podflow/youtube/build.py CHANGED
@@ -12,6 +12,7 @@ from podflow.message.xml_item import xml_item
12
12
  from podflow.basic.time_print import time_print
13
13
  from podflow.basic.http_client import http_client
14
14
  from podflow.message.format_time import format_time
15
+ from podflow.httpfs.progress_bar import progress_bar
15
16
  from podflow.basic.get_html_dict import get_html_dict
16
17
  from podflow.message.xml_original_item import xml_original_item
17
18
 
@@ -184,7 +185,7 @@ def get_xml_item(guid, item, channelid_title, title_change, output_dir):
184
185
 
185
186
 
186
187
  # 生成YouTube对应channel的需更新的items模块
187
- def youtube_xml_items(output_dir):
188
+ def youtube_xml_items(output_dir, ratio_part):
188
189
  items_list = [f"<!-- {output_dir} -->"]
189
190
  entry_num = 0
190
191
  original_judgment = True
@@ -214,6 +215,7 @@ def youtube_xml_items(output_dir):
214
215
  guid, item, channelid_title, title_change, output_dir
215
216
  ):
216
217
  items_list.append(f"{xml_item_text}<!-- {output_dir} -->")
218
+ progress_bar(ratio_part[0], ratio_part[1])
217
219
  if (
218
220
  gVar.video_id_update_format[guid]["description"]
219
221
  and gVar.video_id_update_format[guid]["description"][0] == "『"
@@ -233,6 +235,7 @@ def youtube_xml_items(output_dir):
233
235
  items_list.append(
234
236
  f"{youtube_xml_item(entry, title_change)}<!-- {output_dir} -->"
235
237
  )
238
+ progress_bar(ratio_part[0], ratio_part[1])
236
239
  if re.search(r"(?<=<media:description>)『", entry):
237
240
  original_judgment = False
238
241
  entry_num += 1
@@ -253,6 +256,7 @@ def youtube_xml_items(output_dir):
253
256
  items_list.append(
254
257
  f"{xml_original_item(xml, channelid_title, original_judgment, title_change)}<!-- {output_dir} -->"
255
258
  )
259
+ progress_bar(ratio_part[0], ratio_part[1])
256
260
  xml_num += 1
257
261
  if xml_num >= entry_count:
258
262
  break
@@ -270,6 +274,7 @@ def youtube_xml_items(output_dir):
270
274
  output_dir,
271
275
  ):
272
276
  items_list.append(f"{backward_xml_item_text}<!-- {output_dir} -->")
277
+ progress_bar(ratio_part[0], ratio_part[1])
273
278
  # 生成对应xml
274
279
  try:
275
280
  with open(
podflow/youtube/get.py CHANGED
@@ -9,6 +9,7 @@ from podflow import gVar
9
9
  from podflow.basic.time_print import time_print
10
10
  from podflow.basic.http_client import http_client
11
11
  from podflow.basic.vary_replace import vary_replace
12
+ from podflow.httpfs.progress_bar import progress_bar
12
13
  from podflow.basic.get_html_dict import get_html_dict
13
14
  from podflow.basic.list_merge_tidy import list_merge_tidy
14
15
 
@@ -67,7 +68,9 @@ def get_youtube_html_playlists(
67
68
  ] # 获取发布时间
68
69
  item[videoid]["image"] = player_Microformat_Renderer["thumbnail"][
69
70
  "thumbnails"
70
- ][0]["url"] # 获取封面图
71
+ ][0][
72
+ "url"
73
+ ] # 获取封面图
71
74
  with contextlib.suppress(KeyError, TypeError, IndexError, ValueError):
72
75
  fail.remove(videoid) # 若成功获取,则从失败列表中移除
73
76
  else:
@@ -196,6 +199,8 @@ def youtube_rss_update(
196
199
  channelid_youtube = gVar.channelid_youtube
197
200
  channelid_youtube_rss = gVar.channelid_youtube_rss
198
201
  channelid_youtube_ids_update = gVar.channelid_youtube_ids_update
202
+ youtube_content_ytid_backward = []
203
+ last_size = channelid_youtube[youtube_value]["last_size"]
199
204
  # 获取已下载媒体名称
200
205
  youtube_media = (
201
206
  ("m4a", "mp4") # 根据 channelid_youtube 的媒体类型选择文件格式
@@ -314,11 +319,8 @@ def youtube_rss_update(
314
319
  except TypeError:
315
320
  youtube_content_ytid = [] # 处理类型错误
316
321
  youtube_content_ytid = youtube_content_ytid[
317
- : channelid_youtube[youtube_value][
318
- "update_size"
319
- ] # 限制视频ID数量
322
+ : channelid_youtube[youtube_value]["update_size"] # 限制视频ID数量
320
323
  ]
321
- gVar.xmls_quantity[youtube_key]["update"] = len(youtube_content_ytid)
322
324
  youtube_content_new = list_merge_tidy(youtube_content_ytid, guids) # 合并并去重
323
325
  if youtube_content_ytid := [
324
326
  exclude
@@ -331,12 +333,9 @@ def youtube_rss_update(
331
333
  youtube_content_ytid # 保存更新的视频ID
332
334
  )
333
335
  # 向后更新
334
- youtube_content_ytid_backward = []
335
336
  if channelid_youtube[youtube_value]["BackwardUpdate"] and guids:
336
337
  # 计算向后更新的数量
337
- backward_update_size = channelid_youtube[youtube_value]["last_size"] - len(
338
- youtube_content_new
339
- )
338
+ backward_update_size = last_size - len(youtube_content_new)
340
339
  if backward_update_size > 0:
341
340
  for _ in range(3):
342
341
  # 获取历史播放列表
@@ -373,10 +372,9 @@ def youtube_rss_update(
373
372
  gVar.youtube_content_ytid_backward_update[youtube_key] = (
374
373
  youtube_content_ytid_backward # 保存向后更新的ID
375
374
  )
376
- gVar.xmls_quantity[youtube_key]["backward"] = len(youtube_content_ytid_backward)
375
+ gVar.xmls_quantity[youtube_key] = min(last_size, len(youtube_content_new)) + len(
376
+ youtube_content_ytid_backward
377
+ )
377
378
  # 更新进度条
378
379
  with rss_update_lock:
379
- ratio = gVar.index_message["schedule"][1] + ratio_thread
380
- if ratio > 0.09:
381
- ratio = 0.09
382
- gVar.index_message["schedule"][1] = ratio
380
+ progress_bar(ratio_thread, 0.09)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: podflow
3
- Version: 20250415.2
3
+ Version: 20250417.1
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
@@ -33,6 +33,8 @@ Requires-Dist: BeautifulSoup4>=4.13.3
33
33
 
34
34
  YouTube的cookies需要使用chrome插件导出Netscape格式并保存到channel_data文件夹中
35
35
 
36
+ 图形界面请访问 `/index`
37
+
36
38
  PS:可能存在大量未知bug,改进中并尝试加入抖音……
37
39
 
38
40
  ### 安装方法
@@ -1,8 +1,8 @@
1
- podflow/__init__.py,sha256=uFRDMRh6CVcEEgj4AMmLl43vusbI4o525Hz8Xf24Hsc,7318
1
+ podflow/__init__.py,sha256=RVR-Iyvaawd8g0gc1-lVSCwSW209XVb0gMC-qkoD4us,7332
2
2
  podflow/download_and_build.py,sha256=GKQ1uX8Nuwdhr4wgnGr3jP1Mu0llRUPFcboQ3S05WkU,671
3
3
  podflow/ffmpeg_judge.py,sha256=wM49pPXOFwFAA_8TKHal5fV6ka9sAA87yGQMDOssvXo,1340
4
4
  podflow/main.py,sha256=Cz2E33-Kcc_1_oxNs4Z1OoqJYhonmClsrtoCW1oQmZA,739
5
- podflow/main_podcast.py,sha256=2LeAOJVHqM_dVwff88lvW5oy7QZtGYO2uPcPT-wJ11M,12747
5
+ podflow/main_podcast.py,sha256=KyKNn76XpDEUXAa6rj1WzOW9YtbuvSPLvAPGLD4QQIM,11992
6
6
  podflow/main_upload.py,sha256=H_T5KQMYzToqzQbjGQ6DWDGziy8iMnpmf7A1qOStJuo,2296
7
7
  podflow/parse_arguments.py,sha256=h3a7EaRZS04kNMFYbxTW9Ch29KgZ7dyS-yqEEt_etQI,2592
8
8
  podflow/basic/__init__.py,sha256=CAfI6mVQtz7KKbAiTIZ9_IbvaTXeAqxR1U7ov9GDoDo,44
@@ -21,8 +21,8 @@ podflow/basic/time_stamp.py,sha256=ubdnw4SjcO0JR5JGatBjAX4sxQ4Ro9AjNuzKFkhqwec,1
21
21
  podflow/basic/vary_replace.py,sha256=-TyvZxfak6U7Ak8F87ctYUBpHB2Il6iYZof37lwKjto,211
22
22
  podflow/basic/write_log.py,sha256=wfiNfFuRLCWNLXDRNPVaVsKxwB44xxTiCFJ66g71XmU,1255
23
23
  podflow/bilibili/__init__.py,sha256=6ZTpvhZTyn4f0LryXzH8lzyK1_rRHBeM-hkBoklKHRA,47
24
- podflow/bilibili/build.py,sha256=PKxkjUa8EedpoQTFZIgdcsVbiAWRISA-qKCpCaSTLTU,7957
25
- podflow/bilibili/get.py,sha256=dB1cgogf6bI42D1fNFWIvZB6xFK-VCKuWqqQrRDHhc8,20857
24
+ podflow/bilibili/build.py,sha256=aV3iaY4VFsC4GwkeSY9uacMAnV3OY_6V_gGhMOryrvk,8236
25
+ podflow/bilibili/get.py,sha256=xS9p4RFW1yswmihPOhYbjEZoqnouqqN_mht740LExu4,21262
26
26
  podflow/bilibili/login.py,sha256=oHnuOMvlKZUnJ1OBHuZpTEnG04pboWsueOx871lQWjc,11482
27
27
  podflow/config/__init__.py,sha256=MzgAlkSdV-5MFC11r0QSf-GPxmsLbrMc5ROIrJafjag,45
28
28
  podflow/config/build_original.py,sha256=pG9gCkBBIWwU8QxZA06Br6JRfI4XUSIEiN8eqo1-v7k,1809
@@ -44,31 +44,32 @@ podflow/httpfs/app_bottle.py,sha256=l2myMkoRoC5O7OWCyYjCmk7wOEIlgTWfFfImlhXMYwY,
44
44
  podflow/httpfs/browser.py,sha256=BJ4Xkfiki_tDr0Sc9RqAcEfIVpkAZ3RFOwo0aMHlY3U,197
45
45
  podflow/httpfs/get_channelid.py,sha256=gcwy4IVHBWNQz7qPCpjwiAklGFLRGzvM33-UZz7oFvo,2296
46
46
  podflow/httpfs/port_judge.py,sha256=l_nLpsSiIhAzfJGCOWyYC-KkCCWPUW2ybe_5hdMOEzE,764
47
+ podflow/httpfs/progress_bar.py,sha256=mMkP92SrZZ-IBFz9ombWxzRJfMq20h5IbSc_eFcbZZA,682
47
48
  podflow/httpfs/to_html.py,sha256=60azc3xfPKQB7Qaj_wlF3MoHmG0Wkjep70-JroHA2gg,1709
48
49
  podflow/makeup/__init__.py,sha256=ligUtfj0stTcOHFXDF6eAN7Up2PxlB0GnGbLq7iDY3c,45
49
50
  podflow/makeup/del_makeup_format_fail.py,sha256=XizQh74QYXxRg0e1uerXjd4Tiq5qChks0fTAY7n3Z1I,642
50
- podflow/makeup/make_up_file.py,sha256=_kpvlOpW1TX379aj83rw7U9fFRsHYkYBja1yUKw6oys,2938
51
+ podflow/makeup/make_up_file.py,sha256=Uq_oL0a28PhtEL9ZObmnhaEWcZwchB_5e8-jSiiCeoQ,2777
51
52
  podflow/makeup/make_up_file_format_mod.py,sha256=4dIMeVObr4qnMLD0mocZzBNhduc8dHx-b-w1GVotKIk,3575
52
53
  podflow/makeup/make_up_file_mod.py,sha256=padTanSPw5Dysf_CcUUVy65nCC6zbz1gPJRX98tmUdY,1075
53
54
  podflow/message/__init__.py,sha256=pZkcrrtkdtxgMriEHBZ0_rptKaQrQeMPJvPSaoI1Awo,46
54
55
  podflow/message/backup_zip_save.py,sha256=c81jnx8IxHjTcO7G0OUAppawpBIPxa9wgkj9AQhqeJc,1864
55
- podflow/message/create_main_rss.py,sha256=yo12YYUxYTjGSHD5CrnRIbUZumtr0NOZqQWXpC3t55k,3296
56
+ podflow/message/create_main_rss.py,sha256=kW2QvJhxl2ZcqGV-M-OztlOaQ27ODuQxADeP8poymBQ,3118
56
57
  podflow/message/display_qrcode_and_url.py,sha256=VqmRkDYYG03VihfW4SAU49HJVmfqWbLTgMxqCaREeCo,1037
57
58
  podflow/message/fail_message_initialize.py,sha256=UPHYNErD2hnzm2WFlNqghBRDCw_sf_3EagAF5LiO9wk,6462
58
59
  podflow/message/format_time.py,sha256=gveNh4FGeS3ytwDyYB-h12d1_Km6XoX7WSPcFmDfCBk,909
59
60
  podflow/message/get_media_name.py,sha256=5ULPQOQCZ2-lxdkILwlBP-ItzdFEgvEAKxeLtplACbQ,861
60
- podflow/message/get_original_rss.py,sha256=4OhJ7XCRiS8Eyx4AfRr2sfOdVNmpyDrxMXZo7MpFa8Y,2990
61
+ podflow/message/get_original_rss.py,sha256=Bzy-Fs1vZEjwvQq6D6xp-2IUidliSyaL1P4WtkLJaRg,2450
61
62
  podflow/message/get_video_format.py,sha256=bPetnFwQlhIO9do_nq3B4AwHQRxFn6SDYvFItjwEx0o,5324
62
63
  podflow/message/get_video_format_multithread.py,sha256=tbgQDMpcntulrbmXBbKL4iVr4t_9evGsuMOIZLoLebI,1615
63
- podflow/message/get_youtube_and_bilibili_video_format.py,sha256=QvGkm2avYlUlvxfouw545Si72DtT4SAJwWw0zu6eq_U,4705
64
+ podflow/message/get_youtube_and_bilibili_video_format.py,sha256=LKer75ZhVDvFLd7aMOrr-9UPKIVpCEPkeIhdlmP_xu4,4633
64
65
  podflow/message/media_format.py,sha256=Q4WoML4UqL0Ry-QN8DHFJqOQ2tXcFN6u5hmhdSLdP1g,7346
65
- podflow/message/optimize_download.py,sha256=bIN1Lyk17tgEjjpxgxBzptLT_F_SRdSoyoyIiIT20uo,1409
66
+ podflow/message/optimize_download.py,sha256=-6YritASap8Dp0HqDuvn-kyeamAfw8UjnR-_5S0DbYw,1034
66
67
  podflow/message/original_rss_fail_print.py,sha256=7HM5Gwi3GqBIg2dtTTDlN_FRgZZjYv6ejizS3tDiePE,502
67
68
  podflow/message/rss_create_hash.py,sha256=M5OS9KcQ4mIxLes9ij4oNji-4VKgi56bg0Shv5nCIQ4,638
68
69
  podflow/message/save_rss.py,sha256=x-yRwT7bAUt2k-R9DWa5uToqpcOdaXkPW_4VH5Gbeo4,3193
69
70
  podflow/message/title_correction.py,sha256=Zieulj2wQY_o4r3u5ZRsDQP5y8KuZHrL_l8tnM96k6g,915
70
71
  podflow/message/update_information_display.py,sha256=Zn-Xhps4PKf7NbgQrT-qTwhP096RV-48OEncK_vuUe0,3061
71
- podflow/message/update_youtube_bilibili_rss.py,sha256=cy6zVsn80oEpF83dpUNUp7BCzQF98uch3fbPkeab1v4,6107
72
+ podflow/message/update_youtube_bilibili_rss.py,sha256=igt41NkGuikPzi0gqo-Hc29hMil65kHV19J4W-oGQfU,5962
72
73
  podflow/message/want_retry.py,sha256=3MtlAG4BZ2oznn0X5zYzAl2S0XzZkXhnN_LHVPcWZjA,699
73
74
  podflow/message/xml_item.py,sha256=jCB93aOoIDK6EaAFrZg5gd6mBMv7fP9uX-Z5eiTSyxg,3127
74
75
  podflow/message/xml_original_item.py,sha256=mlORI0p6aSLP6PWIAuvI4uVN0JbxUDZX5-U52ltn9E4,4048
@@ -81,23 +82,23 @@ podflow/remove/remove_dir.py,sha256=xQIhrnqnYjMzXjoSWaTvm7JwPYOFTN1muuTPdaLDXpQ,
81
82
  podflow/remove/remove_file.py,sha256=8wAJQehs-XBqvu0vPlEme2_tt0FZxc5ELwGMxXA_558,982
82
83
  podflow/repair/__init__.py,sha256=Gpc1i6xiSLodKjjmzH66c_Y1z0HQ9E9CS3p95FRnVFM,45
83
84
  podflow/repair/reverse_log.py,sha256=Wc_vAH0WB-z1fNdWx7FYaVH4caRPtot7tDwDwFhmpz4,1106
84
- podflow/templates/index.html,sha256=NYEjsIrf9EJJsZ-udAOdn1f92lxCRj6QFuDusA1IEwQ,22853
85
+ podflow/templates/index.html,sha256=pvFW58zLDK2OJR30U-seZxEvH8KHrFVoQl4mWUkxmVQ,24239
85
86
  podflow/upload/__init__.py,sha256=AtOSXDrE5EjUe3z-iBd1NTDaH8n_X9qA5WXdBLkONjA,45
86
87
  podflow/upload/add_upload.py,sha256=_2-V0z75Lwu-PUCfMD9HOSxZTB102yZlZW5hSdlHcsc,1432
87
88
  podflow/upload/build_hash.py,sha256=9opa3xLd7nJbGGX5xa3uuKPS6dxlbkAb87ZdEiUxmxI,473
88
89
  podflow/upload/get_upload_original.py,sha256=TEDnRutumm2FZNIesPJIlExHyKWpfB3ZAHb3sZt7V6A,4312
89
- podflow/upload/linked_client.py,sha256=ilX0WjNDlgacfLo9L8VEpLnXphMl0o4P46axQ9yb9XY,3210
90
+ podflow/upload/linked_client.py,sha256=cslPx9T2au21DYfLeHIeoR_O-NMx9AdR9MSLJHQogaU,3314
90
91
  podflow/upload/linked_server.py,sha256=h-qSx13fP8_Ny2IKW3wCNPwqRqW6-Iz1pqxD9ga9-dM,2308
91
92
  podflow/upload/login.py,sha256=85sqr12T-3NH-TD3kAMzy4yb1KOheV3Tr0eGee7NCJo,4007
92
93
  podflow/upload/time_key.py,sha256=6jZ3cxUjzj_umYDwH27R0YNZlLXxfhNp-CqV_K22wlo,967
93
94
  podflow/upload/update_upload.py,sha256=_5tp1zPNsC9DdDnLzm-P8bLcOBuDov4eMRHp_861j80,3183
94
95
  podflow/upload/upload_server.py,sha256=BFq3QrWE7U97LbC4EQiDhQXbLapEc4R00eRDBH12E6A,565
95
96
  podflow/youtube/__init__.py,sha256=pgXod8gq0IijZxIkPSwgAOcb9JI5rd1mqMomoR7bcJ4,46
96
- podflow/youtube/build.py,sha256=3LYk_ICVXj9XkE9jZ8jEVI8596xxS_QZkcoIwcBE3Ys,12006
97
- podflow/youtube/get.py,sha256=7OkpcY2-ulv0o4J7QvghIe6rvxjSwSzPWjouKQ_2bj8,17253
97
+ podflow/youtube/build.py,sha256=67m74rQOrvqU6ZZybP85ORpg3pOCkpoikttBbtO_PxY,12315
98
+ podflow/youtube/get.py,sha256=oO32GjTFvUgP5AfFX5AlIuXU2UT6QtOUOXWLFzi8XtI,17157
98
99
  podflow/youtube/login.py,sha256=KYl--ya6Z1u0uIcOp9l8i3DIIj9hsYUDH4dtJjI0MLM,1295
99
- podflow-20250415.2.dist-info/METADATA,sha256=OhQ49GbS0ooi2dZgx_5uooLiU2Iz81nKVkdKiezKiA8,14165
100
- podflow-20250415.2.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
101
- podflow-20250415.2.dist-info/entry_points.txt,sha256=mn7hD_c_dmpKe3XU0KNekheBvD01LhlJ9htY-Df0j2A,131
102
- podflow-20250415.2.dist-info/top_level.txt,sha256=fUujhhz-RrMI8aGvi-3Ey5y7FQnpOOgoFw9OWM3yLCU,8
103
- podflow-20250415.2.dist-info/RECORD,,
100
+ podflow-20250417.1.dist-info/METADATA,sha256=GkbxcNbOEU0mPQoGOAAxjJdG2qpggPddEiOV6vyUYl4,14197
101
+ podflow-20250417.1.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
102
+ podflow-20250417.1.dist-info/entry_points.txt,sha256=mn7hD_c_dmpKe3XU0KNekheBvD01LhlJ9htY-Df0j2A,131
103
+ podflow-20250417.1.dist-info/top_level.txt,sha256=fUujhhz-RrMI8aGvi-3Ey5y7FQnpOOgoFw9OWM3yLCU,8
104
+ podflow-20250417.1.dist-info/RECORD,,