wing-ops/frontend/src/tabs/aerial/utils/streamUtils.ts
Nan Kyung Lee a470df5518 feat(aerial): KBS CCTV HLS 직접 재생 + CCTV 위치 지도 + 좌표 정확도 개선
- 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>
2026-03-16 07:40:52 +09:00

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';
}