Как заставить файлы загружаться через pafy и youtube-dl в веб-приложении Django - PullRequest
0 голосов
/ 08 октября 2018

Я сделал приложение для загрузки видео на YouTube с django и pafy.

Проблема в последней ссылке, которую я получаю, что-то вроде https://r5 --- sn-gwpa-jj0z-бла-бла .

Эти ссылки открывают файлы в браузере, как сделать их загружаемыми на клиентском компьютере?

Шаблон, который я использую для получения ссылки на скачивание,

{% for resolution,extension,file_size,url in streams %}
    <tr>
        <td>{{ resolution }}</td>
        <td>{{ file_size }}</td>
        <td>{{ extension }}</td>
        <td>
            <a href="{{ url }}" download="{{ title }}.{{ extension }}" type="application/octet-stream" >
                <span class="glyphicon glyphicon-download-alt" ></span> Download
            </a>
        </td>
    </tr>
{% endfor %}

Можно ли получить прямые ссылки от youtube-dl, я много искал, но не нашел верного ответа, у меня ничего не получилось?

Обновление

Views.py

import pafy
from django.http import HttpResponse
from django.shortcuts import render
from django.template.defaultfilters import filesizeformat
from django.views import generic


def url_corrector(url):

    correct_url = url

    if 'm.' in url:
        correct_url = correct_url.replace('m.', '')

    if 'youtu.be' in url:
        video_id = url.split('/')[-1]
        correct_url = 'https://www.youtube.com/watch?v=' + video_id

    return correct_url


class Download(generic.View):
    # """The view which handles the url and returns the download links."""

    template_name = 'download.html'

    def get(self, request, *args, **kwargs):
        return render(request, self.template_name)

    def post(self, request, *args, **kwargs):
        url = request.POST['url']
        url = url_corrector(url)  # Converting the urls in a format that is supported by pafy.

        # if len(url.split("=")[-1]) != 11:  # Checks whether the url contains the 11 character unique video id.
        #     return HttpResponse('Enter correct url.')

        video = pafy.new(url)  # creates a pafy object for a given youtube url.

        stream = video.streams  # both video and audio
        video_audio_streams = list()  # list of all the videos which also contain audio
        for s in stream:
            video_audio_streams.append(
                [s.resolution, s.extension, filesizeformat(s.get_filesize()), s.url + "&title=" + video.title])

        stream_video = video.videostreams  # only video
        video_streams = list()  # list of all the dash video formats(only video)
        for s in stream_video:
            video_streams.append(
                [s.resolution, s.extension, filesizeformat(s.get_filesize()), s.url + "&title=" + video.title])

        stream_audio = video.audiostreams  # only audio
        audio_streams = list()  # list of all the dash audio formats(only audio)
        for s in stream_audio:
            audio_streams.append(
                [s.resolution, s.extension, filesizeformat(s.get_filesize()), s.url + "&title=" + video.title])

        return render(request, self.template_name,
                      {'url': request.POST['url'], 'title': video.title, 'streams': video_audio_streams,
                       'desc': video.description, 'likes': video.likes,
                       'dislikes': video.dislikes, 'thumb': video.bigthumbhd,
                       'duration': video.duration, 'views': video.viewcount,
                       'stream_video': video_streams, 'stream_audio': audio_streams})

1 Ответ

0 голосов
/ 08 октября 2018

pafy просто дает прямые ссылки на видеофайлы.Видео находится на серверах Google, поэтому, даже если в html-файле есть атрибут download, оно не будет работать, поскольку видео находится не в одном домене, поэтому вы не можете контролировать заголовки.Что вы можете сделать, это загрузить видеофайл временно на ваш сервер и предоставить его пользователю.

РЕДАКТИРОВАТЬ:
Один из возможных решений - alt + click в ссылках для скачивания.Он загрузит файл вместо воспроизведения.Я попытался вызвать alt+click на обычные клики тоже с помощью js, но это не сработало.Так что вам придется каждый раз alt+click вручную.

...