【问题标题】:Download youtube video to user machine on Django website将 youtube 视频下载到 Django 网站上的用户机器
【发布时间】:2020-07-24 14:25:31
【问题描述】:

问题说的差不多。现在我使用 pytube 有这个功能:

    def download(request, video_url):
        url='http://www.youtube.com/watch?v='+str(video_url)
        homedir = os.path.expanduser("~")
        dirs = homedir + '/Downloads'
        download = YouTube(url).streams.first().download(dirs)   
        return redirect('../../')

但这会将视频下载到 pythonanywhere 中的目录 /Downloads/ - 我已将项目上传到的站点。

如何将视频下载到用户的机器上?该解决方案不必使用 pytube 包,因为我只想要一个答案。如果您告诉我如何将文件下载为.mp3 文件,那就太好了。

提前致谢。

【问题讨论】:

    标签: python django video download youtube


    【解决方案1】:

    问题

    当您在远程计算机(这是您在 pythonanywhere 的服务器)上运行程序时,所有操作都发生在该远程计算机上,而不是用户的计算机上。

    因此,当您在远程计算机上下载内容时,它将被下载到远程计算机(pythonanywhere)。

    解决方案

    为了满足您的要求(将文件下载到用户的计算机,而不是服务器),您可能会执行以下操作:

    • 在本地从 youtube 下载文件(就像您目前使用 YouTube....download() 所做的那样。
    • 将文件发送给用户。这就是 Gagan Aggarwal's solution 试图用 django 的 FileResponse 做的事情

    为什么会这样?

    每次您在浏览器中访问页面时,您的 django 应用程序都会大致执行以下操作:

    • 它接收来自用户的请求
    • 然后它返回一个响应

    通常一个 Django 应用程序会返回一个 HTML 页面。但是 HTML 页面只是一个文件,您正在下载的 Youtube 视频也是如此。然后您可以选择发回视频文件而不是网页。然后用户的浏览器将尝试打开该文件。

    如何选择下载位置?

    您的 Django 应用程序无法选择用户计算机上的下载位置。如果任何网站都可以在您的计算机上的任何位置下载文件,这将是一件危险的事情。

    但是,当您将文件发送给用户时,他们可以选择下载位置。

    如果您查看the documentation for FileResponse,您会看到可以传递as_attachment=True 参数。

    这将使 Django 将文件作为“附件”发送,这意味着它将尝试下载它而不是打开它。这将提示用户选择文件的下载位置。

    【讨论】:

    • 嘿,刚刚回到这个解决方案。 FileResponse 将我重定向到播放音频并具有下载按钮的页面,但它也将其下载到我的服务器。有没有办法直接重定向到这个页面而不先下载。如果你想要我,我可以添加页面的图片。
    • 要使文件从您的服务器可用到浏览器,您必须“下载”它。但这并不意味着您必须将其保存在文件中并保存在服务器中。您可以将其下载到内存中或临时文件中。如果您使用的是pytube,也许您可​​以使用python-pytube.readthedocs.io/en/latest/…。但是您可能需要阅读一些资料才能理解 BinaryIO。对于大文件,您可能还想看看 Django 的 StreamingHttpResponse。
    【解决方案2】:

    我也发布了相同的问题,但我将这个问题减少了 80%... 所以,看看我的解决方案,我希望你能帮助这个解决方案:)

    第一个导入模块

    from django.http import FileResponse
    

    然后编码...

    return FileResponse(open(YouTube(url).streams.first().download(skip_existing=True),'rb'))
    

    不能使用return redirect函数,可以使用FileResponse函数

    【讨论】:

    • 嗨,欢迎来到 SO!如果你能解释为什么海报的原始解决方案不起作用而这个解决方案起作用,它可能会更有用。
    • 我不知道原始解决方案...我尝试了很多次,所以解决方案已经发布了。
    • 我明白了!我已经添加了一个更长的答案,我希望你也会发现这对你有帮助。
    • 嘿,刚刚回到这个解决方案。 FileResponse 将我重定向到播放音频并具有下载按钮的页面,但它也将其下载到我的服务器。有没有办法直接重定向到这个页面而不先下载。如果你想要我,我可以添加页面的图片。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2011-05-10
    • 2019-05-21
    • 2021-11-03
    • 2014-05-09
    • 1970-01-01
    • 2015-05-18
    相关资源
    最近更新 更多