Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion addon.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<requires>
<import addon="xbmc.python" version="3.0.0"/>
<import addon="script.module.routing" version="0.2.3"/>
<import addon="script.module.akl" version="1.0.5"/>
<import addon="script.module.akl" version="1.0.6"/>
</requires>
<extension point="xbmc.python.pluginsource" library="addon.py">
<provides>executable game</provides>
Expand Down
1 change: 1 addition & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
## Current
- Virtual categories now render items from database
- Add and execute single instance ROMs or Games
- Minor bugfixes
- Updated dependency

Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ kodi-addon-checker==0.0.26
Kodistubs==19.0.3
routing==0.2.3
pytest==6.2.5
script.module.akl==1.0.5
script.module.akl==1.0.7rc5
requests==2.22.0
46 changes: 30 additions & 16 deletions resources/lib/commands/api_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
# -------------------------------------------------------------------------------------------------
def cmd_set_launcher_args(args) -> bool:
romcollection_id:str = args['romcollection_id'] if 'romcollection_id' in args else None
rom_id:str = args['rom_id'] if 'rom_id' in args else None
launcher_id:str = args['akl_addon_id'] if 'akl_addon_id' in args else None
addon_id:str = args['addon_id'] if 'addon_id' in args else None
launcher_settings = args['settings'] if 'settings' in args else None
Expand All @@ -47,27 +48,40 @@ def cmd_set_launcher_args(args) -> bool:
with uow:
addon_repository = AelAddonRepository(uow)
romcollection_repository = ROMCollectionRepository(uow)
rom_repository = ROMsRepository(uow)

addon = addon_repository.find_by_addon_id(addon_id, constants.AddonType.LAUNCHER)
romcollection = romcollection_repository.find_romcollection(romcollection_id)

if launcher_id is None:
romcollection.add_launcher(addon, launcher_settings, True)
else:
launcher = romcollection.get_launcher(launcher_id)
launcher.set_settings(launcher_settings)

if 'romcollection' in launcher_settings \
and kodi.dialog_yesno('Do you want to overwrite collection metadata properties with values from the launcher?'):
romcollection.import_data_dic(launcher_settings['romcollection'])
metadata_updated = True
if romcollection_id is not None:
romcollection = romcollection_repository.find_romcollection(romcollection_id)
if launcher_id is None:
romcollection.add_launcher(addon, launcher_settings, True)
else:
launcher = romcollection.get_launcher(launcher_id)
launcher.set_settings(launcher_settings)

if 'romcollection' in launcher_settings \
and kodi.dialog_yesno('Do you want to overwrite collection metadata properties with values from the launcher?'):
romcollection.import_data_dic(launcher_settings['romcollection'])
metadata_updated = True

romcollection_repository.update_romcollection(romcollection)
uow.commit()

romcollection_repository.update_romcollection(romcollection)
uow.commit()
if metadata_updated: AppMediator.async_cmd('RENDER_CATEGORY_VIEW', {'category_id': romcollection.get_parent_id()})
AppMediator.async_cmd('EDIT_ROMCOLLECTION', {'romcollection_id': romcollection_id})
else:
rom = rom_repository.find_rom(rom_id)
if launcher_id is None:
rom.add_launcher(addon, launcher_settings, True)
else:
launcher = rom.get_launcher(launcher_id)
launcher.set_settings(launcher_settings)

rom_repository.update_rom(rom)
uow.commit()

kodi.notify('Configured launcher {}'.format(addon.get_name()))
if metadata_updated: AppMediator.async_cmd('RENDER_CATEGORY_VIEW', {'category_id': romcollection.get_parent_id()})
AppMediator.async_cmd('EDIT_ROMCOLLECTION', {'romcollection_id': romcollection_id})
kodi.notify(f'Configured launcher {addon.get_name()}')
return True

# -------------------------------------------------------------------------------------------------
Expand Down
96 changes: 89 additions & 7 deletions resources/lib/commands/rom_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@

from resources.lib.commands.mediator import AppMediator
from resources.lib import globals, editors
from resources.lib.repositories import ROMsRepository, ROMCollectionRepository, UnitOfWork
from resources.lib.domain import g_assetFactory
from resources.lib.repositories import CategoryRepository, ROMsRepository, ROMCollectionRepository, UnitOfWork
from resources.lib.domain import g_assetFactory, ROM

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -54,19 +54,22 @@ def cmd_edit_rom(args):
options = collections.OrderedDict()
options['ROM_EDIT_METADATA'] = 'Edit Metadata ...'
options['ROM_EDIT_ASSETS'] = 'Edit Assets/Artwork ...'
options['EDIT_ROM_STATUS'] = 'ROM status: {0}'.format(rom.get_finished_str())
options['EDIT_ROM_STATUS'] = f'ROM status: {rom.get_finished_str()}'
if rom.has_launchers():
options['EDIT_ROM_LAUNCHERS'] = 'Manage associated launchers'
else: options['ADD_ROM_LAUNCHER'] = 'Add new launcher to ROM'
options['DELETE_ROM'] = 'Delete ROM'
options['SCRAPE_ROM'] = 'Scrape ROM'

