1use crate::error::SourceError;
2use crate::types::{Quality, SearchResult, Source};
3use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct LyricInfo {
8 pub lyric: String,
9 pub tlyric: Option<String>,
10 pub rlyric: Option<String>,
11 pub lxlyric: Option<String>,
12}
13
14#[async_trait]
15pub trait MusicSource: Send + Sync {
16 fn platform(&self) -> Source;
17 fn supported_qualities(&self) -> &[Quality];
18 async fn search(
19 &self,
20 keyword: &str,
21 page: usize,
22 limit: usize,
23 ) -> Result<SearchResult, SourceError>;
24 async fn get_url(&self, song_id: &str, quality: Quality) -> Result<String, SourceError>;
25 async fn get_lyric(&self, song_id: &str) -> Result<Option<LyricInfo>, SourceError>;
26 async fn get_pic(&self, song_id: &str) -> Result<Option<String>, SourceError>;
27}