podflow 20250405__tar.gz → 20250406__tar.gz

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.
Files changed (108) hide show
  1. {podflow-20250405 → podflow-20250406}/PKG-INFO +1 -1
  2. {podflow-20250405 → podflow-20250406}/podflow/templates/index.html +64 -89
  3. {podflow-20250405 → podflow-20250406}/podflow.egg-info/PKG-INFO +1 -1
  4. {podflow-20250405 → podflow-20250406}/setup.py +1 -1
  5. {podflow-20250405 → podflow-20250406}/MANIFEST.in +0 -0
  6. {podflow-20250405 → podflow-20250406}/README.md +0 -0
  7. {podflow-20250405 → podflow-20250406}/podflow/__init__.py +0 -0
  8. {podflow-20250405 → podflow-20250406}/podflow/basic/__init__.py +0 -0
  9. {podflow-20250405 → podflow-20250406}/podflow/basic/file_save.py +0 -0
  10. {podflow-20250405 → podflow-20250406}/podflow/basic/folder_build.py +0 -0
  11. {podflow-20250405 → podflow-20250406}/podflow/basic/get_duration.py +0 -0
  12. {podflow-20250405 → podflow-20250406}/podflow/basic/get_file_list.py +0 -0
  13. {podflow-20250405 → podflow-20250406}/podflow/basic/get_html_dict.py +0 -0
  14. {podflow-20250405 → podflow-20250406}/podflow/basic/http_client.py +0 -0
  15. {podflow-20250405 → podflow-20250406}/podflow/basic/list_merge_tidy.py +0 -0
  16. {podflow-20250405 → podflow-20250406}/podflow/basic/qr_code.py +0 -0
  17. {podflow-20250405 → podflow-20250406}/podflow/basic/split_dict.py +0 -0
  18. {podflow-20250405 → podflow-20250406}/podflow/basic/time_format.py +0 -0
  19. {podflow-20250405 → podflow-20250406}/podflow/basic/time_print.py +0 -0
  20. {podflow-20250405 → podflow-20250406}/podflow/basic/time_stamp.py +0 -0
  21. {podflow-20250405 → podflow-20250406}/podflow/basic/vary_replace.py +0 -0
  22. {podflow-20250405 → podflow-20250406}/podflow/basic/write_log.py +0 -0
  23. {podflow-20250405 → podflow-20250406}/podflow/bilibili/__init__.py +0 -0
  24. {podflow-20250405 → podflow-20250406}/podflow/bilibili/build.py +0 -0
  25. {podflow-20250405 → podflow-20250406}/podflow/bilibili/get.py +0 -0
  26. {podflow-20250405 → podflow-20250406}/podflow/bilibili/login.py +0 -0
  27. {podflow-20250405 → podflow-20250406}/podflow/config/__init__.py +0 -0
  28. {podflow-20250405 → podflow-20250406}/podflow/config/build_original.py +0 -0
  29. {podflow-20250405 → podflow-20250406}/podflow/config/channge_icon.py +0 -0
  30. {podflow-20250405 → podflow-20250406}/podflow/config/correct_channelid.py +0 -0
  31. {podflow-20250405 → podflow-20250406}/podflow/config/correct_config.py +0 -0
  32. {podflow-20250405 → podflow-20250406}/podflow/config/get_channelid.py +0 -0
  33. {podflow-20250405 → podflow-20250406}/podflow/config/get_channelid_id.py +0 -0
  34. {podflow-20250405 → podflow-20250406}/podflow/config/get_config.py +0 -0
  35. {podflow-20250405 → podflow-20250406}/podflow/download/__init__.py +0 -0
  36. {podflow-20250405 → podflow-20250406}/podflow/download/convert_bytes.py +0 -0
  37. {podflow-20250405 → podflow-20250406}/podflow/download/delete_part.py +0 -0
  38. {podflow-20250405 → podflow-20250406}/podflow/download/dl_aideo_video.py +0 -0
  39. {podflow-20250405 → podflow-20250406}/podflow/download/show_progress.py +0 -0
  40. {podflow-20250405 → podflow-20250406}/podflow/download/wait_animation.py +0 -0
  41. {podflow-20250405 → podflow-20250406}/podflow/download/youtube_and_bilibili_download.py +0 -0
  42. {podflow-20250405 → podflow-20250406}/podflow/download_and_build.py +0 -0
  43. {podflow-20250405 → podflow-20250406}/podflow/ffmpeg_judge.py +0 -0
  44. {podflow-20250405 → podflow-20250406}/podflow/httpfs/__init__.py +0 -0
  45. {podflow-20250405 → podflow-20250406}/podflow/httpfs/app_bottle.py +0 -0
  46. {podflow-20250405 → podflow-20250406}/podflow/httpfs/browser.py +0 -0
  47. {podflow-20250405 → podflow-20250406}/podflow/httpfs/get_channelid.py +0 -0
  48. {podflow-20250405 → podflow-20250406}/podflow/httpfs/port_judge.py +0 -0
  49. {podflow-20250405 → podflow-20250406}/podflow/httpfs/to_html.py +0 -0
  50. {podflow-20250405 → podflow-20250406}/podflow/main.py +0 -0
  51. {podflow-20250405 → podflow-20250406}/podflow/main_podcast.py +0 -0
  52. {podflow-20250405 → podflow-20250406}/podflow/main_upload.py +0 -0
  53. {podflow-20250405 → podflow-20250406}/podflow/makeup/__init__.py +0 -0
  54. {podflow-20250405 → podflow-20250406}/podflow/makeup/del_makeup_format_fail.py +0 -0
  55. {podflow-20250405 → podflow-20250406}/podflow/makeup/make_up_file.py +0 -0
  56. {podflow-20250405 → podflow-20250406}/podflow/makeup/make_up_file_format_mod.py +0 -0
  57. {podflow-20250405 → podflow-20250406}/podflow/makeup/make_up_file_mod.py +0 -0
  58. {podflow-20250405 → podflow-20250406}/podflow/message/__init__.py +0 -0
  59. {podflow-20250405 → podflow-20250406}/podflow/message/backup_zip_save.py +0 -0
  60. {podflow-20250405 → podflow-20250406}/podflow/message/create_main_rss.py +0 -0
  61. {podflow-20250405 → podflow-20250406}/podflow/message/display_qrcode_and_url.py +0 -0
  62. {podflow-20250405 → podflow-20250406}/podflow/message/fail_message_initialize.py +0 -0
  63. {podflow-20250405 → podflow-20250406}/podflow/message/format_time.py +0 -0
  64. {podflow-20250405 → podflow-20250406}/podflow/message/get_media_name.py +0 -0
  65. {podflow-20250405 → podflow-20250406}/podflow/message/get_original_rss.py +0 -0
  66. {podflow-20250405 → podflow-20250406}/podflow/message/get_video_format.py +0 -0
  67. {podflow-20250405 → podflow-20250406}/podflow/message/get_video_format_multithread.py +0 -0
  68. {podflow-20250405 → podflow-20250406}/podflow/message/get_youtube_and_bilibili_video_format.py +0 -0
  69. {podflow-20250405 → podflow-20250406}/podflow/message/media_format.py +0 -0
  70. {podflow-20250405 → podflow-20250406}/podflow/message/original_rss_fail_print.py +0 -0
  71. {podflow-20250405 → podflow-20250406}/podflow/message/rss_create_hash.py +0 -0
  72. {podflow-20250405 → podflow-20250406}/podflow/message/save_rss.py +0 -0
  73. {podflow-20250405 → podflow-20250406}/podflow/message/title_correction.py +0 -0
  74. {podflow-20250405 → podflow-20250406}/podflow/message/update_information_display.py +0 -0
  75. {podflow-20250405 → podflow-20250406}/podflow/message/update_youtube_bilibili_rss.py +0 -0
  76. {podflow-20250405 → podflow-20250406}/podflow/message/want_retry.py +0 -0
  77. {podflow-20250405 → podflow-20250406}/podflow/message/xml_item.py +0 -0
  78. {podflow-20250405 → podflow-20250406}/podflow/message/xml_original_item.py +0 -0
  79. {podflow-20250405 → podflow-20250406}/podflow/message/xml_rss.py +0 -0
  80. {podflow-20250405 → podflow-20250406}/podflow/netscape/__init__.py +0 -0
  81. {podflow-20250405 → podflow-20250406}/podflow/netscape/bulid_netscape.py +0 -0
  82. {podflow-20250405 → podflow-20250406}/podflow/netscape/get_cookie_dict.py +0 -0
  83. {podflow-20250405 → podflow-20250406}/podflow/parse_arguments.py +0 -0
  84. {podflow-20250405 → podflow-20250406}/podflow/remove/__init__.py +0 -0
  85. {podflow-20250405 → podflow-20250406}/podflow/remove/remove_dir.py +0 -0
  86. {podflow-20250405 → podflow-20250406}/podflow/remove/remove_file.py +0 -0
  87. {podflow-20250405 → podflow-20250406}/podflow/repair/__init__.py +0 -0
  88. {podflow-20250405 → podflow-20250406}/podflow/repair/reverse_log.py +0 -0
  89. {podflow-20250405 → podflow-20250406}/podflow/upload/__init__.py +0 -0
  90. {podflow-20250405 → podflow-20250406}/podflow/upload/add_upload.py +0 -0
  91. {podflow-20250405 → podflow-20250406}/podflow/upload/build_hash.py +0 -0
  92. {podflow-20250405 → podflow-20250406}/podflow/upload/get_upload_original.py +0 -0
  93. {podflow-20250405 → podflow-20250406}/podflow/upload/linked_client.py +0 -0
  94. {podflow-20250405 → podflow-20250406}/podflow/upload/linked_server.py +0 -0
  95. {podflow-20250405 → podflow-20250406}/podflow/upload/login.py +0 -0
  96. {podflow-20250405 → podflow-20250406}/podflow/upload/time_key.py +0 -0
  97. {podflow-20250405 → podflow-20250406}/podflow/upload/update_upload.py +0 -0
  98. {podflow-20250405 → podflow-20250406}/podflow/upload/upload_server.py +0 -0
  99. {podflow-20250405 → podflow-20250406}/podflow/youtube/__init__.py +0 -0
  100. {podflow-20250405 → podflow-20250406}/podflow/youtube/build.py +0 -0
  101. {podflow-20250405 → podflow-20250406}/podflow/youtube/get.py +0 -0
  102. {podflow-20250405 → podflow-20250406}/podflow/youtube/login.py +0 -0
  103. {podflow-20250405 → podflow-20250406}/podflow.egg-info/SOURCES.txt +0 -0
  104. {podflow-20250405 → podflow-20250406}/podflow.egg-info/dependency_links.txt +0 -0
  105. {podflow-20250405 → podflow-20250406}/podflow.egg-info/entry_points.txt +0 -0
  106. {podflow-20250405 → podflow-20250406}/podflow.egg-info/requires.txt +0 -0
  107. {podflow-20250405 → podflow-20250406}/podflow.egg-info/top_level.txt +0 -0
  108. {podflow-20250405 → podflow-20250406}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: podflow
