nako-metadata-scraper 0.1.0-alpha.2

Official Nako metadata scraper Addon Sidecar.
Documentation
use nako_addon_protocol::{AddonArtworkKind, AddonMetadataPatch};

use crate::engine::{
    MetadataQuery, ProviderArtworkCandidate, ProviderArtworkCandidateFacts, ProviderCandidateFacts,
    ProviderExternalId, ProviderMetadataCandidate, ProviderOutcome,
};

use super::{DOUBAN_PROVIDER_ID, parser::DoubanDetailFacts};

impl DoubanDetailFacts {
    pub(super) fn into_candidate(self, query: &MetadataQuery) -> ProviderMetadataCandidate {
        let mut tags = vec![DOUBAN_PROVIDER_ID.to_owned()];
        if let Some(rating) = self.rating_milli {
            tags.push(format!("douban_rating:{:.1}", f64::from(rating) / 100.0));
        }
        if let Some(votes) = self.vote_count {
            tags.push(format!("douban_votes:{votes}"));
        }
        let mut artwork_candidates = Vec::new();
        if let Some(poster_url) = self.poster_url.clone() {
            artwork_candidates.push(ProviderArtworkCandidate {
                provider: DOUBAN_PROVIDER_ID.to_owned(),
                provider_id: format!("douban:subject:{}:poster", self.subject_id),
                facts: ProviderArtworkCandidateFacts {
                    kind: AddonArtworkKind::Poster,
                    source_url: poster_url,
                    language: None,
                    width: None,
                    height: None,
                },
            });
        }

        ProviderMetadataCandidate {
            provider: DOUBAN_PROVIDER_ID.to_owned(),
            provider_id: format!("douban:subject:{}", self.subject_id),
            patch: AddonMetadataPatch {
                title: Some(self.title.clone()),
                original_title: self
                    .original_title
                    .clone()
                    .filter(|original_title| original_title != &self.title),
                sort_title: Some(self.title.clone()),
                overview: self.summary.clone(),
                release_date: self.release_date.clone(),
                runtime_minutes: self.runtime_minutes,
                tagline: Some("Douban movie subject".to_owned()),
                genres: Some(self.genres.clone()).filter(|genres| !genres.is_empty()),
                tags: Some(tags).filter(|tags| !tags.is_empty()),
                ..AddonMetadataPatch::default()
            },
            facts: ProviderCandidateFacts {
                title: Some(self.title),
                alternate_titles: Vec::new(),
                release_year: self.release_year,
                language: Some(query.language.clone()),
                av: None,
                community_score_milli: self.rating_milli,
                community_vote_count: self.vote_count,
                external_ids: vec![
                    ProviderExternalId {
                        provider: DOUBAN_PROVIDER_ID.to_owned(),
                        value: self.subject_id,
                    },
                    ProviderExternalId {
                        provider: "douban_url".to_owned(),
                        value: self.url,
                    },
                ],
                provider_outcomes: vec![ProviderOutcome::DoubanRenderedHtmlParsed],
                provider_note: None,
            },
            artwork_candidates,
        }
    }
}