private void FinishAudioSeparation(string mogg, string folder) { var oggs = Directory.GetFiles(folder, "*.ogg"); if (!oggs.Any()) { Log("Failed"); return; } Log("Success"); Tools.DeleteFile(mogg); AnalyzeOggs(oggs); if (!useguitaroggForNonmultitrackSongs.Checked) { return; } oggs = Directory.GetFiles(folder, "*.ogg"); if (!oggs.Any() || oggs.Count() > 1 || !oggs[0].Contains("song.ogg")) { return; } Tools.MoveFile(oggs[0], folder + "guitar.ogg"); }
private void FileExtractor_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { var dtafolder = txtFolder.Text + "\\" + (organizeFilesByType.Checked ? "dta_files\\" : ""); var dtacount = 0; var midicount = 0; var moggcount = 0; var milocount = 0; var pngcount = 0; var thumbcount = 0; var hasdta = false; var rename = ""; var counter = 0; foreach (var file in inputFiles.Where(File.Exists).TakeWhile(file => !FileExtractor.CancellationPending)) { try { if (VariousFunctions.ReadFileType(file) != XboxFileType.STFS) { continue; } if (!Parser.ExtractDTA(file)) { Log("Error extracting songs.dta from file: '" + Path.GetFileName(file) + "' ... skipping"); continue; } if (!Parser.ReadDTA(Parser.DTA) || !Parser.Songs.Any()) { Log("Error reading that songs.dta file ... skipping"); continue; } try { xPackage = new STFSPackage(file); if (!xPackage.ParseSuccess) { Log("Error opening file '" + Path.GetFileName(file) + "' ... skipping"); xPackage.CloseIO(); } else { hasdta = true; Log("CON file '" + Path.GetFileNameWithoutExtension(file) + "' contains " + Parser.Songs.Count + " " + (Parser.Songs.Count == 1 ? "song" : "songs")); for (var i = 0; i < Parser.Songs.Count; i++) { if (FileExtractor.CancellationPending) { xPackage.CloseIO(); break; } var song = Parser.Songs[i]; counter++; Log("Extracting files for song #" + (counter) + ": '" + song.Artist + " - " + song.Name + "'"); var songid = song.InternalName; var name = Tools.CleanString(song.Name, true); var artist = Tools.CleanString(song.Artist, true); songid = Tools.CleanString(songid, true); rename = arrangeName(name, artist, songid).Replace("!", "").Replace("'", ""); rename = Tools.CleanString(rename, false); if (chkMIDI.Checked && !FileExtractor.CancellationPending) { if (ExtractFile("mid", false, songid, rename)) { midicount++; } } if (chkMOGG.Checked && !FileExtractor.CancellationPending) { if (ExtractFile("mogg", false, songid, rename)) { moggcount++; } } if (chkPNG.Checked && !FileExtractor.CancellationPending) { if (ExtractFile("png_xbox", true, songid, rename, true)) { pngcount++; } } if (!chkMILO.Checked) { continue; } if (ExtractFile("milo_xbox", true, songid, rename)) { milocount++; } } if (FileExtractor.CancellationPending) { xPackage.CloseIO(); break; } var xUpgrade = xPackage.GetFile("songs_upgrades/upgrades.dta"); if (xUpgrade != null) { var temp_upg = Path.GetTempPath() + "upg.dta"; Tools.DeleteFile(temp_upg); if (xUpgrade.ExtractToFile(temp_upg)) { var upg_midi = ""; var sr = new StreamReader(temp_upg); while (sr.Peek() >= 0) { var line = sr.ReadLine(); if (string.IsNullOrWhiteSpace(line)) { continue; } if (line.Contains("midi_file")) { upg_midi = line.Replace("midi_file", "").Replace("songs_upgrades", "") .Replace("(", "").Replace(")", "").Replace("\"", "") .Replace("/", "").Replace("'", "").Trim(); } if (string.IsNullOrWhiteSpace(upg_midi)) { continue; } if (chkMIDI.Checked) { var xmidi = xPackage.GetFile("songs_upgrades/" + upg_midi); if (xmidi != null) { var outputfolder = txtFolder.Text + "\\" + (organizeFilesByType.Checked ? "midi_files\\" : ""); if (!Directory.Exists(outputfolder)) { Directory.CreateDirectory(outputfolder); } var out_midi = outputfolder + upg_midi; Log("Extracting MIDI file " + Path.GetFileName(out_midi)); Tools.DeleteFile(out_midi); if (xmidi.ExtractToFile(out_midi)) { Log("Extracted " + Path.GetFileName(out_midi) + " successfully"); midicount++; } else { Log("There was an error extracting upgrade MIDI file " + upg_midi); } } else { Log("Could not find upgrade MIDI file " + upg_midi + " in that file"); } } upg_midi = ""; } sr.Dispose(); if (chkDTA.Checked) { if (!Directory.Exists(dtafolder)) { Directory.CreateDirectory(dtafolder); } var upgdta = (string.IsNullOrWhiteSpace(xPackage.Header.Title_Display) ? Path.GetFileName(file) : xPackage.Header.Title_Display).Replace("!", "") .Replace("'", "").Replace(" ", replaceSpacesWithUnderscores.Checked ? "_" : (removeSpacesFromFileName.Checked ? "" : " ")); var upg_out = dtafolder + "\\" + Tools.CleanString(upgdta, false) + "_upgrade.dta"; Tools.DeleteFile(upg_out); if (Tools.MoveFile(temp_upg, upg_out)) { Log("Extracted " + Path.GetFileName(upg_out) + " successfully"); dtacount++; } else { Log("There was an error extracting the upgrades.dta for " + Path.GetFileName(file)); } } } else { Log("There was an error extracting the upgrades.dta for " + Path.GetFileName(file)); } } else if (!hasdta) { Log("Could not find songs.dta or upgrades.dta inside '" + Path.GetFileName(file) + "'"); } } var packname = (string.IsNullOrWhiteSpace(xPackage.Header.Title_Display) ? Path.GetFileName(file) : xPackage.Header.Title_Display).Replace("!", "") .Replace("'", "").Replace(" ", replaceSpacesWithUnderscores.Checked ? "_" : (removeSpacesFromFileName.Checked ? "" : " ")); packname = Parser.Songs.Count == 1 && !string.IsNullOrWhiteSpace(rename) ? rename : Tools.CleanString(packname, false); if (chkDTA.Checked && hasdta) { try { var newDTA = dtafolder + packname + (appendsongsToFiles.Checked ? "_songs" : "") + ".dta"; Log("Extracting DTA file " + Path.GetFileName(newDTA)); if (!Directory.Exists(dtafolder)) { Directory.CreateDirectory(dtafolder); } if (Parser.WriteDTAToFile(newDTA)) { Log(Path.GetFileName(newDTA) + " extracted successfully"); dtacount++; } else { Log("Looks like extracting the DTA file for " + Path.GetFileName(file) + " failed. Sorry."); } } catch (Exception ex) { Log("Error extracting DTA file for " + Path.GetFileName(file)); Log("The error says: " + ex.Message); } } if (chkThumbs.Checked && !FileExtractor.CancellationPending) { var thumbfolder = txtFolder.Text + "\\" + (organizeFilesByType.Checked ? "thumbnails\\" : ""); var package = thumbfolder + packname + " Package.png"; var content = thumbfolder + packname + " Content.png"; if (!Directory.Exists(thumbfolder)) { Directory.CreateDirectory(thumbfolder); } try { Tools.DeleteFile(content); var img = xPackage.Header.ContentImage; img.Save(content, ImageFormat.Png); img.Dispose(); thumbcount++; Tools.DeleteFile(package); img = xPackage.Header.PackageImage; img.Save(package, ImageFormat.Png); img.Dispose(); thumbcount++; Log("Extracted thumbnails successfully"); } catch (Exception ex) { Log("There was an error extracting the thumbnails"); Log("The error says: " + ex.Message); } } xPackage.CloseIO(); } catch (Exception ex) { Log("Error processing file '" + Path.GetFileName(file) + "'"); Log("The error says: " + ex.Message); xPackage.CloseIO(); } } catch (Exception ex) { Log("There was a problem accessing that file"); Log("The error says: " + ex.Message); xPackage.CloseIO(); } } if (dtacount + midicount + moggcount + milocount + pngcount + thumbcount == 0) { Log("Nothing was extracted ... please see the log for any failure reports"); } else { if (dtacount > 0) { Log("Extracted " + dtacount + " DTA " + (dtacount > 1 ? "files" : "file")); } if (pngcount > 0) { Log("Extracted " + pngcount + " PNG_XBOX " + (pngcount > 1 ? "files" : "file")); btnConverter.Invoke(new MethodInvoker(() => btnConverter.Visible = true)); } if (midicount > 0) { Log("Extracted " + midicount + " MIDI " + (midicount > 1 ? "files" : "file")); } if (moggcount > 0) { Log("Extracted " + moggcount + " MOGG " + (moggcount > 1 ? "files" : "file")); } if (milocount > 0) { Log("Extracted " + milocount + " MILO_XBOX " + (milocount > 1 ? "files" : "file")); } if (thumbcount > 0) { Log("Extracted " + thumbcount + " " + (thumbcount > 1 ? "thumbnails" : "thumbnail")); } } xPackage.CloseIO(); }
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { Tools.CurrentFolder = Path.GetDirectoryName(con); Log("Reading CON file " + Path.GetFileName(con)); var dta = Path.GetTempPath() + "temp_dta.txt"; var backup = con + "_backup"; Tools.DeleteFile(backup); if (!Parser.ExtractDTA(con))//grab byte[] content of DTA { Log("Error extracting DTA file"); ErrorOut(); return; } if (!Parser.WriteDTAToFile(dta)) //write it out to file { Log("Error extracting DTA file"); ErrorOut(); return; } var song = new STFSPackage(con); if (backUpCONFile.Checked) { Log("Found songs.dta file, making a backup of your file before starting"); Log("THIS STEP MAY TAKE A WHILE. DON'T CLOSE ME DOWN!"); song.CloseIO(); File.Copy(con, backup); song = new STFSPackage(con); } var xDTA = song.GetFile("/songs/songs.dta"); Log("Opening DTA file..."); var process = Process.Start(dta); Log("DTA file is being edited by the user ... waiting..."); do { //wait while user has DTA file opened } while (!process.HasExited); process.Dispose(); Log("DTA file closed by user, continuing..."); Log("Replacing old DTA file with modified DTA file"); Log("THIS STEP MAY TAKE A WHILE. DON'T CLOSE ME DOWN!"); if (!xDTA.Replace(dta)) { Log("Error replacing DTA file with modified one"); Tools.DeleteFile(backup); ErrorOut(); return; } Log("Replaced DTA file successfully"); song.Header.MakeAnonymous(); song.Header.ThisType = PackageType.SavedGame; var success = false; try { Log("Saving changes to pack ... sit tight"); Log("THIS STEP MAY TAKE A WHILE. DON'T CLOSE ME DOWN!"); signature = new RSAParams(Application.StartupPath + "\\bin\\KV.bin"); song.RebuildPackage(signature); song.FlushPackage(signature); song.CloseIO(); success = true; } catch (Exception ex) { Log("There was an error: " + ex.Message); song.CloseIO(); } if (success) { Log("Trying to unlock CON file"); if (Tools.UnlockCON(con)) { Log("Unlocked CON file successfully"); } else { Log("Error unlocking CON file"); success = false; } } if (success) { if (Tools.SignCON(con)) { Log("CON file signed successfully"); } else { Log("Error signing CON file"); success = false; } } Tools.DeleteFile(dta); Log(success ? "Process completed successfully!" : "Something went wrong along the way, sorry!"); if (success) { return; } if (!backUpCONFile.Checked) { return; } Log("Restoring backup file"); Tools.DeleteFile(con); Log(Tools.MoveFile(backup, con) ? "Backup file restored successfully, nothing was lost" : "Sorry, there was an error restoring the backup file"); }
private bool extractRBFiles() { var counter = 0; var success = 0; foreach (var file in inputFiles) { if (backgroundWorker1.CancellationPending) { return(false); } try { if (VariousFunctions.ReadFileType(file) != XboxFileType.STFS) { continue; } try { counter++; Parser.ExtractDTA(file); Parser.ReadDTA(Parser.DTA); if (Parser.Songs.Count > 1) { Log("File " + Path.GetFileName(file) + " is a pack, try dePACKing first, skipping..."); continue; } var xPackage = new STFSPackage(file); if (!xPackage.ParseSuccess) { Log("Failed to extract '" + Path.GetFileName(file) + "'"); Log("Skipping this file"); } //if working inner temp folder exists, delete to start clean var temptempFile = tempFolder + "temp\\"; Tools.DeleteFolder(temptempFile, true); if (backgroundWorker1.CancellationPending) { xPackage.CloseIO(); return(false); } //extract songs folder, subfolders and all files into a combined directory xPackage.ExtractPayload(temptempFile, true, false); xPackage.CloseIO(); temptempFile = temptempFile + "root\\"; if (Directory.Exists(temptempFile + "songs\\")) { var subFolders = Directory.GetDirectories(temptempFile + "songs\\"); var tempFileName = subFolders[0].Substring((temptempFile + "songs\\").Length, subFolders[0].Length - (temptempFile + "songs\\").Length); if (subFolders.Count() != 0) //upgrades won't have subdirectories, skip this step in that case { if (File.Exists(temptempFile + "songs\\songs.dta")) { //move songs.dta to the song's folder for sorting later //allows to skip duplicates Tools.MoveFile(temptempFile + "songs\\songs.dta", temptempFile + "songs\\" + tempFileName + "\\songs.dta"); } foreach (var foldertoMove in subFolders) { tempFileName = foldertoMove.Substring((temptempFile + "songs\\").Length, foldertoMove.Length - (temptempFile + "songs\\").Length); var folderpath = tempFolder + "songs\\"; //let's make sure songs folder is there, if not, create it if (!(Directory.Exists(folderpath))) { Directory.CreateDirectory(tempFolder + "songs\\"); } //if this song already exists in the working directory, delete it //copy this one instead Tools.DeleteFolder(folderpath + tempFileName + "\\", true); if (Path.GetPathRoot(temptempFile) == Path.GetPathRoot(songsFolder)) { Directory.Move(temptempFile + "songs\\" + tempFileName + "\\", folderpath + tempFileName + "\\"); } else { FileSystem.CopyDirectory(temptempFile + "songs\\" + tempFileName + "\\", folderpath + tempFileName + "\\"); } } } Log("Extracting file " + counter + " of " + inputFiles.Count); success++; } //move other root files but no spa.bin files to root directory var rootFiles = Directory.GetFiles(temptempFile); if (rootFiles.Count() != 0) { foreach (var rootFile in rootFiles.Where(rootFile => rootFile.Substring(rootFile.Length - 7, 7) != "spa.bin")) { Tools.MoveFile(rootFile, tempFolder + Path.GetFileName(rootFile)); } } //delete folder to get rid of useless files Tools.DeleteFolder(temptempFile, true); } catch (Exception ex) { Log("There was an error: " + ex.Message); return(false); } } catch (Exception ex) { Log("There was a problem accessing that file"); Log("The error says: " + ex.Message); } } Log("Successfully extracted " + success + " of " + counter + " files"); return(true); }