3
- Version: 20250405
3
+ Version: 20250406
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
@@ -284,7 +284,7 @@
284
284
  </section>
285
285
  </main>
286
286
  <script>
287
- (function() {
287
+ (function() {
288
288
  // 生成单个二维码的函数
289
289
  function generateQRCodeForNode(container) {
290
290
  const rootStyles = getComputedStyle(document.documentElement);
@@ -305,44 +305,10 @@
305
305
  container.textContent = 'URL 未提供';
306
306
  }
307
307
  }
308
-
309
- // 为所有存在的二维码容器生成二维码
310
- function generateQRCodes() {
311
- const containers = document.querySelectorAll('.qrcode-container');
312
- containers.forEach(generateQRCodeForNode);
313
- }
314
-
315
- // 利用 MutationObserver 动态监听 container 内新增的二维码容器
316
- function observeQRCodes(container) {
317
- const observer = new MutationObserver((mutationsList) => {
318
- mutationsList.forEach(mutation => {
319
- mutation.addedNodes.forEach(node => {
320
- if (node.nodeType === Node.ELEMENT_NODE) {
321
- if (node.classList.contains('qrcode-container')) {
322
- generateQRCodeForNode(node);
323
- // 在生成二维码后,检查是否需要滚动
324
- if (!userScrolled && container.scrollHeight - container.scrollTop <= container.clientHeight + 10) {
325
- container.scrollTop = container.scrollHeight;
326
- }
327
- } else {
328
- const childContainers = node.querySelectorAll('.qrcode-container');
329
- childContainers.forEach(generateQRCodeForNode);
330
- // 在生成二维码后,检查是否需要滚动
331
- if (!userScrolled && container.scrollHeight - container.scrollTop <= container.clientHeight + 10) {
332
- container.scrollTop = container.scrollHeight;
333
- }
334
- }
335
- }
336
- });
337
- });
338
- });
339
- observer.observe(container, { childList: true, subtree: true });
340
- }
341
-
308
+
342
309
  // 缓存常用节点
343
310
  const menu = document.getElementById('menu');
344
311
  const toggleMenuBtn = document.getElementById('toggleMenu');
345
- const mainArea = document.getElementById('main');
346
312
  const pages = {
347
313
  pageChannel: document.getElementById('pageChannel'),
348
314
  pageMessage: document.getElementById('pageMessage')
@@ -354,13 +320,9 @@
354
320
  const pasteBtn = document.getElementById('pasteBtn');
355
321
  const copyBtn = document.getElementById('copyBtn');
356
322
  const clearBtn = document.getElementById('clearBtn');
357
-
323
+
358
324
  let pollingTimer = null;
359
-
360
- // 监听 messageArea 内动态新增的二维码容器
361
- observeQRCodes(messageArea);
362
- observeQRCodes(messageHttp); // Also observe for messageHttp
363
-
325
+
364
326
  // 菜单切换函数
365
327
  function toggleMenu() {
366
328
  menu.classList.toggle('hidden');
@@ -372,7 +334,7 @@
372
334
  toggleMenuBtn.textContent = '❮';
373
335
  }
374
336
  }
375
-
337
+
376
338
  // 根据页面标识显示对应面板
377
339
  function showPage(pageId) {
378
340
  Object.values(pages).forEach(page => page.style.display = 'none');
@@ -383,29 +345,26 @@
383
345
  toggleMenu();
384
346
  }
385
347
  pageId === 'pageMessage' ? startMessagePolling() : stopMessagePolling();
386
- if (pageId === 'pageMessage') {
387
- generateQRCodes(); // 页面切换时生成已有二维码
388
- }
389
348
  }
390
349
  }
391
-
350
+
392
351
  // 初始化默认页面
393
352
  showPage('pageMessage');
394
-
353
+
395
354
  let lastMessage = { podflow: [], http: [] };
396
355
  let userScrolled = false;
397
-
356
+
398
357
  // 监听滚动事件,检测用户是否手动滚动
399
358
  function onUserScroll(event) {
400
359
  const element = event.target;
401
360
  // 判断是否接近底部,增加一定的容差值
402
- const nearBottom = element.scrollHeight - element.scrollTop <= element.clientHeight + 20;
361
+ const nearBottom = element.scrollHeight - element.scrollTop <= element.clientHeight + 10;
403
362
  userScrolled = !nearBottom;
404
363
  }
405
-
364
+
406
365
  messageArea.addEventListener('scroll', onUserScroll);
407
366
  messageHttp.addEventListener('scroll', onUserScroll);
408
-
367
+
409
368
  // 轮询消息更新,更新 messageArea 与 messageHttp
410
369
  function getMessages() {
411
370
  fetch('message')
@@ -420,7 +379,7 @@
420
379
  })
