podflow 2025.1.26__py3-none-any.whl → 20250126.post2__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.
@@ -12,7 +12,7 @@ def write_log(
12
12
  suffix=None,
13
13
  display=True,
14
14
  time_display=True,
15
- only_log="",
15
+ only_log=None,
16
16
  file_name="Podflow.log",
17
17
  ):
18
18
  # 获取当前的具体时间
@@ -35,7 +35,7 @@ def download_video(
35
35
  pass
36
36
 
37
37
  def error(self, msg):
38
- msg = fail_message_initialize(msg, video_url).ljust(45)
38
+ msg = fail_message_initialize(msg, video_url)
39
39
  print(msg)
40
40
 
41
41
  outtmpl = f"channel_audiovisual/{output_dir}/{video_url}{sesuffix}.{output_format}"
@@ -68,16 +68,15 @@ def download_video(
68
68
  ydl.download([f"{video_website}"]) # 下载指定视频链接的视频
69
69
  return None, None
70
70
  except Exception as download_video_error:
71
- fail_info = fail_message_initialize(download_video_error, video_url).replace("\n","")
71
+ fail_info = fail_message_initialize(download_video_error, video_url)
72
72
  remove_info = ""
73
73
  if fail_info in [
74
- "",
75
74
  "\033[31m请求拒绝\033[0m",
76
75
  "\033[31m数据不完整\033[0m",
77
76
  "\033[31m传输中断\033[0m",
78
77
  "\033[31m请求超时\033[0m",
79
78
  "\033[31m响应超时\033[0m",
80
- ] and "www.youtube.com" in video_website:
79
+ ]:
81
80
  if os.path.isfile(outtmpl):
82
81
  os.remove(outtmpl)
83
82
  remove_info = "|已删除失败文件"
Podflow/ffmpeg_judge.py CHANGED
@@ -3,7 +3,6 @@
3
3
 
4
4
  import sys
5
5
  import subprocess
6
- import shutil
7
6
  from Podflow.basic.write_log import write_log
8
7
 
9
8
 
@@ -29,14 +28,9 @@ def ffmpeg_judge():
29
28
  sudo dnf install ffmpeg\033[0m
30
29
  检查FFmpeg版本:
31
30
  \033[32mffmpeg -version\033[0m"""
32
-
33
- # 使用 shutil.which 检查 ffmpeg 是否安装
34
- if shutil.which("ffmpeg") is None:
35
- error_ffmpeg_judge(ffmpeg_worry)
36
-
37
31
  try:
38
32
  # 执行 ffmpeg 命令获取版本信息
39
- result = subprocess.run(["ffmpeg", "-version"], capture_output=True, text=True, check=True)
33
+ result = subprocess.run(["ffmpeg", "-version"], capture_output=True, text=True)
40
34
  output = result.stdout.lower()
41
35
  # 检查输出中是否包含 ffmpeg 版本信息
42
36
  if "ffmpeg version" not in output:
Podflow/main.py CHANGED
@@ -7,7 +7,6 @@ import time
7
7
  import urllib
8
8
  import subprocess
9
9
  from datetime import datetime
10
- from importlib.metadata import version
11
10
  import cherrypy
12
11
 
13
12
  # 基本功能模块
@@ -63,7 +62,7 @@ def main():
63
62
  # 获取传入的参数
64
63
  parse_arguments()
65
64
  # 开始运行
66
- print(f"{datetime.now().strftime('%H:%M:%S')}|Podflow|{version('Podflow')}开始运行.....")
65
+ print(f"{datetime.now().strftime('%H:%M:%S')}|Podflow开始运行.....")
67
66
  # 判断是否安装ffmpeg
68
67
  ffmpeg_judge()
69
68
  # 初始化
@@ -29,16 +29,10 @@ def duration_and_formats(video_website, video_url, cookies):
29
29
  "logger": MyLogger(),
30
30
  }
31
31
  if cookies:
32
- if "www.bilibili.com" in video_website:
33
- ydl_opts["http_headers"] = {
34
- "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
35
- "Referer": "https://www.bilibili.com/",
36
- }
37
- elif "www.youtube.com" in video_website:
38
- ydl_opts["http_headers"] = {
39
- "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
40
- "Referer": "https://www.youtube.com/",
41
- }
32
+ ydl_opts["http_headers"] = {
33
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
34
+ "Referer": "https://www.bilibili.com/",
35
+ }
42
36
  ydl_opts["cookiefile"] = cookies # cookies 是你的 cookies 文件名
43
37
  with yt_dlp.YoutubeDL(ydl_opts) as ydl:
44
38
  # 使用提供的 URL 提取视频信息
Podflow/youtube/build.py CHANGED
@@ -21,7 +21,6 @@ from Podflow.message.xml_original_item import xml_original_item
21
21
  def get_youtube_introduction():
22
22
  # 创建线程锁
23
23
  youtube_xml_get_lock = threading.Lock()
24
-
25
24
  # 使用http获取youtube频道简介和图标模块
26
25
  def youtube_xml_get(output_dir):
27
26
  if channel_about := http_client(
@@ -48,7 +47,6 @@ def get_youtube_introduction():
48
47
  ).group()
49
48
  with youtube_xml_get_lock:
50
49
  gVar.youtube_xml_get_tree[output_dir] = xml_tree
51
-
52
50
  # 创建线程列表
53
51
  youtube_xml_get_threads = []
54
52
  for output_dir in gVar.channelid_youtube_ids_update:
@@ -69,43 +67,26 @@ def get_youtube_playlist(url, channelid_title):
69
67
  0
70
68
  ]["tabRenderer"]["content"]["sectionListRenderer"]["contents"][0][
71
69
  "itemSectionRenderer"
72
- ]["contents"][0]["playlistVideoListRenderer"]["contents"]
70
+ ][
71
+ "contents"
72
+ ][
73
+ 0
74
+ ][
75
+ "playlistVideoListRenderer"
76
+ ][
77
+ "contents"
78
+ ]
73
79
  videoids.extend(
74
80
  content["playlistVideoRenderer"]["videoId"] for content in contents
75
81
  )
76
82
  return videoids
77
83
 
78
84
 
79
- # 从HTML获取YouTube媒体信息模块
80
- def youtube_html_guid_message(guid):
81
- ytInitialPlayerResponse = get_html_dict(
82
- f"https://www.youtube.com/watch?v={guid}",
83
- f"{guid} HTML",
84
- "ytInitialPlayerResponse",
85
- )
86
- try:
87
- image = ytInitialPlayerResponse["microformat"]["playerMicroformatRenderer"][
88
- "thumbnail"
89
- ]["thumbnails"][0]["url"]
90
- title = ytInitialPlayerResponse["microformat"]["playerMicroformatRenderer"][
91
- "title"
92
- ]["simpleText"]
93
- description = ytInitialPlayerResponse["microformat"][
94
- "playerMicroformatRenderer"
95
- ]["description"]["simpleText"]
96
- published = ytInitialPlayerResponse["microformat"]["playerMicroformatRenderer"][
97
- "publishDate"
98
- ]
99
- return published, image, title, description
100
- except KeyError:
101
- return None
102
-
103
-
104
85
  # 生成YouTube的item模块
105
86
  def youtube_xml_item(entry, title_change=None):
106
87
  if title_change is None:
107
88
  title_change = {}
108
-
89
+ # sourcery skip: avoid-builtin-shadow
109
90
  # 输入时间字符串和原始时区
110
91
  time_str = re.search(r"(?<=<published>).+(?=</published>)", entry).group()
111
92
  pubDate = format_time(time_str)
@@ -134,21 +115,14 @@ def get_xml_item(guid, item, channelid_title, title_change, output_dir):
134
115
  video_website = f"https://youtube.com/watch?v={guid}"
135
116
  if item["yt-dlp"]:
136
117
  guid_value = gVar.video_id_update_format[guid]
137
- if timestamp := guid_value["timestamp"]:
138
- published = datetime.fromtimestamp(timestamp, timezone.utc).strftime(
139
- "%Y-%m-%dT%H:%M:%S%z"
140
- )
141
- title = guid_value["title"]
142
- description = guid_value["description"]
143
- image = guid_value["image"]
144
- elif guid_message := youtube_html_guid_message(guid):
145
- published, image, title, description = guid_message
146
- else:
147
- return None
148
- title = html.escape(title)
149
- description = html.escape(re.sub(r"\n+", "\n", description))
150
- image = re.sub(r"\?.*$", "", image)
118
+ title = html.escape(guid_value["title"])
119
+ description = html.escape(re.sub(r"\n+", "\n", guid_value["description"]))
120
+ timestamp = guid_value["timestamp"]
121
+ published = datetime.fromtimestamp(timestamp, timezone.utc).strftime(
122
+ "%Y-%m-%dT%H:%M:%S%z"
123
+ )
151
124
  pubDate = format_time(published)
125
+ image = re.sub(r"\?.*$", "", guid_value["image"])
152
126
  else:
153
127
  title = html.escape(item["title"])
154
128
  description = html.escape(re.sub(r"\n+", "\n", item["description"]))
@@ -190,16 +164,16 @@ def youtube_xml_items(output_dir):
190
164
  for guid in output_dir_value["content"]["list"]:
191
165
  if guid not in gVar.video_id_failed:
192
166
  item = output_dir_value["content"]["item"][guid]
193
- if xml_item_text := get_xml_item(
167
+ xml_item_text = get_xml_item(
194
168
  guid, item, channelid_title, title_change, output_dir
169
+ )
170
+ items_list.append(f"{xml_item_text}<!-- {output_dir} -->")
171
+ entry_num += 1
172
+ if (
173
+ gVar.video_id_update_format[guid]["description"]
174
+ and gVar.video_id_update_format[guid]["description"][0] == "『"
195
175
  ):
196
- items_list.append(f"{xml_item_text}<!-- {output_dir} -->")
197
- entry_num += 1
198
- if (
199
- gVar.video_id_update_format[guid]["description"]
200
- and gVar.video_id_update_format[guid]["description"][0] == "『"
201
- ):
202
- original_judgment = False
176
+ original_judgment = False
203
177
  else:
204
178
  if output_dir_value["type"] == "html": # 获取最新的rss信息
205
179
  file_xml = output_dir_value["content"].text
@@ -243,14 +217,14 @@ def youtube_xml_items(output_dir):
243
217
  for backward_guid in backward["list"]:
244
218
  if backward_guid not in gVar.video_id_failed:
245
219
  backward_item = backward["item"][backward_guid]
246
- if backward_xml_item_text := get_xml_item(
220
+ backward_xml_item_text = get_xml_item(
247
221
  backward_guid,
248
222
  backward_item,
249
223
  channelid_title,
250
224
  title_change,
251
225
  output_dir,
252
- ):
253
- items_list.append(f"{backward_xml_item_text}<!-- {output_dir} -->")
226
+ )
227
+ items_list.append(f"{backward_xml_item_text}<!-- {output_dir} -->")
254
228
  # 生成对应xml
255
229
  try:
256
230
  with open(
Podflow/youtube/get.py CHANGED
@@ -15,73 +15,61 @@ from Podflow.basic.list_merge_tidy import list_merge_tidy
15
15
 
16
16
  # 从YouTube播放列表获取更新模块
17
17
  def get_youtube_html_playlists(
18
- youtube_key, # YouTube 频道的唯一标识
19
- youtube_value, # YouTube 账户或其他标识信息
20
- guids=None, # 视频 ID 列表(用于比较已有视频)
21
- direction_forward=True, # 控制获取方向,默认向前获取新的视频
22
- update_size=20, # 更新数量限制,最多获取 20 个新视频
23
- youtube_content_ytid_original=None, # 原始 YouTube 视频 ID 列表
18
+ youtube_key,
19
+ youtube_value,
20
+ guids=[""],
21
+ direction_forward=True,
22
+ update_size=20,
23
+ youtube_content_ytid_original=[],
24
24
  ):
25
- idlist = [] # 存储新获取的 YouTube 视频 ID
26
- item = {} # 存储视频信息(标题、描述、封面等)
27
- threads = [] # 线程列表,用于并发获取视频详细信息
28
- fail = [] # 存储获取失败的视频 ID
29
-
30
- if guids is None:
31
- guids = [""]
32
- if youtube_content_ytid_original is None:
33
- youtube_content_ytid_original = []
34
-
25
+ idlist = []
26
+ item = {}
27
+ threads = []
28
+ fail = []
35
29
  try:
36
- videoid_start = guids[0] if direction_forward else guids[-1] # 获取起始视频 ID
30
+ videoid_start = guids[0] if direction_forward else guids[-1]
37
31
  except IndexError:
38
- videoid_start = "" # 处理空列表情况,避免 IndexError
32
+ videoid_start = ""
39
33
 
40
- # 获取视频详细信息的内部函数
34
+ # 获取媒体相关信息模块
41
35
  def get_video_item(videoid, youtube_value):
42
36
  yt_Initial_Player_Response = get_html_dict(
43
37
  f"https://www.youtube.com/watch?v={videoid}",
44
38
  f"{youtube_value}|{videoid}",
45
39
  "ytInitialPlayerResponse",
46
- ) # 解析 YouTube 页面,获取视频信息
40
+ )
47
41
  if not yt_Initial_Player_Response:
48
- return None # 若获取失败,则返回 None
49
-
42
+ return None
50
43
  try:
51
44
  player_Microformat_Renderer = yt_Initial_Player_Response["microformat"][
52
45
  "playerMicroformatRenderer"
53
46
  ]
54
47
  except (KeyError, TypeError, IndexError, ValueError):
55
- player_Microformat_Renderer = {} # 解析失败时,返回空字典
56
- fail.append(videoid) # 记录失败的视频 ID
57
-
48
+ player_Microformat_Renderer = {}
49
+ fail.append(videoid)
58
50
  if player_Microformat_Renderer:
59
51
  try:
60
52
  item[videoid]["description"] = player_Microformat_Renderer[
61
53
  "description"
62
54
  ]["simpleText"]
63
55
  except (KeyError, TypeError, IndexError, ValueError):
64
- item[videoid]["description"] = "" # 若没有描述,则置为空
65
- item[videoid]["pubDate"] = player_Microformat_Renderer[
66
- "publishDate"
67
- ] # 获取发布时间
56
+ item[videoid]["description"] = ""
57
+ item[videoid]["pubDate"] = player_Microformat_Renderer["publishDate"]
68
58
  item[videoid]["image"] = player_Microformat_Renderer["thumbnail"][
69
59
  "thumbnails"
70
- ][0]["url"] # 获取封面图
60
+ ][0]["url"]
71
61
  with contextlib.suppress(KeyError, TypeError, IndexError, ValueError):
72
- fail.remove(videoid) # 若成功获取,则从失败列表中移除
62
+ fail.remove(videoid)
73
63
  else:
74
- return None # 若无有效数据,返回 None
64
+ return None
75
65
 
76
- # 获取播放列表数据
77
66
  yt_initial_data = get_html_dict(
78
67
  f"https://www.youtube.com/watch?v={videoid_start}&list=UULF{youtube_key[-22:]}",
79
68
  f"{youtube_value} HTML",
80
69
  "ytInitialData",
81
- ) # 解析 YouTube 播放列表页面,获取数据
70
+ )
82
71
  if not yt_initial_data:
83
- return None # 若获取失败,则返回 None
84
-
72
+ return None
85
73
  try:
86
74
  playlists = yt_initial_data["contents"]["twoColumnWatchNextResults"][
87
75
  "playlist"
@@ -90,70 +78,74 @@ def get_youtube_html_playlists(
90
78
  "playlist"
91
79
  ]["playlist"]["ownerName"]["simpleText"]
92
80
  except (KeyError, TypeError, IndexError, ValueError):
93
- return None # 若解析失败,返回 None
94
-
95
- # 若方向是向前获取(最新视频)或没有起始视频 ID
81
+ return None
96
82
  if direction_forward or not videoid_start:
97
83
  for playlist in playlists:
98
- videoid = playlist["playlistPanelVideoRenderer"]["videoId"] # 提取视频 ID
84
+ videoid = playlist["playlistPanelVideoRenderer"]["videoId"]
99
85
  if (
100
86
  playlist["playlistPanelVideoRenderer"]["navigationEndpoint"][
101
87
  "watchEndpoint"
102
88
  ]["index"]
103
89
  == update_size
104
90
  ):
105
- break # 如果达到更新上限,则停止
106
- if videoid not in guids: # 确保视频 ID 不是已存在的
107
- title = playlist["playlistPanelVideoRenderer"]["title"][
108
- "simpleText"
109
- ] # 获取视频标题
110
- idlist.append(videoid) # 添加到 ID 列表
111
- item[videoid] = {"title": title, "yt-dlp": True} # 记录视频信息
112
- if videoid in youtube_content_ytid_original: # 若视频已在原始列表中
113
- item[videoid]["yt-dlp"] = False # 标记为已存在
91
+ break
92
+ if videoid not in guids:
93
+ title = playlist["playlistPanelVideoRenderer"]["title"]["simpleText"]
94
+ idlist.append(videoid)
95
+ item[videoid] = {
96
+ "title": title,
97
+ "yt-dlp": True,
98
+ }
99
+ if videoid in youtube_content_ytid_original:
100
+ item[videoid]["yt-dlp"] = False
114
101
  item_thread = threading.Thread(
115
- target=get_video_item, args=(videoid, youtube_value)
116
- ) # 启动线程获取详细信息
102
+ target=get_video_item,
103
+ args=(
104
+ videoid,
105
+ youtube_value,
106
+ ),
107
+ )
117
108
  item_thread.start()
118
109
  threads.append(item_thread)
119
- else: # 处理向后获取(获取较旧的视频)
110
+ else:
120
111
  reversed_playlists = []
121
112
  for playlist in reversed(playlists):
122
113
  videoid = playlist["playlistPanelVideoRenderer"]["videoId"]
123
114
  if videoid not in guids:
124
- reversed_playlists.append(playlist) # 收集未存在的旧视频
115
+ reversed_playlists.append(playlist)
125
116
  else:
126
- break # 如果找到已存在的视频 ID,则停止
127
-
117
+ break
128
118
  for playlist in reversed(reversed_playlists[-update_size:]):
129
119
  videoid = playlist["playlistPanelVideoRenderer"]["videoId"]
130
120
  title = playlist["playlistPanelVideoRenderer"]["title"]["simpleText"]
131
121
  idlist.append(videoid)
132
- item[videoid] = {"title": title, "yt-dlp": True}
122
+ item[videoid] = {
123
+ "title": title,
124
+ "yt-dlp": True,
125
+ }
133
126
  if videoid in youtube_content_ytid_original:
134
127
  item[videoid]["yt-dlp"] = False
135
128
  item_thread = threading.Thread(
136
- target=get_video_item, args=(videoid, youtube_value)
129
+ target=get_video_item,
130
+ args=(
131
+ videoid,
132
+ youtube_value,
133
+ ),
137
134
  )
138
135
  item_thread.start()
139
136
  threads.append(item_thread)
140
-
141
137
  for thread in threads:
142
- thread.join() # 等待所有线程完成
143
-
144
- # 处理获取失败的视频
138
+ thread.join()
145
139
  for videoid in fail:
146
- get_video_item(videoid, youtube_value) # 重新尝试获取失败的视频
147
-
148
- if fail: # 如果仍然有失败的视频
140
+ get_video_item(videoid, youtube_value)
141
+ if fail:
149
142
  if direction_forward or not videoid_start:
150
143
  for videoid in fail:
151
144
  print(
152
145
  f"{datetime.now().strftime('%H:%M:%S')}|{youtube_value}|{videoid} HTML无法更新, 将不获取"
153
146
  )
154
- if videoid in idlist:
155
- idlist.remove(videoid) # 安全地移除视频 ID,避免 `ValueError`
156
- del item[videoid] # 删除对应的字典项
147
+ idlist.remove(videoid)
148
+ del item[videoid]
157
149
  else:
158
150
  print(
159
151
  f"{datetime.now().strftime('%H:%M:%S')}|{youtube_value} HTML有失败只更新部分"
@@ -161,14 +153,12 @@ def get_youtube_html_playlists(
161
153
  index = len(idlist)
162
154
  for videoid in fail:
163
155
  if videoid in idlist:
164
- index = min(idlist.index(videoid), index) # 计算最早失败视频的索引
165
- idlist_fail = idlist[index:] # 截取失败的视频 ID 列表
166
- idlist = idlist[:index] # 只保留成功的视频 ID
156
+ index = min(idlist.index(videoid), index)
157
+ idlist_fail = idlist[index:]
158
+ idlist = idlist[:index]
167
159
  for videoid in idlist_fail:
168
- if videoid in idlist:
169
- idlist.remove(videoid) # 安全删除失败视频 ID
170
-
171
- return {"list": idlist, "item": item, "title": main_title} # 返回最终结果
160
+ idlist.remove(videoid)
161
+ return {"list": idlist, "item": item, "title": main_title}
172
162
 
173
163
 
174
164
  def get_youtube_shorts_id(youtube_key, youtube_value):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: podflow
3
- Version: 2025.1.26
3
+ Version: 20250126.post2
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
@@ -1,6 +1,6 @@
1
1
  Podflow/__init__.py,sha256=fkPG1o_2qAA_qeUgBPs9FPWc5-7p8WuQ-h2FqrgsZS4,6803
2
- Podflow/ffmpeg_judge.py,sha256=krttVs1PDot_0CDq5rmtUIpchiaiqtAkPYFQRLG6OQM,1275
3
- Podflow/main.py,sha256=wIpxvDoC62Feeig43GU8VmJ557MFJ1tsLAwP3llHdJo,9757
2
+ Podflow/ffmpeg_judge.py,sha256=92YUVmdWYpZ3vyz9tdC98S3LMHwmHdVmctYcRFMZfGQ,1114
3
+ Podflow/main.py,sha256=p7AUhMSEocPgfFskFtq3gjWimCLrQCMbA4UqvXvyRig,9697
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
@@ -15,7 +15,7 @@ Podflow/basic/split_dict.py,sha256=rxwsGuzBWXJ8nDxcxYI-BqeeccyDTsw011tjkT8rZwI,4
15
15
  Podflow/basic/time_format.py,sha256=Rddq-5wQgo6IrgiMlcMgDA52vQnMvWZvZC8g1Bj3BaQ,487
16
16
  Podflow/basic/time_stamp.py,sha256=vf0p6FIK2-ZN2p2sotbpf4dewQMy-Vior-aREYfT0Zc,1888
17
17
  Podflow/basic/vary_replace.py,sha256=aecFDuAOvQjTpgtoSW5uDu8Tx_YTs4bCFF9imVFkfVY,211
18
- Podflow/basic/write_log.py,sha256=Sm6qzTSb1x6X2uQnnmVD4dU6BsY1PONxenwsWAdFxso,1358
18
+ Podflow/basic/write_log.py,sha256=uhyKdsmHPcpeUc_Uuw9fuw_9qjl2RgX3M00vM8Vwmbw,1360
19
19
  Podflow/bilibili/__init__.py,sha256=ekvpCzR4bg6ar73Gq0YWQcPXND4TEqP46pb9iLyke9g,47
20
20
  Podflow/bilibili/build.py,sha256=G-MhhURoTRmGNJGRySltraFsslIEDtJxhL93_DnqlfY,7948
21
21
  Podflow/bilibili/get.py,sha256=PXPh_H8B_zP9dhqe6sA_QCeJcdnriBCpbF7mPq46xMw,20337
@@ -31,7 +31,7 @@ Podflow/config/get_config.py,sha256=xM_C1Vk5EUAdPKwR7guPSo2IVR_QOZ-EFHfbmtMtm30,
31
31
  Podflow/download/__init__.py,sha256=1TgjbOdcnnPTBMXpzqaazcN50EUomBW0zHN0wXAa3cM,47
32
32
  Podflow/download/convert_bytes.py,sha256=33Fgeyt-yEmysFZaj23tGtjUkUtHuKZohRKR4TxOxyg,543
33
33
  Podflow/download/delete_part.py,sha256=G9lK8G8tOOmnEBmAHJKPdqPeLhJ61S5m8o6iL5g9SyE,679
34
- Podflow/download/dl_aideo_video.py,sha256=DDB03WfBzqHW9NOozGN6gj4BwG4jyiW79-_fbfVBX9c,9998
34
+ Podflow/download/dl_aideo_video.py,sha256=6PpzQF1sdGU24ruq0g3olLAWM_nVyPQ2dFp05wvJCUA,9916
35
35
  Podflow/download/show_progress.py,sha256=7oGzhj_frO2A1o5JeGuHn7bHtma5oPpD_IWcctIO2rs,1595
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
@@ -53,7 +53,7 @@ Podflow/message/get_original_rss.py,sha256=CK_Q5enOzUafgL2l5OlXBpC08Nj_B7AKPzw5D
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
56
- Podflow/message/media_format.py,sha256=WH0NnjWPLigU8Wy2kbqDIhj_RISnaCCXtsR5qIjLFdU,7346
56
+ Podflow/message/media_format.py,sha256=zCiUixdk5ZvZz9J0OS3BFw8sHPgR3Jdb1tu7aLLg9uU,6948
57
57
  Podflow/message/original_rss_fail_print.py,sha256=pVVb_BGM1HofHDh9pCX5GS03gOnNAssfHDjj5Ytz_mw,502
58
58
  Podflow/message/rss_create_hash.py,sha256=NODhtprDPkpiuiezupARKm5Xr4Zt2Io_lcxmHedPAQc,638
59
59
  Podflow/message/title_correction.py,sha256=JR2q3PubOUUAfQEPjIzeRzUe4Jy86opGIO1st51qt2g,915
@@ -70,11 +70,11 @@ 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
72
  Podflow/youtube/__init__.py,sha256=-bdMyuw-wxoz2miVkp284amS4Qg0k7VN0JPuGF-cXlM,46
73
- Podflow/youtube/build.py,sha256=y1R5KI_R8ydYjjxZKvMtNaHUiyMm4iBa-MIEMbA92FY,11210
74
- Podflow/youtube/get.py,sha256=Yf6DPH2cLpNTMbwLTweXW9_Vc4zC8pJaZVzk__XENWo,16972
73
+ Podflow/youtube/build.py,sha256=PnRr_nI_DIMDF0IPZUIuO8mJBB57FS-VZNTYHVzRQKI,10143
74
+ Podflow/youtube/get.py,sha256=Frk7NMAUpqyeoCHBplTu6P3C9lHXyMmnyUg3XxSuUnw,15171
75
75
  Podflow/youtube/login.py,sha256=DlS_ZG4g6CKWqS5ojE4UwFJSCSZDsXbeuDVgHtQAa4A,1380
76
- podflow-2025.1.26.dist-info/METADATA,sha256=74BRC36R3SwJAEoK71489emsBqSP2YnDuhlIIyaSJg4,13802
77
- podflow-2025.1.26.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
78
- podflow-2025.1.26.dist-info/entry_points.txt,sha256=44nj8jJB7bo1JLNrKQZmwMGEA1OalrALJ0tF_G0yXLY,131
79
- podflow-2025.1.26.dist-info/top_level.txt,sha256=KcvRCiz_DRWWc9i-PgpARvFB0J4CKmpZOZgPqOdG-Lk,8
80
- podflow-2025.1.26.dist-info/RECORD,,
76
+ podflow-20250126.post2.dist-info/METADATA,sha256=CRsNtMgsew5qyjAq3L_oWLqHSmqNEXgr8qXSdVEcygg,13807
77
+ podflow-20250126.post2.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
78
+ podflow-20250126.post2.dist-info/entry_points.txt,sha256=44nj8jJB7bo1JLNrKQZmwMGEA1OalrALJ0tF_G0yXLY,131
79
+ podflow-20250126.post2.dist-info/top_level.txt,sha256=KcvRCiz_DRWWc9i-PgpARvFB0J4CKmpZOZgPqOdG-Lk,8
80
+ podflow-20250126.post2.dist-info/RECORD,,