<?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>