podflow 20250630__py3-none-any.whl → 20250703__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
@@ -117,10 +117,11 @@ class Application_gVar:
117
117
  self.make_up_file_format = {} # 补全缺失媒体字典
118
118
  self.make_up_file_format_fail = {} # 补全缺失媒体失败字典
119
119
 
120
- self.upload_original = [] # 原始上传信息字典
120
+ self.upload_original = [] # 原始上传信息列表
121
121
  self.upload_data = {} # 上传用户账号密码字典
122
122
  self.upload_json = {} # 上传登陆账号密码字典
123
123
  self.upload_stop = False # 上传停止布尔值
124
+ self.upload_message = [] # 上传用户媒体信息列表
124
125
 
125
126
  self.shortcuts_url = {} # 输出至shortcut的url字典
126
127
 
@@ -21,6 +21,7 @@ from podflow.upload.time_key import check_time_key
21
21
  from podflow.basic.folder_build import folder_build
22
22
  from podflow.httpfs.get_channelid import get_channelid
23
23
  from podflow.basic.random_sequence import random_sequence
24
+ from podflow.upload.store_users_info import store_users_info
24
25
 
25
26
 
26
27
  class bottle_app:
@@ -391,11 +392,23 @@ class bottle_app:
391
392
  }
392
393
  # 获取实际的文件句柄
393
394
  uploadfile_obj = upload_file.file
395
+ # 去除临时文件模块
396
+ def close_file():
397
+ if (
398
+ upload_file
399
+ and hasattr(upload_file, "file")
400
+ and not upload_file.file.closed
401
+ ):
402
+ try:
403
+ upload_file.file.close()
404
+ except Exception:
405
+ pass
394
406
  # 判断文件是否完整
395
407
  uploadfile_obj.seek(0) # 确保从文件开头计算哈希
396
408
  uploadfile_hash = build_hash(uploadfile_obj)
397
409
  if upload_hash != uploadfile_hash:
398
410
  self.print_out("upload", 401)
411
+ close_file()
399
412
  return {
400
413
  "code": -5,
401
414
  "message": "Incomplete File", # 文件不完整
@@ -418,6 +431,8 @@ class bottle_app:
418
431
  original_file.seek(0)
419
432
  if upload_hash == build_hash(original_file):
420
433
  self.print_out("upload same", 200)
434
+ store_users_info(username,filename)
435
+ close_file()
421
436
  return {
422
437
  "code": 1,
423
438
  "message": "The Same File Exists", # 相同文件已存在
@@ -437,6 +452,8 @@ class bottle_app:
437
452
  ) # 传递文件对象
438
453
  # 打印成功信息并返回成功码
439
454
  self.print_out("upload", 200)
455
+ store_users_info(username,filename)
456
+ close_file()
440
457
  return {
441
458
  "code": 0,
442
459
  "message": "Upload Success", # 上传成功
@@ -458,7 +475,10 @@ class bottle_app:
458
475
  and hasattr(upload_file, "file")
459
476
  and not upload_file.file.closed
460
477
  ):
461
- upload_file.file.close()
478
+ try:
479
+ upload_file.file.close()
480
+ except Exception:
481
+ pass
462
482
  else:
463
483
  num = 0
464
484
  while True:
@@ -475,6 +495,7 @@ class bottle_app:
475
495
  original_file.seek(0)
476
496
  if upload_hash == build_hash(original_file):
477
497
  self.print_out("upload same", 200)
498
+ store_users_info(username,filename)
478
499
  return {
479
500
  "code": 1,
480
501
  "message": "The Same File Exists", # 相同文件已存在
podflow/main_podcast.py CHANGED
@@ -72,17 +72,17 @@ def main_podcast():
72
72
  # 初始化
73
73
  build_original()
74
74
  # http共享
75
- port = gVar.config.get("port", 8000) # 使用 .get 获取端口
75
+ port = gVar.config.get("port", 8000) # 使用 .get 获取端口
76
76
  hostip = "0.0.0.0"
77
77
 
78
- if port_judge(hostip, port): # 假设 port_judge 存在
78
+ if port_judge(hostip, port): # 假设 port_judge 存在
79
79
  # 设置路由 (确保此时 gVar.config 等已就绪)
80
- bottle_app_instance.setup_routes(upload=False) # 或者根据需要设置为 True
80
+ bottle_app_instance.setup_routes(upload=False) # 或者根据需要设置为 True
81
81
 
82
82
  # 设置logname
83
83
  bottle_app_instance.set_logname(
84
84
  logname="httpfs.log",
85
- http_fs=gVar.config.get("httpfs", False), # 使用 .get
85
+ http_fs=gVar.config.get("httpfs", False), # 使用 .get
86
86
  )
87
87
 
88
88
  # 启动 CherryPy 服务器
@@ -99,7 +99,7 @@ def main_podcast():
99
99
  "log.access_file": "", # 关闭访问日志
100
100
  "log.error_file": "", # 关闭错误日志
101
101
  # 添加线程池配置,对于长连接 (SSE) 可能有帮助
102
- 'server.thread_pool': 30 # 示例值,根据需要调整
102
+ "server.thread_pool": 30, # 示例值,根据需要调整
103
103
  }
104
104
  }
