python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5


Posted in Python onDecember 01, 2020

相对之前版本更新内容:

※ 根据UP主分类存放导出的视频。

※ 新增一种标题格式

注意:需要安装ffmpeg才可使用
ffmpeg下载地址: https://ffmpeg.zeranoe.com/builds/
ffmpeg安装方法:
解压好下载的压缩包后,再将bin目录加入Path环境变量中 按Win+R 运行 输入cmd 在弹出的框框中输入 ffmpeg ,如果没有出现"既不是内部或外部命令"之类的话就是安装成功了
参考链接: https://3water.com/article/153806.htm
运行截图

python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5 

工具源码

import os
import json
import random
import time
import requests

# 清除所有空格
def clearSpace(str):
 return str.replace(" ", "").replace(" ", "");


# 获取指定Uid的Up主名
def getUpNameByUid(uid):
 try:
 url = 'https://space.bilibili.com/' + str(uid)
 html = requests.get(url)
 html.encoding = 'UTF-8'
 html = html.text
 index1 = html.find("<title>") + len("<title>")
 index2 = html.find("的个人空间", index1)
 result = html[index1:index2]
 if (result != ""):
  return result
 else:
  return uid
 except Exception:
 return uid

# 获取时间戳
def getTimeStamp():
 t = time.localtime(time.time())
 return str(t.tm_year) + '_' + str(t.tm_mon) + '_' + str(t.tm_mday) + '_' + str(t.tm_hour) + \
  str(t.tm_min) + str(t.tm_sec) + str(random.randint(10, 99))


# 更正文件名
def correctFileName(name):
 n_list = list(name)
 for i in range(0, len(n_list)):
 index = 0
 for i in n_list:
  if (
   i == '\\' or i == '/' or i == ':' or i == '*' or i == '?' or i == '\"' or i == '<' or i == '>' or i == '|'):
  n_list.pop(index)
  index = index + 1
 return ''.join(n_list)

# 读取json文件
def getVideoName(path):
 f = open(path, encoding='utf-8')
 setting = json.load(f)
 try:
 result = setting['page_data']['download_subtitle'] # 注意多重结构的读取语法
 except KeyError:
 try:
  result = setting['title'] + ' 第' + setting['ep']['index'] + '话 ' + setting['ep']['index_title']
 except KeyError:
  try:
  result = setting['title']
  except KeyError:
  result = getTimeStamp()
 return result


def getVideoOwner(path):
 try:
 f = open(path, encoding='utf-8')
 setting = json.load(f)
 return clearSpace(getUpNameByUid(setting['owner_id']))
 except Exception:
 return ""

# 获取文件列表
def getFileList(file_dir):
 # 定义四个列表
 title = []
 owner = []
 videoPath = []
 audioPath = []
 # 遍历文件目录
 for root, dirs, files in os.walk(file_dir):
 if ('entry.json' in files):
  title.append(getVideoName(str(root) + '\\entry.json'))
  owner.append(getVideoOwner(str(root) + '\\entry.json'))
 if ('video.m4s' in files and 'audio.m4s' in files):
  videoPath.append(str(root) + '\\video.m4s')
  audioPath.append(str(root) + '\\audio.m4s')
 if (len(title) < len(videoPath)):
  title.append(getTimeStamp())
 if ('0.blv' in files):
  title.pop()
 return [title, owner, videoPath, audioPath]


# 输出mp4文件
def getMP4(title, owner, video_path, audio_path):
 # 生成输出目录
 if not os.path.exists("./output"):
 os.mkdir("./output")
 # 循环生成MP4文件
 for i in title:
 reName = correctFileName(i)
 # 开始生成MP4文件
 if not os.path.exists("./output/" + reName + ".mp4"):
  # 获取临时文件时间戳
  t_stamp = getTimeStamp()
  # 开始合成
  os.system(
  "ffmpeg -i " + video_path[title.index(i)] + " -i " + audio_path[
   title.index(i)] + " -codec copy ./output/" + t_stamp + ".mp4")
  # 设置所属Up主
  curOwner = owner[title.index(i)]
  if curOwner != "":
  if not os.path.exists("./output/" + curOwner):
   os.mkdir("./output/" + curOwner)
  os.rename("./output/" + t_stamp + ".mp4", "./output/" + curOwner + "/" + reName + ".mp4")
  else:
  # 将临时文件时间戳改为标题名
  os.rename("./output/" + t_stamp + ".mp4", "./output/" + reName + ".mp4")
  print("正在合成...")
  print("标题:" + reName)
  print("UP主:" + curOwner)
  print("视频源:" + video_path[title.index(i)])
  print("音频源:" + audio_path[title.index(i)])
  time.sleep(1)

print("欢迎使用批量合成M4S工具 ver2.5")
fileDir = str(input("请输入含M4S文件的目录:"))
f = getFileList(fileDir)
getMP4(f[0], f[1], f[2], f[3])
print("合成完毕")

已编译好的可执行文件(EXE):

链接: https://pan.baidu.com/s/1bLOg6GGJ5Wp7gcW73sXzvg

提取码: yqvm

到此这篇关于python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5的文章就介绍到这了,更多相关python批量合成bilibili缓存文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
盘点提高 Python 代码效率的方法
Jul 03 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
May 21 Python
python多进程实现进程间通信实例
Nov 24 Python
python3.x实现发送邮件功能
May 22 Python
python中的不可变数据类型与可变数据类型详解
Sep 16 Python
Python3中_(下划线)和__(双下划线)的用途和区别
Apr 26 Python
python实现多进程通信实例分析
Sep 01 Python
python实现飞机大战小游戏
Nov 08 Python
python 实现多维数组(array)排序
Feb 28 Python
PyQt5 控件字体样式等设置的实现
May 13 Python
python求numpy中array按列非零元素的平均值案例
Jun 08 Python
Python3中最常用的5种线程锁实例总结
Jul 07 Python
python连接mongodb数据库操作数据示例
Nov 30 #Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
Nov 30 #Python
Python命令行参数定义及需要注意的地方
Nov 30 #Python
用sleep间隔进行python反爬虫的实例讲解
Nov 30 #Python
Python基于Faker假数据构造库
Nov 30 #Python
python爬虫调度器用法及实例代码
Nov 30 #Python
python爬虫中url管理器去重操作实例
Nov 30 #Python
You might like
漫威DC即将合作联动,而双方早已经秘密开始
2020/04/09 欧美动漫
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
destoon公司主页模板风格的添加方法
2014/06/20 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
PHP读取Excel类文件
2017/05/15 PHP
php实现的双色球算法示例
2017/06/20 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
vue中jsonp插件的使用方法示例
2020/09/10 Javascript
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
python如何修改文件时间属性
2021/02/05 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
单方离婚协议书范本(2014版)
2014/09/30 职场文书
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android