421
380
  .catch(error => console.error('获取消息失败:', error));
422
381
  }
423
-
382
+
424
383
  function createMessageElement(message) {
425
384
  const p = document.createElement('p');
426
385
  p.innerHTML = message;
@@ -428,16 +387,34 @@
428
387
  return p;
429
388
  }
430
389
 
390
+ function processQRCodeContainers(p) {
391
+ const qrContainers = p.querySelectorAll('.qrcode-container');
392
+ qrContainers.forEach(container => {
393
+ // 判断当前容器是否有 data-url 属性,并且值不为空
394
+ if (container.dataset.url) {
395
+ generateQRCodeForNode(container);
396
+ } else {
397
+ // 如果没有 data-url 或值为空,可以执行其他操作,例如输出提示信息
398
+ console.log('容器中未提供 URL,跳过二维码生成:', container);
399
+ container.textContent = '未提供二维码 URL'; // 可选:在容器中显示提示
400
+ }
401
+ });
402
+ }
403
+
404
+ // 修改后的 appendMessages 函数:先生成消息节点内的二维码,再将节点追加或替换到消息容器中
431
405
  function appendMessages(container, newMessages, oldMessages) {
432
406
  // 判断当前是否在底部
433
407
  const wasAtBottom = container.scrollHeight - container.scrollTop <= container.clientHeight + 10;
434
-
435
- // 当两数组长度相等且有内容时,只比较最后一项
408
+ // 较为简单的情况:两数组长度相同且有内容,只比较最后一项
436
409
  if (newMessages.length === oldMessages.length && newMessages.length > 0) {
437
410
  const lastNewMessage = newMessages[newMessages.length - 1];
438
411
  const lastOldMessage = oldMessages[oldMessages.length - 1];
439
412
  if (lastNewMessage !== lastOldMessage) {
413
+ // 先创建消息节点
440
414
  const p = createMessageElement(lastNewMessage);
415
+ // 在插入前先处理二维码生成
416
+ processQRCodeContainers(p);
417
+ // 替换或追加到容器中
441
418
  const lastChild = container.lastElementChild;
442
419
  if (lastChild) {
443
420
  container.replaceChild(p, lastChild);
@@ -446,11 +423,13 @@
446
423
  }
447
424
  }
448
425
  } else {
449
- // 如果 newMessages 与 oldMessages 数量不一致
450
- // 先替换容器中最后一项为 newMessages 中对应位置的消息(若 oldMessages 存在数据)
426
+ // newMessages 与 oldMessages 数量不一致时
427
+ // 如果 oldMessages 存在数据,先替换容器中最后一项对应的消息
451
428
  if (oldMessages.length > 0) {
452
429
  const replaceIndex = oldMessages.length - 1;
453
430
  const p = createMessageElement(newMessages[replaceIndex]);
431
+ // 先生成二维码
432
+ processQRCodeContainers(p);
454
433
  const lastChild = container.lastElementChild;
455
434
  if (lastChild) {
456
435
  container.replaceChild(p, lastChild);
@@ -460,30 +439,33 @@
460
439
  }
461
440
  // 再追加从 oldMessages.length 开始的后续消息
462
441
  newMessages.slice(oldMessages.length).forEach(msg => {
463
- container.appendChild(createMessageElement(msg));
442
+ const p = createMessageElement(msg);
443
+ // 先生成二维码
444
+ processQRCodeContainers(p);
445
+ // 插入容器中
446
+ container.appendChild(p);
464
447
  });
465
448
  }
466
-
467
449
  // 如果之前在底部且用户没有主动滚动,则自动滚动到底部
468
450
  if (wasAtBottom && !userScrolled) {
469
451
  container.scrollTop = container.scrollHeight;
470
452
  }
471
453
  }
472
-
454
+
473
455
  function startMessagePolling() {
474
456
  getMessages();
475
- pollingTimer = setInterval(getMessages, 250);
457
+ pollingTimer = setInterval(getMessages, 500);
476
458
  }
477
-
459
+
478
460
  function stopMessagePolling() {
479
461
  if (pollingTimer !== null) {
480
462
  clearInterval(pollingTimer);
481
463
  pollingTimer = null;
482
464
  }
483
465
  }
484
-
466
+
485
467
  startMessagePolling();
486
-
468
+
487
469
  // 表单异步提交(获取 Channel-ID)
488
470
  inputForm && inputForm.addEventListener('submit', function(event) {
489
471
  event.preventDefault();
@@ -493,19 +475,19 @@
493
475
  headers: { 'Content-Type': 'application/json' },
494
476
  body: JSON.stringify({ content })
495
477
  })
496
- .then(response => {
497
- if (!response.ok) {
498
- throw new Error('网络响应异常');
499
- }
500
- return response.json();
501
- })
502
- .then(data => inputOutput.value = data.response)
503
- .catch(error => {
504
- console.error('请求失败:', error);
505
- alert('请求失败,请稍后重试!');
506
- });
478
+ .then(response => {
479
+ if (!response.ok) {
480
+ throw new Error('网络响应异常');
481
+ }
482
+ return response.json();
483
+ })
484
+ .then(data => inputOutput.value = data.response)
485
+ .catch(error => {
486
+ console.error('请求失败:', error);
487
+ alert('请求失败,请稍后重试!');
488
+ });
507
489
  });