105
105
  )
@@ -122,7 +122,7 @@ def main_podcast():
122
122
  gVar.server_process_print_flag[0] = "pause"
123
123
  # 获取YouTube cookie
124
124
  gVar.youtube_cookie = get_youtube_cookie(gVar.channelid_youtube_ids_original)
125
- progress_update(0.01 ,num=0.0049)
125
+ progress_update(0.01, num=0.0049)
126
126
  # 更新哔哩哔哩data
127
127
  gVar.channelid_bilibili_ids, gVar.bilibili_data = get_bilibili_data(
128
128
  gVar.channelid_bilibili_ids_original
@@ -131,7 +131,9 @@ def main_podcast():
131
131
  # 恢复进程打印
132
132
  bottle_app_instance.cherry_print()
133
133
  # 获取原始xml字典和rss文本
134
- gVar.xmls_original, gVar.hash_rss_original, gVar.xmls_original_fail = get_original_rss()
134
+ gVar.xmls_original, gVar.hash_rss_original, gVar.xmls_original_fail = (
135
+ get_original_rss()
136
+ )
135
137
  progress_update(0.025, num=-0.0024)
136
138
  # 暂停进程打印
137
139
  gVar.server_process_print_flag[0] = "pause"
@@ -147,15 +149,10 @@ def main_podcast():
147
149
  # 初始化原始上传信息
148
150
  get_upload_original()
149
151
  progress_update(0.04)
150
-
151
152
  # 如果有上传服务器,则启动上传线程
152
153
  if upload_url:
153
- thread_upload = threading.Thread(
154
- target=all_upload,
155
- args=(upload_url,)
156
- )
154
+ thread_upload = threading.Thread(target=all_upload, args=(upload_url,))
157
155
  thread_upload.start()
158
-
159
156
  # 更新Youtube和哔哩哔哩频道xml
160
157
  update_youtube_bilibili_rss()
161
158
  progress_update(0.1)
@@ -198,11 +195,9 @@ def main_podcast():
198
195
  # 下载并构建YouTube和哔哩哔哩视频
199
196
  download_and_build()
200
197
  progress_update(0.8)
201
-
202
198
  # 如果有上传服务器,则等待上传线程完成
203
199
  if upload_url:
204
200
  thread_upload.join()
205
-
206
201
  # 添加新媒体至上传列表
207
202
  add_upload()
208
203
  progress_update(0.81, num=0.0049)
@@ -257,12 +252,10 @@ def main_podcast():
257
252
  # 清理缓存文件
258
253
  remove_flush(upload_url)
259
254
  else:
260
-
261
255
  # 如果没有更新内容,则停止上传线程
262
- gVar.upload_stop = True
256
+ gVar.upload_stop = True
263
257
  if upload_url:
264
258
  thread_upload.join()
265
-
266
259
  time_print("频道无更新内容")
267
260
  # 清空变量内数据
268
261
  gVar.channelid_youtube_ids_update.clear() # 需更新的YouTube频道字典
@@ -286,7 +279,7 @@ def main_podcast():
286
279
  gVar.overall_rss = "" # 更新后的rss文本
287
280
  gVar.make_up_file_format.clear() # 补全缺失媒体字典
288
281
  gVar.make_up_file_format_fail.clear() # 补全缺失媒体失败字典
289
- gVar.upload_original.clear() # 原始上传信息字典
282
+ gVar.upload_original.clear() # 原始上传信息列表
290
283
  # 将需要更新转为否
291
284
  gVar.update_generate_rss = False
292
285
  if parse.update_num != -1:
podflow/main_upload.py CHANGED
@@ -21,7 +21,7 @@ def main_upload():
21
21
  os.makedirs(new_tmp_dir, exist_ok=True) # 确保目录存在
22
22
  os.environ['TMPDIR'] = new_tmp_dir
23
23
  time_print(f"临时文件目录已设置为: {os.environ['TMPDIR']}")
24
- # 获取账号密码
24
+ # 获取账号密码及信息
25
25
  get_login()
26
26
  # 服务发现相关配置
27
27
  broadcast_port = 37001 # 服务发现用端口
@@ -239,6 +239,20 @@ button:hover {
239
239
  color: var(--button-hover);
240
240
  }
241
241
 
242
+ /* 版本号样式 */
243
+ #version-info {
244
+ position: fixed; /* 固定定位,相对于视口 */
245
+ top: 10px; /* 距离底部 10px */
246
+ right: 10px; /* 距离右侧 10px */
247
+ font-size: 12px; /* 字体大小 */
248
+ color: var(--secondary-text); /* 使用定义的次要文本颜色 */
249
+ background-color: var(--bg-color); /* 背景颜色,确保在不同模式下可见 */
250
+ padding: 5px 8px; /* 内边距 */
251
+ border-radius: 5px; /* 圆角 */
252
+ z-index: 1001; /* 确保在其他内容之上 */
253
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* 轻微的阴影效果 */
254
+ }
255
+
242
256
  /* 手机端优化 */
