podflow 20250404.8__py3-none-any.whl → 20250405__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,6 @@ class Application_gVar:
125
125
  "http": [], # httpfs窗口信息列表
126
126
  "enter": True, # 是否换行
127
127
  }
128
- self.text_message = [] # 测试
129
128
 
130
129
 
131
130
  # 参数变量
@@ -35,8 +35,5 @@ def time_print(text, Top=False, NoEnter=False, Time=True, Url=""):
35
35
  gVar.index_message["enter"] = True
36
36
  if Url:
37
37
  gVar.index_message["podflow"].append(
38
- f'<a href="{Url}"><span class="ansi-url">{Url}</span></a>'
38
+ f'<a href="{Url}" target="_blank"><span class="ansi-url">{Url}</span></a>'
39
39
  )
40
- gVar.text_message.append(
41
- [text, Top, NoEnter]
42
- )
@@ -2,6 +2,7 @@
2
2
  # coding: utf-8
3
3
 
4
4
  import os
5
+ import re
5
6
  import ffmpeg
6
7
  import yt_dlp
7
8
  from podflow import gVar
@@ -68,22 +69,22 @@ def download_video(
68
69
  ydl.download([f"{video_website}"]) # 下载指定视频链接的视频
69
70
  return None, None
70
71
  except Exception as download_video_error:
71
- fail_info = fail_message_initialize(download_video_error, video_url).replace("\n","")
72
+ fail_info = fail_message_initialize(download_video_error, video_url).replace(
73
+ "\n", ""
74
+ )
72
75
  remove_info = ""
73
- if fail_info in [
74
- "",
75
- "\033[31m请求拒绝\033[0m",
76
- "\033[31m数据不完整\033[0m",
77
- "\033[31m传输中断\033[0m",
78
- "\033[31m请求超时\033[0m",
79
- "\033[31m响应超时\033[0m",
80
- ] and "www.youtube.com" in video_website:
76
+ if (
77
+ fail_info == ""
78
+ or re.search(r"请求拒绝|数据不完整|传输中断|请求超时|响应超时", fail_info)
79
+ ) and "www.youtube.com" in video_website:
80
+ if fail_info != "":
81
+ remove_info = "|"
81
82
  if os.path.isfile(outtmpl):
82
83
  os.remove(outtmpl)
83
- remove_info = "|已删除失败文件"
84
+ remove_info += "已删除失败文件"
84
85
  elif os.path.isfile(outtmpl + ".part"):
85
86
  os.remove(outtmpl + ".part")
86
- remove_info = "|已删除部分失败文件"
87
+ remove_info += "已删除部分失败文件"
87
88
  write_log(
88
89
  f"{video_write_log} \033[31m下载失败\033[0m",
89
90
  None,
@@ -124,15 +125,12 @@ def dl_full_video(
124
125
  f"channel_audiovisual/{output_dir}/{video_url}{sesuffix}.{output_format}"
125
126
  ) # 获取已下载视频的实际时长
126
127
  if (
127
- duration_video is not None
128
- and abs(id_duration - duration_video) <= 1
128
+ duration_video is not None and abs(id_duration - duration_video) <= 1
129
129
  ): # 检查实际时长与预计时长是否一致
130
130
  return None, None
131
131
  if duration_video:
132
132
  fail_info = f"不完整({id_duration}|{duration_video}"
133
- write_log(
134
- f"{video_write_log} \033[31m下载失败\033[0m\n错误信息: {fail_info})"
135
- )
133
+ write_log(f"{video_write_log} \033[31m下载失败\033[0m\n错误信息: {fail_info})")
136
134
  os.remove(
137
135
  f"channel_audiovisual/{output_dir}/{video_url}{sesuffix}.{output_format}"
138
136
  ) # 删除不完整的视频
@@ -176,7 +174,9 @@ def dl_retry_video(
176
174
  cookies = "channel_data/yt_dlp_youtube.txt"
177
175
  video_id_count += 1
178
176
  if cookies:
179
- write_log(f"{video_write_log} 第\033[34m{video_id_count}\033[0m次重新下载 🍪")
177
+ write_log(
178
+ f"{video_write_log} 第\033[34m{video_id_count}\033[0m次重新下载 🍪"
179
+ )
180
180
  else:
181
181
  write_log(f"{video_write_log} 第\033[34m{video_id_count}\033[0m次重新下载")
182
182
  video_id_failed, _ = dl_full_video(
@@ -298,10 +298,7 @@ def dl_aideo_video(
298
298
  audio, video, output_file, vcodec="copy", acodec="copy"
299
299
  )
300
300
  ffmpeg.run(stream, quiet=True)
301
- time_print(
302
- " \033[32m合成成功\033[0m",
303
- Time=False
304
- )
301
+ time_print(" \033[32m合成成功\033[0m", Time=False)
305
302
  # 删除临时文件
306
303
  os.remove(f"channel_audiovisual/{output_dir}/{video_url}.part.mp4")
307
304
  os.remove(f"channel_audiovisual/{output_dir}/{video_url}.part.m4a")
@@ -3,6 +3,7 @@
3
3
 
4
4
  import os
5
5
  import hashlib
6
+ import mimetypes
6
7
  import pkg_resources
7
8
  from datetime import datetime
8
9
  import cherrypy
@@ -203,7 +204,21 @@ class bottle_app:
203
204
  # 如果文件存在, 返回文件
204
205
  if os.path.exists(filename): # 如果文件存在, 返回文件
205
206
  self.print_out(filename, 200)
206
- return static_file(filename, root=".")
207
+ # 设置正确的 Content-Type 头部
208
+ content_type, _ = mimetypes.guess_type(filename)
209
+ # 如果无法自动猜测出正确的 Content-Type,手动指定
210
+ if not content_type:
211
+ if filename.endswith(".xml"):
212
+ content_type = "application/xml"
213
+ elif filename.endswith(".m4a"):
214
+ content_type = "audio/mp4"
215
+ elif filename.endswith(".mp4"):
216
+ content_type = "video/mp4"
217
+ else:
218
+ content_type = "application/octet-stream" # 默认文件类型
219
+
220
+ # 返回静态文件并附加正确的 Content-Type
221
+ return static_file(filename, root=".", mimetype=content_type)
207
222
  else: # 如果文件不存在, 返回 404 错误
208
223
  self.print_out(filename, 404)
209
224
  abort(404, "File not found")
podflow/main_podcast.py CHANGED
@@ -210,7 +210,27 @@ def main_podcast():
210
210
  update_upload()
211
211
  else:
212
212
  time_print("频道无更新内容")
213
-
213
+ # 清空变量内数据
214
+ gVar.channelid_youtube_ids_update.clear() # 需更新的YouTube频道字典
215
+ gVar.youtube_content_ytid_update.clear() # 需下载YouTube视频字典
216
+ gVar.youtube_content_ytid_backward_update.clear() # 向后更新需下载YouTube视频字典
217
+ gVar.channelid_youtube_rss.clear() # YouTube频道最新Rss Response字典
218
+ gVar.channelid_bilibili_ids_update.clear() # 需更新的哔哩哔哩频道字典
219
+ gVar.bilibili_content_bvid_update.clear() # 需下载哔哩哔哩视频字典
220
+ gVar.channelid_bilibili_rss.clear() # 哔哩哔哩频道最新Rss Response字典
221
+ gVar.bilibili_content_bvid_backward_update.clear() # 向后更新需下载哔哩哔哩视频字典
222
+ gVar.video_id_failed.clear() # YouTube&哔哩哔哩视频下载失败列表
223
+ gVar.video_id_update_format.clear() # YouTube&哔哩哔哩视频下载的详细信息字典
224
+ gVar.hash_rss_original = "" # 原始rss哈希值文本
225
+ gVar.xmls_original.clear() # 原始xml信息字典
226
+ gVar.xmls_original_fail.clear() # 未获取原始xml频道列表
227
+ gVar.youtube_xml_get_tree.clear() # YouTube频道简介和图标字典
228
+ gVar.all_youtube_content_ytid.clear() # 所有YouTube视频id字典
229
+ gVar.all_bilibili_content_bvid.clear() # 所有哔哩哔哩视频id字典
230
+ gVar.all_items.clear() # 更新后所有item明细列表
231
+ gVar.overall_rss = "" # 更新后的rss文本
232
+ gVar.make_up_file_format.clear() # 补全缺失媒体字典
233
+ gVar.make_up_file_format_fail.clear() # 补全缺失媒体失败字典
214
234
  # 将需要更新转为否
215
235
  gVar.update_generate_rss = False
216
236
  if parse.update_num != -1:
@@ -232,9 +252,5 @@ def main_podcast():
232
252
  # 延时
233
253
  time.sleep(parse.time_delay)
234
254
  # 关闭CherryPy服务器
235
- cherrypy.engine.exit()
236
255
  time_print("Podflow运行结束")
237
-
238
- from podflow.basic.file_save import file_save
239
- file_save(gVar.text_message, "text.json")
240
- file_save(gVar.index_message, "index.json")
256
+ cherrypy.engine.exit()
@@ -169,4 +169,6 @@ def fail_message_initialize(message_error, video_url):
169
169
  elif mode == "regexp" and re.search(fail_info, fail_message):
170
170
  fail_message = re.sub(rf"{fail_info}", field, fail_message)
171
171
  break
172
+ if fail_message[0] == "\n":
173
+ fail_message = fail_message[1:]
172
174
  return fail_message
@@ -151,6 +151,9 @@
151
151
  overflow-x: auto; /* 当内容超出宽度时显示水平滚动条(可选) */
152
152
  overflow-y: auto;
153
153
  font-family: 'Courier New', Courier, monospace; /* 添加字体 */
154
+ word-break: break-word;
155
+ overflow-wrap: break-word;
156
+ white-space: pre-wrap; /* 保留换行并允许自动换行 */
154
157
  }
155
158
  textarea {
156
159
  height: 350px;
@@ -222,6 +225,11 @@
222
225
  nav {
223
226
  position: fixed;
224
227
  }
228
+ /* 确保页面宽度不会超出视口 */
229
+ body, html {
230
+ width: 100%;
231
+ overflow-x: hidden;
232
+ }
225
233
  }
226
234
  .message {
227
235
  padding: 0px;
@@ -312,9 +320,17 @@
312
320
  if (node.nodeType === Node.ELEMENT_NODE) {
313
321
  if (node.classList.contains('qrcode-container')) {
314
322
  generateQRCodeForNode(node);
323
+ // 在生成二维码后,检查是否需要滚动
324
+ if (!userScrolled && container.scrollHeight - container.scrollTop <= container.clientHeight + 10) {
325
+ container.scrollTop = container.scrollHeight;
326
+ }
315
327
  } else {
316
328
  const childContainers = node.querySelectorAll('.qrcode-container');
317
329
  childContainers.forEach(generateQRCodeForNode);
330
+ // 在生成二维码后,检查是否需要滚动
331
+ if (!userScrolled && container.scrollHeight - container.scrollTop <= container.clientHeight + 10) {
332
+ container.scrollTop = container.scrollHeight;
333
+ }
318
334
  }
319
335
  }
320
336
  });
@@ -343,6 +359,7 @@
343
359
 
344
360
  // 监听 messageArea 内动态新增的二维码容器
345
361
  observeQRCodes(messageArea);
362
+ observeQRCodes(messageHttp); // Also observe for messageHttp
346
363
 
347
364
  // 菜单切换函数
348
365
  function toggleMenu() {
@@ -381,8 +398,8 @@
381
398
  // 监听滚动事件,检测用户是否手动滚动
382
399
  function onUserScroll(event) {
383
400
  const element = event.target;
384
- // 判断是否接近底部
385
- const nearBottom = element.scrollHeight - element.scrollTop <= element.clientHeight + 10;
401
+ // 判断是否接近底部,增加一定的容差值
402
+ const nearBottom = element.scrollHeight - element.scrollTop <= element.clientHeight + 20;
386
403
  userScrolled = !nearBottom;
387
404
  }
388
405
 
@@ -404,56 +421,54 @@
404
421
  .catch(error => console.error('获取消息失败:', error));
405
422
  }
406
423
 
424
+ function createMessageElement(message) {
425
+ const p = document.createElement('p');
426
+ p.innerHTML = message;
427
+ p.className = 'message';
428
+ return p;
429
+ }
430
+
407
431
  function appendMessages(container, newMessages, oldMessages) {
408
432
  // 判断当前是否在底部
409
- const isAtBottom = container.scrollHeight - container.scrollTop <= container.clientHeight + 10;
410
-
411
- // 只追加新数据,避免重复渲染
433
+ const wasAtBottom = container.scrollHeight - container.scrollTop <= container.clientHeight + 10;
434
+
435
+ // 当两数组长度相等且有内容时,只比较最后一项
412
436
  if (newMessages.length === oldMessages.length && newMessages.length > 0) {
413
437
  const lastNewMessage = newMessages[newMessages.length - 1];
414
438
  const lastOldMessage = oldMessages[oldMessages.length - 1];
415
439
  if (lastNewMessage !== lastOldMessage) {
416
- const p = document.createElement('p');
417
- p.innerHTML = lastNewMessage;
418
- p.className = 'message'; // 添加 CSS 类名
419
-
420
- // 获取容器的最后一个子元素
440
+ const p = createMessageElement(lastNewMessage);
421
441
  const lastChild = container.lastElementChild;
422
- // 如果容器有子元素,则替换最后一个
423
442
  if (lastChild) {
424
443
  container.replaceChild(p, lastChild);
425
444
  } else {
426
- // 如果容器为空,则直接添加
427
445
  container.appendChild(p);
428
446
  }
429
447
  }
430
448
  } else {
431
- // 如果 newMessages oldMessages 元素数量不一致,则执行原来的添加逻辑
449
+ // 如果 newMessages oldMessages 数量不一致
450
+ // 先替换容器中最后一项为 newMessages 中对应位置的消息(若 oldMessages 存在数据)
451
+ if (oldMessages.length > 0) {
452
+ const replaceIndex = oldMessages.length - 1;
453
+ const p = createMessageElement(newMessages[replaceIndex]);
454
+ const lastChild = container.lastElementChild;
455
+ if (lastChild) {
456
+ container.replaceChild(p, lastChild);
457
+ } else {
458
+ container.appendChild(p);
459
+ }
460
+ }
461
+ // 再追加从 oldMessages.length 开始的后续消息
432
462
  newMessages.slice(oldMessages.length).forEach(msg => {
433
- const p = document.createElement('p');
434
- p.innerHTML = msg;
435
- p.className = 'message'; // 添加 CSS 类名
436
- container.appendChild(p);
463
+ container.appendChild(createMessageElement(msg));
437
464
  });
438
465
  }
439
-
440
- // 替换倒数第二项和倒数第三项
441
- for (let i = 2; i <= 3; i++) {
442
- const child = container.children[container.children.length - (i + 1)];
443
- if (child && newMessages.length > i) {
444
- const newMessage = newMessages[newMessages.length - (i + 1)];
445
- const p = document.createElement('p');
446
- p.innerHTML = newMessage;
447
- p.className = 'message'; // 添加 CSS 类名
448
- container.replaceChild(p, child);
449
- }
450
- }
451
-
452
- // 如果用户没有主动滚动,才自动滚动到底部
453
- if (!userScrolled) {
466
+
467
+ // 如果之前在底部且用户没有主动滚动,则自动滚动到底部
468
+ if (wasAtBottom && !userScrolled) {
454
469
  container.scrollTop = container.scrollHeight;
455
470
  }
456
- }
471
+ }
457
472
 
458
473
  function startMessagePolling() {
459
474
  getMessages();
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: podflow
3
- Version: 20250404.8
3
+ Version: 20250405
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,8 +1,8 @@
1
- podflow/__init__.py,sha256=-12IeezgxSWsT1HfVomg8dGSMq3mDi0SqCRMRZQtByY,7263
1
+ podflow/__init__.py,sha256=N8hpfDHmVdVyDQs50yt_EMscS2v6CTD5a8oBWUkUOf0,7222
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=ViZ-J2kCfjAmF5l5GMp8z4qOGpyvEvDGVesQCAcS2mE,9176
5
+ podflow/main_podcast.py,sha256=0WXZpltTQ5InKnPt5LlIWK1dNbt8v2QE_vWVR5td7Cc,10680
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
@@ -16,7 +16,7 @@ podflow/basic/list_merge_tidy.py,sha256=7hWfSnsPh23edHNU92vxtI0nfpfN8m54GTEt2rGm
16
16
  podflow/basic/qr_code.py,sha256=BQFxAx55vqWECTwWgybyXu3IuDFavpc3zMCmZ4XvKKE,1630
17
17
  podflow/basic/split_dict.py,sha256=Ir6GTortcWMUeFITFgY1v-INMla5y0IN3RN3nTgzWqM,401
18
18
  podflow/basic/time_format.py,sha256=T3tw2vbOwxMYYXDaV4Sj76WOZtsspj2lWA_DzWqUEJA,487
19
- podflow/basic/time_print.py,sha256=dtXXszwpXbHvgAcc_Y5JYlpKeKDCNdFrqU0eAYYD54U,1237
19
+ podflow/basic/time_print.py,sha256=QWp8h7SV5RGMXtVPF4BUPVD9f5ht8iBCMkLJCw7GymA,1188
20
20
  podflow/basic/time_stamp.py,sha256=Kbz9PzgPtss1fRqPXdfz1q6MTGVMRi3LPClN7wrXSIk,1888
21
21
  podflow/basic/vary_replace.py,sha256=-TyvZxfak6U7Ak8F87ctYUBpHB2Il6iYZof37lwKjto,211
22
22
  podflow/basic/write_log.py,sha256=wfiNfFuRLCWNLXDRNPVaVsKxwB44xxTiCFJ66g71XmU,1255
@@ -35,12 +35,12 @@ podflow/config/get_config.py,sha256=TpLbh5GoPO7csWUJ-di65XXnkN3LSnMXkFw85h5ndHs,
35
35
  podflow/download/__init__.py,sha256=1lATXiOAEx5oDUDR99mQRiTrQlQ9CQkJNAKpsLrnPCo,47
36
36
  podflow/download/convert_bytes.py,sha256=6Q3TcPGzCO2FlhOKWbp9RB_GPmfuyKY5suIyE9EJf6k,543
37
37
  podflow/download/delete_part.py,sha256=wjY6WulpUMjLx38on0kTLXj0gA04rIuKAdwFidZtWGU,679
38
- podflow/download/dl_aideo_video.py,sha256=LxA_Nt51ZG2MaIyVOi5CyDH7PA-EONxxAVW1wO8i4vE,10344
38
+ podflow/download/dl_aideo_video.py,sha256=U9dVYi7TviB987bOWleNHvjnQWIiesflrhkQiFvU_hQ,10273
39
39
  podflow/download/show_progress.py,sha256=w_nzq6LbewXpFwXENQwbA5-L-j3XDqzfQSMU7E_CWxs,1716
40
40
  podflow/download/wait_animation.py,sha256=AUTvszXF89QA7XYjocFIauPKV7Qj8cFqry44teClaLQ,1314
41
41
  podflow/download/youtube_and_bilibili_download.py,sha256=dlUh9cPHrYgZAhtXlBUOdFIpZOhv9xOtgdcTaqUvLuY,1294
42
42
  podflow/httpfs/__init__.py,sha256=BxEXkufjcx-a0F7sDVXo65hmyANqCCbZUd6EH9i8T2c,45
43
- podflow/httpfs/app_bottle.py,sha256=jHgRxvJdt3Gh0KBWlzR_pwdfgy_-vQRFNWXvbwYLObY,16787
43
+ podflow/httpfs/app_bottle.py,sha256=l2myMkoRoC5O7OWCyYjCmk7wOEIlgTWfFfImlhXMYwY,17614
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
@@ -54,7 +54,7 @@ podflow/message/__init__.py,sha256=pZkcrrtkdtxgMriEHBZ0_rptKaQrQeMPJvPSaoI1Awo,4
54
54
  podflow/message/backup_zip_save.py,sha256=0SIxVvAtgSWAr_TvdXLVDIpxvXOHeFUN8n8QzfnIB84,1740
55
55
  podflow/message/create_main_rss.py,sha256=g2DZGLf81yUsLCpiB8QVaxSxqhJ5lVeC43ndRiCbodg,2999
56
56
  podflow/message/display_qrcode_and_url.py,sha256=VqmRkDYYG03VihfW4SAU49HJVmfqWbLTgMxqCaREeCo,1037
57
- podflow/message/fail_message_initialize.py,sha256=jIGzL0hXg3JRq7leB7nFeRFOkjnkDn-Kyco7r-w-bTY,6299
57
+ podflow/message/fail_message_initialize.py,sha256=3rFpRPXopLGNmSq88ODyQe15bu-T-Iiz9CUMeC-RAQ0,6371
58
58
  podflow/message/format_time.py,sha256=gveNh4FGeS3ytwDyYB-h12d1_Km6XoX7WSPcFmDfCBk,909
59
59
  podflow/message/get_media_name.py,sha256=5ULPQOQCZ2-lxdkILwlBP-ItzdFEgvEAKxeLtplACbQ,861
60
60
  podflow/message/get_original_rss.py,sha256=PYA7UGhHXbUN66vWmxWOp5Ns423CopHxw4vR19zXaPs,2383
@@ -80,7 +80,7 @@ podflow/remove/remove_dir.py,sha256=xQIhrnqnYjMzXjoSWaTvm7JwPYOFTN1muuTPdaLDXpQ,
80
80
  podflow/remove/remove_file.py,sha256=8wAJQehs-XBqvu0vPlEme2_tt0FZxc5ELwGMxXA_558,982
81
81
  podflow/repair/__init__.py,sha256=Gpc1i6xiSLodKjjmzH66c_Y1z0HQ9E9CS3p95FRnVFM,45
82
82
  podflow/repair/reverse_log.py,sha256=Wc_vAH0WB-z1fNdWx7FYaVH4caRPtot7tDwDwFhmpz4,1106
83
- podflow/templates/index.html,sha256=cb2qoU7xienWiZ02O0n_uoQOtwq0KCNML5xYGqsghmM,18014
83
+ podflow/templates/index.html,sha256=Hiojlu48ebZKYSgTSTc_UAId4HIAu59gFakKnYW_-r4,18778
84
84
  podflow/upload/__init__.py,sha256=AtOSXDrE5EjUe3z-iBd1NTDaH8n_X9qA5WXdBLkONjA,45
85
85
  podflow/upload/add_upload.py,sha256=_2-V0z75Lwu-PUCfMD9HOSxZTB102yZlZW5hSdlHcsc,1432
86
86
  podflow/upload/build_hash.py,sha256=9opa3xLd7nJbGGX5xa3uuKPS6dxlbkAb87ZdEiUxmxI,473
@@ -95,8 +95,8 @@ podflow/youtube/__init__.py,sha256=pgXod8gq0IijZxIkPSwgAOcb9JI5rd1mqMomoR7bcJ4,4
95
95
  podflow/youtube/build.py,sha256=3LYk_ICVXj9XkE9jZ8jEVI8596xxS_QZkcoIwcBE3Ys,12006
96
96
  podflow/youtube/get.py,sha256=Of7PRgUknhpyW70nvyVAUYVb5KyFViKiBTfH3Y6Mke8,16970
97
97
  podflow/youtube/login.py,sha256=KYl--ya6Z1u0uIcOp9l8i3DIIj9hsYUDH4dtJjI0MLM,1295
98
- podflow-20250404.8.dist-info/METADATA,sha256=Z0RBsVpwwdyYZk8f72jeGN-iRlgwGOL5OF1cSsrcIRQ,14165
99
- podflow-20250404.8.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
100
- podflow-20250404.8.dist-info/entry_points.txt,sha256=mn7hD_c_dmpKe3XU0KNekheBvD01LhlJ9htY-Df0j2A,131
101
- podflow-20250404.8.dist-info/top_level.txt,sha256=fUujhhz-RrMI8aGvi-3Ey5y7FQnpOOgoFw9OWM3yLCU,8
102
- podflow-20250404.8.dist-info/RECORD,,
98
+ podflow-20250405.dist-info/METADATA,sha256=Wk84DRVfITCP0CrsBEsL-njqoO8KmqghfST3W5nLzkA,14163
99
+ podflow-20250405.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
100
+ podflow-20250405.dist-info/entry_points.txt,sha256=mn7hD_c_dmpKe3XU0KNekheBvD01LhlJ9htY-Df0j2A,131
101
+ podflow-20250405.dist-info/top_level.txt,sha256=fUujhhz-RrMI8aGvi-3Ey5y7FQnpOOgoFw9OWM3yLCU,8
102
+ podflow-20250405.dist-info/RECORD,,