@php $audioUrl = route('videos.stream', $video) . '?v=' . $video->updated_at->timestamp; $coverUrl = $video->thumbnail ? route('media.thumbnail', $video->thumbnail) : asset('storage/images/logo.png'); $nextUrl = isset($nextVideo, $playlist) ? route('videos.show', $nextVideo).'?playlist='.$playlist->share_token : null; $prevUrl = isset($previousVideo, $playlist) ? route('videos.show', $previousVideo).'?playlist='.$playlist->share_token : null; $slideUrls = $video->slides->count() > 1 ? $video->slides->map(fn($s) => route('media.thumbnail', $s->filename))->values()->all() : []; // Build all-tracks list: primary first, then extra language tracks (skip extras that duplicate primary language) $primaryLang = $video->language ?? 'default'; $allLangData = \App\Data\Languages::all(); $primaryFlag = $allLangData[$primaryLang]['flag'] ?? null; $allAudioTracks = collect([[ 'id' => 0, 'language' => $primaryLang, 'label' => $video->language ? strtoupper($video->language) : 'Default', 'flag' => $primaryFlag, 'stream_url' => $audioUrl, 'title' => $video->title, 'description' => $video->description ?? '', 'dl_url' => route('videos.downloadMp3', $video), ]])->concat($video->audioTracks->map(fn($t) => [ 'id' => $t->id, 'language' => $t->language, 'label' => $t->label, 'flag' => $allLangData[$t->language]['flag'] ?? null, 'stream_url' => route('videos.audio-track', ['video' => $video, 'track' => $t->id]) . '?v=' . $t->updated_at->timestamp, 'title' => $t->title ?? '', 'description' => $t->description ?? '', 'dl_url' => route('videos.audio-track', ['video' => $video, 'track' => $t->id]) . '?download=1&v=' . $t->updated_at->timestamp, ])); $hasMultipleTracks = $allAudioTracks->count() > 1; @endphp
{{-- Cover art / slideshow — both always in DOM so SPA transitions can switch between them --}} {{ $video->title }} 1) style="display:none"@endif> {{-- Bars canvas overlay --}} {{-- Gradient --}}
{{-- Large play overlay --}}
{{-- Controls --}}
@if(isset($previousVideo) && $prevUrl) @endif @if(isset($nextVideo) && $nextUrl) @endif
0:00 / 0:00
{{-- Language flag — always in DOM; hidden only when no language/flag is set --}}
Playback speed Normal
Playback speed
@foreach([['0.25','0.25'],['0.5','0.5'],['0.75','0.75'],['1','Normal'],['1.25','1.25'],['1.5','1.5'],['1.75','1.75'],['2','2']] as [$val,$label])
{{ $label }}
@endforeach
{{-- Loop — standalone button, outside gear --}} {{-- Bars visualiser toggle --}}
{{-- Hidden audio element --}} {{-- ══ CSS ══ --}} {{-- ══ JS ══ --}}