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编程之属性和方法实例详解
May 19 Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
python中set()函数简介及实例解析
Jan 09 Python
Python 从相对路径下import的方法
Dec 04 Python
Python numpy中矩阵的基本用法汇总
Feb 12 Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
使用pickle存储数据dump 和 load实例讲解
Dec 30 Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 Python
python time()的实例用法
Nov 03 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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
php 模拟POST|GET操作实现代码
2010/07/20 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
2017/05/19 PHP
php中的钩子理解及应用实例分析
2019/08/30 PHP
多广告投放代码 推荐
2006/11/13 Javascript
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
js以对象为索引的关联数组
2010/07/04 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
JavaScript通过select动态更换图片的方法
2015/03/23 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
python开发之for循环操作实例详解
2015/11/12 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
python实现日志按天分割
2019/07/22 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
python随机生成库faker库api实例详解
2019/11/28 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
党员批评与自我批评(5篇)
2014/09/23 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
一篇文章带你复习java知识点
2021/06/28 Java/Android
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js