Skip to content

Commit

Permalink
feat: scanned games are matched by platform
Browse files Browse the repository at this point in the history
Library scans will now take a games platform into account when matching
via IGDB.
  • Loading branch information
JMBeresford committed Nov 23, 2024
1 parent 12bd960 commit 2161a42
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 17 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ config_dev
config.dev.*

**/node_modules
**/rustc-ice*
39 changes: 33 additions & 6 deletions packages/service/src/grpc/library/metadata_handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@ use retrom_codegen::retrom::{
get_igdb_search_request::IgdbSearchType,
igdb_fields::{IncludeFields, Selector},
igdb_filters::{FilterOperator, FilterValue},
GameGenre, GameMetadata, GetIgdbSearchRequest, IgdbFields, IgdbFilters, NewGameGenre,
NewGameGenreMap, NewSimilarGameMap, UpdateLibraryMetadataResponse,
igdb_game_search_query::Fields,
GameGenre, GameMetadata, GetIgdbSearchRequest, IgdbFields, IgdbFilters, IgdbGameSearchQuery,
NewGameGenre, NewGameGenreMap, NewSimilarGameMap, PlatformMetadata,
UpdateLibraryMetadataResponse,
};
use retrom_db::schema;
use tracing::{info_span, instrument, Instrument};
Expand Down Expand Up @@ -55,7 +57,7 @@ pub async fn update_metadata(
let db_pool = db_pool.clone();

async move {
let metadata = igdb_provider.get_platform_metadata(platform).await;
let metadata = igdb_provider.get_platform_metadata(platform, None).await;
let mut conn = match db_pool.get().await {
Ok(conn) => conn,
Err(why) => {
Expand All @@ -82,7 +84,7 @@ pub async fn update_metadata(
})
.collect();

let games = schema::games::table.load(&mut conn).await.map_err(|e| {
let games: Vec<retrom::Game> = schema::games::table.load(&mut conn).await.map_err(|e| {
tracing::error!("Failed to load games: {}", e);
e.to_string()
})?;
Expand All @@ -95,15 +97,40 @@ pub async fn update_metadata(
let db_pool = db_pool.clone();

async move {
let metadata = igdb_provider.get_game_metadata(game).await;

let mut conn = match db_pool.get().await {
Ok(conn) => conn,
Err(why) => {
return Err(why.to_string());
}
};

let query = match game.platform_id {
Some(id) => {
let platform_meta: Option<PlatformMetadata> =
schema::platform_metadata::table
.find(id)
.first(&mut conn)
.await
.ok();

let platform_igdb_id = platform_meta
.and_then(|meta| meta.igdb_id)
.and_then(|id| id.to_u64());

IgdbGameSearchQuery {
fields: Some(Fields {
platform: platform_igdb_id,
..Default::default()
}),
..Default::default()
}
.into()
}
None => None,
};

let metadata = igdb_provider.get_game_metadata(game, query).await;

if let Some(metadata) = metadata {
if let Err(e) = diesel::insert_into(schema::game_metadata::table)
.values(&metadata)
Expand Down
20 changes: 15 additions & 5 deletions packages/service/src/providers/igdb/games.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,11 @@ impl IGDBProvider {

impl GameMetadataProvider<IgdbGameSearchQuery> for IGDBProvider {
#[instrument(level = Level::DEBUG, skip_all, fields(name = game.path))]
async fn get_game_metadata(&self, game: retrom::Game) -> Option<NewGameMetadata> {
async fn get_game_metadata(
&self,
game: retrom::Game,
query: Option<IgdbGameSearchQuery>,
) -> Option<NewGameMetadata> {
let naive_name = game.path.split('/').last().unwrap_or(&game.path);
let path = PathBuf::from_str(&game.path).unwrap();
let mut name = path
Expand Down Expand Up @@ -168,12 +172,18 @@ impl GameMetadataProvider<IgdbGameSearchQuery> for IGDBProvider {
let search = deunicode(name);
debug!("Matching game: {search}");

let query = IgdbGameSearchQuery {
search: Some(IgdbSearch { value: search }),
..Default::default()
let search_query = match query {
Some(mut query) => {
query.search = Some(IgdbSearch { value: search });
query
}
None => IgdbGameSearchQuery {
search: Some(IgdbSearch { value: search }),
..Default::default()
},
};

let matches = self.search_game_metadata(query).await;
let matches = self.search_game_metadata(search_query).await;

let exact_match = matches
.iter()
Expand Down
15 changes: 11 additions & 4 deletions packages/service/src/providers/igdb/platforms.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ impl PlatformMetadataProvider<IgdbPlatformSearchQuery> for IGDBProvider {
async fn get_platform_metadata(
&self,
platform: retrom::Platform,
query: Option<IgdbPlatformSearchQuery>,
) -> Option<retrom::NewPlatformMetadata> {
let naive_name = platform.path.split('/').last().unwrap_or(&platform.path);
let path = PathBuf::from_str(&platform.path).unwrap();
Expand Down Expand Up @@ -90,12 +91,18 @@ impl PlatformMetadataProvider<IgdbPlatformSearchQuery> for IGDBProvider {
let search = deunicode(name);
debug!("Searching for platform: {}", search);

let query = IgdbPlatformSearchQuery {
search: Some(IgdbSearch { value: search }),
..Default::default()
let search_query = match query {
Some(mut query) => {
query.search = Some(IgdbSearch { value: search });
query
}
None => IgdbPlatformSearchQuery {
search: Some(IgdbSearch { value: search }),
..Default::default()
},
};

let matches = self.search_platform_metadata(query).await;
let matches = self.search_platform_metadata(search_query).await;

let exact_match = matches
.iter()
Expand Down
9 changes: 7 additions & 2 deletions packages/service/src/providers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,16 @@ pub trait MetadataProvider<Query, Data> {
}

pub trait GameMetadataProvider<Query> {
async fn get_game_metadata(&self, game: Game) -> Option<NewGameMetadata>;
async fn get_game_metadata(&self, game: Game, query: Option<Query>) -> Option<NewGameMetadata>;
async fn search_game_metadata(&self, query: Query) -> Vec<NewGameMetadata>;
}

pub trait PlatformMetadataProvider<Query> {
async fn get_platform_metadata(&self, platform: Platform) -> Option<NewPlatformMetadata>;
async fn get_platform_metadata(
&self,
platform: Platform,
query: Option<Query>,
) -> Option<NewPlatformMetadata>;

async fn search_platform_metadata(&self, query: Query) -> Vec<NewPlatformMetadata>;
}

0 comments on commit 2161a42

Please sign in to comment.