2024最新YT-DLP使用demo网页端渲染

server/2024/11/25 11:35:44/

2024最新YT-DLP使用demo网页端渲染

  • 前提摘要
  • 1.使用pythonfastapi库和jinjia2库进行前端渲染
  • 2.代码实现
    • 1)目录结构
    • 2)代码
      • style.css
      • index.html
      • result.html
      • main.py
      • run.py
    • 3)运行测试
      • 命令端运行
  • 3.项目下载地址

前提摘要

2024最新python使用yt-dlp
在这里插入图片描述

pythonfastapijinjia2_5">1.使用pythonfastapi库和jinjia2库进行前端渲染

需要下载下面对应的python第三方库
pip install fastapi uvicorn python-multipart jinja2 yt-dlp

功能如下
使用YT-DLP,缓存文件到本地,预览文件信息

在这里插入图片描述
在这里插入图片描述

2.代码实现

1)目录结构

在这里插入图片描述

2)代码

style.css

body {font-family: Arial, sans-serif;margin: 0;padding: 20px;background-color: #f0f0f0;
}.container {max-width: 800px;margin: 0 auto;background-color: white;padding: 20px;border-radius: 8px;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}/* 添加 logo 相关样式 */
.logo {display: flex;justify-content: center;gap: 8px;margin-bottom: 20px;
}.youtube-icon, .download-icon {width: 32px;  /* 调整图标大小 */height: 32px; /* 调整图标大小 */
}.header {text-align: center;margin-bottom: 30px;
}h1 {font-size: 24px;margin: 10px 0;
}.subtitle {color: #666;margin-bottom: 20px;
}form {margin: 20px 0;
}.input-group {display: flex;gap: 10px;
}input[type="text"] {flex: 1;padding: 10px;border: 1px solid #ddd;border-radius: 4px;
}button {background-color: #007bff;color: white;padding: 10px 20px;border: none;border-radius: 4px;cursor: pointer;
}button:hover {background-color: #0056b3;
}.disclaimer {text-align: center;color: #666;font-size: 14px;margin: 20px 0;
}.info-icon {color: #007bff;cursor: help;
}.footer {text-align: center;margin-top: 30px;color: #666;font-size: 14px;
}

index.html

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>YouTube 视频下载器</title><link rel="stylesheet" href="{{ url_for('static', path='style.css') }}">
</head>
<body><div class="container"><div class="header"><div class="logo"><svg class="youtube-icon" viewBox="0 0 24 24"><path fill="#FF0000" d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/></svg><svg class="download-icon" viewBox="0 0 24 24"><path fill="#4285f4" d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></svg></div><h1>YT-DLP-DEMO</h1><p class="subtitle">YTDownload</p></div><form action="/download" method="POST"><div class="input-group"><input type="text" name="url" placeholder="https://www.youtube.com/watch?v=..." required><button type="submit">下载</button></div></form><div class="footer"><p>由 FastAPI 和 yt-dlp 提供技术支持</p></div></div>
</body>
</html> 

result.html

<!DOCTYPE html>
<html>
<head><title>Download Result</title><link rel="stylesheet" href="{{ url_for('static', path='style.css') }}">
</head>
<body><div class="container">{% if success %}<div class="result-info"><div class="video-header"><div class="video-details"><h2>{{ video_info.title }}</h2><div class="meta-info"><p><strong>作者:</strong> {{ video_info.author }}</p><p><strong>时长:</strong> {{ video_info.length }}</p><p><strong>观看次数:</strong> {{ '{:,}'.format(video_info.views) }}</p></div></div></div><div class="download-sections"><div class="preview-section"><h3>视频预览</h3><div class="preview-container"><video controls><source src="{{ video_path }}" type="video/mp4">您的浏览器不支持视频标签。</video></div><a href="{{ video_path }}" class="download-button" download><span class="icon"></span> 下载视频</a></div><div class="preview-section"><h3>音频预览</h3><div class="preview-container"><audio controls><source src="{{ audio_path }}" type="audio/mp4">您的浏览器不支持音频标签。</audio></div><a href="{{ audio_path }}" class="download-button" download><span class="icon"></span> 下载音频</a></div></div></div>{% else %}<div class="error-container"><h2>下载失败</h2><p class="error-message">{{ error }}</p></div>{% endif %}<a href="/" class="back-button">返回首页</a></div>
</body>
</html> 

main.py

