- KBS 재난안전포탈 CCTV를 iframe에서 HLS 직접 재생으로 전환 - 백엔드 KBS HLS 리졸버 엔드포인트 추가 (/api/aerial/cctv/kbs-hls/:cctvId/stream.m3u8) - KBS API 3단계 리졸브: 팝업API → loomex API → m3u8 (5분 캐시) - CCTV 미선택 시 MapLibre 지도에 마커 표시 + 팝업 영상 선택 - 우측 미니맵을 실제 MapLibre 지도로 교체 - KBS API 정확 좌표로 19개 CCTV 업데이트 + 신규 2건 추가 (울산 달동, 제주 도남동) - PredictionInputSection 중복 className 수정 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
48 lines
1.1 KiB
TypeScript
48 lines
1.1 KiB
TypeScript
/**
|
|
* CCTV 스트림 타입 감지 유틸리티
|
|
*/
|
|
|
|
export type StreamType = 'hls' | 'mjpeg' | 'iframe' | 'mp4' | 'unknown';
|
|
|
|
/** URL 패턴으로 스트림 타입을 자동 감지한다. */
|
|
export function detectStreamType(url: string): StreamType {
|
|
const lower = url.toLowerCase();
|
|
|
|
// KHOA 공식 팝업 페이지 (내장 video.js — videoUrl 파라미터에 .m3u8이 포함되므로 HLS보다 먼저 체크)
|
|
if (lower.includes('khoa.go.kr') && lower.includes('popup.do')) {
|
|
return 'iframe';
|
|
}
|
|
|
|
// KBS 재난안전포탈 CCTV 공유 페이지 (iframe 임베드)
|
|
if (lower.includes('d.kbs.co.kr')) {
|
|
return 'iframe';
|
|
}
|
|
|
|
if (lower.includes('.m3u8') || lower.includes('/hls/')) {
|
|
return 'hls';
|
|
}
|
|
|
|
if (
|
|
lower.includes('mjpeg') ||
|
|
lower.includes('mjpg') ||
|
|
lower.includes('/video/mjpg') ||
|
|
lower.includes('action=stream')
|
|
) {
|
|
return 'mjpeg';
|
|
}
|
|
|
|
if (
|
|
lower.includes('youtube.com/embed') ||
|
|
lower.includes('player.') ||
|
|
lower.includes('/embed/')
|
|
) {
|
|
return 'iframe';
|
|
}
|
|
|
|
if (lower.endsWith('.mp4') || lower.endsWith('.webm') || lower.endsWith('.ogg')) {
|
|
return 'mp4';
|
|
}
|
|
|
|
return 'unknown';
|
|
}
|