243
257
  @media (max-width: 600px) {
244
258
  #messageArea, textarea {
@@ -255,6 +269,12 @@ button:hover {
255
269
  width: 100%;
256
270
  overflow-x: hidden;
257
271
  }
272
+ #version-info {
273
+ top: 5px; /* 在手机上可以更靠近底部 */
274
+ right: 5px; /* 在手机上可以更靠近右侧 */
275
+ font-size: 10px; /* 手机上字体可以更小 */
276
+ padding: 3px 6px;
277
+ }
258
278
  }
259
279
  .message {
260
280
  padding: 0px;
@@ -65,6 +65,11 @@
65
65
  </section>
66
66
 
67
67
  </main>
68
+
69
+ <div id="version-info">
70
+ Version: 1.0.1
71
+ </div>
72
+
68
73
  <script src="/templates/js/index.js"></script>
69
74
  <script src="/templates/js/qrcode.min.js"></script>
70
75
  <script src="/templates/js/config.js"></script>
@@ -0,0 +1,10 @@
1
+ # podflow/upload/find_media_index.py
2
+ # coding: utf-8
3
+
4
+
5
+ # 查找位置模块
6
+ def find_media_index(upload_original, target_media_id):
7
+ for index, item in enumerate(upload_original):
8
+ if item.get("media_id") == target_media_id:
9
+ return index # 返回找到的索引
10
+ return -1
podflow/upload/login.py CHANGED
@@ -20,6 +20,12 @@ def get_login():
20
20
  gVar.upload_data = json.loads(upload_data)
21
21
  except Exception:
22
22
  file_save(gVar.upload_data, "upload_login.json", "channel_data")
23
+ try:
24
+ with open("channel_data/upload_message.json", "r") as file:
25
+ upload_message = file.read()
26
+ gVar.upload_message = json.loads(upload_message)
27
+ except Exception:
28
+ file_save(gVar.upload_message, "upload_message.json", "channel_data")
23
29
 
24
30
 
25
31
  def create():
@@ -0,0 +1,22 @@
1
+ # podflow/upload/store_users_info.py
2
+ # coding: utf-8
3
+
4
+ from podflow import gVar
5
+ from podflow.basic.file_save import file_save
6
+ from podflow.upload.find_media_index import find_media_index
7
+
8
+
9
+ def store_users_info(username,filename):
10
+ index = find_media_index(gVar.upload_message, filename)
11
+ if index == -1:
12
+ gVar.upload_message.append(
13
+ {
14
+ "media_id": filename,
15
+ "users": [username]
16
+ }
17
+ )
18
+ elif username not in gVar.upload_message[index]["users"]:
19
+ gVar.upload_message[index]["users"].append(username)
20
+ else:
21
+ return
22
+ file_save(gVar.upload_message, "upload_message.json", "channel_data")
@@ -22,15 +22,21 @@ def update_upload():
22
22
  upload_original = gVar.upload_original
23
23
  # 获取所有项目
24
24
  all_items = gVar.all_items
25
+ # 获取原始 XML 数据
26
+ xmls_original = gVar.xmls_original
27
+ # 获取无法更新channel_id
28
+ fail_upload_parts = list(set(xmls_original.keys()) - set(all_items.keys()))
25
29
  # 遍历所有项目,获取每个输出目录的媒体名称
26
30
  for output_dir, items_dict in all_items.items():
27
31
  media_name[output_dir] = get_media_name(items_dict["type"], items_dict["items"])
28
32
  # 遍历原始上传列表,筛选出需要上传的媒体部分
29
33
  for upload_part in upload_original:
30
34
  if (
31
- upload_part["channel_id"] in media_name
32
- and upload_part["media_id"] in media_name[upload_part["channel_id"]]
33
- ):
35
+ (
36
+ upload_part["channel_id"] in media_name
37
+ and upload_part["media_id"] in media_name[upload_part["channel_id"]]
38
+ )
39
+ or upload_part["channel_id"] in fail_upload_parts):
34
40
  main_upload.append(upload_part)
