基于哔哩哔哩视频库的音频提取播放器,实现下载B站音频到本地,方便把鬼畜下载到手机上,项目使用FFmpeg作为编码器

import re
import json
import threading
import time
import os
import shutil
import subprocess

import requests
import PySimpleGUI as sg

os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"
from pygame import mixer
sg.theme('SystemDefaultForReal')

# 窗口配置和对象
VIDEO_URL = "https://www.bilibili.com/video/BV16v411L7js"
MP3_LIST = ["暂无歌单"]
DEFAULT_SINGER_DICT = {
    "btn_Timzhuo": ("卓依婷", "https://www.bilibili.com/video/BV16v411L7js"),
    "btn_zy": ("郑源", "https://www.bilibili.com/video/BV1f54y1T7x7"),
    "btn_xs": ("许嵩", "https://www.bilibili.com/video/BV1Zz421o7Cq"),
    "btn_lyj": ("李翊君", "https://www.bilibili.com/video/BV1Fg4y197Mi"),
    "btn_zxy": ("张学友", "https://www.bilibili.com/video/BV1GM411e7iZ"),
    "btn_fhcq": ("凤凰传奇", "https://www.bilibili.com/video/BV1Ap4y1S7Gg"),
    "btn_ldh": ("刘德华", "https://www.bilibili.com/video/BV11v411z7Xr"),
    "btn_jay": ("周杰伦", "https://www.bilibili.com/video/BV1e84y1T7jp"),

}
LAYOUT = [
    [sg.Button(group[0], key=key) for key, group in DEFAULT_SINGER_DICT.items()],
    [sg.Input(VIDEO_URL, expand_x=True, key="txt_video_url"), sg.Button('获取歌单', key="btn_fetch")],
    [
        sg.Button('暂停', key="btn_pause"),
        sg.Button('播放', key="btn_play"),
        sg.Button('上一首', key="btn_prev"),
        sg.Button('下一首', key="btn_next"),
        sg.Text('@bilibiliの踏破钢鞋无觅处', size=(50, 1),justification='right'),

    ],
    [sg.ProgressBar(100, orientation="h", expand_x=True, key="process_bar")],
    [sg.Listbox(MP3_LIST, key='song_list', expand_x=True, expand_y=True, enable_events=True)]
]
WINDOW = sg.Window(
    '音乐播放器',
    LAYOUT,
    size=(500, 600),
    icon=b'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')

# 所有歌单
PLAY_VIDEO_BASE_URL = None
PLAY_TOTAL_NAME_DICT = {}
PLAY_TOTAL_NAME_LIST = []

# 暂定
PLAY_USER_PAUSE = False

# 正在播放的音乐(用于单曲循环)
PLAY_VIDEO_URL = None
PLAY_CHOICE_INT_NUM = None
PLAY_CLOSE = False


def fetch_name_list(video_url):
    """ 获取歌曲列表 """
    res = requests.get(
        url=video_url,
        headers={
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
            "Accept-Language": "zh-CN,zh;q=0.9"
        }
    )
    res.close()
    data_list = re.findall(r'__INITIAL_STATE__=(.+);\(function', res.text)
    data_dict = json.loads(data_list[0])
    page_list = data_dict["videoData"]['pages']

    global PLAY_VIDEO_BASE_URL
    PLAY_VIDEO_BASE_URL = video_url.split("?")[0]

    global PLAY_TOTAL_NAME_DICT
    PLAY_TOTAL_NAME_DICT = {item['page']: item['part'] for item in page_list}
    global PLAY_TOTAL_NAME_LIST
    PLAY_TOTAL_NAME_LIST = ["{page} {part}".format(**item) for item in page_list]


def download_m4s(video_url, download_folder):
    """ 下载m4s文件 """
    session = requests.Session()
    session.headers.update({
        # "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
        "Referer": video_url,
        "Accept-Language": "zh-CN,zh;q=0.9"
    })

    # 1.访问首页
    res = session.get(video_url)

    play_list = re.findall(r'__playinfo__=(.+?)</script', res.text)
    play_dict = json.loads(play_list[0])
    audio_list = play_dict['data']['dash']['audio']
    for item in audio_list:
        base_url = item['baseUrl']
        audio_file_name = base_url.split("?", maxsplit=1)[0].split("/")[-1]
        res = session.get(url=item['baseUrl'], )
        if res.status_code != 200:
            continue

        folder = os.path.join(download_folder, str(int(time.time() * 1000)))
        if not os.path.exists(folder):
            os.makedirs(folder)

        m4s_file_path = os.path.join(folder, audio_file_name)
        with open(m4s_file_path, mode='wb') as f:
            f.write(res.content)
        res.close()
        return True, m4s_file_path
    return False, None


def convert_to_mp3(m4s_file_path, mp3_path):
    """ 转换m4s成mp3文件"""
    os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__))
    cmd_string = f'ffmpeg -loglevel quiet -i "{m4s_file_path}" -y "{mp3_path}"'
    subprocess.check_output(cmd_string, shell=True)


def music_end_event():
    """ 不断检测,音乐是否播放完,播放完则单曲循环"""
    while True:
        time.sleep(1)

        # 关闭,则退出
        if PLAY_CLOSE:
            return

        # 暂停,则不选播放下一首
        if PLAY_USER_PAUSE:
            continue

        if mixer.music.get_busy():
            pass  # print("播放中")
        else:
            global PLAY_CHOICE_INT_NUM

            if not PLAY_CHOICE_INT_NUM:
                continue
            if PLAY_CHOICE_INT_NUM < len(PLAY_TOTAL_NAME_DICT):
                PLAY_CHOICE_INT_NUM += 1
            else:
                PLAY_CHOICE_INT_NUM = 1
            index = PLAY_CHOICE_INT_NUM - 1
            WINDOW.Element("song_list").Update(PLAY_TOTAL_NAME_LIST, scroll_to_index=index, set_to_index=index)
            play_task()  # 播放完5s,用户未选择其他,则默认下一首;如果已播完,则重新开始


