Add multi-language audio tracks and self-hosted flag-icons

Introduce per-video language support and multiple audio tracks
(VideoAudioTrack model + migrations for language, description, title),
a reusable language-select component, and a track-editor form. Bundle
the self-hosted flag-icons v7.2.3 library and a NAS auto-sync command.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
This commit is contained in:
ghassanandClaude Opus 4.7 committed 2026-05-22 21:32:52 +03:00
1 parent f8d13457fa
commit 66fd78c10f
314 files changed
+16507 -3172

No files matched your search

@@ -1,6 +1,8 @@
@props(['video' => null, 'size' => 'medium'])
@php
use App\Data\Languages;
$videoUrl = $video ? asset('storage/videos/' . $video->filename) : null;
$thumbnailUrl = $video && $video->thumbnail
? route('media.thumbnail', $video->thumbnail)
@@ -18,6 +20,9 @@ $isShorts = $video && $video->isShorts();
// Check if current user is the owner of the video
$isOwner = $video && auth()->check() && auth()->id() == $video->user_id;
// Language flag code (null when no language set)
$langFlag = $video ? Languages::flag($video->language) : null;
// Size classes
$sizeClasses = match($size) {
'small' => 'yt-video-card-sm',
@@ -70,6 +75,9 @@ $sizeClasses = match($size) {
<div class="yt-video-details">
<h3 class="yt-video-title">
<a href="{{ $video ? route('videos.show', $video) : '#' }}">
@if($langFlag)
<span class="fi fi-{{ $langFlag }} vc-lang-flag"></span>
@endif
{{ $video->title ?? 'Untitled Video' }}
</a>
</h3>
@@ -481,6 +489,19 @@ $sizeClasses = match($size) {
.yt-video-card .yt-video-title a {
color: inherit;
text-decoration: none;
display: flex;
align-items: baseline;
gap: 5px;
}
.vc-lang-flag {
display: inline-block;
width: 16px;
height: 12px;
border-radius: 2px;
flex-shrink: 0;
vertical-align: baseline;
position: relative;
top: 1px;
}
.yt-video-card .yt-channel-icon {