aboutsummaryrefslogtreecommitdiff
path: root/import/src/musicbrainz.rs
diff options
context:
space:
mode:
Diffstat (limited to 'import/src/musicbrainz.rs')
-rw-r--r--import/src/musicbrainz.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/import/src/musicbrainz.rs b/import/src/musicbrainz.rs
new file mode 100644
index 0000000..059b8f5
--- /dev/null
+++ b/import/src/musicbrainz.rs
@@ -0,0 +1,44 @@
+/*
+ This file is part of jellything (https://codeberg.org/metamuffin/jellything)
+ which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
+ Copyright (C) 2025 metamuffin <metamuffin.org>
+*/
+
+use reqwest::{
+ header::{HeaderMap, HeaderName, HeaderValue},
+ Client, ClientBuilder,
+};
+use std::sync::Arc;
+use tokio::sync::Semaphore;
+use crate::USER_AGENT;
+
+pub struct MusicBrainz {
+ client: Client,
+ key: String,
+ rate_limit: Arc<Semaphore>,
+}
+
+impl MusicBrainz {
+ pub fn new(api_key: &str) -> Self {
+ let client = ClientBuilder::new()
+ .default_headers(HeaderMap::from_iter([
+ (
+ HeaderName::from_static("accept"),
+ HeaderValue::from_static("application/json"),
+ ),
+ (
+ HeaderName::from_static("user-agent"),
+ HeaderValue::from_static(USER_AGENT),
+ ),
+ ]))
+ .build()
+ .unwrap();
+ Self {
+ client,
+ // send at most 1 req/s according to musicbrainz docs, each lock is held for 10s
+ // this implementation also never sends more than 10 requests in-flight.
+ rate_limit: Arc::new(Semaphore::new(10)),
+ key: api_key.to_owned(),
+ }
+ }
+}