def play_task():
    base_url = PLAY_VIDEO_BASE_URL
    num = PLAY_CHOICE_INT_NUM

    if not num or not base_url:
        return

    name = PLAY_TOTAL_NAME_DICT.get(num)
    name = re.sub(r'[\/:,?*"<>|]', '', name)
    if not name:
        return

    mixer.pause()
    WINDOW.set_title(f"{name} 加载中")
    bv_id = base_url.strip("/").split("/")[-1]
    video_url = f"{base_url}?p={num}"
    download_folder = os.path.join("Download", bv_id)
    mp3_path = os.path.join(download_folder, f"{name}.mp3")
    if os.path.exists(mp3_path):
        WINDOW.set_title(f"{name} 播放中")
        mixer.music.load(mp3_path)
        mixer.music.play()
        return

    status, m4s_file_path = download_m4s(video_url, download_folder)
    if not status:
        WINDOW.set_title(f"{name} 加载失败")
        return

    WINDOW.set_title(f"{name} 转码中")

    convert_to_mp3(m4s_file_path, mp3_path)

    shutil.rmtree(os.path.dirname(m4s_file_path))

    WINDOW.set_title(f"{name} 播放中")
    mixer.music.load(f"{mp3_path}")
    mixer.music.play()


def run():
    global PLAY_USER_PAUSE
    global PLAY_CHOICE_INT_NUM

    mixer.init()
    # 线程,检测是否已播放完(播完自动单曲循环)
    end_event_thread = threading.Thread(target=music_end_event)
    end_event_thread.start()

    while True:
        # 监听窗体中的事件:点击获取歌单 、 选中歌曲
        event, value_dict = WINDOW.read()
        if event in DEFAULT_SINGER_DICT:
            _, url = DEFAULT_SINGER_DICT[event]
            WINDOW.Element("txt_video_url").update(url)

        if event == "btn_pause":
            mixer.music.pause()
            PLAY_USER_PAUSE = True

        if event == "btn_play":
            if PLAY_USER_PAUSE:
                mixer.music.unpause()
                PLAY_USER_PAUSE = False
                continue

            if PLAY_TOTAL_NAME_DICT and not PLAY_CHOICE_INT_NUM:
                PLAY_CHOICE_INT_NUM = 1

                index = PLAY_CHOICE_INT_NUM - 1
                WINDOW.Element("song_list").Update(PLAY_TOTAL_NAME_LIST, scroll_to_index=index, set_to_index=index)
                t = threading.Thread(target=play_task)
                t.start()

        if event == "btn_next":
            if not PLAY_CHOICE_INT_NUM or not PLAY_TOTAL_NAME_DICT:
                continue
            PLAY_USER_PAUSE = False
            if PLAY_CHOICE_INT_NUM < len(PLAY_TOTAL_NAME_DICT):
                PLAY_CHOICE_INT_NUM += 1
            else:
                PLAY_CHOICE_INT_NUM = 1

            index = PLAY_CHOICE_INT_NUM - 1
            WINDOW.Element("song_list").Update(PLAY_TOTAL_NAME_LIST, scroll_to_index=index, set_to_index=index)
            t = threading.Thread(target=play_task)
            t.start()

        if event == "btn_prev":
            if not PLAY_CHOICE_INT_NUM or not PLAY_TOTAL_NAME_DICT:
                continue
            PLAY_USER_PAUSE = False
            if PLAY_CHOICE_INT_NUM < 2:
                PLAY_CHOICE_INT_NUM = 1
            else:
                PLAY_CHOICE_INT_NUM -= 1

            index = PLAY_CHOICE_INT_NUM - 1
            WINDOW.Element("song_list").Update(PLAY_TOTAL_NAME_LIST, scroll_to_index=index, set_to_index=index)
            t = threading.Thread(target=play_task)
            t.start()

        if event == "btn_fetch":
            # 点击获取歌单
            video_url = value_dict['txt_video_url']
            fetch_name_list(video_url)
            WINDOW.Element("song_list").Update(PLAY_TOTAL_NAME_LIST)

            PLAY_CHOICE_INT_NUM = None

        if event == "song_list":
            # 选择歌曲+播放
            choice_string = value_dict['song_list'][0]
            if choice_string == "暂无歌单":
                continue

            if not PLAY_TOTAL_NAME_DICT:
                continue

            # 用户如果暂定
            PLAY_USER_PAUSE = False

            # 当前播放歌曲,字符串格式的序号
            PLAY_CHOICE_INT_NUM = int(choice_string.split(maxsplit=1)[0])

            # 创建线程去播放
            t = threading.Thread(target=play_task)
            t.start()

        if not event:
            break

    # 关闭监听单曲循环的线程
    global PLAY_CLOSE
    PLAY_CLOSE = True

    # 关闭播放器
    mixer.music.stop()
    WINDOW.close()


if __name__ == '__main__':
    run()

运行本项目前务必把ffmpeg加入环境变量,或者放在该文件同级目录下,因为不经过重新编码的m4s文件有些播放器不支持

运行效果如图

需要给定bv号链接获取音频

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值