From 80b7cc7333b4d69f22e72d2dc8b1b53b5ce78967 Mon Sep 17 00:00:00 2001 From: zurdi Date: Wed, 27 Nov 2024 11:43:06 +0000 Subject: [PATCH 01/44] added basic platform info from the igdb api call --- .trunk/trunk.yaml | 24 +++++------ .../alembic/versions/0027_platforms_data.py | 40 +++++++++++++++++++ backend/handler/metadata/igdb_handler.py | 35 ++++++++++++++-- backend/handler/scan_handler.py | 2 + backend/models/platform.py | 5 +++ 5 files changed, 90 insertions(+), 16 deletions(-) create mode 100644 backend/alembic/versions/0027_platforms_data.py diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 1b01f49fe..b76ad3d43 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -2,12 +2,12 @@ # To learn more about the format of this file, see https://docs.trunk.io/reference/trunk-yaml version: 0.1 cli: - version: 1.22.4 + version: 1.22.8 # Trunk provides extensibility via plugins. (https://docs.trunk.io/plugins) plugins: sources: - id: trunk - ref: v1.6.2 + ref: v1.6.5 uri: https://github.com/trunk-io/plugins # Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes) runtimes: @@ -18,25 +18,25 @@ runtimes: # This is the section where you manage your linters. (https://docs.trunk.io/check/configuration) lint: enabled: - - markdownlint@0.41.0 - - eslint@9.9.1 - - actionlint@1.7.1 - - bandit@1.7.9 - - black@24.8.0 - - checkov@3.2.239 + - markdownlint@0.42.0 + - eslint@9.14.0 + - actionlint@1.7.4 + - bandit@1.7.10 + - black@24.10.0 + - checkov@3.2.296 - git-diff-check - isort@5.13.2 - mypy@1.13.0 - - osv-scanner@1.8.4 + - osv-scanner@1.9.1 - oxipng@9.1.2 - prettier@3.3.3 - - ruff@0.6.3 + - ruff@0.7.3 - shellcheck@0.10.0 - shfmt@3.6.0 - svgo@3.3.2 - taplo@0.9.3 - - trivy@0.54.1 - - trufflehog@3.81.10 + - trivy@0.56.2 + - trufflehog@3.83.6 - yamllint@1.35.1 ignore: - linters: [ALL] diff --git a/backend/alembic/versions/0027_platforms_data.py b/backend/alembic/versions/0027_platforms_data.py new file mode 100644 index 000000000..24dd7c689 --- /dev/null +++ b/backend/alembic/versions/0027_platforms_data.py @@ -0,0 +1,40 @@ +"""platforms_data + +Revision ID: 0027_platforms_data +Revises: 0026_romuser_status_fields +Create Date: 2024-11-17 23:05:31.038917 + +""" + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = "0027_platforms_data" +down_revision = "0026_romuser_status_fields" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("platforms", schema=None) as batch_op: + batch_op.add_column(sa.Column("category", sa.String(length=50), nullable=True)) + batch_op.add_column(sa.Column("generation", sa.Integer(), nullable=True)) + batch_op.add_column(sa.Column("family", sa.String(length=1000), nullable=True)) + batch_op.add_column(sa.Column("url", sa.String(length=1000), nullable=True)) + batch_op.add_column( + sa.Column("url_logo", sa.String(length=1000), nullable=True) + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("platforms", schema=None) as batch_op: + batch_op.drop_column("url_logo") + batch_op.drop_column("url") + batch_op.drop_column("family") + batch_op.drop_column("generation") + batch_op.drop_column("category") + # ### end Alembic commands ### diff --git a/backend/handler/metadata/igdb_handler.py b/backend/handler/metadata/igdb_handler.py index 5ded7e7ea..b8978712a 100644 --- a/backend/handler/metadata/igdb_handler.py +++ b/backend/handler/metadata/igdb_handler.py @@ -35,6 +35,12 @@ class IGDBPlatform(TypedDict): slug: str igdb_id: int | None name: NotRequired[str] + category: NotRequired[str] + generation: NotRequired[str] + family: NotRequired[int] + url: NotRequired[str] + url_logo: NotRequired[str] + logo_path: NotRequired[str] class IGDBAgeRating(TypedDict): @@ -323,13 +329,17 @@ class IGDBBaseHandler(MetadataHandler): self.platform_endpoint, data=f'fields {",".join(self.platforms_fields)}; where slug="{slug.lower()}";', ) - platform = pydash.get(platforms, "[0]", None) if platform: return IGDBPlatform( - igdb_id=platform["id"], + igdb_id=platform.get("id", None), slug=slug, - name=platform["name"], + name=platform.get("name", slug), + category=IGDB_PLATFORM_CATEGORIES.get(platform["category"], "Unknown"), + generation=platform.get("generation", None), + family=platform.get("family", None), + url=platform.get("url", None), + url_logo=platform.get("url_logo", None), ) # Check if platform is a version if not found @@ -651,7 +661,15 @@ class TwitchAuth: return token -PLATFORMS_FIELDS = ["id", "name"] +PLATFORMS_FIELDS = [ + "id", + "name", + "category", + "generation", + "url", + # "platform_families.name", + # "platform_logos.image_id", +] GAMES_FIELDS = [ "id", @@ -931,6 +949,15 @@ IGDB_PLATFORM_LIST = [ {"slug": "airconsole", "name": "AirConsole"}, ] +IGDB_PLATFORM_CATEGORIES: dict[int, str] = { + 1: "Console", + 2: "Arcade", + 3: "Platform", + 4: "Operative System", + 5: "Portable Console", + 6: "Computer", +} + IGDB_AGE_RATINGS: dict[int, IGDBAgeRating] = { 1: { "rating": "Three", diff --git a/backend/handler/scan_handler.py b/backend/handler/scan_handler.py index b6d43009b..564065f62 100644 --- a/backend/handler/scan_handler.py +++ b/backend/handler/scan_handler.py @@ -95,6 +95,8 @@ async def scan_platform( if "igdb" in metadata_sources else IGDBPlatform(igdb_id=None, slug=platform_attrs["slug"]) ) + for key, value in igdb_platform.items(): + log.debug(key + ": " + str(value)) moby_platform = ( meta_moby_handler.get_platform(platform_attrs["slug"]) if "moby" in metadata_sources diff --git a/backend/models/platform.py b/backend/models/platform.py index 2e0d9ffdc..f0bc91da4 100644 --- a/backend/models/platform.py +++ b/backend/models/platform.py @@ -21,6 +21,11 @@ class Platform(BaseModel): slug: Mapped[str] = mapped_column(String(length=50)) fs_slug: Mapped[str] = mapped_column(String(length=50)) name: Mapped[str] = mapped_column(String(length=400)) + category: Mapped[str | None] = mapped_column(String(length=50), default="") + generation: Mapped[int | None] + family: Mapped[str | None] = mapped_column(String(length=1000), default="") + url: Mapped[str | None] = mapped_column(String(length=1000), default="") + url_logo: Mapped[str | None] = mapped_column(String(length=1000), default="") logo_path: Mapped[str | None] = mapped_column(String(length=1000), default="") roms: Mapped[list[Rom]] = relationship(back_populates="platform") From 81507fa93c6372e9f9cf1ad06fb74927f2c2f62f Mon Sep 17 00:00:00 2001 From: zurdi Date: Wed, 27 Nov 2024 11:43:21 +0000 Subject: [PATCH 02/44] added platform info drawer --- .../src/components/Details/Info/GameInfo.vue | 4 + .../Gallery/AppBar/Platform/Base.vue | 84 +++++++++++++++++-- .../components/Settings/InterfaceOption.vue | 11 +++ .../src/components/common/Collection/Card.vue | 7 +- .../src/components/common/Game/Card/Base.vue | 5 +- .../components/common/Game/Card/Related.vue | 4 +- .../common/Game/Dialog/MatchRom.vue | 4 +- .../common/Navigation/CollectionsDrawer.vue | 2 +- .../common/Navigation/PlatformsDrawer.vue | 2 +- .../common/Navigation/SettingsDrawer.vue | 2 +- .../components/common/Navigation/UserBtn.vue | 40 +++++---- .../src/components/common/SearchCover.vue | 7 +- frontend/src/stores/galleryView.ts | 3 + frontend/src/stores/navigation.ts | 10 +++ frontend/src/views/EmulatorJS/Base.vue | 4 +- frontend/src/views/RuffleRS/Base.vue | 4 +- 16 files changed, 157 insertions(+), 36 deletions(-) diff --git a/frontend/src/components/Details/Info/GameInfo.vue b/frontend/src/components/Details/Info/GameInfo.vue index 42ebaff42..c8906bb6c 100644 --- a/frontend/src/components/Details/Info/GameInfo.vue +++ b/frontend/src/components/Details/Info/GameInfo.vue @@ -1,17 +1,21 @@ @@ -61,6 +118,21 @@ const auth = storeAuth(); z-index: 999 !important; } .platform-icon { - filter: drop-shadow(0px 0px 2px #a452fe); + cursor: pointer; + transition: filter 0.15s ease-in-out; +} +.platform-icon { + filter: drop-shadow(0px 0px 1px rgba(var(--v-theme-romm-accent-1))); +} +.platform-icon:hover, +.platform-icon.active { + filter: drop-shadow(0px 0px 3px rgba(var(--v-theme-romm-accent-1))); +} +.platform-logo { + filter: drop-shadow(0px 0px 1px rgba(var(--v-theme-romm-accent-1))); +} +#platform-info-drawer { + z-index: 3 !important; + height: calc(100dvh - 48px) !important; } diff --git a/frontend/src/components/Settings/InterfaceOption.vue b/frontend/src/components/Settings/InterfaceOption.vue index e45b1c55b..e35bc96ae 100644 --- a/frontend/src/components/Settings/InterfaceOption.vue +++ b/frontend/src/components/Settings/InterfaceOption.vue @@ -38,3 +38,14 @@ const emit = defineEmits(["update:modelValue"]); > + + diff --git a/frontend/src/components/common/Collection/Card.vue b/frontend/src/components/common/Collection/Card.vue index e93992346..552e4f2d0 100644 --- a/frontend/src/components/common/Collection/Card.vue +++ b/frontend/src/components/common/Collection/Card.vue @@ -1,7 +1,9 @@