首页 > 其他分享 >YouTube JSON字幕格式转srt格式并下载

YouTube JSON字幕格式转srt格式并下载

时间:2022-11-16 20:00:27浏览次数:40  
标签:return str subtitle YouTube filename JSON srt 格式

<?php
function formatNum(int $time)
{
    if ($time < 10) {
        return "0{$time}";
    }
    return $time;
}
function changeTimeType(int $num): string
{
    $millisecond = substr($num, -3);
    $temp = intval($num / 1000);
    $second = formatNum($temp % 60);
    $temp = intval($temp / 60);
    $minute = formatNum($temp % 60);
    $temp = intval($temp / 60);
    $hour = formatNum($temp % 60);
    return "{$hour}:{$minute}:{$second},{$millisecond}";
}

function transSingleSubtitle($sequence,$start,$end,$subtitle): string
{
    return "{$sequence}\n{$start} --> {$end}\n{$subtitle}\n\n";
}

function transSubtitle($subtitle): string
{
    $key = 1;
    $srt = '';
    foreach ($subtitle as $v) {
        $start = changeTimeType($v['tStartMs']);
        $end = changeTimeType($v['tStartMs'] + $v['dDurationMs']);
        $content = trim($v['segs'][0]['utf8']);
        $srt .= transSingleSubtitle($key, $start, $end, $content);
        $key++;
    }
    return $srt;
}

if (!empty($srt = $_POST['srt']) && strlen($srt)>0) {
    $srt = json_decode($srt, true);
    $subtitle = $srt['events'];
    $ua = $_SERVER["HTTP_USER_AGENT"];
    $filename = date('YmdHis');
    $filename = "{$filename}.srt";
    $encoded_filename = urlencode($filename);
    $encoded_filename = str_replace("+", "%20", $encoded_filename);
    header("Content-Type: application/octet-stream");
    if (preg_match("/MSIE/", $_SERVER['HTTP_USER_AGENT']) ) {
        header('Content-Disposition:  attachment; filename="' . $encoded_filename . '"');
    } elseif (preg_match("/Firefox/", $_SERVER['HTTP_USER_AGENT'])) {
        header('Content-Disposition: attachment; filename*="utf8' .  $filename . '"');
    } else {
        header('Content-Disposition: attachment; filename="' .  $filename . '"');
    }
    echo $srt = transSubtitle($subtitle);
    exit();
}
?>
    <!doctype html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>YouTube字幕下载</title>
        <link rel="stylesheet" href="https://www.layuicdn.com/layui/css/layui.css">
    </head>
    <body>
    <form method="post" class="layui-form" action="">
        <div class="layui-form-item layui-form-text">
            <label class="layui-form-label">输入字幕JSON</label>
            <div class="layui-input-block">
                <textarea rows="10" lay-verify="required" name="srt" placeholder="请输入内容" class="layui-textarea"></textarea>
            </div>
        </div>
        <div class="layui-form-item layui-form-text">
            <label class="layui-form-label"></label>
            <div class="layui-input-block">
                <button class="layui-btn layui-btn-normal" lay-submit lay-filter="formDemo">提交</button>
            </div>
        </div>
    </form>

    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
    <script src="https://www.layuicdn.com/layui/layui.js"></script>
    <script>
        function isJSON(str) {
            if (typeof str == 'string') {
                try {
                    let obj = JSON.parse(str);
                    return !!(typeof obj == 'object' && obj);
                } catch(e) {
                    console.log('error:' + str + '!!!' + e);
                    return false;
                }
            }
            console.log('It is not a string!')
            return false;
        }
        //Demo
        layui.use('form', function(){
            let form = layui.form;
            //监听提交
            form.on('submit(formDemo)', function(data){
                let srt = data.field.srt;
                if (!isJSON(srt)) {
                    layer.msg("请输入有效的JSON格式", {icon: 2, anim: 6});
                    return false;
                }
                srt = JSON.parse(srt);
                if (!srt.hasOwnProperty('events')) {
                    layer.msg("没有[events]", {icon: 2, anim: 6});
                    return false;
                }
                return true;
            });
        });
    </script>
    </body>
    </html>

 

标签:return,str,subtitle,YouTube,filename,JSON,srt,格式
From: https://www.cnblogs.com/felixwan/p/16897326.html

相关文章

  • python JSON模块
    一、JSON介绍JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于人阅读和编写。二、常用方法方法描述json.loads()将JSON字符串转化为Python对......
  • 批量生成特定格式的文本文件
    联系方式:[email protected]或者[email protected]软件下载地址(2022-08-28更新,如果无法下载,多刷新几次)https://gitcode.net/techinged/share/-/raw/master/text/text-v3.22......
  • CSS语法格式和CSS_选择器_基础选择器
    CSS语法格式:格式∶选择器{属性名1:属性值1;属性名2:属性值2;}选择器:筛选具有相似特征的元秦注意:每一对属性需要使用;隔开,最后一对属性可以不加;   CSS_选......
  • vscode提交git自动格式化的问题
    最近不是在写新项目嘛,发现提交git之后总会有大批的代码变动,而且只是单纯的格式化,这根本没必要,还会妨碍我看我的代码变化,今天有时间了处理一下就是类似这样的代码,在上传git......
  • FastJson循环引用特性
    FastJson在序列化集合时,若集合循环引用特性packagecom.yang;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.TypeReference;importcom.alibaba.f......
  • Js时间戳转时间格式
    废话不多说,直接上代码Js时间戳转(yyyy:MM:ddhh:mm:ss)格式//标准时间转换成年月日时分秒(补0)functiongetTime(timestamp){vardate=newDate(timestamp);//......
  • 关于软件常用的各种配置文件YAML、JSON、ini、XML比较
    如果我们的程序没有任何配置文件时,这样的程序对外是全封闭的,一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,这样很不好,所以要用配置文件,让程序出厂后还能根据需......
  • 解决JsonPath.read初始化时候报错Defaulting to no-operation (NOP) logger implement
    报错如下:解决方案:<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.5</version>......
  • shell脚本输出带文本颜色背景颜色自定义样式格式内容
    shell脚本中echo和printf都可以输出内容。示例1:echo-e"\033[43;35mdaviduseechosayHelloWorld\033[0m\n"printf"\033[44;36mdaviduseprintfsayHel......
  • 2022-11-16 Unexpected end of JSON input
    vue+小程序,页面传参中的url路径有问题,导致传递过去后使用json.parse报错如题所示。原因:url中含有特殊字符无法被传递。解决方案:使用encodeURIComponent把参数编码,然后再......