11using AssetStudio ;
22using MaiChartManager . Models ;
33using Microsoft . AspNetCore . Mvc ;
4+ using Microsoft . VisualBasic . FileIO ;
45using Sitreamai ;
56using Sitreamai . Models ;
67using Standart . Hash . xxHash ;
@@ -9,7 +10,7 @@ namespace MaiChartManager.Controllers;
910
1011[ ApiController ]
1112[ Route ( "MaiChartManagerServlet/[action]Api/{id:int}" ) ]
12- public class MusicController ( StaticSettings settings , ILogger < StaticSettings > logger ) : ControllerBase
13+ public class MusicController ( StaticSettings settings , ILogger < MusicController > logger ) : ControllerBase
1314{
1415 [ HttpGet ]
1516 public MusicXmlWithABJacket ? GetMusicDetail ( int id )
@@ -233,4 +234,62 @@ public void SetAudio(int id, [FromForm] float padding, IFormFile file, IFormFile
233234 StaticSettings . AcbAwb [ $ "music{ id : 000000} .acb"] = targetAcbPath ;
234235 StaticSettings . AcbAwb [ $ "music{ id : 000000} .awb"] = targetAwbPath ;
235236 }
237+
238+ [ HttpPost ]
239+ public void RequestCopyTo ( int id )
240+ {
241+ if ( Program . BrowserWin is null ) return ;
242+ var dialog = new FolderBrowserDialog
243+ {
244+ Description = "请选择要复制到的另一份游戏的资源目录(Axxx)位置"
245+ } ;
246+ if ( Program . BrowserWin . Invoke ( ( ) => dialog . ShowDialog ( Program . BrowserWin ) ) != DialogResult . OK ) return ;
247+ var dest = dialog . SelectedPath ;
248+ logger . LogInformation ( "CopyTo: {dest}" , dest ) ;
249+
250+ var music = settings . MusicList . Find ( it => it . Id == id ) ;
251+ if ( music is null ) return ;
252+
253+ // copy music
254+ Directory . CreateDirectory ( Path . Combine ( dest , "music" ) ) ;
255+ FileSystem . CopyDirectory ( Path . GetDirectoryName ( music . FilePath ) , Path . Combine ( dest , $@ "music\{ music . Id : 000000} ") , UIOption . OnlyErrorDialogs ) ;
256+
257+ // copy jacket
258+ Directory . CreateDirectory ( Path . Combine ( dest , @"AssetBundleImages\jacket" ) ) ;
259+ if ( music . JacketPath is not null )
260+ {
261+ FileSystem . CopyFile ( music . JacketPath , Path . Combine ( dest , $@ "AssetBundleImages\jacket\ui_jacket_{ music . NonDxId : 000000} { Path . GetExtension ( music . JacketPath ) } ") , UIOption . OnlyErrorDialogs ) ;
262+ }
263+ else if ( music . AssetBundleJacket is not null )
264+ {
265+ FileSystem . CopyFile ( music . AssetBundleJacket , Path . Combine ( dest , $@ "AssetBundleImages\jacket\{ Path . GetFileName ( music . AssetBundleJacket ) } ") , UIOption . OnlyErrorDialogs ) ;
266+ if ( System . IO . File . Exists ( music . AssetBundleJacket + ".manifest" ) )
267+ {
268+ FileSystem . CopyFile ( music . AssetBundleJacket + ".manifest" , Path . Combine ( dest , $@ "AssetBundleImages\jacket\{ Path . GetFileName ( music . AssetBundleJacket ) } .manifest") , UIOption . OnlyErrorDialogs ) ;
269+ }
270+ }
271+ else if ( music . PseudoAssetBundleJacket is not null )
272+ {
273+ FileSystem . CopyFile ( music . PseudoAssetBundleJacket , Path . Combine ( dest , $@ "AssetBundleImages\jacket\{ Path . GetFileName ( music . PseudoAssetBundleJacket ) } ") , UIOption . OnlyErrorDialogs ) ;
274+ }
275+
276+ // copy acbawb
277+ Directory . CreateDirectory ( Path . Combine ( dest , "SoundData" ) ) ;
278+ if ( StaticSettings . AcbAwb . TryGetValue ( $ "music{ music . NonDxId : 000000} .acb", out var acb ) )
279+ {
280+ FileSystem . CopyFile ( acb , Path . Combine ( dest , $@ "SoundData\music{ music . NonDxId : 000000} .acb") , UIOption . OnlyErrorDialogs ) ;
281+ }
282+
283+ if ( StaticSettings . AcbAwb . TryGetValue ( $ "music{ music . NonDxId : 000000} .awb", out var awb ) )
284+ {
285+ FileSystem . CopyFile ( awb , Path . Combine ( dest , $@ "SoundData\music{ music . NonDxId : 000000} .awb") , UIOption . OnlyErrorDialogs ) ;
286+ }
287+
288+ // copy movie data
289+ if ( StaticSettings . MovieDataMap . TryGetValue ( music . NonDxId , out var movie ) )
290+ {
291+ Directory . CreateDirectory ( Path . Combine ( dest , "MovieData" ) ) ;
292+ FileSystem . CopyFile ( movie , Path . Combine ( dest , $@ "MovieData\{ music . NonDxId : 000000} .dat") , UIOption . OnlyErrorDialogs ) ;
293+ }
294+ }
236295}
0 commit comments