s = 'Edit ROM "{}"'.format(rom.get_name())
s = f'Edit ROM "{rom.get_name()}"'
selected_option = kodi.OrdDictionaryDialog().select(s, options)
if selected_option is None:
# >> Exits context menu
logger.debug('EDIT_ROM: cmd_edit_rom() Selected None. Closing context menu')
return

# >> Execute subcommand. May be atomic, maybe a submenu.
logger.debug('EDIT_ROM: cmd_edit_rom() Selected {}'.format(selected_option))
logger.debug(f'EDIT_ROM: cmd_edit_rom() Selected {selected_option}')
AppMediator.sync_cmd(selected_option, args)

# --- Submenu commands ---
Expand Down Expand Up @@ -156,6 +159,43 @@ def cmd_rom_assets(args):
AppMediator.async_cmd('RENDER_ROMCOLLECTION_VIEW', {'romcollection_id': romcollection_id})

AppMediator.sync_cmd('ROM_EDIT_ASSETS', {'rom_id': rom_id, 'selected_asset': asset.id})

#
# Remove ROMCollection
#
@AppMediator.register('DELETE_ROM')
def cmd_rom_delete(args):
rom_id:str = args['rom_id'] if 'rom_id' in args else None
romcollections = []
categories = []
uow = UnitOfWork(globals.g_PATHS.DATABASE_FILE_PATH)
with uow:
roms_repository = ROMsRepository(uow)
romcollections_repository = ROMCollectionRepository(uow)
category_repository = CategoryRepository(uow)

rom = roms_repository.find_rom(rom_id)

question = f'Are you sure you want to delete "{rom.get_name()}"?\nThis will delete the ROM from all views.'
ret = kodi.dialog_yesno(question)
if not ret:
AppMediator.sync_cmd('EDIT_ROM', args)
return

romcollections = list(romcollections_repository.find_romcollections_by_rom(rom_id))
categories = list(category_repository.find_categories_by_rom(rom_id))

logger.info(f'Deleting ROM "{rom.get_name()}" ID {rom.get_id()}')
roms_repository.delete_rom(rom.get_id())
uow.commit()

for romcollection in romcollections:
AppMediator.async_cmd('RENDER_ROMCOLLECTION_VIEW', {'romcollection_id': romcollection.get_id()})
for category in categories:
AppMediator.async_cmd('RENDER_CATEGORY_VIEW', {'category_id': category.get_id()})
AppMediator.async_cmd('RENDER_VIRTUAL_VIEWS')

kodi.notify(f'Deleted ROM {rom.get_name()}')

# --- Atomic commands ---
@AppMediator.register('ROM_EDIT_METADATA_TITLE')
Expand Down Expand Up @@ -315,7 +355,6 @@ def cmd_rom_metadata_nplayers_online(args):

AppMediator.sync_cmd('ROM_EDIT_METADATA', args)


@AppMediator.register('ROM_EDIT_METADATA_RATING')
def cmd_rom_metadata_rating(args):
rom_id = args['rom_id'] if 'rom_id' in args else None
Expand Down Expand Up @@ -606,4 +645,47 @@ def cmd_manage_rom_tags(args):
repository.delete_tag(selected_option)

if did_tag_change:
uow.commit()
uow.commit()

# -------------------------------------------------------------------------------------------------
# ROM ADD
# -------------------------------------------------------------------------------------------------
@AppMediator.register('ADD_STANDALONE_ROM')
def cmd_add_rom(args):
category_id:str = args['category_id'] if 'category_id' in args else None

if category_id is None:
logger.warning('No Category id supplied.')
kodi.notify_warn("Invalid parameters supplied.")
return

rom_name = ""
is_file_based = kodi.dialog_yesno("Is it a file based ROM/executable?")
if is_file_based:
file_path = kodi.dialog_get_file("Select file")
if file_path is not None:
path = io.FileName(file_path)
rom_name = path.getBaseNoExt()

rom_name = kodi.dialog_keyboard("Name", rom_name)
if rom_name is None:
return

rom_obj = ROM()
rom_obj.set_name(rom_name)
rom_obj.set_scanned_data_element("file", file_path)

uow = UnitOfWork(globals.g_PATHS.DATABASE_FILE_PATH)
with uow:
category_repository = CategoryRepository(uow)
roms_repository = ROMsRepository(uow)

roms_repository.insert_rom(rom_obj)
category_repository.add_rom_to_category(category_id, rom_obj.get_id())
uow.commit()

AppMediator.async_cmd('RENDER_CATEGORY_VIEW', args)
AppMediator.async_cmd('RENDER_VCATEGORY_VIEW', {'vcategory_id': constants.VCATEGORY_TITLE_ID})
kodi.notify(f"Created new standalone ROM '{rom_name}'")
kodi.refresh_container()

Loading