diff --git a/Vagrantfile b/Vagrantfile index f6b652f..49b5c2a 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -46,4 +46,6 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| if defined? VagrantPlugins::HostsUpdater config.hostsupdater.aliases = settings['sites'].map { |site| site['map'] } end + + config.vm.provision 'ffmpeg', type: 'shell', inline: 'apt install -y ffmpeg' end diff --git a/app/SongComposer.php b/app/SongComposer.php index f89be72..11172f8 100644 --- a/app/SongComposer.php +++ b/app/SongComposer.php @@ -152,9 +152,25 @@ protected function createOrUpdate(array $metadata, string $file): array Storage::disk()->makeDirectory('public/songs/' . $song->id); } + // Store song image. File::move($file, storage_path('app/public/songs') . "/{$song->id}/{$song->id}-{$songDetails->id}.zip"); Storage::disk()->put("public/songs/{$song->id}/{$song->id}-{$songDetails->id}.{$songData['coverType']}", base64_decode($songData['coverData'])); + // Create MP3 previews (e.g., for iOS). + foreach ($songData['songPreviews'] as $audioPath => $songPreviewData) { + // Save original song data temporarily to convert with ffmpeg. + $audioFilename = basename($audioPath); + $storagePathBase = "public/songs/{$song->id}"; + $storagePathPreview = "{$storagePathBase}/temp-{$audioFilename}"; + Storage::disk()->put("$storagePathPreview", base64_decode($songPreviewData)); + + // Convert to MP3 with ffmpeg. + $audioFilenameBase = pathinfo($audioFilename)['filename']; + $previewOutPath = storage_path("app/{$storagePathBase}/{$audioFilenameBase}.mp3"); + $previewTempPath = storage_path("app/{$storagePathPreview}"); + exec("(ffmpeg -i \"{$previewTempPath}\" \"{$previewOutPath}\"; rm \"{$previewTempPath}\") > /dev/null &"); + } + return [ 'status' => static::SONG_CREATED, 'key' => $song->id . '-' . $songDetails->id, @@ -448,4 +464,4 @@ protected function updateCache(array $song) } } -} \ No newline at end of file +} diff --git a/app/UploadParser.php b/app/UploadParser.php index be9b5d4..5a9f6f8 100644 --- a/app/UploadParser.php +++ b/app/UploadParser.php @@ -138,9 +138,16 @@ function map($v) } $hashBase = ''; + $songData['songPreviews'] = []; foreach ($info['difficultyLevels'] as $difficultyLevel) { if ($this->zipHasFile($difficultyLevel['audioPath']) && $this->zipHasFile($difficultyLevel['jsonPath'])) { + // Store song preview data in object for SongComposer to save to disk. + $audioPath = $difficultyLevel['audioPath']; + if (!array_key_exists($audioPath, $songData['songPreviews'])) { + $songData['songPreviews'][$audioPath] = base64_encode($this->readFromZip($audioPath)); + } + $songData['difficultyLevels'][$difficultyLevel['difficulty']] = [ 'difficulty' => $difficultyLevel['difficulty'], 'rank' => $difficultyLevel['difficultyRank'], @@ -290,4 +297,4 @@ protected function closeZip() $this->zipFile = null; } } -} \ No newline at end of file +}