dnu
背景
作为一个喜欢搬运 YouTube 视频的网友,我发现将视频下载下来再上传到 B 站十分繁琐,因此我决定开发一个小工具,能够方便快捷地将 YouTube 视频下载并上传至 B 站,以节省我的时间和精力。
项目实现
语言:Python
主要借助:request库、yt-dlp、biliup
完整代码:
from PIL import Image
import json
import sys
import requests
import yt_dlp
import subprocess
from biliup.plugins.bili_webup import BiliBili, Data
def download(url):
# 初始化
video_info = {}
audio_ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
}],
'outtmpl': './resource/%(channel)s/%(id)s'
}
video_ydl_opts = {
'format' : 'bv[height<=1080][ext=mp4]+ba[ext=m4a]',
'outtmpl': './resource/%(channel)s/%(id)s.mp4'
}
# 下载音频
with yt_dlp.YoutubeDL(audio_ydl_opts) as ydl:
ydl.download(url)
with yt_dlp.YoutubeDL(video_ydl_opts) as ydl:
# 获取视频信息
extract_info = ydl.extract_info(url, download=False)
video_info['id'] = extract_info['id']
video_info['title'] = extract_info['title']
video_info['description'] = extract_info['description']
video_info['url'] = extract_info['webpage_url']
video_info['categories'] = extract_info['categories']
video_info['tags'] = extract_info['tags']
video_info['video_path'] = f"./resource/{extract_info['channel']}/{extract_info['id']}.mp4"
video_info['audio_path'] = f"./resource/{extract_info['channel']}/{extract_info['id']}.mp3"
video_info['thumbnail_path'] = f"./resource/{extract_info['channel']}/{extract_info['id']}.png"
# 下载视频
ydl.download(url)
# 下载壁纸,并转换成可以上传的格式
imgData = requests.get(extract_info['thumbnail']).content
with open(f"./resource/{extract_info['channel']}/{extract_info['id']}.webp", "wb") as handler:
handler.write(imgData)
im = Image.open(f"./resource/{extract_info['channel']}/{extract_info['id']}.webp").convert("RGB")
im.save(f"./resource/{extract_info['channel']}/{extract_info['id']}.png")
return video_info
# 上传
def upload(video_info):
return_code = subprocess.run([
'./biliup', 'upload', f"{video_info['video_path']}",
'--copyright', '2',
'--cover', f"{video_info['thumbnail_path']}",
'--desc', f"{video_info['description'][:99]}",
'--source', f'{video_info["url"][:79]}',
'--tag', 'youtube',
'--title', f'{video_info["title"]}',
])
print("return code:", return_code)
if __name__ == "__main__":
# 获取url
url = sys.argv[1]
# 下载
video_info = download(url)
# 上传
upload(video_info)
dnu的更多相关文章
- 解决dnu restore时的“Cannot handle address family”问题
前几天在使用基于 mono 的 dnx 中的 dnu restore 命令安装 nuget 包包时,遇到了 “Cannot handle address family” 错误,错误详情如下: Cann ...
- [DNX]解决dnu restore时找不到Newtonsoft.Json的问题
在Mac上用最新版的dnx 1.0.0-beta5-11855进行dnu restore,出现下面的错误: System.IO.FileNotFoundException: Could not loa ...
- 小白学数据分析----->DNU/DAU
行业指标观察分析-DNU/DAU 写在分析之前 一直以来,我们对于数据都是在做加法,也希望这个过程中,不断搜罗和变换出来更多的数据指标,维度等等.而在实际的分析中,我们发现,一如我们给用户提供产品一样 ...
- 理解ASP.NET 5运行时命令:DNVM, DNX, 和DNU
ASP.NET 5 引入了一个新型的运行时,让我们可以现场交付模式组合式构建应用程序,而不依赖于宿主机上的.NET框架.这种新模式为我们提供了命令行工具(DNVM.DNX.DNU)用于管理我们的.ne ...
- .NET Core、DNX、DNU、DNVM、MVC6学习资料
一.资源 1.http://dotnet.github.io/ 2.http://www.codeproject.com/Articles/1005145/DNVM-DNX-and-DNU-Under ...
- 在Ubuntu下搭建ASP.NET 5开发环境
在Ubuntu下搭建ASP.NET 5开发环境 0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要做成 ...
- ASP.NET 5 (vNext) Linux部署
引言 工欲善其事,必先利其器. 首先,我们先明确下以下基本概念 Linux相关 Ubuntu Ubuntu是基于linux的免费开源桌面PC操作系统 十分契合英特尔的超极本定位 支持x86.64位和p ...
- .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序
在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...
- .NET跨平台:在CentOS上编译dnx并运行ASP.NET 5示例程序
在之前的博文中我们在 Ubuntu 上成功编译出了 dnx ,并且用它成功运行了 ASP.NET 5 示例程序.在这篇博文中我们将 Ubuntu 换成 CentOS. 目前 dnx 的编译需要用到 m ...
- ubuntu15 coreclr
看了很多文章心里痒痒,也下载个ubuntu想发布个asp.net5试试,自然是下载的最新版本15.结果涉及dnu restore,dnx...什么的都没反应,切换为mono就正常,奇怪了,按说core ...
随机推荐
- ISCTF 2022
Re SigninReverse ida 64 位 打开程序,即可获得flag ISCTF{27413241-9eab-41e2-aca1-88fe8b525956} ezbase # coding= ...
- DVWA-SQL Injection(SQL注入)
SQL Injection,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的.结构,从而达到执行恶意SQL语句的目的. LOW: 代码审计: SQL Injection Source vuln ...
- 自己动手从零写桌面操作系统GrapeOS系列教程——19.硬盘读写理论知识
学习操作系统原理最好的方法是自己写一个简单的操作系统. 一.硬盘控制器 我们前面已经讲过硬盘控制器是一种I/O接口,CPU通过它就能间接的读写硬盘.硬盘控制器主要有IDE和SATA两种,我们这里只考虑 ...
- odoo 开发入门教程系列-模型和基本字段
模型和基本字段 在上一章的末尾,我们创建一个odoo模块.然而,此时它仍然是一个空壳,不允许我们存储任何数据.在我们的房地产模块中,我们希望将与房地产相关的信息(名称(name).描述(descrip ...
- vue中的v-model 与 .sync
<input v-model="parentData"> //等同于 <input :value="parentData" @input=&q ...
- -O1 -O2 -O3 优化的原理是什么?
一般来说,如果不指定优化标识的话,gcc就会产生可调试代码,每条指令之间将是独立的:可以在指令之间设置断点,使用gdb中的 p命令查看变量的值,改变变量的值等.并且把获取最快的编译速度作为它的目标. ...
- (原创)【B4A】一步一步入门10:TabHost,标签页、标题带图标(控件篇06)
一.前言 本篇教程我们来讲一下TabHost(标签页)的基本使用方法. 相信看完的你,一定会有所收获! 本文地址:https://www.cnblogs.com/lesliexin/p/1728556 ...
- 万字详解 | Java 流式编程
概述 Stream API 是 Java 中引入的一种新的数据处理方法.它提供了一种高效且易于使用的方法来处理数据集合.Stream API 支持函数式编程,可以让我们以简洁.优雅的方式进行数据操作, ...
- 生产事故-记一次特殊的OOM排查
入职多年,面对生产环境,尽管都是小心翼翼,慎之又慎,还是难免捅出篓子.轻则满头大汗,面红耳赤.重则系统停摆,损失资金.每一个生产事故的背后,都是宝贵的经验和教训,都是项目成员的血泪史.为了更好地防范和 ...
- sorted、返回函数、匿名函数、装饰器、偏函数
1.sorted()排序方法,它可已经一个列表按照升序排序,也可以按照反序排序 1)如果要进行反序排序时,需要在函数里面设置reverse = True 2)sorted是一个高阶函数,它接受函数作为 ...