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操作MongoDB基础知识
Nov 01 Python
Python编程中的文件读写及相关的文件对象方法讲解
Jan 19 Python
使用Python写个小监控
Jan 27 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
python解决pandas处理缺失值为空字符串的问题
Apr 08 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 Python
Django import export实现数据库导入导出方式
Apr 03 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 25 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 友好URL的实现(吐血推荐)
2008/10/04 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
php查询操作实现投票功能
2016/05/09 PHP
PDO::exec讲解
2019/01/28 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
学习jQuery中的noConflict()用法
2018/09/28 jQuery
JS图片预加载三种实现方法解析
2020/05/08 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
shell命令行,一键创建 python 模板文件脚本方法
2018/03/20 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
python有几个版本
2020/06/17 Python
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
武汉东之林科技有限公司机试
2013/09/17 面试题
单位绩效考核方案
2014/05/11 职场文书
商铺门前三包责任书
2014/07/25 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
2014年团工作总结
2014/11/27 职场文书
十二生肖观后感
2015/06/12 职场文书
2019个人工作总结
2019/06/21 职场文书
Navicat for MySQL的使用教程详解
2021/05/27 MySQL