cms-orbit / video-field
A comprehensive video upload and multi-encoding system for CMS-Orbit with streaming support, transcoding, and thumbnails
Installs: 2
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/cms-orbit/video-field
Requires
- php: ^8.2
- amuz/cms-orbit: ^3.1.3
- intervention/image: ^3.0
- league/flysystem: ^3.0
- php-ffmpeg/php-ffmpeg: ^1.3.0
- symfony/process: ^7.0
Requires (Dev)
- phpunit/phpunit: ^10.0
README
CMS-Orbit을 위한 포괄적인 비디오 관리 시스템입니다.
주요 기능: 다중 프로파일 인코딩, HLS/DASH 스트리밍, 시청 기록, 강의 모드
🎯 최신 업데이트 (v1.1.5)
시청 기록 및 강의 모드
<!-- 일반 비디오 재생 --> <Player :video-id="123" /> <!-- 강의 모드 (빨리감기 제한) --> <Player :video-id="123" :lecture-mode="true" />
- ✅ 시청 기록 자동 저장 (사용자별/세션별)
- ✅ 마지막 시청 위치 자동 복원
- ✅ 강의 모드: 빨리감기 제한으로 순차적 시청 강제
- ✅ 비회원 → 로그인 시 시청 기록 자동 연결
✨ 주요 기능
기능 | 설명 |
---|---|
🎥 비디오 관리 | 다중 업로드, 메타데이터 자동 추출, 진행률 모니터링 |
🔄 자동 인코딩 | 4K/FHD/HD/SD 다중 프로파일, HLS/DASH/Progressive MP4 |
🖼️ 미디어 생성 | 썸네일, 스프라이트 시트 자동 생성 |
📊 시청 기록 | 사용자별/세션별 진행률 추적, 이어보기 |
🎓 강의 모드 | 빨리감기 제한으로 순차적 학습 강제 |
🎛️ 관리자 UI | Orchid Platform 통합, 실시간 로그 |
🔗 VideoField | Orchid 커스텀 필드로 간편한 비디오 연결 |
🚀 빠른 시작
# 1. 설치 composer require cms-orbit/video-field # 2. 설정 발행 php artisan vendor:publish --provider="CmsOrbit\VideoField\VideoServiceProvider" --tag="config" # 3. 마이그레이션 php artisan migrate # 4. 테마 스크립트 빌드 php artisan cms:build-theme-scripts
⚙️ 환경 설정
.env
파일 기본 설정:
# FFmpeg (필수) FFMPEG_BINARY_PATH=ffmpeg FFPROBE_BINARY_PATH=ffprobe # 저장소 VIDEO_STORAGE_DISK=public VIDEO_MAX_FILE_SIZE=5368709120 # 5GB # 시청 기록 (선택) VIDEO_COMPLETION_THRESHOLD=0.9 # 90% 시청 시 완료 VIDEO_WATCH_HISTORY_INTERVAL=5 # 5초마다 저장
📖 기본 사용법
1. 모델에 트레이트 추가
use CmsOrbit\VideoField\Traits\HasVideos; class Post extends Model { use HasVideos; }
2. VideoField 사용 (Orchid)
use App\Settings\Extends\OrbitLayout; use CmsOrbit\VideoField\Fields\VideoField\VideoField; public function layout(): iterable { return [ OrbitLayout::rows([ VideoField::make('post.main_video') ->title('Main Video') ]) ]; }
3. 프론트엔드에서 비디오 재생
<script setup> import Player from '@orbit/video/Player.vue'; defineProps({ videoId: Number, lectureMode: { type: Boolean, default: false } }); </script> <template> <Player :video-id="videoId" :lecture-mode="lectureMode" show-title show-description /> </template>
📚 상세 문서
문서 | 설명 |
---|---|
플레이어 사용 가이드 | Player 컴포넌트 props, 이벤트, 커스터마이징 |
플레이어 API | API 엔드포인트 및 응답 형식 |
설정 가이드 | 전체 설정 옵션 및 설명 |
패치 노트 v1.1.5 | 시청 기록 및 강의 모드 상세 |
🎮 주요 Player Props
<Player :video-id="123" :lecture-mode="true" :autoplay="false" :muted="false" :show-title="true" :show-description="true" :show-quality-selector="true" :show-download="false" :use-native-controls="false" @play="handlePlay" @pause="handlePause" @ended="handleEnded" />
🔧 관리자 패널
- 비디오 목록:
/settings/orbit-video-fields/videos
- 비디오 업로드:
/settings/orbit-video-fields/videos/create
- 비디오 편집:
/settings/orbit-video-fields/videos/{id}/edit
- 휴지통:
/settings/orbit-video-fields/videos/trash
🎯 시청 기록 API
// 시청 진행률 조회 const response = await axios.get(`/api/orbit-video-player/${videoId}/watch-history`); console.log(response.data.data.percent); // 시청 진행률 console.log(response.data.data.is_complete); // 완료 여부 // 시청 진행률 저장 (자동으로 호출됨) await axios.post(`/api/orbit-video-player/${videoId}/progress`, { current_time: 30.5, duration: 120.0 });
🤝 기여
이슈 및 PR은 언제든지 환영합니다!
📄 라이선스
MIT License - 자유롭게 사용하세요.
👨💻 저자
- xiso - ceo@amuz.co.kr
CMS-Orbit - 모던 Laravel CMS 시스템