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 urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
Python3处理HTTP请求的实例
May 10 Python
python解决字符串倒序输出的问题
Jun 25 Python
Pandas之groupby( )用法笔记小结
Jul 23 Python
python实现各种插值法(数值分析)
Jul 30 Python
python基础教程之while循环
Aug 14 Python
python新式类和经典类的区别实例分析
Mar 23 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
Python configparser模块常用方法解析
May 22 Python
Python数据可视化图实现过程详解
Jun 12 Python
scrapy处理python爬虫调度详解
Nov 23 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 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 header示例代码(推荐)
2010/09/08 PHP
php通用防注入程序 推荐
2011/02/26 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
php的一个简单加密解密代码
2014/01/14 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
prototype class详解
2006/09/07 Javascript
jQuery each()小议
2010/03/18 Javascript
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
2014/09/25 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
利用Python实现Windows定时关机功能
2017/03/21 Python
python绘制直方图和密度图的实例
2019/07/08 Python
Python 控制终端输出文字的实例
2019/07/12 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
java字符串格式化输出实例讲解
2021/01/06 Python
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
大学团支书的自我评价分享
2013/12/14 职场文书
环境建设实施方案
2014/03/14 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
中国梦主题教育活动总结
2014/05/05 职场文书
承诺函范文
2015/01/21 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
幼儿园六一儿童节活动总结
2015/02/10 职场文书
鸡毛信观后感
2015/06/11 职场文书
大学同学聚会感言
2015/07/30 职场文书
学习十八大的感悟
2015/08/11 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python