代码改变生活-使用You-Get下载bilibili的视频【三】

2023-05-16

本文为博主原创,未经许可严禁转载。
本文链接:https://blog.csdn.net/zyooooxie/article/details/112167893

我自己都想不到,这个分享做到了第三篇,前两篇是 第一篇、第二篇;这一篇主要是对之前代码的优化+一些介绍。

这是我写的 代码改变生活的 category,有兴趣可以看看;

个人博客:https://blog.csdn.net/zyooooxie

使用介绍

最终版 支持:

  1. 下载 单独某个视频
  2. 下载 某个多P视频
  3. 下载 某个up主的全部视频
  4. 下载的视频 格式转换 mp4 > flv

实际流程:

  1. 用户将url写入本地的某个txt文件 (此外:可指定画质、指定下载某几P、一次下载多个url);

  2. 脚本执行,读取txt文件;根据画质、下载某几P、重命名的配置,访问此HTML;

  3. 使用you-get解析下载;

  4. 实际观看视频时,若视频无图像,转格式(可选 最新下载的 or 全部的);

  5. 步骤 3、4 都是Windows的bat 触发、执行,用户不接触代码;

  6. 【较少】可下载某up的全部视频,txt不支持(可脚本执行);

  7. 【极少】多P视频出现相同文件名,txt不支持(可脚本执行);

说是给我自己用,实际还有我妈、我朋友,所以就尽可能做的简单、傻瓜式;

代码优化

