<?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>
原文地址:http://www.cnblogs.com/felixwan/p/16897326.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性