问题描述
我正在处理一个瓶子项目,代码正在从任何网站下载视频。下载过程没问题,但问题是当两个用户使用我的网站和两个不同的视频 URL 时,服务器会下载文件,但如果返回快速下载我的意思是哪个视频下载速度快,代码将该视频返回给所有用户。这是一个问题,因为当两个用户使用我的网站下载不同的视频时,他们必须需要与提供 url 相同的视频。 所以请帮我把所有用户分开。 所以我需要像,对于每个用户,我的服务器将返回他们粘贴 url 的视频。我使用了线程服务器粘贴。 请帮我找出我该怎么做。
from bottle import route,run,request,static_file
import os
try:
import youtube_dl
except:
os.system('pip install youtube_dl')
import youtube_dl
x=[]
def cvtmp3(filename):
p=filename.split('.')
print(p)
a=p[0]
audio=a+'.mp3'
os.rename(filename,audio)
print(audio)
def download(url):
global filename
# url=input('type the valid url: ')
ydl_opts = {'format': 'bestaudio/best'}
os.chdir('/storage/emulated/0/')
with youtube_dl.YoutubedL(ydl_opts) as ydl:
#p=ydl.extract_info('https://www.youtube.com/watch?v=n06H7OcPd-g')
#print(p)
info = ydl.extract_info(url,download=True)
filename = ydl.prepare_filename(info)
#ydl.download(['https://www.youtube.com/watch?v=n06H7OcPd-g'])
@route('/')
def index():
return '''
<!DOCTYPE html>
<html>
<head>
<Meta name="viewport" content="width=device-width,initial-scale=1">
<style>
.loader {
border: 16px solid #f3f3f3;
border-radius: 50%;
border-top: 16px solid #3498db;
width: 120px;
height: 120px;
text-align:center;
margin-left:auto;
margin-right:auto;
-webkit-animation: spin 2s linear infinite; /* Safari */
animation: spin 2s linear infinite;
}
/* Safari */
@-webkit-keyframes spin {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
</head>
<body>
<h2>paste any video link to download</h2>
<form action="/submit" method="post">
<textarea name="text"></textarea>
<input type="submit" onclick="show()">
</form>
<div class="loader" style="display:none;"></div>
<script>
function show(){
document.getElementsByTagName("h2")[0].innerText="Please wait :) you will be redirected to download page ";
document.getElementsByTagName("form")[0].style.display="none";
document.getElementsByClassName("loader")[0].style.display="block";}
</script>
'''
@route('/submit',method='POST')
def submit():
#return "<h1>processing url</h1>"
try:
text=request.forms.get('text')
if ',' in text:
urls=text.split(',')
else:urls=text.split('\n')
except:pass
global filename
x=urls
for url in urls:
download(url.strip())
#return "<h1>processing url</h1>"
return '''<h1>processing done !!!</h1><br/><a href="/downloading">download</a> '''
#%(os.getcwd()+'/'+filename)
@route('/downloading')
def downloading():
global urls
#for i in range(len(x)):
#print('hao',i)
#return 'halo'+str(i)
return static_file(filename,root=os.getcwd(),download=True)
run(port=8080)
我在我的手机上托管了这个,所以如果你有两部手机,你可以检查一下。但有时网址可以更改 Link of the website
解决方法
与 YouTube
类似,您应该生成具有唯一值的网址 - 即某些唯一编号、来自 YouTube 网址的唯一编号、下载文件的名称等。
/downloading?number=...
/downloading?filename=...
或
/downloading/<number>
/downloading/<filename>
和函数 downloading
应该使用它来发送正确的文件。
如果使用文件名,则不需要其他变量。但这可能不安全,因为有人可能会使用完整路径来保存密码。
如果您使用来自 YouTube 网址的唯一编号,那么您必须在数据库或至少在全局变量中使用 originaml 文件名记住它
database[unique_number] = filename
以及以后的 downloading
可以使用这个唯一编号来发送正确的文件名。
因为用户可能会提供很多网址,所以您应该使用 for
-loop 为每个文件单独生成指向 downloading
的链接。
最少的工作代码
from bottle import route,run,request,static_file,template
import os
try:
import youtube_dl
except:
os.system('pip install youtube_dl')
import youtube_dl
# --- functions ---
def download(url):
ydl_opts = {'format': 'bestaudio/best'}
#os.chdir('/storage/emulated/0/')
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(url,download=True)
number = info['id']
filename = ydl.prepare_filename(info)
return number,filename
# --- pages ---
@route('/')
def index():
return '''
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
.loader {
border: 16px solid #f3f3f3;
border-radius: 50%;
border-top: 16px solid #3498db;
width: 120px;
height: 120px;
text-align:center;
margin-left:auto;
margin-right:auto;
-webkit-animation: spin 2s linear infinite; /* Safari */
animation: spin 2s linear infinite;
}
/* Safari */
@-webkit-keyframes spin {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
</head>
<body>
<h2>paste any video link to download</h2>
<form action="/submit" method="post">
<textarea name="text"></textarea></br>
<input type="submit" onclick="show()">
</form>
<div class="loader" style="display:none;"></div>
<script>
function show(){
document.getElementsByTagName("h2")[0].innerText="Please wait :) you will be redirected to download page ";
document.getElementsByTagName("form")[0].style.display="none";
document.getElementsByClassName("loader")[0].style.display="block";}
</script>
'''
@route('/submit',method='POST')
def submit():
try:
text = request.forms.get('text')
if ',' in text:
urls = text.split(',')
else:
urls = text.split('\n')
except Exception as ex:
print('[Exception]',ex)
all_items = []
for url in urls:
url = url.strip()
number,filename = download(url)
database[number] = filename
all_items.append( (number,filename) )
return template('''<h1>processing done !!!</h1><br/>
% for number,filename,in items:
Download: <a href="/downloading/{{number}}">{{filename}}</a></br>
% end
''',items=all_items)
@route('/downloading/') # to catch url without number
@route('/downloading/<number>')
def downloading(number=None):
if (not number) or (number not in database):
return "WRONG NUMBER"
filename = database[number]
print('filename:',filename)
return static_file(filename,root=os.getcwd(),download=True)
if __name__ == '__main__':
database = dict()
run(port=8080)