目前,我正在努力了解如何将python脚本带到彼此执行多项任务。
对于这种情况,我将自己设定为目标:
创建一个带有URL的脚本,通过HTTP-GET传递,下载URL后面的视频,将其转换为mp3文件并执行一些"下载后的内容"比如设置mp3标签。 这里的挑战应该是,接受新的"下载请求" while 另一个下载/转换/后期下载过程已激活。
如果这种用法有意义,不应该是这个问题的重点(因为我知道已经有软件可用于实现视频到mp3的下载)。 我只是想了解如何在执行其他任务(下载/转换/后期下载)时使用python来提供某个服务(httpd)。
首先,我尝试尽可能基本。 所以我决定使用BaseHttpServer和youtube-dl。 BaseHttpServer让我在我的脚本中提供和处理HTTP,youtube-dl管理下载/转换。处理下载后动作是我的问题。
目前,我可以接受多个"下载请求"并启动多个子进程'但是......我怎样才能开始"后期下载"一次下载/转换完成后的事情(如设置mp3标签)。因为我不知道如何获得特定文件的下载/转换成功完成的信息。
到目前为止,这是我的代码
#!/usr/bin/env python
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import SocketServer
import subprocess
class S(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
def do_GET(self):
# set youtube-dl command and arguments
args = ['youtube-dl', '--extract-audio', '--audio-format', 'mp3', '--output', '%(title)s.%(ext)s', '--no-playlist', '--quiet']
# building HTTP Header and extract path from it
self._set_headers()
passed = self.path # catch the passed url
url = passed[1:] # cutoff leading /
if url:
# append the url as the last argument to args
args.append(url)
# download
subprocess.Popen(args)
else:
print('empty request')
def run(server_class=HTTPServer, handler_class=S, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print 'Starting httpd...'
httpd.serve_forever()
if __name__ == "__main__":
from sys import argv
if len(argv) == 2:
run(port=int(argv[1]))
else:
run()
这使我能够下载视频并将其存储为mp3,同时接受另一个下载请求,但我不知道在 >>下载/转换之后对文件执行进一步操作< strong> while 接受并开始新的下载/转换。
使用subprocess.call()
并等到youtube-dl完成后会破坏接受另一个下载的选项,与当前版本并行。
编写第二个脚本,我以.Popen()
开头处理下载/转换/后期下载 - 这些似乎不是正确的方法^^
现在这对我来说是鸡蛋和鸡蛋的情况......希望你能开导我......
答案 0 :(得分:0)
来自Sanket Sudake的小费为我做了诀窍!
我使用Celery作为具有已定义任务的任务管理器,我在异步链接的帮助下调用以在专门的任务中处理我定义的任务(下载和转换&amp; post_download-stuff)。
非常好用!
和Celery有更多功能和技术可供试验! 但对于我自定义的情况,任务的异步链工作正常,这是我的解决方案!
我添加了一个systemd-config,将其用作systemd可管理的守护程序服务。