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

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('video_audio_tracks', function (Blueprint $table) {
$table->id();
$table->foreignId('video_id')->constrained()->cascadeOnDelete();
$table->string('language', 10);
$table->string('label', 100);
$table->string('path', 500);
$table->string('filename', 255);
$table->timestamps();
$table->index('video_id');
});
}
public function down(): void
{
Schema::dropIfExists('video_audio_tracks');
}
};
@@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('videos', function (Blueprint $table) {
$table->string('language', 10)->nullable()->after('type');
});
}
public function down(): void
{
Schema::table('videos', function (Blueprint $table) {
$table->dropColumn('language');
});
}
};
@@ -0,0 +1,25 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('video_audio_tracks', function (Blueprint $table) {
$table->text('description')->nullable()->after('label');
});
}
public function down(): void
{
Schema::table('video_audio_tracks', function (Blueprint $table) {
$table->dropColumn('description');
});
}
};
@@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('video_audio_tracks', function (Blueprint $table) {
$table->string('title')->nullable()->after('label');
});
}
public function down(): void
{
Schema::table('video_audio_tracks', function (Blueprint $table) {
$table->dropColumn('title');
});
}
};