这次优化主要是 支持txt;


    def read_txt(self, txt_abs_path=None, second_someParts=None):
        """
        读取txt内容 下载
        :param txt_abs_path:
        :param second_someParts:第二项 为指定下载的某几P
        :return:
        """
        if txt_abs_path is None:
            txt = '网址.txt'
        else:
            txt = txt_abs_path

        try:
            with open(txt, "r", encoding="utf-8") as f:
                url_list = f.readlines()

        except Exception as e:
            print(e, '当前文件异常')

        # re_str = r'video/\w.+'
        # re_com = re.compile(re_str)
        for u in url_list:

            # txt的url、画质、下载某几P  使用空格来间隔
            if u.find(' ') != -1:

                # 第二项为画质
                if second_someParts is None:

                    qn = u[u.find(' '):]
                    qn = qn.strip()

                    # 指定某几P
                    if qn.find(' ') != -1:

                        some_parts = json.loads(qn[qn.find(' '):].strip())
                        print('指定下载:{}'.format(some_parts))
                        qn = json.loads(qn[:qn.find(' ')])

                    # 不指定某几P
                    else:
                        some_parts = None
                    print('指定画质:{}'.format(qn))

                # 第二项为 下载的某几P,不指定画质
                else:
                    some_parts = json.loads(u[u.find(' '):].strip())
                    print('指定下载:{}'.format(some_parts))
                    qn = None

                u = u[: u.find(' ')]

            # 只有url【没有画质、下载的某几P】
            else:
                qn = None
                some_parts = None

            # url处理
            if u.find('/?') != -1:
                u = u[: u.find('/?')]
            elif u.find('?') != -1:
                u = u[: u.find('?')]
            u = u.replace('\n', '')
            print(u)

            # print(re_com.search(u))
            # print(re_com.search(u).group())

            # 解析HTML,获取name\宽高
            name_list, w_h_list = self.get_name_list(url=u)

            # 只一个name [单个视频]
            if len(name_list) == 1:
                if qn is None:
                    qn = self.return_format(w_h_list[0])
                else:
                    qn = self.change_format(int(qn))

                print(qn)
                self.down_one(url=u, txt_format_qn=qn)

            # 多个name [此url 多P视频]
            else:
                if qn is None:
                    if second_someParts is not None:
                        # index 不适合
                        # w_h = list(filter(lambda x: w_h_list.index(x) in some_parts, w_h_list))
                        w_h_list = [w_h_list[s] for s in some_parts]

                    qn = [self.return_format(wh) for wh in w_h_list]
                else:
                    qn = [self.change_format(int(q)) for q in qn]

                print(qn)
                self.down_multipart(url=u, txt_qn=qn, some_parts=some_parts)


    def down_one(self, url, format_qn: int = None, down_path=r'F:\bili', txt_format_qn=None):
        """
        下载某url
        :param url:
        :param format_qn:
        :param down_path:
        :param txt_format_qn:读取txt文件 画质
        :return:
        """
        # 脚本直接使用
        if txt_format_qn is None:
            assert format_qn is not None
            format_str = self.change_format(format_qn=format_qn)

        # txt使用
        else:
            format_str = txt_format_qn

        cmd = """you-get {} {} -o {} --no-caption""".format(format_str, url, down_path)
        print(cmd)
        os.system(cmd)

        # cmd = 'explorer {}'.format(down_path)
        # os.system(cmd)
        

    def down_multipart(self, url, format_qn_list=None, root_path=r'F:\bili', rename_file=None, some_parts=None, txt_qn=None):
        """
        批量下载
        :param url:请求url
        :param format_qn_list:画质
        :param root_path:下载路径
        :param rename_file:默认为None,不用重命名
        :param some_parts: 下载某p;传list
        :param txt_qn:读取txt文件 拿到的画质
        :return:
        """
        os.chdir(root_path)
        new_dir = url.split('/')[-1]
        if not os.path.exists(new_dir):
            os.mkdir(new_dir)
        down_path = os.path.join(root_path, new_dir)

        # 不使用txt,脚本执行【不推荐】
        if format_qn_list is not None:
            assert txt_qn is None

            # 相同画质[使用一个qn]、文件名不重复
            # 【使用某画质,有可能会出现画质不对的情况】
            if isinstance(format_qn_list, int) and rename_file is None:
                format_str = self.change_format(format_qn=format_qn_list)
                cmd = """you-get {} --playlist {} -o {} --no-caption --debug""".format(format_str, url, down_path)
                print(cmd)
                os.system(cmd)

        # 使用txt的内容【推荐】
        else:
            format_qn_list = txt_qn

            if rename_file is not None:
                fact_name_list = self.get_name_list(url=url)[0]
                assert len(fact_name_list) == len(format_qn_list)

            for index, i in enumerate(format_qn_list):
                format_str = i

                if some_parts is not None:
                    assert len(some_parts) == len(format_qn_list)
                    url_index = some_parts[index]
                else:
                    url_index = index + 1

                new_url = ''.join([url, '?p={}'.format(url_index)])
                cmd = """you-get {} {} -o {} --no-caption""".format(format_str, new_url, down_path)
                print(cmd)
                os.system(cmd)

                # txt不支持 重命名
                if rename_file is None:
                    continue

                else:
                    # 极少出现文件名重复的情况,若出现,请脚本执行,给rename_file传参

                    name = fact_name_list[index]
                    os.chdir(down_path)
                    all_files = os.listdir(down_path)
                    all_files = [i for i in all_files if i.endswith(('mp4', 'flv'))]
                    down_file_last = sorted(all_files, key=lambda x: os.path.getmtime(x))[-1]
                    file_type = os.path.splitext(down_file_last)[1]

                    os.rename(down_file_last, ''.join([name, file_type]))

        # cmd = 'explorer {}'.format(down_path)
        # os.system(cmd)
        

    def down_up_all_videos(self, up_mid, root_path=r'F:\bili'):
        bvid = self.get_up_videos_BV(up_mid=up_mid)
        down_url = [''.join(['https://www.bilibili.com/video/', bv]) for bv in bvid]
        print(down_url)

        up_mid = str(up_mid)
        os.chdir(root_path)
        if not os.path.exists(up_mid):
            os.mkdir(up_mid)
        down_path = os.path.join(root_path, up_mid)
        print(down_path)
        print()

        for d in down_url:
            name_list, w_h_list = self.get_name_list(url=d)
            if len(name_list) == 1:
                qn = self.return_format(w_h_list[0])
                self.down_one(url=d, down_path=down_path, txt_format_qn=qn)

            else:
                qn = [self.return_format(wh) for wh in w_h_list]

                self.down_multipart(url=d, root_path=down_path, txt_qn=qn)

展示

在这里插入图片描述
在这里插入图片描述

关于you-get下载B站视频的分享 应该到此为止了。

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码改变生活-使用You-Get下载bilibili的视频【三】 的相关文章

