@@ -1078,38 +1078,54 @@ public ActionResult ExportCustom([FromQuery] int id, [FromQuery] string assetDir
10781078 if ( music == null ) return NotFound ( ) ;
10791079
10801080 var safeName = string . Join ( "_" , music . Name . Split ( Path . GetInvalidFileNameChars ( ) ) ) ;
1081+ var ext = format . ToLowerInvariant ( ) == "sus" ? "sus" : "ugc" ;
1082+ var diffFileNames = new [ ] { "bas" , "adv" , "exp" , "mas" , "ult" , "we" } ;
1083+
10811084 var ms = new MemoryStream ( ) ;
10821085 using ( var zip = new ZipArchive ( ms , ZipArchiveMode . Create , true ) )
10831086 {
1084- var enabledFumen = music . Fumens . FirstOrDefault ( f => f is { Enable : true } ) ;
1085- if ( enabledFumen != null )
1087+ for ( var i = 0 ; i < music . Fumens . Length ; i ++ )
10861088 {
1087- var c2sPath = Path . Combine ( music . MusicDirectory , enabledFumen . FilePath ) ;
1088- if ( System . IO . File . Exists ( c2sPath ) )
1089+ var fumen = music . Fumens [ i ] ;
1090+ if ( fumen is not { Enable : true } || string . IsNullOrEmpty ( fumen . FilePath ) ) continue ;
1091+
1092+ var c2sPath = Path . Combine ( music . MusicDirectory , fumen . FilePath ) ;
1093+ if ( ! System . IO . File . Exists ( c2sPath ) ) continue ;
1094+
1095+ var c2sContent = System . IO . File . ReadAllText ( c2sPath , Encoding . UTF8 ) ;
1096+ try
10891097 {
1090- var c2sContent = System . IO . File . ReadAllText ( c2sPath , Encoding . UTF8 ) ;
1091- try
1092- {
1093- var ( chart , _) = new C2sParser ( ) . Parse ( c2sContent ) ;
1094- var ext = format . ToLowerInvariant ( ) == "sus" ? "sus" : "ugc" ;
1095- var content = ext == "sus"
1096- ? new SusGenerator ( ) . Generate ( chart ) . Item1
1097- : new UgcGenerator ( ) . Generate ( chart ) . Item1 ;
1098- var entry = zip . CreateEntry ( $ "{ safeName } .{ ext } ") ;
1099- using var w = new StreamWriter ( entry . Open ( ) , Encoding . UTF8 ) ;
1100- w . Write ( content ) ;
1101- }
1102- catch
1103- {
1104- zip . CreateEntryFromFile ( c2sPath , $ "{ safeName } .c2s") ;
1105- }
1098+ var ( chart , _) = new C2sParser ( ) . Parse ( c2sContent ) ;
1099+ chart . Difficulty = i ;
1100+ chart . Title = music . Name ;
1101+ chart . Artist = music . Artist ;
1102+ chart . Designer = fumen . NotesDesigner ;
1103+ chart . DisplayLevel = fumen . LevelDisplay ;
1104+ chart . Level = fumen . LevelValue ;
1105+ chart . MusicId = music . Id . ToString ( ) ;
1106+ var content = ext == "sus"
1107+ ? new SusGenerator ( ) . Generate ( chart ) . Item1
1108+ : new UgcGenerator ( ) . Generate ( chart ) . Item1 ;
1109+
1110+ if ( ext == "ugc" )
1111+ content = content . Replace ( "@SONGID\t " , "@BGM\t bgm.wav\r \n @JACKET\t jacket.png\r \n @SONGID\t " ) ;
1112+
1113+ var fileName = i < diffFileNames . Length ? diffFileNames [ i ] : $ "diff{ i } ";
1114+ var entry = zip . CreateEntry ( $ "{ safeName } /{ fileName } .{ ext } ") ;
1115+ using var w = new StreamWriter ( entry . Open ( ) , Encoding . UTF8 ) ;
1116+ w . Write ( content ) ;
1117+ }
1118+ catch
1119+ {
1120+ var fileName = i < diffFileNames . Length ? diffFileNames [ i ] : $ "diff{ i } ";
1121+ zip . CreateEntryFromFile ( c2sPath , $ "{ safeName } /{ fileName } .c2s") ;
11061122 }
11071123 }
11081124
11091125 var wav = AudioHelper . GetWavFromMusic ( music ) ;
11101126 if ( wav != null )
11111127 {
1112- var entry = zip . CreateEntry ( $ "{ safeName } .wav") ;
1128+ var entry = zip . CreateEntry ( $ "{ safeName } /bgm .wav") ;
11131129 using var s = entry . Open ( ) ;
11141130 s . Write ( wav ) ;
11151131 }
@@ -1120,13 +1136,13 @@ public ActionResult ExportCustom([FromQuery] int id, [FromQuery] string assetDir
11201136 var pngData = ConvertDdsToPng ( jacketPath ) ;
11211137 if ( pngData != null )
11221138 {
1123- var entry = zip . CreateEntry ( $ "{ safeName } .png") ;
1139+ var entry = zip . CreateEntry ( $ "{ safeName } /jacket .png") ;
11241140 using var s = entry . Open ( ) ;
11251141 s . Write ( pngData ) ;
11261142 }
11271143 else if ( Path . GetExtension ( jacketPath ) . ToLowerInvariant ( ) is ".png" or ".jpg" or ".jpeg" )
11281144 {
1129- zip . CreateEntryFromFile ( jacketPath , $ "{ safeName } { Path . GetExtension ( jacketPath ) } ") ;
1145+ zip . CreateEntryFromFile ( jacketPath , $ "{ safeName } /jacket { Path . GetExtension ( jacketPath ) } ") ;
11301146 }
11311147 }
11321148 }
0 commit comments