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完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
python3生成随机数实例
Oct 20 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
获取python文件扩展名和文件名方法
Feb 02 Python
python3+dlib实现人脸识别和情绪分析
Apr 21 Python
Python rstrip()方法实例详解
Nov 11 Python
python同时遍历数组的索引和值的实例
Nov 15 Python
神经网络相关之基础概念的讲解
Dec 29 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
使用Python实现跳一跳自动跳跃功能
Jul 10 Python
python导入不同目录下的自定义模块过程解析
Nov 18 Python
浅析Python模块之间的相互引用问题
Feb 26 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可逆加密函数(分享)
2013/06/06 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
javascript,jquery闭包概念分析
2010/06/19 Javascript
Jquery下attr和removeAttr的使用方法
2010/12/28 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
js实现图片360度旋转
2017/01/22 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
vue2.0.js的多级联动选择器实现方法
2018/02/09 Javascript
浅析Visual Studio Code断点调试Vue
2018/02/27 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
Python中关键字nonlocal和global的声明与解析
2017/03/12 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
Python超越函数积分运算以及绘图实现代码
2019/11/20 Python
python检查目录文件权限并修改目录文件权限的操作
2020/03/11 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
python中数字是否为可变类型
2020/07/08 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
Linux内核产生并发的原因
2012/07/13 面试题
外语系大学生自荐信范文
2014/03/01 职场文书
目标责任书范文
2014/04/14 职场文书
企业年度评优方案
2014/06/02 职场文书
九九重阳节标语
2014/10/07 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
遗失证明范文
2015/06/19 职场文书
Python基础之元编程知识总结
2021/05/23 Python
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android