/** * Reads audio file record from database and generates audio preview. */ public function preview() { Logger::printf("Requested preview for track %s", $this->track_id); if ($this->hasPreview()) { Logger::printf("Track preview is available (file_id is %s)", $this->track_data[TSongs::PREVIEW_ID]); FileServer::sendToClient($this->track_data[TSongs::PREVIEW_ID]); return; } Logger::printf("Track preview is unavailable"); Logger::printf("Generating new track preview in real time"); header("Content-Type: " . PREVIEW_MIME); $temp_file = TempFileProvider::generate("preview", ".mp3"); $filename = FileServer::getFileUsingId($this->track_data[TSongs::FILE_ID]); $command_template = "%s -i %s -bufsize 256k -vn -ab 128k -ac 2 -acodec libmp3lame -f mp3 - | tee %s"; $command = sprintf($command_template, $this->settings->get("tools", "ffmpeg_cmd"), escapeshellarg($filename), escapeshellarg($temp_file)); passthru($command); $temp_file_id = FileServer::register($temp_file, PREVIEW_MIME); Logger::printf("New preview registered => %s", $temp_file_id); SongDao::updateSongUsingId($this->track_id, [TSongs::PREVIEW_ID => $temp_file_id]); }
public static function changeCover($song_id, $cover_file) { $song_ids = explode(",", $song_id); $song_objects = (new SelectQuery(TSongs::_NAME))->where(TSongs::ID, $song_ids)->where(TSongs::USER_ID, self::$me->getId())->fetchAll(); // Delete exists covers foreach ($song_objects as $song) { if ($song[TSongs::C_SMALL_ID]) { FileServer::unregister($song[TSongs::C_SMALL_ID]); } if ($song[TSongs::C_MID_ID]) { FileServer::unregister($song[TSongs::C_MID_ID]); } if ($song[TSongs::C_BIG_ID]) { FileServer::unregister($song[TSongs::C_BIG_ID]); } } $covers = FFProbe::readTempCovers($cover_file)->getOrThrow(ControllerException::class, "Image file is corrupted"); $query = (new UpdateQuery(TSongs::_NAME))->where(TSongs::ID, $song_ids)->where(TSongs::USER_ID, self::$me->getId()); $full_cover_id = FileServer::register($covers[0]); $middle_cover_id = FileServer::register($covers[1]); $small_cover_id = FileServer::register($covers[2]); $query->set(TSongs::C_SMALL_ID, $small_cover_id)->set(TSongs::C_MID_ID, $middle_cover_id)->set(TSongs::C_BIG_ID, $full_cover_id); $query->returning(implode(",", [TSongs::ID, TSongs::C_SMALL_ID, TSongs::C_MID_ID, TSongs::C_BIG_ID])); return $query->fetchAll(); }