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.
- Podflow/basic/write_log.py +1 -1
- Podflow/download/dl_aideo_video.py +3 -4
- Podflow/ffmpeg_judge.py +1 -7
- Podflow/main.py +1 -2
- Podflow/message/media_format.py +4 -10
- Podflow/youtube/build.py +28 -54
- Podflow/youtube/get.py +64 -74
- {podflow-2025.1.26.dist-info → podflow-20250126.post2.dist-info}/METADATA +1 -1
- {podflow-2025.1.26.dist-info → podflow-20250126.post2.dist-info}/RECORD +12 -12
- {podflow-2025.1.26.dist-info → podflow-20250126.post2.dist-info}/WHEEL +0 -0
- {podflow-2025.1.26.dist-info → podflow-20250126.post2.dist-info}/entry_points.txt +0 -0
- {podflow-2025.1.26.dist-info → podflow-20250126.post2.dist-info}/top_level.txt +0 -0
Podflow/basic/write_log.py
CHANGED
@@ -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)
|
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)
|
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
|
-
]
|
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
|
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
|
65
|
+
print(f"{datetime.now().strftime('%H:%M:%S')}|Podflow开始运行.....")
|
67
66
|
# 判断是否安装ffmpeg
|
68
67
|
ffmpeg_judge()
|
69
68
|
# 初始化
|
Podflow/message/media_format.py
CHANGED
@@ -29,16 +29,10 @@ def duration_and_formats(video_website, video_url, cookies):
|
|
29
29
|
"logger": MyLogger(),
|
30
30
|
}
|
31
31
|
if cookies:
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
-
][
|
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
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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,
|
19
|
-
youtube_value,
|
20
|
-
guids=
|
21
|
-
direction_forward=True,
|
22
|
-
update_size=20,
|
23
|
-
youtube_content_ytid_original=
|
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 = []
|
26
|
-
item = {}
|
27
|
-
threads = []
|
28
|
-
fail = []
|
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]
|
30
|
+
videoid_start = guids[0] if direction_forward else guids[-1]
|
37
31
|
except IndexError:
|
38
|
-
videoid_start = ""
|
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
|
-
)
|
40
|
+
)
|
47
41
|
if not yt_Initial_Player_Response:
|
48
|
-
return 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)
|
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
|
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
|
-
)
|
70
|
+
)
|
82
71
|
if not yt_initial_data:
|
83
|
-
return 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
|
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"]
|
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:
|
107
|
-
title = playlist["playlistPanelVideoRenderer"]["title"][
|
108
|
-
|
109
|
-
]
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
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,
|
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
|
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] = {
|
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,
|
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
|
-
|
155
|
-
|
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:]
|
166
|
-
idlist = idlist[:index]
|
156
|
+
index = min(idlist.index(videoid), index)
|
157
|
+
idlist_fail = idlist[index:]
|
158
|
+
idlist = idlist[:index]
|
167
159
|
for videoid in idlist_fail:
|
168
|
-
|
169
|
-
|
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
|
Podflow/__init__.py,sha256=fkPG1o_2qAA_qeUgBPs9FPWc5-7p8WuQ-h2FqrgsZS4,6803
|
2
|
-
Podflow/ffmpeg_judge.py,sha256=
|
3
|
-
Podflow/main.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
74
|
-
Podflow/youtube/get.py,sha256=
|
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-
|
77
|
-
podflow-
|
78
|
-
podflow-
|
79
|
-
podflow-
|
80
|
-
podflow-
|
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,,
|
File without changes
|
File without changes
|
File without changes
|