code base adapted to new development environment

This commit is contained in:
zurdi zurdo
2023-05-10 16:02:34 +02:00
parent 1f080b5760
commit 3e74854358
12 changed files with 54 additions and 40 deletions

3
.gitignore vendored
View File

@@ -37,7 +37,8 @@ __pycache__
mariadb
# used to mock the library/config/mounts/etc while testing
romm
frontend/assets/romm
romm_mock
# virtualenv
.venv

View File

@@ -1,3 +1,12 @@
## Create the mock structure with at least one rom
```sh
mkdir -p romm_mock/library/roms/switch
touch romm_mock/library/roms/switch/metroid.xci
mkdir -p romm_mock/resources
touch romm_mock/config.yml
```
## Setting up the backend
### Copy env.template to .env and fill the variables
@@ -47,6 +56,13 @@ cd frontend
npm install
```
### Create symlink to library and resources
```sh
mkdir assets/romm
ln -s ../../../romm_mock/library assets/romm/library
ln -s ../../../romm_mock/resources assets/romm/resources
```
### Run the frontend
```sh

View File

@@ -6,8 +6,6 @@ from sqlalchemy import create_engine
from config.config_loader import ConfigLoader
from alembic import context
cl = ConfigLoader()
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
@@ -45,7 +43,7 @@ def run_migrations_offline() -> None:
"""
context.configure(
url=cl.get_db_engine(),
url=ConfigLoader.get_db_engine(),
target_metadata=target_metadata,
render_as_batch=True,
literal_binds=True,
@@ -64,7 +62,7 @@ def run_migrations_online() -> None:
"""
engine = create_engine(cl.get_db_engine())
engine = create_engine(ConfigLoader.get_db_engine())
with engine.connect() as connection:
context.configure(

View File

@@ -8,10 +8,11 @@ DEV_PORT: int = 5000
DEV_HOST: str = "0.0.0.0"
# PATHS
LIBRARY_BASE_PATH: str = "/romm/library"
ROMM_USER_CONFIG_PATH: str = "/romm/config.yml"
SQLITE_DB_BASE_PATH: str = "/romm/database"
RESOURCES_BASE_PATH: str = "/romm/resources"
ROMM_BASE_PATH: str = os.environ.get('ROMM_BASE_PATH', '/romm')
LIBRARY_BASE_PATH: str = f"{ROMM_BASE_PATH}/library"
ROMM_USER_CONFIG_PATH: str = f"{ROMM_BASE_PATH}/config.yml"
SQLITE_DB_BASE_PATH: str = f"{ROMM_BASE_PATH}/database"
RESOURCES_BASE_PATH: str = f"{ROMM_BASE_PATH}/resources"
HIGH_PRIO_STRUCTURE_PATH: str = f"{LIBRARY_BASE_PATH}/roms"
# DEFAULT RESOURCES

View File

@@ -12,7 +12,7 @@ class ConfigLoader:
def __init__(self):
try:
with open(ROMM_USER_CONFIG_PATH) as config_file: self.config: dict = yaml.load(config_file, Loader=SafeLoader)
with open(ROMM_USER_CONFIG_PATH) as config_file: self.config: dict = (yaml.load(config_file, Loader=SafeLoader) or {})
except FileNotFoundError:
self.config: dict = {}
self._parse_config()
@@ -47,31 +47,31 @@ class ConfigLoader:
def _parse_config(self) -> dict:
try:
self.config['EXCLUDED_PLATFORMS'] = self.config['exclude']['platforms'] if self.config['exclude']['platforms'] else []
except KeyError:
except (KeyError, TypeError):
self.config['EXCLUDED_PLATFORMS'] = []
try:
self.config['EXCLUDED_SINGLE_EXT'] = self.config['exclude']['roms']['single_file']['extensions'] if self.config['exclude']['roms']['single_file']['extensions'] else []
except KeyError:
except (KeyError, TypeError):
self.config['EXCLUDED_SINGLE_EXT'] = []
try:
self.config['EXCLUDED_SINGLE_FILES'] = self.config['exclude']['roms']['single_file']['names'] if self.config['exclude']['roms']['single_file']['names'] else []
except KeyError:
except (KeyError, TypeError):
self.config['EXCLUDED_SINGLE_FILES'] = []
try:
self.config['EXCLUDED_MULTI_FILES'] = self.config['exclude']['roms']['multi_file']['names'] if self.config['exclude']['roms']['multi_file']['names'] else []
except KeyError:
except (KeyError, TypeError):
self.config['EXCLUDED_MULTI_FILES'] = []
try:
self.config['EXCLUDED_MULTI_PARTS_EXT'] = self.config['exclude']['roms']['multi_file']['parts']['extensions'] if self.config['exclude']['roms']['multi_file']['parts']['extensions'] else []
except KeyError:
except (KeyError, TypeError):
self.config['EXCLUDED_MULTI_PARTS_EXT'] = []
try:
self.config['EXCLUDED_MULTI_PARTS_FILES'] = self.config['exclude']['roms']['multi_file']['parts']['names'] if self.config['exclude']['roms']['multi_file']['parts']['names'] else []
except KeyError:
except (KeyError, TypeError):
self.config['EXCLUDED_MULTI_PARTS_FILES'] = []
try:
self.config['PLATFORMS_BINDING'] = self.config['system']['platforms'] if self.config['system']['platforms'] else {}
except KeyError:
except (KeyError, TypeError):
self.config['PLATFORMS_BINDING'] = {}

View File

@@ -53,7 +53,7 @@ def _get_cover_path(p_slug: str, file_name: str, size: str) -> str:
file_name: name of rom file
size: size of the cover -> big | small
"""
return f"{RESOURCES_BASE_PATH}/{p_slug}/{file_name}/cover/{size}.png"
return f"{p_slug}/{file_name}/cover/{size}.png"
def get_cover(overwrite: bool, p_slug: str, file_name: str, url_cover: str) -> tuple:
@@ -91,7 +91,7 @@ def _get_screenshot_path(p_slug: str, file_name: str, idx: str) -> str:
file_name: name of rom file
idx: index number of screenshot
"""
return f"{RESOURCES_BASE_PATH}/{p_slug}/{file_name}/screenshots/{idx}.jpg"
return f"{p_slug}/{file_name}/screenshots/{idx}.jpg"
def get_screenshots(p_slug: str, file_name: str, url_screenshots: list) -> tuple:
@@ -131,7 +131,7 @@ def get_platforms() -> list[str]:
# ========= Roms utils =========
def get_roms_structure(p_slug: str) -> tuple:
return f"{HIGH_PRIO_STRUCTURE_PATH}/{p_slug}" if os.path.exists(HIGH_PRIO_STRUCTURE_PATH) else f"{LIBRARY_BASE_PATH}/{p_slug}/roms"
return f"roms/{p_slug}" if os.path.exists(HIGH_PRIO_STRUCTURE_PATH) else f"{p_slug}/roms"
def _exclude_files(files, type) -> list[str]:
@@ -171,11 +171,11 @@ def get_roms(p_slug: str) -> list[dict] or int:
"""
roms_path = get_roms_structure(p_slug)
try:
fs_single_roms: list[str] = list(os.walk(roms_path))[0][2]
fs_single_roms: list[str] = list(os.walk(f"{LIBRARY_BASE_PATH}/{roms_path}"))[0][2]
except IndexError:
raise RomsNotFoundException(p_slug)
try:
fs_multi_roms: list[str] = list(os.walk(roms_path))[0][1]
fs_multi_roms: list[str] = list(os.walk(f"{LIBRARY_BASE_PATH}/{roms_path}"))[0][1]
except IndexError:
raise RomsNotFoundException(p_slug)
fs_roms: list[dict] = [{'multi': False, 'file_name': rom} for rom in _exclude_files(fs_single_roms, 'single')] + \
@@ -185,7 +185,7 @@ def get_roms(p_slug: str) -> list[dict] or int:
def get_rom_size(multi: bool, rom: str, files: list, roms_path:str) -> str:
files: list = [f"{roms_path}/{rom}"] if not multi else [f"{roms_path}/{rom}/{file}" for file in files]
files: list = [f"{LIBRARY_BASE_PATH}/{roms_path}/{rom}"] if not multi else [f"{LIBRARY_BASE_PATH}/{roms_path}/{rom}/{file}" for file in files]
total_size: int = 0
for file in files:
total_size += os.stat(file).st_size
@@ -205,7 +205,7 @@ def _rom_exists(p_slug: str, file_name: str) -> bool:
True if rom exists in filesystem else False
"""
rom_path = get_roms_structure(p_slug)
exists: bool = True if os.path.exists(f"{rom_path}/{file_name}") else False
exists: bool = True if os.path.exists(f"{LIBRARY_BASE_PATH}/{rom_path}/{file_name}") else False
return exists
@@ -214,15 +214,15 @@ def rename_rom(p_slug: str, old_name: str, new_name: str) -> None:
rom_path = get_roms_structure(p_slug)
if _rom_exists(p_slug, new_name):
raise RomAlreadyExistsException(new_name)
os.rename(f"{rom_path}/{old_name}", f"{rom_path}/{new_name}")
os.rename(f"{LIBRARY_BASE_PATH}/{rom_path}/{old_name}", f"{LIBRARY_BASE_PATH}/{rom_path}/{new_name}")
def remove_rom(p_slug: str, file_name: str) -> None:
rom_path = get_roms_structure(p_slug)
try:
try:
os.remove(f"{rom_path}/{file_name}")
os.remove(f"{LIBRARY_BASE_PATH}/{rom_path}/{file_name}")
except IsADirectoryError:
shutil.rmtree(f"{rom_path}/{file_name}")
shutil.rmtree(f"{LIBRARY_BASE_PATH}/{rom_path}/{file_name}")
except FileNotFoundError:
raise RomNotFoundError(file_name, p_slug)

View File

@@ -1,3 +1,5 @@
ROMM_BASE_PATH=/path/to/romm_mock
# IGDB auth
CLIENT_ID=
CLIENT_SECRET=
@@ -5,9 +7,6 @@ CLIENT_SECRET=
# STEAMGRIDDB API KEY
STEAMGRIDDB_API_KEY=
# Library path
LIBRARY_PATH="library_path/"
# Database driver (mariadb, sqlite)
ROMM_DB_DRIVER=
@@ -18,4 +17,3 @@ DB_ROOT_PASSWD=
DB_USER=
DB_PASSWD=
DB_NAME=romm
DB_CONFIG_PATH=

View File

@@ -4,7 +4,7 @@ const props = defineProps(['rom'])
<template>
<v-card class="header-background" position="absolute" rounded="0" flat>
<v-img :src="'/assets'+rom.path_cover_s+'?reload='+Date.now()" class="header-background-img" cover/>
<v-img :src="'/assets/romm/resources/'+rom.path_cover_s+'?reload='+Date.now()" class="header-background-img" cover/>
</v-card>
</template>

View File

@@ -12,8 +12,8 @@ const forceImgReload = Date.now()
:value="rom.id"
:key="rom.id"
v-bind="hoverProps"
:src="'/assets'+rom.path_cover_l+'?reload='+forceImgReload"
:lazy-src="'/assets'+rom.path_cover_s+'?reload='+forceImgReload"
:src="'/assets/romm/resources/'+rom.path_cover_l+'?reload='+forceImgReload"
:lazy-src="'/assets/romm/resources/'+rom.path_cover_s+'?reload='+forceImgReload"
class="cover"
cover>
<template v-slot:placeholder>

View File

@@ -33,8 +33,8 @@ const emitter = inject('emitter')
<v-avatar :rounded="0">
<v-progress-linear color="rommAccent1" :active="downloading.value.includes(rom.file_name)" :indeterminate="true" absolute/>
<v-img
:src="'/assets'+rom.path_cover_s+'?reload='+forceImgReload"
:lazy-src="'/assets'+rom.path_cover_s+'?reload='+forceImgReload"
:src="'/assets/romm/resources/'+rom.path_cover_s+'?reload='+forceImgReload"
:lazy-src="'/assets/romm/resources/'+rom.path_cover_s+'?reload='+forceImgReload"
min-height="150"/>
</v-avatar>
</template>

View File

@@ -15,7 +15,7 @@ export async function downloadRom(rom, emitter, filesToDownload=[]) {
if (files.length == 0){ files = rom.files }
var count = 0
files.forEach(async function (file_part) {
var file_full_path = "/assets"+rom.file_path+"/"+rom.file_name+"/"+file_part
var file_full_path = "/assets/romm/library/"+rom.file_path+"/"+rom.file_name+"/"+file_part
var file = await fetch(file_full_path)
var fileBlob = await file.blob()
var f = zip.folder(rom.file_name);
@@ -25,7 +25,7 @@ export async function downloadRom(rom, emitter, filesToDownload=[]) {
})
}
else{
var file_full_path = "/assets"+rom.file_path+"/"+rom.file_name
var file_full_path = "/assets/romm/library/"+rom.file_path+"/"+rom.file_name
var file = await fetch(file_full_path)
var fileBlob = await file.blob()
saveAs(fileBlob, rom.file_name)

View File

@@ -102,7 +102,7 @@ onMounted(() => {
<v-row>
<v-col>
<v-card elevation="2" :loading="downloading.value.includes(rom.file_name) ? 'rommAccent1': null">
<v-img :src="'/assets'+rom.path_cover_l+'?reload='+Date.now()" :lazy-src="'/assets'+rom.path_cover_s+'?reload='+Date.now()" cover>
<v-img :src="'/assets/romm/resources/'+rom.path_cover_l+'?reload='+Date.now()" :lazy-src="'/assets/romm/resources/'+rom.path_cover_s+'?reload='+Date.now()" cover>
<template v-slot:placeholder>
<div class="d-flex align-center justify-center fill-height">
<v-progress-circular color="rommAccent1" :width="2" :size="20" indeterminate/>
@@ -197,7 +197,7 @@ onMounted(() => {
<v-window-item value="screenshots">
<v-row class="d-flex mt-2">
<v-carousel hide-delimiter-background delimiter-icon="mdi-square" class="bg-rommBlack" show-arrows="hover" height="400">
<v-carousel-item v-for="screenshot in rom.path_screenshots" :src="'/assets'+screenshot"/>
<v-carousel-item v-for="screenshot in rom.path_screenshots" :src="'/assets/romm/resources/'+screenshot"/>
</v-carousel>
</v-row>
</v-window-item>