podflow 20250205__py3-none-any.whl → 20250212__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 +4 -3
- Podflow/bilibili/build.py +3 -3
- Podflow/config/build_original.py +1 -1
- Podflow/config/correct_config.py +5 -0
- Podflow/main.py +12 -1
- Podflow/message/fail_message_initialize.py +3 -1
- Podflow/message/get_original_rss.py +3 -1
- Podflow/upload/__init__.py +2 -0
- Podflow/upload/get_upload_original.py +105 -0
- Podflow/youtube/build.py +1 -2
- {podflow-20250205.dist-info → podflow-20250212.dist-info}/METADATA +2 -2
- {podflow-20250205.dist-info → podflow-20250212.dist-info}/RECORD +15 -13
- {podflow-20250205.dist-info → podflow-20250212.dist-info}/WHEEL +0 -0
- {podflow-20250205.dist-info → podflow-20250212.dist-info}/entry_points.txt +0 -0
- {podflow-20250205.dist-info → podflow-20250212.dist-info}/top_level.txt +0 -0
Podflow/__init__.py
CHANGED
@@ -19,6 +19,7 @@ default_config = {
|
|
19
19
|
"token": "", # token认证, 如为null或""将不启用token
|
20
20
|
"delete_incompletement": False, # 是否删除下载中断媒体(下载前处理流程)
|
21
21
|
"remove_media": True, # 是否删除无用的媒体文件
|
22
|
+
"upload": False, # 是否将长期媒体进行上传
|
22
23
|
"channelid_youtube": { # Youtube频道列表
|
23
24
|
"youtube": {
|
24
25
|
"update_size": 15, # 每次获取频道媒体数量
|
@@ -100,9 +101,7 @@ class Application_gVar:
|
|
100
101
|
self.channelid_bilibili_ids_update = {} # 需更新的哔哩哔哩频道字典
|
101
102
|
self.bilibili_content_bvid_update = {} # 需下载哔哩哔哩视频字典
|
102
103
|
self.channelid_bilibili_rss = {} # 哔哩哔哩频道最新Rss Response字典
|
103
|
-
self.bilibili_content_bvid_backward_update =
|
104
|
-
{}
|
105
|
-
) # 向后更新需下载哔哩哔哩视频字典
|
104
|
+
self.bilibili_content_bvid_backward_update = {} # 向后更新需下载哔哩哔哩视频字典
|
106
105
|
self.video_id_failed = [] # YouTube&哔哩哔哩视频下载失败列表
|
107
106
|
self.video_id_update_format = {} # YouTube和哔哩哔哩视频下载的详细信息字典
|
108
107
|
self.hash_rss_original = "" # 原始rss哈希值文本
|
@@ -115,6 +114,8 @@ class Application_gVar:
|
|
115
114
|
self.overall_rss = "" # 更新后的rss文本
|
116
115
|
self.make_up_file_format = {} # 补全缺失媒体字典
|
117
116
|
self.make_up_file_format_fail = {} # 补全缺失媒体失败字典
|
117
|
+
|
118
|
+
self.upload_original = {} # 原始上传信息字典
|
118
119
|
|
119
120
|
self.shortcuts_url = {} # 输出至shortcut的url字典
|
120
121
|
|
Podflow/bilibili/build.py
CHANGED
@@ -144,9 +144,9 @@ def bilibili_xml_items(output_dir):
|
|
144
144
|
)
|
145
145
|
if item["description"] and item["description"][0] == "『":
|
146
146
|
original_judgment = False
|
147
|
-
|
148
|
-
|
149
|
-
|
147
|
+
entry_num += 1
|
148
|
+
if entry_num >= channelid_bilibili_value["update_size"]:
|
149
|
+
break
|
150
150
|
items_guid = re.findall(r"(?<=<guid>).+?(?=</guid>)", "".join(items_list))
|
151
151
|
# 存量接入
|
152
152
|
entry_count = channelid_bilibili_value["last_size"] - len(items_guid)
|
Podflow/config/build_original.py
CHANGED
@@ -6,8 +6,8 @@ from Podflow.config.get_config import get_config
|
|
6
6
|
from Podflow.basic.folder_build import folder_build
|
7
7
|
from Podflow.config.get_channelid import get_channelid
|
8
8
|
from Podflow.config.correct_config import correct_config
|
9
|
-
from Podflow.config.correct_channelid import correct_channelid
|
10
9
|
from Podflow.config.get_channelid_id import get_channelid_id
|
10
|
+
from Podflow.config.correct_channelid import correct_channelid
|
11
11
|
|
12
12
|
|
13
13
|
def build_original():
|
Podflow/config/correct_config.py
CHANGED
@@ -101,3 +101,8 @@ def correct_config():
|
|
101
101
|
config["remove_media"], bool
|
102
102
|
):
|
103
103
|
config["remove_media"] = default_config["remove_media"]
|
104
|
+
# 对upload进行纠正
|
105
|
+
if "upload" not in config or not isinstance(
|
106
|
+
config["upload"], bool
|
107
|
+
):
|
108
|
+
config["upload"] = default_config["upload"]
|
Podflow/main.py
CHANGED
@@ -58,12 +58,17 @@ from Podflow.remove.remove_dir import remove_dir
|
|
58
58
|
# 处理 YouTube 信息模块
|
59
59
|
from Podflow.youtube.build import get_youtube_introduction
|
60
60
|
|
61
|
+
# 长期媒体进行上传模块
|
62
|
+
from Podflow.upload.get_upload_original import get_upload_original
|
63
|
+
|
61
64
|
|
62
65
|
def main():
|
63
66
|
# 获取传入的参数
|
64
67
|
parse_arguments()
|
65
68
|
# 开始运行
|
66
|
-
print(
|
69
|
+
print(
|
70
|
+
f"{datetime.now().strftime('%H:%M:%S')}|Podflow|{version('Podflow')}开始运行....."
|
71
|
+
)
|
67
72
|
# 判断是否安装ffmpeg
|
68
73
|
ffmpeg_judge()
|
69
74
|
# 初始化
|
@@ -116,6 +121,12 @@ def main():
|
|
116
121
|
gVar.xmls_original, gVar.hash_rss_original, gVar.xmls_original_fail = (
|
117
122
|
get_original_rss()
|
118
123
|
)
|
124
|
+
# 初始化原始上传信息
|
125
|
+
if gVar.config["upload"]:
|
126
|
+
if upload_original := get_upload_original():
|
127
|
+
gVar.upload_original = upload_original
|
128
|
+
else:
|
129
|
+
gVar.config["upload"] = False
|
119
130
|
# 更新Youtube和哔哩哔哩频道xml
|
120
131
|
update_youtube_bilibili_rss()
|
121
132
|
# 判断是否有更新内容
|
@@ -135,7 +135,7 @@ error_reason = [
|
|
135
135
|
"text",
|
136
136
|
],
|
137
137
|
[
|
138
|
-
r"Got error: HTTPSConnectionPool\(host='rr[0-9]---sn-.{8}\.googlevideo.com', port=443\): Read timed out\.",
|
138
|
+
r"Got error: HTTPSConnectionPool\(host='rr[0-9]---sn-.{8}\.googlevideo.com', port=443\): Read timed out\. \(read timeout=20\.0\)",
|
139
139
|
"\033[31m响应超时\033[0m",
|
140
140
|
"regexp",
|
141
141
|
],
|
@@ -144,6 +144,8 @@ error_reason = [
|
|
144
144
|
|
145
145
|
# 失败信息初始化模块
|
146
146
|
def fail_message_initialize(message_error, video_url):
|
147
|
+
if video_url[:2] == "BV":
|
148
|
+
video_url = video_url[:12]
|
147
149
|
fail_message = (
|
148
150
|
str(message_error)
|
149
151
|
.replace("ERROR: ", "")
|
@@ -48,7 +48,9 @@ def get_original_rss():
|
|
48
48
|
get_xmls_original = {}
|
49
49
|
rss_original = ""
|
50
50
|
# 如原始xml无对应的原频道items, 将尝试从对应频道的xml中获取
|
51
|
-
for channelid_key in (
|
51
|
+
for channelid_key in (
|
52
|
+
gVar.channelid_youtube_ids | gVar.channelid_bilibili_ids
|
53
|
+
).keys():
|
52
54
|
if channelid_key not in get_xmls_original.keys():
|
53
55
|
try:
|
54
56
|
with open(
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# Podflow/upload/get_upload_original.py
|
2
|
+
# coding: utf-8
|
3
|
+
|
4
|
+
import re
|
5
|
+
import json
|
6
|
+
from collections import Counter
|
7
|
+
from email.utils import parsedate_tz, mktime_tz
|
8
|
+
from Podflow import gVar
|
9
|
+
from Podflow.basic.file_save import file_save
|
10
|
+
from Podflow.basic.write_log import write_log
|
11
|
+
|
12
|
+
|
13
|
+
# 获取原始上传数据模块
|
14
|
+
def get_upload_original():
|
15
|
+
xmls_original = gVar.xmls_original
|
16
|
+
try:
|
17
|
+
# 尝试打开并读取 JSON 文件
|
18
|
+
with open("channel_data/upload.json", "r") as file:
|
19
|
+
upload_original = file.read() # 读取原始上传数据
|
20
|
+
upload_original = json.loads(
|
21
|
+
upload_original
|
22
|
+
) # 将读取的字符串转换为 Python 对象(列表或字典)
|
23
|
+
except Exception:
|
24
|
+
# 如果读取或解析失败,将 upload_original 初始化为空列表
|
25
|
+
upload_original = []
|
26
|
+
|
27
|
+
# 如果 upload_original 不为空
|
28
|
+
if upload_original:
|
29
|
+
# 提取每个条目的 channel_id
|
30
|
+
channel_ids = [item.get("channel_id") for item in upload_original]
|
31
|
+
|
32
|
+
# 统计每个 channel_id 的出现次数
|
33
|
+
channelid_counts = Counter(channel_ids)
|
34
|
+
|
35
|
+
# 将出现次数转换为字典
|
36
|
+
age_counts = dict(channelid_counts)
|
37
|
+
|
38
|
+
# 统计 xmls_original 中每个键对应的 <guid> 标签内的元素数量
|
39
|
+
xmls_original_counts = {
|
40
|
+
key: len(re.findall(r"(?<=<guid>).+(?=</guid>)", value))
|
41
|
+
for key, value in xmls_original.items()
|
42
|
+
}
|
43
|
+
|
44
|
+
# 如果两个计数字典不相等,清空 upload_original
|
45
|
+
if age_counts != xmls_original_counts:
|
46
|
+
upload_original = []
|
47
|
+
|
48
|
+
# 如果 upload_original 仍然为空
|
49
|
+
if not upload_original:
|
50
|
+
# 遍历 xmls_original 的每个键值对
|
51
|
+
for xmls_original_key, xmls_original_value in xmls_original.items():
|
52
|
+
# 如果当前键在 channelid_youtube_ids 中
|
53
|
+
if xmls_original_key in gVar.channelid_youtube_ids:
|
54
|
+
# 使用正则表达式解析包含特定格式媒体ID的字符串
|
55
|
+
media = re.findall(
|
56
|
+
r"(?:/UC.{22}/)(.{11}\.m4a|.{11}\.mp4)(?=\"|\?)",
|
57
|
+
xmls_original_value,
|
58
|
+
)
|
59
|
+
# 如果当前键在 channelid_bilibili_ids 中
|
60
|
+
elif xmls_original_key in gVar.channelid_bilibili_ids:
|
61
|
+
media = re.findall(
|
62
|
+
r"(?:/[0-9]+/)(BV.{10}\.m4a|BV.{10}\.mp4|BV.{10}_p[0-9]+\.m4a|BV.{10}_p[0-9]+\.mp4|BV.{10}_[0-9]{9}\.m4a|BV.{10}_[0-9]{9}\.mp4)(?=\"|\?)",
|
63
|
+
xmls_original_value,
|
64
|
+
)
|
65
|
+
else:
|
66
|
+
media = []
|
67
|
+
|
68
|
+
# 查找每个上传条目的发布时间
|
69
|
+
upload_time = re.findall(
|
70
|
+
r"(?<=<pubDate>).+(?=</pubDate>)",
|
71
|
+
xmls_original_value,
|
72
|
+
)
|
73
|
+
|
74
|
+
# 将日期字符串列表转换为 Unix 时间戳列表
|
75
|
+
timestamps = [
|
76
|
+
mktime_tz(
|
77
|
+
parsedate_tz(date_string)
|
78
|
+
) # 解析和转换每个日期字符串为 Unix 时间戳
|
79
|
+
for date_string in upload_time
|
80
|
+
if parsedate_tz(date_string) # 确保解析成功
|
81
|
+
]
|
82
|
+
|
83
|
+
# 如果媒体和时间戳的数量不匹配,记录错误并清空 upload_original
|
84
|
+
if len(media) != len(timestamps):
|
85
|
+
write_log("获取原始上传内容失败") # 错误日志
|
86
|
+
upload_original.clear() # 清空 upload_original
|
87
|
+
break # 退出循环
|
88
|
+
|
89
|
+
# 如果数量匹配,则整合 media_id、channel_id 和上传时间到 upload_original 列表
|
90
|
+
upload_original += [
|
91
|
+
{
|
92
|
+
"media_id": key,
|
93
|
+
"channel_id": xmls_original_key,
|
94
|
+
"media_time": value,
|
95
|
+
"upload": False,
|
96
|
+
}
|
97
|
+
for value, key in zip(
|
98
|
+
timestamps, media
|
99
|
+
) # 使用 zip() 将 media 和 timestamps 组合成对
|
100
|
+
]
|
101
|
+
|
102
|
+
# 如果成功填充 upload_original
|
103
|
+
if upload_original:
|
104
|
+
file_save(upload_original, "upload.json", "channel_data") # 保存到文件
|
105
|
+
return upload_original
|
Podflow/youtube/build.py
CHANGED
@@ -194,7 +194,6 @@ def youtube_xml_items(output_dir):
|
|
194
194
|
guid, item, channelid_title, title_change, output_dir
|
195
195
|
):
|
196
196
|
items_list.append(f"{xml_item_text}<!-- {output_dir} -->")
|
197
|
-
entry_num += 1
|
198
197
|
if (
|
199
198
|
gVar.video_id_update_format[guid]["description"]
|
200
199
|
and gVar.video_id_update_format[guid]["description"][0] == "『"
|
@@ -214,9 +213,9 @@ def youtube_xml_items(output_dir):
|
|
214
213
|
items_list.append(
|
215
214
|
f"{youtube_xml_item(entry, title_change)}<!-- {output_dir} -->"
|
216
215
|
)
|
217
|
-
entry_num += 1
|
218
216
|
if re.search(r"(?<=<media:description>)『", entry):
|
219
217
|
original_judgment = False
|
218
|
+
entry_num += 1
|
220
219
|
if entry_num >= update_size:
|
221
220
|
break
|
222
221
|
items_guid = re.findall(r"(?<=<guid>).+?(?=</guid>)", "".join(items_list))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: podflow
|
3
|
-
Version:
|
3
|
+
Version: 20250212
|
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
|
@@ -21,7 +21,7 @@ Requires-Dist: cherrypy>=18.10.0
|
|
21
21
|
Requires-Dist: requests>=2.32.3
|
22
22
|
Requires-Dist: pycryptodome>=3.21.0
|
23
23
|
Requires-Dist: ffmpeg-python>=0.2.0
|
24
|
-
Requires-Dist: BeautifulSoup4>=4.
|
24
|
+
Requires-Dist: BeautifulSoup4>=4.13.3
|
25
25
|
|
26
26
|
# Podflow
|
27
27
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Podflow/__init__.py,sha256=
|
1
|
+
Podflow/__init__.py,sha256=lXlJ6btdmA-rtsJH7fH4gvaRobCe5woXRuD5PCtXMRM,6908
|
2
2
|
Podflow/ffmpeg_judge.py,sha256=krttVs1PDot_0CDq5rmtUIpchiaiqtAkPYFQRLG6OQM,1275
|
3
|
-
Podflow/main.py,sha256=
|
3
|
+
Podflow/main.py,sha256=k_rb5ssdHZIqkdb7GCPtsGALPQnM_gpGpxGtF3uDJsM,10120
|
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
|
@@ -17,14 +17,14 @@ Podflow/basic/time_stamp.py,sha256=vf0p6FIK2-ZN2p2sotbpf4dewQMy-Vior-aREYfT0Zc,1
|
|
17
17
|
Podflow/basic/vary_replace.py,sha256=aecFDuAOvQjTpgtoSW5uDu8Tx_YTs4bCFF9imVFkfVY,211
|
18
18
|
Podflow/basic/write_log.py,sha256=Sm6qzTSb1x6X2uQnnmVD4dU6BsY1PONxenwsWAdFxso,1358
|
19
19
|
Podflow/bilibili/__init__.py,sha256=ekvpCzR4bg6ar73Gq0YWQcPXND4TEqP46pb9iLyke9g,47
|
20
|
-
Podflow/bilibili/build.py,sha256=
|
20
|
+
Podflow/bilibili/build.py,sha256=Z62hEUDT0YB_NNR9rDpmvvOYrSOBR644Kvkdc05FGU0,7936
|
21
21
|
Podflow/bilibili/get.py,sha256=PXPh_H8B_zP9dhqe6sA_QCeJcdnriBCpbF7mPq46xMw,20337
|
22
22
|
Podflow/bilibili/login.py,sha256=aYKEj5re-JYXnA0aCOKUF9Cqwwd7FTOuAu_yvcaqdag,10944
|
23
23
|
Podflow/config/__init__.py,sha256=BroaS1uvdLb00OQeJXc1i7QeuErD-U-2QjynQH5IDdE,45
|
24
|
-
Podflow/config/build_original.py,sha256=
|
24
|
+
Podflow/config/build_original.py,sha256=tZtsGUi1rG6DH6cxaiaVQPRtIl6U0-FqOdeho7CXl0s,1809
|
25
25
|
Podflow/config/channge_icon.py,sha256=z2tFFiP7aZFiMP1RqXkrovWAxBOI77rTHKhuzzhFfn0,5653
|
26
26
|
Podflow/config/correct_channelid.py,sha256=o88DH1RJVloeXHI2ZKP7vb-3VUqM2yQaaUWRq3V_rfg,9252
|
27
|
-
Podflow/config/correct_config.py,sha256=
|
27
|
+
Podflow/config/correct_config.py,sha256=faER2s7jBB7siX0b5XNoMgjnR88CddQK2Yl53xVdQSI,3958
|
28
28
|
Podflow/config/get_channelid.py,sha256=3Eeh_GN1qUJGhNl5uVDUZHZpcY-fa16BtfwWpJ4Yyjg,641
|
29
29
|
Podflow/config/get_channelid_id.py,sha256=JAZ1nf_AnfOa19j4PTEwN2aITojvAvDFQj56FOWH8g8,586
|
30
30
|
Podflow/config/get_config.py,sha256=xM_C1Vk5EUAdPKwR7guPSo2IVR_QOZ-EFHfbmtMtm30,1326
|
@@ -47,9 +47,9 @@ Podflow/message/__init__.py,sha256=SC42QCYhGwCvzvBnxiBz6L1MN-l57WHbH7PIh-UyPdI,4
|
|
47
47
|
Podflow/message/backup_zip_save.py,sha256=cU1oLO68INKSlmckYNCWmdZKu51T-HNuVFSHYzA9a-8,1740
|
48
48
|
Podflow/message/create_main_rss.py,sha256=pbi5h0EOPLtX9rh9IUZ4QWdXQnQXNRPTE35XCUqiiqw,1773
|
49
49
|
Podflow/message/display_qrcode_and_url.py,sha256=72DwF1H2-cmVxsRlTb93Othc-6fkgFWEVHl3djm3acE,1183
|
50
|
-
Podflow/message/fail_message_initialize.py,sha256=
|
50
|
+
Podflow/message/fail_message_initialize.py,sha256=ilLoRBtHaDvcz9vZ3R57Ut1AknUOQxioR0mLWsLMFL0,6130
|
51
51
|
Podflow/message/format_time.py,sha256=2Z7rPh3rrU68UoDO5fFF_ipV_SEmtotziBmBBl0mHdc,909
|
52
|
-
Podflow/message/get_original_rss.py,sha256=
|
52
|
+
Podflow/message/get_original_rss.py,sha256=QRtpHEYeS9rDh4Cv_EkTIC89eSw0I6540ykrTT3yr-4,2383
|
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
|
@@ -69,12 +69,14 @@ Podflow/netscape/get_cookie_dict.py,sha256=ptT2H8ZwFseK8EmpH0jn-lhzh-KCciOOPwpAJ
|
|
69
69
|
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
|
+
Podflow/upload/__init__.py,sha256=9uOIL8vr_vP_XYrhfZ4IDZmfSGyCf0_MpLOc-KnbpSY,45
|
73
|
+
Podflow/upload/get_upload_original.py,sha256=JLepP_0ROLexVNUV-Ji8r1kq81pACfJqdA4ewIgmujw,4194
|
72
74
|
Podflow/youtube/__init__.py,sha256=-bdMyuw-wxoz2miVkp284amS4Qg0k7VN0JPuGF-cXlM,46
|
73
|
-
Podflow/youtube/build.py,sha256=
|
75
|
+
Podflow/youtube/build.py,sha256=010SwUpvtYrAOxZEWOqt70XByPpPrnZ0HQZOCD96Qhg,11171
|
74
76
|
Podflow/youtube/get.py,sha256=dFLyiHttygqdJltwC29jD_v8wwoLynE5NUdow_0wERI,16970
|
75
77
|
Podflow/youtube/login.py,sha256=DlS_ZG4g6CKWqS5ojE4UwFJSCSZDsXbeuDVgHtQAa4A,1380
|
76
|
-
podflow-
|
77
|
-
podflow-
|
78
|
-
podflow-
|
79
|
-
podflow-
|
80
|
-
podflow-
|
78
|
+
podflow-20250212.dist-info/METADATA,sha256=ikAvsNny5lZfu8dkgprsW2R3uLKCyHxpqNwlPp2F6yo,13801
|
79
|
+
podflow-20250212.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
80
|
+
podflow-20250212.dist-info/entry_points.txt,sha256=44nj8jJB7bo1JLNrKQZmwMGEA1OalrALJ0tF_G0yXLY,131
|
81
|
+
podflow-20250212.dist-info/top_level.txt,sha256=KcvRCiz_DRWWc9i-PgpARvFB0J4CKmpZOZgPqOdG-Lk,8
|
82
|
+
podflow-20250212.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|