nako-metadata-scraper 0.1.0-alpha.2

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

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

use super::{FC2_PROVIDER_ID, parser::Fc2DetailFacts};

impl Fc2DetailFacts {
    pub(super) fn into_candidate(self, query: &MetadataQuery) -> ProviderMetadataCandidate {
        let mut tags = vec![
            FC2_PROVIDER_ID.to_owned(),
            format!("av_number:{}", self.av.number),
            "av_route:fc2".to_owned(),
        ];
        if let Some(seller) = &self.seller {
            tags.push(format!("seller:{seller}"));
        }

        let mut artwork_candidates = Vec::new();
        if let Some(poster_url) = self.poster_url.clone() {
            artwork_candidates.push(ProviderArtworkCandidate {
                provider: FC2_PROVIDER_ID.to_owned(),
                provider_id: format!("fc2:article:{}:poster", self.article_id),
                facts: ProviderArtworkCandidateFacts {
                    kind: AddonArtworkKind::Poster,
                    source_url: poster_url,
                    language: None,
                    width: None,
                    height: None,
                },
            });
        }

        ProviderMetadataCandidate {
            provider: FC2_PROVIDER_ID.to_owned(),
            provider_id: format!("fc2:article:{}", self.article_id),
            patch: AddonMetadataPatch {
                title: Some(self.title.clone()),
                original_title: None,
                sort_title: Some(self.title.clone()),
                overview: self.overview.clone(),
                release_date: self.release_date.clone(),
                runtime_minutes: self.runtime_minutes,
                tagline: Some("FC2 AV article".to_owned()),
                genres: Some(self.tags.clone()).filter(|genres| !genres.is_empty()),
                tags: Some(tags),
                ..AddonMetadataPatch::default()
            },
            facts: ProviderCandidateFacts {
                title: Some(self.title),
                alternate_titles: vec![self.av.number.clone()],
                release_year: self.release_year,
                language: Some(query.language.clone()),
                av: AvMetadataFacts {
                    studio: self.seller.clone(),
                    publisher: self.seller.clone(),
                    thumb_url: self.poster_url.clone(),
                    ..AvMetadataFacts::default()
                }
                .non_empty(),
                community_score_milli: None,
                community_vote_count: None,
                external_ids: vec![
                    ProviderExternalId {
                        provider: FC2_PROVIDER_ID.to_owned(),
                        value: self.article_id,
                    },
                    ProviderExternalId {
                        provider: "fc2_url".to_owned(),
                        value: self.url,
                    },
                    ProviderExternalId {
                        provider: AV_NUMBER_EXTERNAL_ID_PROVIDER.to_owned(),
                        value: self.av.number,
                    },
                ],
                provider_outcomes: vec![ProviderOutcome::Fc2RenderedHtmlParsed],
                provider_note: None,
            },
            artwork_candidates,
        }
    }
}