mirror of
https://github.com/rommapp/romm.git
synced 2026-03-03 02:27:00 +00:00
code base adapted to new development environment
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -37,7 +37,8 @@ __pycache__
|
||||
mariadb
|
||||
|
||||
# used to mock the library/config/mounts/etc while testing
|
||||
romm
|
||||
frontend/assets/romm
|
||||
romm_mock
|
||||
|
||||
# virtualenv
|
||||
.venv
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'] = {}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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=
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user