private void btnExport_Click(object sender, EventArgs e) { var desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); var sfd = new SaveFileDialog { Title = "Select location to export to", FileName = Tools.CleanString(ActiveSetlist, true).Replace("'", "").Replace(" ", "") + "_details.txt", OverwritePrompt = true, AddExtension = true, InitialDirectory = desktop, Filter = "Text Files (*.txt)|*txt" }; if (sfd.ShowDialog() != DialogResult.OK || string.IsNullOrWhiteSpace(sfd.FileName)) { return; } Tools.DeleteFile(sfd.FileName); var sw = new StreamWriter(sfd.FileName, false, System.Text.Encoding.UTF8); try { for (var i = 0; i < lstStats.Items.Count; i++) { sw.WriteLine(FormatText(lstStats.Items[i].SubItems[0].Text, lstStats.Items[i].SubItems[1].Text)); } } catch (Exception ex) { MessageBox.Show("There was an error exporting the Setlist Details\nThe error says: " + ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); sw.Dispose(); return; } sw.Dispose(); if (MessageBox.Show("Setlist Details exported successfully\nDo you want to open the file now?", Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) { return; } Process.Start(sfd.FileName); }
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 DrawWaveForm() { ClearPanels(); ClearLabels(); lblFileName.Invoke(new MethodInvoker(() => lblFileName.Text = "Analysis of audio file: " + (Parser.Songs == null ? Path.GetFileName(InputFile) : Parser.Songs[0].InternalName + ".mogg"))); var BassStream = Bass.BASS_StreamCreateFile(Tools.GetOggStreamIntPtr(), 0L, Tools.PlayingSongOggData.Length, BASSFlag.BASS_STREAM_DECODE); if (BassStream == 0) { MessageBox.Show("Error processing audio stream:\n" + Bass.BASS_ErrorGetCode(), Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } var length = Bass.BASS_ChannelGetLength(BassStream); var duration = Math.Round(Bass.BASS_ChannelBytes2Seconds(BassStream, length), 2); var audio_info = Bass.BASS_ChannelGetInfo(BassStream); string size; if (Tools.PlayingSongOggData.Length >= 1048576) { size = Math.Round((double)Tools.PlayingSongOggData.Length / 1048576, 2) + " MB"; } else { size = Math.Round((double)Tools.PlayingSongOggData.Length / 1024, 2) + " KB"; } var minutes = Parser.GetSongDuration((duration * 1000).ToString(CultureInfo.InvariantCulture)); lblStart.Invoke(new MethodInvoker(() => lblStart.Text = "0:00")); lblLength.Invoke(new MethodInvoker(() => lblLength.Text = minutes)); var info = "Channels: " + audio_info.chans + " | Sample rate: " + audio_info.freq + " Hz | Length: " + duration + " seconds (" + minutes + ") | File size: " + Tools.PlayingSongOggData.Length + " bytes (" + size + ")"; lblFileInfo.Invoke(new MethodInvoker(() => lblFileInfo.Text = info)); WaveForm WaveImage; switch (audio_info.chans) { case 1: WaveImage = GetNewWaveForm(false); if (!WaveImage.RenderStart(BassStream, false, true)) { MessageBox.Show("Error rendering audio stream:\n" + Bass.BASS_ErrorGetCode(), Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); ClearPanels(); return; } panelWave.BackgroundImage = WaveImage.CreateBitmap(WaveWidth, WaveHeight, -1, -1, highQualityDrawing.Checked); break; case 2: WaveImage = GetNewWaveForm(true); if (!WaveImage.RenderStart(BassStream, false, true)) { MessageBox.Show("Error rendering audio stream:\n" + Bass.BASS_ErrorGetCode(), Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); ClearPanels(); return; } panelWave.BackgroundImage = WaveImage.CreateBitmap(WaveWidth, WaveHeight, -1, -1, highQualityDrawing.Checked); break; default: try { List <string> TrackNames; List <bool> TrackIsStereo; var splitter = new MoggSplitter(); var ArrangedChannels = splitter.ArrangeStreamChannels(audio_info.chans, Path.GetExtension(InputFile) != ".wav"); GetTrackNames(out TrackNames, out TrackIsStereo); var height = WaveHeight / audio_info.chans; var top = 0; var index = 0; var maxCount = TrackNames.Any() ? TrackNames.Count : audio_info.chans; for (var i = 0; i < maxCount; i++) { var multiplier = TrackIsStereo.Any() && TrackIsStereo[i] ? 2 : 1; var panel = new Panel(); Invoke(new MethodInvoker(delegate { panel.Parent = panelWave; })); panel.Invoke(new MethodInvoker(() => panel.Left = -1)); panel.Invoke(new MethodInvoker(() => panel.Top = top - 1)); panel.Invoke(new MethodInvoker(() => panel.Width = WaveWidth + 2)); panel.Invoke(new MethodInvoker(() => panel.Height = (height * multiplier) + 1)); panel.Invoke(new MethodInvoker(() => panel.BackgroundImageLayout = ImageLayout.Stretch)); panel.Invoke(new MethodInvoker(() => panel.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right)); if (outlineAudioTracks.Checked && i < maxCount - 1) { panel.Invoke(new MethodInvoker(() => panel.BorderStyle = BorderStyle.FixedSingle)); } var map = TrackIsStereo.Any() && TrackIsStereo[i] ? new[] { ArrangedChannels[index], ArrangedChannels[index + 1], -1 } : new[] { ArrangedChannels[index], -1 }; var channel_stream = BassMix.BASS_Split_StreamCreate(BassStream, BASSFlag.BASS_STREAM_DECODE, map); WaveImage = GetNewWaveForm(TrackIsStereo.Any() && TrackIsStereo[i]); if (!WaveImage.RenderStart(channel_stream, false, true)) { MessageBox.Show("Error rendering audio stream:\n" + Bass.BASS_ErrorGetCode(), Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); ClearPanels(); ClearLabels(); return; } var endFrame = WaveImage.Position2Frames((length / audio_info.chans) * multiplier); panel.BackgroundImage = WaveImage.CreateBitmap(WaveWidth, height * multiplier, -1, endFrame, highQualityDrawing.Checked); var font = new Font("Times New Roman", 10f, FontStyle.Bold); var label = new Label(); Invoke(new MethodInvoker(delegate { label.Parent = panel; })); label.Invoke(new MethodInvoker(() => label.Visible = labelAudioChannels.Checked)); label.Invoke(new MethodInvoker(() => label.Location = new Point(3, 3))); label.Invoke(new MethodInvoker(() => label.BackColor = Color.Transparent)); label.Invoke(new MethodInvoker(() => label.ForeColor = Color.White)); label.Invoke(new MethodInvoker(() => label.Font = font)); label.Invoke(new MethodInvoker(() => label.Text = TrackNames.Count > 0 ? TrackNames[i] : "chan. " + i)); ChannelLabels.Add(label); Bass.BASS_StreamFree(channel_stream); ChannelPanels.Add(panel); top += (height * multiplier); index += multiplier; } } catch (Exception ex) { MessageBox.Show("Error rendering audio stream:\n" + ex.Message + "\n\n" + Bass.BASS_ErrorGetCode(), Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); ClearPanels(); ClearLabels(); return; } break; } Bass.BASS_StreamFree(BassStream); if (InputFiles.Count <= 1) { return; } var file = Path.GetDirectoryName(InputFile) + "\\" + Tools.CleanString(Path.GetFileNameWithoutExtension(InputFile), false) + ".jpg"; TakeScreenshot(file); }
private bool ProcessFiles() { var counter = 0; var success = 0; foreach (var file in inputFiles.Where(File.Exists).TakeWhile(file => !backgroundWorker1.CancellationPending)) { try { if (VariousFunctions.ReadFileType(file) != XboxFileType.STFS) { continue; } Song.NewSong(); Song.ReplaceGenreWithSub = useSubgenreInsteadOfGenreToolStripMenuItem.Checked; try { if (!Directory.Exists(PSFolder)) { Directory.CreateDirectory(PSFolder); } 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; } if (!Parser.Songs.Any()) { Log("There was an error processing the songs.dta file"); continue; } if (loadDTA()) { Log("Loaded and processed songs.dta file for song #" + counter + " successfully"); Log("Song #" + counter + " is " + Song.Artist + " - " + Song.Name); } else { return(false); } var songfolder = PSFolder + Tools.CleanString(Song.Artist, false) + " - " + Tools.CleanString(Song.Name, false) + "\\"; if (!Directory.Exists(songfolder)) { Directory.CreateDirectory(songfolder); } var internal_name = Parser.Songs[0].InternalName; var xPackage = new STFSPackage(file); if (!xPackage.ParseSuccess) { Log("Failed to parse '" + Path.GetFileName(file) + "'"); Log("Skipping this file"); continue; } var xArt = xPackage.GetFile("songs/" + internal_name + "/gen/" + internal_name + "_keep.png_xbox"); if (xArt != null) { var newart = songfolder + "album.png_xbox"; if (xArt.ExtractToFile(newart)) { Log("Extracted album art file " + internal_name + "_keep.png_xbox successfully"); fromXbox(newart); } else { Log("There was a problem extracting the album art file"); } } else { Log("WARNING: Did not find album art file in that CON file"); } var xMIDI = xPackage.GetFile("songs/" + internal_name + "/" + internal_name + ".mid"); if (xMIDI != null) { var newmidi = songfolder + "notes.mid"; if (xMIDI.ExtractToFile(newmidi)) { Log("Extracted MIDI file " + internal_name + ".mid successfully"); ProcessMidi(newmidi); } else { Log("There was a problem extracting the MIDI file"); Log("Skipping this song..."); xPackage.CloseIO(); continue; } } else { Log("ERROR: Did not find a MIDI file in that CON file!"); Log("Skipping this song..."); xPackage.CloseIO(); continue; } var xMOGG = xPackage.GetFile("songs/" + internal_name + "/" + internal_name + ".mogg"); if (xMOGG != null) { var newmogg = songfolder + internal_name + ".mogg"; if (radioSeparate.Checked) { xPackage.CloseIO(); SeparateAudio(file, newmogg, songfolder); } else if (radioDownmix.Checked) { xPackage.CloseIO(); DownMixAudio(file, songfolder); } else { var msg = "Extracting audio file " + (radioAudacity.Checked ? "to send to Audacity" : "and leaving it as is"); Log(msg); var mData = xMOGG.Extract(); if (mData != null && mData.Length > 0) { Log("Successfully extracted audio file '" + Path.GetFileName(newmogg) + "'"); if (radioAudacity.Checked) { Log("Sending audio file to Audacity now"); Tools.DecM(mData, false, false, DecryptMode.ToFile, newmogg); Log(Tools.SendtoAudacity(newmogg)); } else { Tools.WriteOutData(Tools.ObfM(mData), newmogg); } } else { Log("There was a problem extracting the audio file"); Log("Skipping this song..."); xPackage.CloseIO(); continue; } } } else { Log("ERROR: Did not find an audio file in that CON file!"); Log("Skipping this song..."); xPackage.CloseIO(); continue; } xPackage.CloseIO(); if (!Directory.Exists(songfolder)) { Directory.CreateDirectory(songfolder); } Song.WriteINIFile(songfolder, !chkNoC3.Checked); var banner = Application.StartupPath + "\\res\\phaseshift\\banner.png"; if (File.Exists(banner) && !chkNoC3.Checked) { Tools.DeleteFile(songfolder + "banner.png"); File.Copy(banner, songfolder + "banner.png"); } var icon = Application.StartupPath + "\\res\\phaseshift\\c3.png"; if (File.Exists(icon) && !chkNoC3.Checked) { Tools.DeleteFile(songfolder + "ccc.png"); File.Copy(icon, songfolder + "ccc.png"); } success++; if (!chkRAR.Checked || backgroundWorker1.CancellationPending) { continue; } var archive = Path.GetFileName(file); archive = archive.Replace(" ", "").Replace("-", "_").Replace("\\", "").Replace("'", "").Replace(",", "").Replace("_rb3con", ""); archive = Tools.CleanString(archive, false); archive = PSFolder + archive + "_ps.rar"; var arg = "a -m5 -ep1 -r \"" + archive + "\" \"" + songfolder.Substring(0, songfolder.Length - 1) + "\""; Log("Creating RAR archive"); Log(Tools.CreateRAR(rar, archive, arg)? "Created RAR archive successfully" : "RAR archive creation failed"); } catch (Exception ex) { Log("There was an error: " + ex.Message); Log("Attempting to continue with the next file"); } } catch (Exception ex) { Log("There was a problem accessing that file"); Log("The error says: " + ex.Message); } } Log("Successfully processed " + success + " of " + counter + " files"); return(true); }