508
-
490
+
509
491
  // 粘贴功能
510
492
  pasteBtn.addEventListener('click', function() {
511
493
  if (navigator.clipboard && navigator.clipboard.readText) {
@@ -526,7 +508,7 @@
526
508
  }
527
509
  }
528
510
  });
529
-
511
+
530
512
  // 复制功能
531
513
  copyBtn.addEventListener('click', function() {
532
514
  if (navigator.clipboard && navigator.clipboard.writeText) {
@@ -544,12 +526,12 @@
544
526
  }
545
527
  }
546
528
  });
547
-
529
+
548
530
  // 清空输入框
549
531
  clearBtn.addEventListener('click', function() {
550
532
  inputOutput.value = '';
551
533
  });
552
-
534
+
553
535
  // 菜单项点击事件委托
554
536
  menu.addEventListener('click', function(event) {
555
537
  const target = event.target;
@@ -557,24 +539,17 @@
557
539
  showPage(target.dataset.page);
558
540
  }
559
541
  });
560
-
542
+
561
543
  // 菜单切换按钮事件绑定
562
544
  toggleMenuBtn.addEventListener('click', toggleMenu);
563
-
545
+
564
546
  // 针对手机端,初始化时隐藏菜单
565
547
  if (window.innerWidth <= 600) {
566
548
  menu.classList.add('hidden');
567
549
  toggleMenuBtn.style.left = '0px';
568
550
  toggleMenuBtn.textContent = '❯';
569
551
  }
570
-
571
- // 在页面加载完成后首次生成二维码(如果当前显示的是 Channel 页面)
572
- window.addEventListener('load', () => {
573
- if (pages.pageChannel.style.display === 'block') {
574
- generateQRCodes();
575
- }
576
- });
577
552
  })();
578
- </script>
553
+ </script>
579
554
  </body>
580
555
  </html>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: podflow
3
- Version: 20250405
3
+ Version: 20250406
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
@@ -5,7 +5,7 @@ from setuptools import setup, find_packages
5
5
 
6
6
  setup(
7
7
  name="podflow",
8
- version="20250405",
8
+ version="20250406",
9
9
  author="gruel_zxz",
10
10
  author_email="zhuxizhouzxz@gmail.com",
11
11
  description="A podcast server that includes YouTube and BiliBili",
File without changes
File without changes
File without changes
File without changes