from fastapi import FastAPI, Request, Form
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse
import yt_dlp
from pathlib import Path
import osapp = FastAPI()# 配置静态文件和模板
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")# 配置下载目录
VIDEO_DIR = Path("downloads/video")
AUDIO_DIR = Path("downloads/audio")
VIDEO_DIR.mkdir(parents=True, exist_ok=True)
AUDIO_DIR.mkdir(parents=True, exist_ok=True)def download_youtube_video(url):try:# yt-dlp 基础配置common_opts = {'cookiefile': r'www.youtube.com_cookies.txt','quiet': False,'no_warnings': False,'verbose': True,'proxy': 'http://127.0.0.1:10809','socket_timeout': 30,'retries': 3,'nocheckcertificate': True,'prefer_insecure': True}# 视频下载选项video_opts = {**common_opts,'format': 'best[ext=mp4][height<=720]/best[height<=720]/best','outtmpl': str(VIDEO_DIR / '%(title)s.%(ext)s'),}# 音频下载选项audio_opts = {**common_opts,'format': 'bestaudio[ext=m4a]/bestaudio','outtmpl': str(AUDIO_DIR / '%(title)s.%(ext)s'),}# 获取视频信息with yt_dlp.YoutubeDL(common_opts) as ydl:info = ydl.extract_info(url, download=False)title = info['title']duration = info['duration']thumbnail = info['thumbnail']author = info.get('uploader', 'Unknown')views = info.get('view_count', 0)# 下载视频with yt_dlp.YoutubeDL(video_opts) as ydl:ydl.download([url])# 下载音频with yt_dlp.YoutubeDL(audio_opts) as ydl:ydl.download([url])# 获取下载后的文件路径video_file = next(VIDEO_DIR.glob(f"{title}.*"))audio_file = next(AUDIO_DIR.glob(f"{title}.*"))return {"status": "success","title": title,"author": author,"duration": f"{duration // 60}:{duration % 60:02d}","views": views,"thumbnail": thumbnail,"video_path": str(video_file.name),"audio_path": str(audio_file.name)}except Exception as e:return {"status": "error", "message": str(e)}@app.get("/")
async def home(request: Request):return templates.TemplateResponse("index.html", {"request": request})@app.post("/download")
async def download_video_route(request: Request, url: str = Form(...)):try:result = download_youtube_video(url)if result["status"] == "success":video_info = {"title": result["title"],"author": result["author"],"length": result["duration"],"views": result["views"],"thumbnail": result["thumbnail"]}return templates.TemplateResponse("result.html", {"request": request,"video_info": video_info,"video_path": f"/downloads/video/{result['video_path']}","audio_path": f"/downloads/audio/{result['audio_path']}","success": True})else:raise Exception(result["message"])except Exception as e:return templates.TemplateResponse("result.html", {"request": request,"error": str(e),"success": False})# 配置下载目录的静态文件服务
app.mount("/downloads", StaticFiles(directory="downloads"), name="downloads") 

run.py

import uvicorn
import osdef check_directories():"""确保必要的目录存在"""directories = ['static','templates','downloads','downloads/video','downloads/audio']for directory in directories:if not os.path.exists(directory):os.makedirs(directory)print(f"Created directory: {directory}")if __name__ == "__main__":# 检查并创建必要的目录check_directories()# 配置并启动服务器uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True,reload_dirs=["templates", "static"],log_level="info") 

3)运行测试

命令端运行

pip install fastapi uvicorn python-multipart jinja2 yt-dlp

在这里插入图片描述

python run.py

在这里插入图片描述

3.项目下载地址

https://github.com/unkownc/python_demo/tree/main
在这里插入图片描述


http://www.ppmy.cn/server/144780.html

相关文章

Epipolar-Free 3D Gaussian Splatting for Generalizable Novel View Synthesis 论文解读

目录 一、概述 二、相关工作 1、单场景3DGS 2、跨场景生成3DGS 3、几何方法解决3D任务 三、eFreeSplat 1、预训练跨视角模块 2、无外极线跨视角交互感知模块 3、迭代跨视角高斯对齐 4、高斯参数预测 一、概述 该论文设计了一种不依赖于极线约束的情况实现可推广的新视…

Spring AI Fluent API:与AI模型通信的流畅体验

引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;越来越多的应用场景开始融入AI技术以提升用户体验和系统效率。在Java开发中&#xff0c;与AI模型通信成为了一个重要而常见的需求。为了满足这一需求&#xff0c;Spring AI引入了ChatClient&#xff0c…

书生浦语实战训练营L1G5000

XTuner 微调个人小助手认知任务 记录复现过程并截图。 基础任务&#xff08;完成此任务即完成闯关并获得 100 算力点&#xff09; 使用 XTuner 微调 InternLM2-Chat-7B 实现自己的小助手认知&#xff0c;如下图所示&#xff08;图中的尖米需替换成自己的昵称&#xff09;&…

springboot 使用笔记

1.springboot 快速启动项目 注意&#xff1a;该启动只是临时启动&#xff0c;不能关闭终端面板 cd /www/wwwroot java -jar admin.jar2.脚本启动 linux shell脚本启动springboot服务 3.java一键部署springboot 第5条 https://blog.csdn.net/qq_30272167/article/details/1…

安卓手机5G网络频繁掉4G 问题解决 手机5G网络优化方案

问题环境 在某个长期停留的位置&#xff08;例如&#xff1a;躺平&#xff09;使用手机时网络突然从5G跳到4G&#xff0c;偶尔跳来跳去导致网络体验很差&#xff0c;经过调整5G网络情况下网速及其他体验都要更好&#xff0c;基于这样的情况使用一种简单的操作&#xff0c;锁定5…

生成式AI;语义通信技术;生成式AI辅助的云边协同算法及其可解释性

目录 生成式AI 语义通信技术 生成式AI辅助的云边协同算法及其可解释性 一、端到端设计的物理层内生智能 二、生成式语义通信 三、生成式数字孪生网络 四、生成式AI辅助的云边协同算法及其可解释性 五、未来可能的研究方向 生成式AI 是一种人工智能技术,它能够从大量数…

Pytorch|mnist手写数字识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import matplotlib.pyplot as plt import torchvi…

【vim】使用 gn 组合命令实现搜索选中功能

gn是Vim 7.4新增的一个操作&#xff08;motion&#xff09;&#xff0c;作用是跳到并选中下一个搜索匹配项。 具体说&#xff0c;Vim里执行搜索后&#xff0c;执行n操作只会跳转到下一个匹配项&#xff0c;而不选中它。但是我们往往需要对匹配项执行一些修改操作&#xff0c;例…