随机推荐

  • 朋友(并查集)

    朋友 AC in luogu P2078 题目背景 小明在A公司工作 xff0c 小红在B公司工作 题目描述 这两个公司的员工有一个特点 xff1a 一个公司的员工都是同性 A公司有N名员工 xff0c 其中有P对朋友关系 B公司有M名员工
  • Ubuntu20.04 wifi连不上或频繁掉线解决办法

    一 新装Ubuntu20 04后发现wifi连不上 xff0c 提示网络激活失败 xff0c 经一番研究发现是网卡驱动问题 解决办法如下 xff1a 点击左下角 显示应用程序 按钮 xff0c 找到 软件和更新 双击打开 xff0c 单击
  • 右移运算符总结

    概念 右移运算符是将一个二进制数按指定移动的位数向右移动 移动过程中 xff0c 正数最高位补0 xff0c 负数最高位补1 xff0c 无符号数最高位补0 补码 在计算机系统中 xff0c 数值一律用补码来表示和存储 xff0c 其中最高
  • PVE7.2-3直通独显 nvidia 1080ti

    1 编辑 etc default grub vim etc default grub 修改对应参数 GRUB CMDLINE LINUX DEFAULT 61 quiet intel iommu 61 on iommu 61 pt 2 编辑
  • Ubuntu 18.04 服务器版安装桌面及软件

    Ubuntu 18 04 服务器版安装软件记录 设置root密码使用root用户登录安装ssh xff08 远程连接用 xff09 xff0c 最小化安装的需要 xff0c 一般已安装 将 PermitRootLogin prohibit
  • 函数 —【回调函数的创建和调用】

    function test callback callback 2 console log 39 我是主题函数 39 function callc data console log data test callc 将一个函数的调用委托给另一
  • Win11笔记本连接热点(无线)后即自动断网怎么办?

    Win11笔记本连接热点 xff08 无线 xff09 后即自动断网怎么办 xff1f 有很多笔记本用户反应电脑PC连接到热点时 xff0c Windows电脑会自动断开与 Internet 的连接 xff0c 这是什么原因呢 xff1f
  • MyBatis Generator配置文件--指定生成实体类的属性名

    table标签下的设置属性useActualColumnNames用于指定生成实体类时是否使用实际的列名作为实体类的属性名 xff0c 取值true或false true xff1a MyBatis Generator会使用数据库中实际的字
  • MySQL 判断某个值是纯数字(正则判断)

    判断某个值是纯数字 这个sql 判断在字符串只有1个非数字的情况 判断不出来 span class token keyword select span span class token operator span span class to
  • mysql 取反操作

    span class token keyword update span span class token keyword table span span class token keyword set span filed span cl
  • error RC1015: cannot open include file ‘afxres.h‘. 的解决办法

    转载 参考 引用请注明出处 文章地址 xff1a https blog csdn net duiwangxiaomi article details 88822702 spm 61 1001 2014 3001 5501 编译工程时出现如下
  • 程序包com.sun.xml.internal.bind.v2不存在解决

    程序包com sun xml internal bind v2不存在 导入com sun xml internal 下的包并且没使用时打包也会报这个错误 全局搜索 com sun xml internal bind v2 删除掉import
  • fastjson byte[]转json字符串

    直接JSON toJSONString 会转为 base64字符串 可以使用JSON toJSON param toString 进行转换
  • SVN文件夹红色感叹号

    SVN文件夹红色感叹号 文件夹更新无最新文件 也没提交 解决方案 1右键 svn清理 2 提交 原因 有可能是svn上面有你之前提交的文件 而在你的本地目录里面删除了
  • jetson nano ubuntu 备份系统至u盘/移动硬盘

    jetson nano ubuntu备份系统至u盘 移动硬盘 1 df h 查看 信息2 挂载u盘2 1 fat322 2 ntfs2 3 挂载被占用 3 刷系统4 解除挂载 1 df h 查看 信息 一般都是 dev sda dev sd
  • 安装 cuda 从装系统开始

    勾选这个选项后就可以跳过安装驱动的环节了 设置root密码 sudo passwd root 安装openssh server 开xshell sudo apt get update sudo apt get install openssh
  • mac用完移动硬盘后 windows识别不出 解决方案

    cmd 运行 chkdsk F f
  • Cannot find reference ‘imread‘ in ‘__init__.py‘

    Cannot find reference imread in init py 前言 本人java开发 只是用python解决部分问题 可能解决方案不专业或者有问题 请自己判断 毕竟我只是简单处理下图片 解决方案 方案一 pip insta
  • RobotMaster资料汇总

    1 软件 xff1a 软件可以去网上下载 xff0c 或者去淘宝购买 xff0c 还包安装 不过基本上都是在虚拟机上操作 xff0c 只有在XP系统下可以直接安装 若是正版软件 xff0c 则会包含正确的安装教程 其中包括 xff1a MA
  • 代码改变生活-使用You-Get下载bilibili的视频【三】

    本文为博主原创 xff0c 未经许可严禁转载 本文链接 xff1a https blog csdn net zyooooxie article details 112167893 我自己都想不到 xff0c 这个分享做到了第三篇 xff0c