├── Artwork ├── icon1.ico ├── icon1.png ├── icon2.ico └── icon2.png ├── readmeStuff ├── gui.png └── contextMenu.png ├── Repackinator ├── bass.dll ├── libbass.so ├── libbass.dylib ├── Assets │ ├── repackinator.ico │ ├── teamresurgent.jpg │ └── Stuart Wilson - Not Another Comic Bakery Remix.mp3 ├── ViewModels │ ├── ViewModelBase.cs │ ├── AttachUpdateViewModel.cs │ ├── ProcessViewModel.cs │ └── ScanOutputViewModel.cs ├── Models │ ├── GameDataSection.cs │ ├── LogItem.cs │ ├── ScrubOption.cs │ ├── CompressOption.cs │ ├── GameDataFilter.cs │ └── GroupingOption.cs ├── Utils │ ├── WindowLocator.cs │ ├── StringToBoolConverter.cs │ ├── WarningColorConverter.cs │ └── LogLevelColorConverter.cs ├── Views │ ├── AboutWindow.axaml.cs │ ├── AboutWindow.axaml │ ├── AttachUpdateWindow.axaml.cs │ ├── ProcessWindow.axaml.cs │ ├── ScanOutputWindow.axaml.cs │ ├── MessageWindow.axaml │ ├── MessageWindow.axaml.cs │ ├── MainWindow.axaml.cs │ ├── ProcessWindow.axaml │ ├── ScanOutputWindow.axaml │ └── AttachUpdateWindow.axaml ├── ViewLocator.cs ├── Program.cs ├── app.manifest ├── App.axaml.cs ├── App.axaml └── Repackinator.UI.csproj ├── Repackinator.Shell ├── repackinator.ico ├── Program.cs ├── Repackinator.Shell.csproj ├── Console │ ├── ConsoleRegister.cs │ ├── ConsoleUnregister.cs │ ├── ConsoleStartup.cs │ ├── ConsoleExtract.cs │ ├── ConsoleUtil.cs │ ├── ConsoleChecksum.cs │ ├── ConsoleInfo.cs │ ├── ConsoleXbeInfo.cs │ ├── ConsoleCompare.cs │ └── ConsolePack.cs └── Shell │ └── ContextMenu.cs ├── Repackinator.Core ├── Resources │ └── attach.xbe ├── Exceptions │ └── ExtractAbortException.cs ├── Version.cs ├── Models │ ├── ProgressInfo.cs │ ├── GameDataHelper.cs │ ├── GameData.cs │ └── Config.cs ├── Repackinator.Core.csproj ├── Extensions │ └── StreamExtension.cs ├── Logging │ └── LogMessage.cs ├── Streams │ ├── ProgressStream.cs │ └── ExtractSplitStream.cs ├── Helpers │ ├── ResourceLoader.cs │ └── Utility.cs └── Actions │ ├── AttachUpdater.cs │ └── Scanner.cs ├── Linux └── share │ ├── icons │ ├── hicolor │ │ ├── 256x256 │ │ │ └── apps │ │ │ │ ├── cerbios.png │ │ │ │ └── repackinator.png │ │ ├── 48x48 │ │ │ └── apps │ │ │ │ ├── cerbios.png │ │ │ │ └── repackinator.png │ │ ├── 1024x1024 │ │ │ └── apps │ │ │ │ └── cerbios.png │ │ ├── 128x128 │ │ │ └── mimetypes │ │ │ │ ├── application-x-cci.png │ │ │ │ └── gnome-mime-application-x-cci.png │ │ └── scalable │ │ │ └── apps │ │ │ └── cerbios.svg │ └── pixmaps │ │ ├── cerbios.xpm │ │ └── repackinator.xpm │ ├── mime │ └── packages │ │ └── application-x-cci.xml │ ├── applications │ ├── cci.desktop │ └── repackinator.desktop │ ├── kservices5 │ └── ServiceMenus │ │ └── repackinator_menu.desktop │ └── kde4 │ └── services │ └── ServiceMenus │ └── repackinator_menu.desktop ├── editorconfig ├── .gitattributes ├── Nuget.config ├── Repackinator.sln ├── .github └── workflows │ └── dotnet.yml └── .gitignore /Artwork/icon1.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Artwork/icon1.ico -------------------------------------------------------------------------------- /Artwork/icon1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Artwork/icon1.png -------------------------------------------------------------------------------- /Artwork/icon2.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Artwork/icon2.ico -------------------------------------------------------------------------------- /Artwork/icon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Artwork/icon2.png -------------------------------------------------------------------------------- /readmeStuff/gui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/readmeStuff/gui.png -------------------------------------------------------------------------------- /Repackinator/bass.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Repackinator/bass.dll -------------------------------------------------------------------------------- /Repackinator/libbass.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Repackinator/libbass.so -------------------------------------------------------------------------------- /Repackinator/libbass.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Repackinator/libbass.dylib -------------------------------------------------------------------------------- /readmeStuff/contextMenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/readmeStuff/contextMenu.png -------------------------------------------------------------------------------- /Repackinator.Shell/repackinator.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Repackinator.Shell/repackinator.ico -------------------------------------------------------------------------------- /Repackinator/Assets/repackinator.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Repackinator/Assets/repackinator.ico -------------------------------------------------------------------------------- /Repackinator/Assets/teamresurgent.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Repackinator/Assets/teamresurgent.jpg -------------------------------------------------------------------------------- /Repackinator.Core/Resources/attach.xbe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Repackinator.Core/Resources/attach.xbe -------------------------------------------------------------------------------- /Linux/share/icons/hicolor/256x256/apps/cerbios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Linux/share/icons/hicolor/256x256/apps/cerbios.png -------------------------------------------------------------------------------- /Linux/share/icons/hicolor/48x48/apps/cerbios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Linux/share/icons/hicolor/48x48/apps/cerbios.png -------------------------------------------------------------------------------- /Linux/share/icons/hicolor/1024x1024/apps/cerbios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Linux/share/icons/hicolor/1024x1024/apps/cerbios.png -------------------------------------------------------------------------------- /Linux/share/icons/hicolor/256x256/apps/repackinator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Linux/share/icons/hicolor/256x256/apps/repackinator.png -------------------------------------------------------------------------------- /Linux/share/icons/hicolor/48x48/apps/repackinator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Linux/share/icons/hicolor/48x48/apps/repackinator.png -------------------------------------------------------------------------------- /editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = crlf 5 | indent_style = space 6 | indent_size = 4 7 | trim_trailing_whitespace = true 8 | insert_fianl_newline = true -------------------------------------------------------------------------------- /Repackinator.Core/Exceptions/ExtractAbortException.cs: -------------------------------------------------------------------------------- 1 | namespace Repackinator.Core.Exceptions 2 | { 3 | public class ExtractAbortException : Exception 4 | { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Linux/share/icons/hicolor/128x128/mimetypes/application-x-cci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Linux/share/icons/hicolor/128x128/mimetypes/application-x-cci.png -------------------------------------------------------------------------------- /Repackinator/ViewModels/ViewModelBase.cs: -------------------------------------------------------------------------------- 1 | using ReactiveUI; 2 | 3 | namespace Repackinator.UI.ViewModels 4 | { 5 | public class ViewModelBase : ReactiveObject 6 | { 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union -------------------------------------------------------------------------------- /Repackinator/Assets/Stuart Wilson - Not Another Comic Bakery Remix.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Repackinator/Assets/Stuart Wilson - Not Another Comic Bakery Remix.mp3 -------------------------------------------------------------------------------- /Repackinator/Models/GameDataSection.cs: -------------------------------------------------------------------------------- 1 | namespace Repackinator.UI.Models 2 | { 3 | public class GameDataSection(string name) 4 | { 5 | public string Name { get; set; } = name; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Linux/share/icons/hicolor/128x128/mimetypes/gnome-mime-application-x-cci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Team-Resurgent/Repackinator/HEAD/Linux/share/icons/hicolor/128x128/mimetypes/gnome-mime-application-x-cci.png -------------------------------------------------------------------------------- /Nuget.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Repackinator/Utils/WindowLocator.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | 3 | namespace Repackinator.UI.Utils 4 | { 5 | public static class WindowLocator 6 | { 7 | public static Window? MainWindow { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Repackinator/Views/AboutWindow.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | 3 | namespace Repackinator.UI; 4 | 5 | public partial class AboutWindow : Window 6 | { 7 | public AboutWindow() 8 | { 9 | InitializeComponent(); 10 | } 11 | } -------------------------------------------------------------------------------- /Repackinator/Models/LogItem.cs: -------------------------------------------------------------------------------- 1 | namespace Repackinator.UI.Models 2 | { 3 | public class LogItem 4 | { 5 | public string Time { get; set; } = "00:00:00"; 6 | public string Level { get; set; } = string.Empty; 7 | public string Message { get; set; } = string.Empty; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Repackinator.Core/Version.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace Repackinator.Core 8 | { 9 | public static class Version 10 | { 11 | public static string Value { get; } = "2.1.0"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Repackinator.Shell/Program.cs: -------------------------------------------------------------------------------- 1 | using Repackinator.Shell.Console; 2 | 3 | namespace Repackinator.Shell 4 | { 5 | internal sealed class Program 6 | { 7 | public static void Main(string[] args) 8 | { 9 | ConsoleStartup.Process(Repackinator.Core.Version.Value, args); 10 | } 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /Linux/share/mime/packages/application-x-cci.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Cerbios Compressed Image 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Linux/share/applications/cci.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Categories=Game; 3 | Comment[en_US]=Cerbios Compressed Image 4 | Comment=Cerbios Compressed Image 5 | Exec=repackinator 6 | GenericName[en_US]=Cerbios Compressed Image 7 | GenericName=Cerbios Compressed Image 8 | Icon=application-x-cci 9 | MimeType=application/x-cci; 10 | Name[en_US]=Cerbios Compressed Image 11 | Name=Cerbios Compressed Image 12 | StartupNotify=true 13 | Terminal=false 14 | Type=Application -------------------------------------------------------------------------------- /Repackinator/Models/ScrubOption.cs: -------------------------------------------------------------------------------- 1 | using Repackinator.Core.Helpers; 2 | using Repackinator.Core.Models; 3 | 4 | namespace Repackinator.UI.Models 5 | { 6 | public class ScrubOption(ScrubOptionType type) 7 | { 8 | public ScrubOptionType Type { get; set; } = type; 9 | 10 | public string Name 11 | { 12 | get 13 | { 14 | return Utility.EnumValueToString(Type); 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Repackinator/Models/CompressOption.cs: -------------------------------------------------------------------------------- 1 | using Repackinator.Core.Helpers; 2 | using Repackinator.Core.Models; 3 | 4 | namespace Repackinator.UI.Models 5 | { 6 | public class CompressOption(CompressOptionType type) 7 | { 8 | public CompressOptionType Type { get; set; } = type; 9 | 10 | public string Name 11 | { 12 | get 13 | { 14 | return Utility.EnumValueToString(Type); 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Repackinator/Models/GameDataFilter.cs: -------------------------------------------------------------------------------- 1 | using Repackinator.Core.Helpers; 2 | using Repackinator.Core.Models; 3 | 4 | namespace Repackinator.UI.Models 5 | { 6 | public class GameDataFilter(GameDataFilterType type) 7 | { 8 | public GameDataFilterType Type { get; set; } = type; 9 | 10 | public string Name 11 | { 12 | get 13 | { 14 | return Utility.EnumValueToString(Type); 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Repackinator/Models/GroupingOption.cs: -------------------------------------------------------------------------------- 1 | using Repackinator.Core.Helpers; 2 | using Repackinator.Core.Models; 3 | 4 | namespace Repackinator.UI.Models 5 | { 6 | public class GroupingOption(GroupingOptionType type) 7 | { 8 | public GroupingOptionType Type { get; set; } = type; 9 | 10 | public string Name 11 | { 12 | get 13 | { 14 | return Utility.EnumValueToString(Type); 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Linux/share/applications/repackinator.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Categories=Game; 3 | Comment[en_US]=OG Xbox XISO and CCI image creation tool. 4 | Comment=OG Xbox XISO and CCI image creation tool. 5 | Exec=repackinator 6 | GenericName[en_US]=Repackinator 7 | GenericName=Repackinator 8 | Icon=repackinator 9 | Keywords=Utility;Games;Xbox;XISO; 10 | MimeType= 11 | Name[en_US]=Repackinator 12 | Name=Repackinator 13 | Type=Application 14 | PrefersNonDefaultGPU=true 15 | X-DBUS-ServiceName= 16 | X-DBUS-StartupType= 17 | X-KDE-SubstituteUID=false 18 | X-KDE-Username= 19 | -------------------------------------------------------------------------------- /Repackinator.Core/Models/ProgressInfo.cs: -------------------------------------------------------------------------------- 1 | namespace Repackinator.Core.Models 2 | { 3 | public struct ProgressInfo 4 | { 5 | public float Progress1 { get; set; } 6 | 7 | public string Progress1Text { get; set; } 8 | 9 | public float Progress2 { get; set; } 10 | 11 | public string Progress2Text { get; set; } 12 | 13 | public ProgressInfo() 14 | { 15 | Progress1 = 0; 16 | Progress1Text = string.Empty; 17 | Progress2 = 0; 18 | Progress2Text = string.Empty; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Repackinator/Views/AboutWindow.axaml: -------------------------------------------------------------------------------- 1 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Repackinator/Views/AttachUpdateWindow.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | using Repackinator.Core.Models; 3 | using Repackinator.UI.ViewModels; 4 | 5 | namespace Repackinator.UI; 6 | 7 | public partial class AttachUpdateWindow : Window 8 | { 9 | public AttachUpdateWindow() 10 | { 11 | InitializeComponent(); 12 | 13 | DataContext = new AttachUpdateViewModel(this, [], new Config()); 14 | } 15 | 16 | public AttachUpdateWindow(GameData[] gameDataArray, Config config) 17 | { 18 | InitializeComponent(); 19 | 20 | var logViewModel = new AttachUpdateViewModel(this, gameDataArray, config); 21 | DataContext = logViewModel; 22 | 23 | Opened += async (_, _) => 24 | { 25 | await logViewModel.StartAsync(); 26 | }; 27 | } 28 | } -------------------------------------------------------------------------------- /Repackinator/Views/ProcessWindow.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | using Repackinator.Core.Models; 3 | using Repackinator.UI.ViewModels; 4 | 5 | namespace Repackinator.UI; 6 | 7 | public partial class ProcessWindow : Window 8 | { 9 | public GameData[]? GameDataList; 10 | 11 | public ProcessWindow() 12 | { 13 | InitializeComponent(); 14 | 15 | DataContext = new AttachUpdateViewModel(this, [], new Config()); 16 | } 17 | 18 | public ProcessWindow(GameData[] gameDataArray, Config config) 19 | { 20 | InitializeComponent(); 21 | 22 | var logViewModel = new ProcessViewModel(this, gameDataArray, config); 23 | DataContext = logViewModel; 24 | 25 | Opened += async (_, _) => 26 | { 27 | GameDataList = await logViewModel.StartAsync(); 28 | }; 29 | } 30 | } -------------------------------------------------------------------------------- /Repackinator/Views/ScanOutputWindow.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | using Repackinator.Core.Models; 3 | using Repackinator.UI.ViewModels; 4 | 5 | namespace Repackinator.UI; 6 | 7 | public partial class ScanOutputWindow : Window 8 | { 9 | public GameData[]? GameDataList; 10 | 11 | public ScanOutputWindow() 12 | { 13 | InitializeComponent(); 14 | 15 | DataContext = new AttachUpdateViewModel(this, [], new Config()); 16 | } 17 | 18 | public ScanOutputWindow(GameData[] gameDataArray, Config config) 19 | { 20 | InitializeComponent(); 21 | 22 | var logViewModel = new ScanOutputViewModel(this, gameDataArray, config); 23 | DataContext = logViewModel; 24 | 25 | Opened += async (_, _) => 26 | { 27 | GameDataList = await logViewModel.StartAsync(); 28 | }; 29 | } 30 | } -------------------------------------------------------------------------------- /Repackinator/Utils/StringToBoolConverter.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Data.Converters; 2 | using System; 3 | using System.Globalization; 4 | 5 | namespace Repackinator.UI.Utils 6 | { 7 | public class StringToBoolConverter : IValueConverter 8 | { 9 | public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) 10 | { 11 | if (value is string stringValue) 12 | { 13 | return stringValue.Equals("Y", StringComparison.OrdinalIgnoreCase); 14 | } 15 | return false; 16 | } 17 | 18 | public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) 19 | { 20 | if (value is bool boolValue) 21 | { 22 | return boolValue ? "Y" : "N"; 23 | } 24 | return "N"; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Repackinator/ViewLocator.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | using Avalonia.Controls.Templates; 3 | using Repackinator.UI.ViewModels; 4 | using System; 5 | 6 | namespace Repackinator.UI 7 | { 8 | public class ViewLocator : IDataTemplate 9 | { 10 | 11 | public Control? Build(object? param) 12 | { 13 | if (param is null) 14 | return null; 15 | 16 | var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal); 17 | var type = Type.GetType(name); 18 | 19 | if (type != null) 20 | { 21 | return (Control)Activator.CreateInstance(type)!; 22 | } 23 | 24 | return new TextBlock { Text = "Not Found: " + name }; 25 | } 26 | 27 | public bool Match(object? data) 28 | { 29 | return data is ViewModelBase; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Repackinator/Program.cs: -------------------------------------------------------------------------------- 1 | using Avalonia; 2 | using Avalonia.ReactiveUI; 3 | using System; 4 | 5 | namespace Repackinator.UI 6 | { 7 | internal sealed class Program 8 | { 9 | // Initialization code. Don't use any Avalonia, third-party APIs or any 10 | // SynchronizationContext-reliant code before AppMain is called: things aren't initialized 11 | // yet and stuff might break. 12 | [STAThread] 13 | public static void Main(string[] args) 14 | { 15 | BuildAvaloniaApp().StartWithClassicDesktopLifetime(args); 16 | } 17 | 18 | // Avalonia configuration, don't remove; also used by visual designer. 19 | public static AppBuilder BuildAvaloniaApp() 20 | => AppBuilder.Configure() 21 | .UsePlatformDetect() 22 | .WithInterFont() 23 | .LogToTrace() 24 | .UseReactiveUI(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Repackinator/Views/MessageWindow.axaml: -------------------------------------------------------------------------------- 1 | 14 | 15 |