diff --git a/booklore-api/src/main/java/org/booklore/model/dto/settings/MetadataProviderSettings.java b/booklore-api/src/main/java/org/booklore/model/dto/settings/MetadataProviderSettings.java index a8895c310..0bcf3645a 100644 --- a/booklore-api/src/main/java/org/booklore/model/dto/settings/MetadataProviderSettings.java +++ b/booklore-api/src/main/java/org/booklore/model/dto/settings/MetadataProviderSettings.java @@ -27,6 +27,7 @@ public class MetadataProviderSettings { public static class Google { private boolean enabled; private String language; + private String apiKey; } @Data diff --git a/booklore-api/src/main/java/org/booklore/service/metadata/parser/GoogleParser.java b/booklore-api/src/main/java/org/booklore/service/metadata/parser/GoogleParser.java index 50a0780c2..b7151c68f 100644 --- a/booklore-api/src/main/java/org/booklore/service/metadata/parser/GoogleParser.java +++ b/booklore-api/src/main/java/org/booklore/service/metadata/parser/GoogleParser.java @@ -4,6 +4,7 @@ import org.booklore.model.dto.Book; import org.booklore.model.dto.BookMetadata; import org.booklore.model.dto.request.FetchMetadataRequest; import org.booklore.model.dto.response.GoogleBooksApiResponse; +import org.booklore.model.dto.settings.MetadataProviderSettings; import org.booklore.model.enums.MetadataProvider; import org.booklore.service.appsettings.AppSettingService; import org.booklore.util.BookUtils; @@ -579,17 +580,23 @@ public class GoogleParser implements BookParser { } private String getApiUrl() { - String language = appSettingService.getAppSettings().getMetadataProviderSettings().getGoogle().getLanguage(); + MetadataProviderSettings.Google googleSettings = appSettingService.getAppSettings() + .getMetadataProviderSettings().getGoogle(); - if (language == null || language.isEmpty()) { - return GOOGLE_BOOKS_API_URL; + String language = googleSettings.getLanguage(); + String apiKey = googleSettings.getApiKey(); + + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(GOOGLE_BOOKS_API_URL); + + if (language != null && !language.isEmpty()) { + builder.queryParam("langRestrict", language); } - return UriComponentsBuilder.fromUriString(GOOGLE_BOOKS_API_URL) - .queryParam("langRestrict", language) - .build() - .toUri() - .toString(); + if (apiKey != null && !apiKey.isBlank()) { + builder.queryParam("key", apiKey); + } + + return builder.build().toUri().toString(); } private void waitForRateLimit() { diff --git a/booklore-ui/src/app/features/settings/global-preferences/metadata-provider-settings/metadata-provider-settings.component.html b/booklore-ui/src/app/features/settings/global-preferences/metadata-provider-settings/metadata-provider-settings.component.html index d09c9df75..8987bacfe 100644 --- a/booklore-ui/src/app/features/settings/global-preferences/metadata-provider-settings/metadata-provider-settings.component.html +++ b/booklore-ui/src/app/features/settings/global-preferences/metadata-provider-settings/metadata-provider-settings.component.html @@ -65,6 +65,16 @@ class="config-select"> +
+ +

Providing a Google Books API key increases rate limits and improves reliability.

+ +
} diff --git a/booklore-ui/src/app/features/settings/global-preferences/metadata-provider-settings/metadata-provider-settings.component.ts b/booklore-ui/src/app/features/settings/global-preferences/metadata-provider-settings/metadata-provider-settings.component.ts index 99c0c922f..c58db3a0c 100644 --- a/booklore-ui/src/app/features/settings/global-preferences/metadata-provider-settings/metadata-provider-settings.component.ts +++ b/booklore-ui/src/app/features/settings/global-preferences/metadata-provider-settings/metadata-provider-settings.component.ts @@ -95,6 +95,7 @@ export class MetadataProviderSettingsComponent implements OnInit { doubanEnabled: boolean = false; lubimyCzytacEnabled: boolean = false; ranobedbEnabled: boolean = false; + googleApiKey: string = ''; private appSettingsService = inject(AppSettingsService); private messageService = inject(MessageService); @@ -116,6 +117,7 @@ export class MetadataProviderSettingsComponent implements OnInit { this.goodreadsEnabled = metadataProviderSettings?.goodReads?.enabled ?? false; this.googleEnabled = metadataProviderSettings?.google?.enabled ?? false; this.selectedGoogleLanguage = metadataProviderSettings?.google?.language ?? ''; + this.googleApiKey = metadataProviderSettings?.google?.apiKey ?? ''; this.hardcoverToken = metadataProviderSettings?.hardcover?.apiKey ?? ''; this.hardcoverEnabled = metadataProviderSettings?.hardcover?.enabled ?? false; this.comicvineEnabled = metadataProviderSettings?.comicvine?.enabled ?? false; @@ -157,6 +159,7 @@ export class MetadataProviderSettingsComponent implements OnInit { google: { enabled: this.googleEnabled, language: this.selectedGoogleLanguage, + apiKey: this.googleApiKey.trim() }, hardcover: { enabled: this.hardcoverEnabled, diff --git a/booklore-ui/src/app/shared/model/app-settings.model.ts b/booklore-ui/src/app/shared/model/app-settings.model.ts index 1d843c370..2952393b6 100644 --- a/booklore-ui/src/app/shared/model/app-settings.model.ts +++ b/booklore-ui/src/app/shared/model/app-settings.model.ts @@ -66,6 +66,7 @@ export interface Amazon { export interface Google { enabled: boolean; language: string; + apiKey: string; } export interface Goodreads {