@@ -68,16 +68,27 @@ public static function fetch(Beatmapset $beatmapset): ?static
6868 }
6969 }
7070
71- private static function convertAudioForPreview (string $ audioFile , int $ previewTime ): ?string
71+ private static function convertAudioForPreview (string $ audioFile , ? int $ previewTime ): ?string
7272 {
7373 $ srcFile = tmpfile ();
7474 fwrite ($ srcFile , $ audioFile );
7575 $ srcFilename = get_stream_filename ($ srcFile );
76+ $ srcFilenameEscaped = escapeshellarg ($ srcFilename );
7677 $ dstFile = tmpfile ();
7778 $ dstFilename = get_stream_filename ($ dstFile );
7879
7980 $ duration = 10000 ;
80- $ previewTime = max ($ previewTime , 0 );
81+ if ($ previewTime === null || $ previewTime < 0 ) {
82+ $ srcDuration = (float ) exec (implode (' ' , [
83+ 'timeout 10s ' ,
84+ 'ffprobe ' ,
85+ '-loglevel quiet ' ,
86+ "-i {$ srcFilenameEscaped }" ,
87+ '-show_entries format=duration ' ,
88+ '-of csv=p=0 ' ,
89+ ]));
90+ $ previewTime = 0.4 * $ srcDuration * 100 ;
91+ }
8192
8293 $ fadeInExtension = min ($ previewTime , 100 );
8394 $ fadeIn = $ fadeInExtension + 100 ;
@@ -108,7 +119,7 @@ private static function convertAudioForPreview(string $audioFile, int $previewTi
108119 '-nostdin ' ,
109120 "-ss {$ previewTime }ms " ,
110121 "-t {$ duration }ms " ,
111- ' -i ' . escapeshellarg ( $ srcFilename ) ,
122+ " -i { $ srcFilenameEscaped }" ,
112123 "-af {$ filter }" ,
113124 '-map 0:a ' , // strip out non-audio streams
114125 '-map_metadata -1 ' , // strip out metadata
@@ -176,10 +187,10 @@ public function generateAudioPreview(): ?string
176187 $ previewTime = $ parsedFile ->previewTime ;
177188 $ audioFilename = $ parsedFile ->audioFilename ;
178189
179- if (isset ($ audioFilename, $ previewTime )) {
190+ if (isset ($ audioFilename )) {
180191 $ audioFile = $ this ->readFile ($ audioFilename );
181192
182- if ($ audioFile !== null ) {
193+ if ($ audioFile !== false ) {
183194 return static ::convertAudioForPreview ($ audioFile , $ previewTime );
184195 }
185196 }
0 commit comments