35
41
 
36
42
  # 获取需要上传的媒体部分的ID
@@ -5,6 +5,7 @@ from podflow import gVar
5
5
  from podflow.upload.build_hash import build_hash
6
6
  from podflow.basic.http_client import http_client
7
7
  from podflow.httpfs.app_bottle import bottle_app_instance
8
+ from podflow.upload.find_media_index import find_media_index
8
9
 
9
10
 
10
11
  # 上传文件模块
@@ -53,14 +54,6 @@ def upload_file(
53
54
  return None, hashs, ""
54
55
 
55
56
 
56
- # 查找位置模块
57
- def find_media_index(upload_original, target_media_id):
58
- for index, item in enumerate(upload_original):
59
- if item.get("media_id") == target_media_id:
60
- return index # 返回找到的索引
61
- return -1
62
-
63
-
64
57
  # 过滤和排序上传媒体模块
65
58
  def filter_and_sort_media(media_list):
66
59
  filtered_sorted = sorted(
podflow/youtube/login.py CHANGED
@@ -1,6 +1,7 @@
1
1
  # podflow/youtube/login.py
2
2
  # coding: utf-8
3
3
 
4
+ import shutil
4
5
  from podflow.basic.write_log import write_log
5
6
  from podflow.basic.time_print import time_print
6
7
  from podflow.basic.http_client import http_client
@@ -17,7 +18,7 @@ def get_youtube_cookie_fail(arg0):
17
18
  def get_youtube_cookie(channelid_youtube_ids):
18
19
  if not channelid_youtube_ids:
19
20
  return
20
- youtube_cookie = get_cookie_dict("channel_data/yt_dlp_youtube.txt")
21
+ youtube_cookie = get_cookie_dict("channel_data/youtube_cookie.txt")
21
22
  if youtube_cookie is None:
22
23
  write_log("YouTube \033[31m获取cookie失败\033[0m")
23
24
  return None
@@ -27,6 +28,10 @@ def get_youtube_cookie(channelid_youtube_ids):
27
28
  html_content = response.text
28
29
  if '"LOGGED_IN":true' in html_content:
29
30
  time_print("YouTube \033[32m获取cookie成功\033[0m")
31
+ shutil.copyfile(
32
+ "channel_data/youtube_cookie.txt",
33
+ "channel_data/yt_dlp_youtube.txt",
34
+ )
30
35
  return youtube_cookie
31
36
  elif '"LOGGED_IN":false' in html_content:
32
37
  return get_youtube_cookie_fail("登陆YouTube失败")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: podflow
3
- Version: 20250630
3
+ Version: 20250703
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
@@ -14,7 +14,7 @@ Requires-Python: >=3.8
14
14
  Description-Content-Type: text/markdown
15
15
  Requires-Dist: astral>=3.2
16
16
  Requires-Dist: bottle>=0.13.2
17
- Requires-Dist: yt-dlp>=2025.6.25
17
+ Requires-Dist: yt-dlp>=2025.6.30
18
18
  Requires-Dist: chardet>=5.2.0
19
19
  Requires-Dist: cherrypy>=18.10.0
20
20
  Requires-Dist: pyqrcode>=1.2.1
@@ -1,9 +1,9 @@
1
- podflow/__init__.py,sha256=mquu8BdWK9V4dDObCCfnPodeXOPkz-kj8_RNB7kK3Ys,7628
1
+ podflow/__init__.py,sha256=hpC5LyzhH6gYwn2DRHUBjQY4eHADFA5oIDztzhES-Ew,7695
2
2
  podflow/download_and_build.py,sha256=x7S7N26B1G9Yn2yr7YthDJgKUwEKBLtHBLlaqpofLas,746
3
3
  podflow/ffmpeg_judge.py,sha256=wM49pPXOFwFAA_8TKHal5fV6ka9sAA87yGQMDOssvXo,1340
4
4
  podflow/main.py,sha256=7zWdpw80jqPaYu1Un1nPqaZoiAb7Dqg8zaF-cUioU4c,755
5
- podflow/main_podcast.py,sha256=Lz8cFdIjzCjSjsTx2vjmrU5i2opdSO93Y9IxWlJeD4E,13065
6
- podflow/main_upload.py,sha256=xuN15GAXokl2xzZrraLeusevl0j-TnHVziL0wobsBZc,2586
5
+ podflow/main_podcast.py,sha256=8lCQqZ5vP5su1pLKcPu65yJRnty1CqPKfDNJyvYU76M,12977
6
+ podflow/main_upload.py,sha256=VOihPtjr37lxRNEr2cJp70DB6W5q7lHvpanApFKA9qE,2595
7
7
  podflow/parse_arguments.py,sha256=h3a7EaRZS04kNMFYbxTW9Ch29KgZ7dyS-yqEEt_etQI,2592
8
8
  podflow/basic/__init__.py,sha256=CAfI6mVQtz7KKbAiTIZ9_IbvaTXeAqxR1U7ov9GDoDo,44
9
9
  podflow/basic/file_save.py,sha256=6vu4EkbsN4df5-ci6sJOgIOUEhh-WaRBOyMJ8rpouXo,1233
@@ -41,7 +41,7 @@ podflow/download/show_progress.py,sha256=y46chchUC9eZCg4ZdNMFnx_bXJQV_IUq15jVzZt
41
41
  podflow/download/wait_animation.py,sha256=AUTvszXF89QA7XYjocFIauPKV7Qj8cFqry44teClaLQ,1314
42
42
  podflow/download/youtube_and_bilibili_download.py,sha256=VCEhz6pGXFWXusdbGWqkCzi4f4VsKQVn6sZz1pfGsns,1335
43
43
  podflow/httpfs/__init__.py,sha256=BxEXkufjcx-a0F7sDVXo65hmyANqCCbZUd6EH9i8T2c,45
44
- podflow/httpfs/app_bottle.py,sha256=f0bPGGVGSMabIaURmWeXwRT9k_rG3-akq6V6Ql9zrWU,27978
44
+ podflow/httpfs/app_bottle.py,sha256=RunI3OVcYelgTk8lkYRJwwF8O2RxHOurih7Xn1RBPxo,28885
45
45
  podflow/httpfs/browser.py,sha256=BJ4Xkfiki_tDr0Sc9RqAcEfIVpkAZ3RFOwo0aMHlY3U,197
46
46
  podflow/httpfs/download_bar.py,sha256=0n3HATEO3pdsIpx-E_IZG9OlXa6u-9SeBCoZVgUutyc,965
47
47
  podflow/httpfs/get_channelid.py,sha256=gcwy4IVHBWNQz7qPCpjwiAklGFLRGzvM33-UZz7oFvo,2296
@@ -85,29 +85,31 @@ podflow/remove/remove_file.py,sha256=ZusvZsBQX_yRdLuboD7bZKiOX4z4Rxg66zZK9KDWHwE
85
85
  podflow/remove/remove_flush.py,sha256=HWCe5SjNJ3VXaXbgFtqGdTXeJ1R2vv5qllNilB-G0_g,1851
86
86
  podflow/repair/__init__.py,sha256=Gpc1i6xiSLodKjjmzH66c_Y1z0HQ9E9CS3p95FRnVFM,45
87
87
  podflow/repair/reverse_log.py,sha256=Wc_vAH0WB-z1fNdWx7FYaVH4caRPtot7tDwDwFhmpz4,1106
88
- podflow/templates/index.html,sha256=kGsp1TAcf_qkV6hYRE8Ueq7CaTflR73rsTWtjnWuwwY,2775
88
+ podflow/templates/index.html,sha256=clCTccfAXSX69il80gv3Z3p0ftrZ_n8RjY2kiecWVFg,2831
89
89
  podflow/templates/css/config.css,sha256=-xjFlrbP2BAeTYTLs2M2u-4--klwSSC7HE2av58QUF0,5224
90
- podflow/templates/css/index.css,sha256=dgrlonF2BYdAtIFYpDChvSBnXAndbdoyY6c2ysOgdL0,9641
90
+ podflow/templates/css/index.css,sha256=wibmhsKu-jlnX6dbxMExlvO1Lbx2kw_TEbVGomyXd7M,10424
91
91
  podflow/templates/js/config.js,sha256=VZmpvtQWszofoccjJZNhbjvNkpl-CjGOdTrPkI83ND4,43634
92
92
  podflow/templates/js/index.js,sha256=GUfFhZM3vjiwfJ7USQZIIv5c7cyZwt64QZt0VInq5TI,34051
93
93
  podflow/templates/js/qrcode.min.js,sha256=xUHvBjJ4hahBW8qN9gceFBibSFUzbe9PNttUvehITzY,19927
94
94
  podflow/upload/__init__.py,sha256=AtOSXDrE5EjUe3z-iBd1NTDaH8n_X9qA5WXdBLkONjA,45
95
95
  podflow/upload/add_upload.py,sha256=LloIucGJSXARhxiWerAbJVW-FpTkTUxvYCAKPbl93Ew,1536
96
96
  podflow/upload/build_hash.py,sha256=9opa3xLd7nJbGGX5xa3uuKPS6dxlbkAb87ZdEiUxmxI,473
97
+ podflow/upload/find_media_index.py,sha256=HAtKkp0e-mjqjyLv1jgxXcNlNYvz-RD_kWvGkFdLygY,299
97
98
  podflow/upload/get_upload_original.py,sha256=TEDnRutumm2FZNIesPJIlExHyKWpfB3ZAHb3sZt7V6A,4312
98
99
  podflow/upload/linked_client.py,sha256=NdSi5uh0TbZUhOHbA_mkHo4aIz1XNKoSXHhT4rMRUpc,5288
99
100
  podflow/upload/linked_server.py,sha256=h-qSx13fP8_Ny2IKW3wCNPwqRqW6-Iz1pqxD9ga9-dM,2308
100
- podflow/upload/login.py,sha256=85sqr12T-3NH-TD3kAMzy4yb1KOheV3Tr0eGee7NCJo,4007
101
+ podflow/upload/login.py,sha256=WwQoPCr1oSGZh6wEsEuUH5E8-PEYS_k36b-Qfe00rjY,4282
102
+ podflow/upload/store_users_info.py,sha256=nnAUgPUStYR48ma1B8mtY9SFOr3rOGvnlCuKSNdee3M,679
101
103
  podflow/upload/time_key.py,sha256=6jZ3cxUjzj_umYDwH27R0YNZlLXxfhNp-CqV_K22wlo,967
102
- podflow/upload/update_upload.py,sha256=_5tp1zPNsC9DdDnLzm-P8bLcOBuDov4eMRHp_861j80,3183
103
- podflow/upload/upload_files.py,sha256=zKMv27cqj7u-c8dHKNZx67UNx0gkMkQAnu2oxnk6a5M,5749
104
+ podflow/upload/update_upload.py,sha256=tolV9WMRFg9KqdGSSC37REBy4N_f-d3GvCihciMlOlg,3456
105
+ podflow/upload/upload_files.py,sha256=vI0sSjCxUILlu0K9doMLJpmR7KrqhMRsCJmcWrCKlA0,5564
104
106
  podflow/upload/upload_server.py,sha256=BFq3QrWE7U97LbC4EQiDhQXbLapEc4R00eRDBH12E6A,565
105
107
  podflow/youtube/__init__.py,sha256=pgXod8gq0IijZxIkPSwgAOcb9JI5rd1mqMomoR7bcJ4,46
106
108
  podflow/youtube/build.py,sha256=j6SVq3HFFGlNNqRrHfnBIThdzsH88PFmwLnejosif1U,12311
107
109
  podflow/youtube/get.py,sha256=oO32GjTFvUgP5AfFX5AlIuXU2UT6QtOUOXWLFzi8XtI,17157
108
- podflow/youtube/login.py,sha256=KYl--ya6Z1u0uIcOp9l8i3DIIj9hsYUDH4dtJjI0MLM,1295
109
- podflow-20250630.dist-info/METADATA,sha256=GEeZ4rah0rMYrbE4XCyEs34tWr-sB6CyGsdDRjmLKrI,14195
110
- podflow-20250630.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
111
- podflow-20250630.dist-info/entry_points.txt,sha256=mn7hD_c_dmpKe3XU0KNekheBvD01LhlJ9htY-Df0j2A,131
112
- podflow-20250630.dist-info/top_level.txt,sha256=fUujhhz-RrMI8aGvi-3Ey5y7FQnpOOgoFw9OWM3yLCU,8
113
- podflow-20250630.dist-info/RECORD,,
110
+ podflow/youtube/login.py,sha256=8sMtCkmw1DH6KR47tS6kOZ5bpPyP0SyHtlQyvIBJd_k,1454
111
+ podflow-20250703.dist-info/METADATA,sha256=gWs31WUuYVehzIyqoqeUo-npKtNYg8VQoycnhcPc7uE,14195
112
+ podflow-20250703.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
113
+ podflow-20250703.dist-info/entry_points.txt,sha256=mn7hD_c_dmpKe3XU0KNekheBvD01LhlJ9htY-Df0j2A,131
114
+ podflow-20250703.dist-info/top_level.txt,sha256=fUujhhz-RrMI8aGvi-3Ey5y7FQnpOOgoFw9OWM3yLCU,8
115
+ podflow-20250703.dist-info/RECORD,,