切り抜き塾 会員ページのログインフォームです。
false]);
if (isset($uploaded_file[‘url’])) {
$file_url = $uploaded_file[‘url’];
$file_name = pathinfo($file_url, PATHINFO_FILENAME);
echo “
✅ アップロード完了
“;
// 定数はどこかで定義されていることを前提とする
$api_key = RUNPOD_API_KEY;
$endpoint_id = RUNPOD_ENDPOINT_ID;
$runpod_api_url = “https://api.runpod.ai/v2/{$endpoint_id}/run”;
$body = json_encode([
“input” => [
“audio” => $file_url,
“model” => “large-v2”,
“transcription” => “srt”
]
]);
$response = wp_remote_post($runpod_api_url, [
‘headers’ => [
‘Content-Type’ => ‘application/json’,
‘Authorization’ => “Bearer {$api_key}”
],
‘body’ => $body
]);
if (!is_wp_error($response)) {
$result = json_decode(wp_remote_retrieve_body($response), true);
if (isset($result[‘id’])) {
$job_id = esc_js($result[‘id’]);
?>
first_name . ” ” . $member->last_name) . ” 様”;
} else {
return “
⚠️ このページは会員専用です。ログインしてください。
“;
}
$upload_dir = wp_upload_dir();
$srt_dir = $upload_dir[‘basedir’] . ‘/srt/’ . $user_id . ‘/’;
$srt_url_base = $upload_dir[‘baseurl’] . ‘/srt/’ . $user_id . ‘/’;
if (!file_exists($srt_dir)) {
return “
{$display_name}、まだSRTファイルはありません。
“;
}
$files = glob($srt_dir . “*.srt”);
if (!$files) {
return “
{$display_name}、まだSRTファイルはありません。
“;
}
usort($files, function($a, $b) {
return filemtime($b) – filemtime($a);
});
$html = “
文字起こし履歴 (SRTファイル)
“;
$html .= “
👤 {$display_name}
“;
$html .= “
| 日付 | ファイル名 | ダウンロード |
|---|---|---|
| {$date} | {$filename} | 📥 ダウンロード |
“;
return $html;
}
// ========== マイページ用ショートコード ==========
add_shortcode(‘member_mypage’, ‘render_member_mypage’);
function render_member_mypage() {
if (class_exists(‘SwpmMemberUtils’) && SwpmMemberUtils::is_member_logged_in()) {
$user_id = SwpmMemberUtils::get_logged_in_members_id();
$member = SwpmMemberUtils::get_user_by_id($user_id);
$name = !empty($member->first_name) ? esc_html($member->first_name . ‘ ‘ . $member->last_name) : ‘会員’;
} else {
return “
⚠️ このページは会員専用です。ログインしてください。
“;
}
$upload_dir = wp_upload_dir();
$srt_dir = $upload_dir[‘basedir’] . ‘/srt/’ . $user_id . ‘/’;
$srt_url_base = $upload_dir[‘baseurl’] . ‘/srt/’ . $user_id . ‘/’;
$html = “
{$name} 様のマイページ
“;
// メニューリンク
// 【SRT完全統一】リンク先を /srt-history/ に変更
$html .= “
“;
// 最新3件履歴
$html .= “
📂 最新の文字起こし履歴 (SRT)
“;
if (file_exists($srt_dir)) {
$files = glob($srt_dir . “*.srt”);
if ($files) {
usort($files, function($a, $b) {
return filemtime($b) – filemtime($a);
});
$html .= “
| 日付 | ファイル名 | ダウンロード |
|---|---|---|
| {$date} | {$filename} | 📥 ダウンロード |
“;
// 【SRT完全統一】リンク先を /srt-history/ に変更
$html .= “
“;
} else {
$html .= “
まだ文字起こし履歴はありません。
“;
}
} else {
$html .= “
まだ文字起こし履歴はありません。
“;
}
return $html;
}
// ========== 会員メニューショートコード ==========
function kirinuki_member_menu() {
if (class_exists(‘SwpmMemberUtils’) && SwpmMemberUtils::is_member_logged_in()) {
return ”
“;
}
return “”;
}
add_shortcode(‘kirinuki_member_menu’, ‘kirinuki_member_menu’);
// ========== SRT変換フォーム (そのまま維持) ==========
function srt_converter_form() {
ob_start(); ?>
(\d{2}:\d{2}:\d{2},\d{3})/’, $timestamp_line, $matches)) continue;
$start_ms = srt_to_ms($matches[1]);
$end_ms = srt_to_ms($matches[2]);
if ($end_ms <= $start_ms) continue; // 1. テキストの整形 (句読点・文字数で分割) $text = implode(' ', array_slice($lines, 2)); $text = preg_replace('/\s+/', '', $text); $segments_raw = preg_split('/([。、!?])/', $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); $current_line = ""; $formatted_segments = []; foreach ($segments_raw as $segment) { $current_line .= $segment; $is_punctuation_end = in_array(mb_substr($segment, -1, 1, 'UTF-8'), ['。', '、', '!', '?']); $is_too_long = mb_strlen($current_line, 'UTF-8') >= $max_chars;
if ($is_punctuation_end || $is_too_long) {
while(mb_strlen($current_line, ‘UTF-8’) > $max_chars) {
$part = mb_substr($current_line, 0, $max_chars, ‘UTF-8’);
$formatted_segments[] = trim($part);
$current_line = mb_substr($current_line, $max_chars, null, ‘UTF-8’);
}
if (!empty(trim($current_line))) {
$formatted_segments[] = trim($current_line);
$current_line = “”;
}
}
}
if (!empty(trim($current_line))) {
$formatted_segments[] = trim($current_line);
}
// 2. 時間の均等分割とSRTフォーマットへの出力
$split_count = count($formatted_segments);
$duration_ms = $end_ms – $start_ms;
$interval_ms = $split_count > 0 ? floor($duration_ms / $split_count) : 0;
for ($i = 0; $i < $split_count; $i++) {
$new_start_ms = $start_ms + ($i * $interval_ms);
$new_end_ms = ($i == $split_count - 1)
? $end_ms
: $start_ms + (($i + 1) * $interval_ms);
$new_start_time_srt = ms_to_srt_time($new_start_ms);
$new_end_time_srt = ms_to_srt_time($new_end_ms);
$final_output .= $sequence_number . PHP_EOL;
$final_output .= $new_start_time_srt . ' --> ‘ . $new_end_time_srt . PHP_EOL;
$final_output .= $formatted_segments[$i] . PHP_EOL;
$final_output .= PHP_EOL;
$sequence_number++;
}
}
return $final_output;
}
