如何估计下载完成之前需要多少时间,然后将其作为进度条+计时器显示在网站上

问题描述 投票:0回答:0

``几乎我知道我必须用 java 来做,但我真的对 java 一无所知,我唯一知道的是如何通过 AJAX 使页面在更改页面时不冻结

我非常想通过为 youtube 实现 yt-dlb 分支来挑战自己,它工作得很好,但我被困在添加一个计时器,告诉用户在转换后的文件准备好下载之前需要多长时间(我的意思是严格来说,这是从用户按下转换到出现下载所述文件的按钮的时间。)

我不打算在任何地方部署它,我只是想学习如何做

我试过查看一些论坛但没有用

我唯一试过的就是这个

<h1>Yeqwfwq</h1>

<div id="message"></div>

<form id="download-form">
    <label for="youtube_url">YouTube video URL:</label>
    <input type="text" name="youtube_url" id="youtube_url">
    <br><br>
    <label for="format">Select a format:</label>
    <select name="format" id="format">
        <option value="mp3">MP3</option>
        <option value="mp4">MP4</option>
    </select>
    <br><br>
    <button type="submit">Convert</button>
</form>

<div id="progress-bar" style="display:none">
    <div id="progress" style="background-color: #4CAF50; width: 0%; height: 20px;"></div>
    <div id="progress-text">Conversion progress: <span id="progress-percent">0%</span></div>
    <br>
</div>

<script>

    $(document).ready(function() {

        // Handle form submission
        $("#download-form").submit(function(event) {
            event.preventDefault();
            var form = $(this);
            var message = $("#message");
            var url = form.find("#youtube_url").val();
            var format = form.find("#format").val();

            // Check if the YouTube URL is valid
            if (url.trim() === "" || !isValidYoutubeUrl(url)) {
                message.html("Please enter a valid YouTube video URL");
                return;
            }

            // Send AJAX request to start download
            $.ajax({
                type: "POST",
                url: "download.php",
                data: {
                    youtube_url: url,
                    format: format
                },
                beforeSend: function() {
                    message.html("Starting download...");
                    $("#progress-bar").show();
                },
                xhr: function() {
                    var xhr = $.ajaxSettings.xhr();
                    if (xhr.upload) {
                        xhr.upload.addEventListener('progress', function(event) {
                            var percent = 0;
                            var position = event.loaded || event.position;
                            var total = event.total || event.totalSize;
                            if (event.lengthComputable) {
                                percent = Math.ceil(position / total * 100);
                            }
                            $("#progress").width(percent + '%');
                            $("#progress-percent").html(percent + '%');
                        }, true);
                    }
                    return xhr;
                },
                success: function(data) {
                    message.html(data);
                    $("#progress-bar").hide();
                },
                error: function() {
                    message.html("An error occurred while downloading the video");
                    $("#progress-bar").hide();
                }
            });
        });

        // Validate YouTube URL
        function isValidYoutubeUrl(url) {
            var pattern = /^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.be)\//;
            return pattern.test(url);
        }

    });
</script>


但是每次我尝试下载一些东西时,下载完成后就会显示计时器。

这将是完成所有工作的 php 代码

<?php

// Check if YouTube video URL and format are set
if (isset($_POST['youtube_url']) && isset($_POST['format'])) {

    // Get YouTube video URL and format
    $youtube_url = $_POST['youtube_url'];
    $format = $_POST['format'];

    // Validate YouTube URL
    if (preg_match('/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.be)\//', $youtube_url) !== 1) {
        die("Please enter a valid YouTube video URL");
    }

    // Build yt-dlp command
    $cmd = "yt-dlp --yes-playlist -o downloads/%(title)s.%(ext)s " . escapeshellarg($youtube_url);

    // If format is mp3, add the --extract-audio and --audio-format mp3 options
    if ($format === "mp3") {
        $cmd .= " --extract-audio --audio-format mp3";
    }

    // If format is mp4, add the --merge-output-format mp4 option
    if ($format === "mp4") {
        $cmd .= " --merge-output-format mp4";
    }

    // Execute yt-dlp command
    exec($cmd, $output, $return);

    // Check if the download was successful
    if ($return === 0) {
        // Find the downloaded file
        $files = glob('downloads/*.' . $format);
        if (count($files) > 0) {
            $filename = $files[0];
            // Set headers to download the file
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
            header('Content-Length: ' . filesize($filename));
        } else {
            echo "An error occurred: downloaded file not found";
        }
    } else {
        echo "An error occurred while downloading the video";
    }

    // Add download button
    echo '<a href="downloads/' . basename($filename) . '" download>
    <button>Download Converted File</button>
</a>';

} else {
    echo "Please enter a YouTube video URL and select a format";
}

?> 






and this would be the code that handles the HTML page


<!DOCTYPE html>
<link rel="stylesheet" href="style.css">
<html>
<head>
    <title>YouTube Downloader</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>

    <h1>YouTube Downloader</h1>

    <div id="message"></div>

    <form id="download-form">
        <label for="youtube_url">YouTube video URL:</label>
        <input type="text" name="youtube_url" id="youtube_url">
        <br><br>
        <label for="format">Select a format:</label>
        <select name="format" id="format">
            <option value="mp3">MP3</option>
            <option value="mp4">MP4</option>
        </select>
        <br><br>
        <button type="submit">Convert</button>
    </form>

    <script>

        $(document).ready(function() {

            // Handle form submission
            $("#download-form").submit(function(event) {
                event.preventDefault();
                var form = $(this);
                var message = $("#message");
                var url = form.find("#youtube_url").val();
                var format = form.find("#format").val();

                // Check if the YouTube URL is valid
                if (url.trim() === "" || !isValidYoutubeUrl(url)) {
                    message.html("Please enter a valid YouTube video URL");
                    return;
                }

                // Send AJAX request to start download
                $.ajax({
                    type: "POST",
                    url: "download.php",
                    data: {
                        youtube_url: url,
                        format: format
                    },
                    beforeSend: function() {
                        message.html("Starting download...");
                    },
                    success: function(data) {
                        message.html(data);
                    },
                    error: function() {
                        message.html("An error occurred while downloading the video");
                    }
                });
            });

            // Validate YouTube URL
            function isValidYoutubeUrl(url) {
                var pattern = /^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.be)\//;
                return pattern.test(url);
            }

        });
    </script>

</body>
</html>



`

`

javascript timer progress-bar yt-dlp
© www.soinside.com 2019 - 2024. All rights reserved.