nako-metadata-scraper 0.1.0-alpha.2

Official Nako metadata scraper Addon Sidecar.
Documentation
use nako_addon_protocol::{
    ADDON_PROTOCOL_VERSION, AddonArtifact, AddonResourceRequest, AddonResourceResponse,
};

use super::MetadataScrapeOutcome;

pub(crate) fn metadata_response(
    request: AddonResourceRequest,
    outcome: MetadataScrapeOutcome,
) -> AddonResourceResponse {
    let payload = metadata_payload(&outcome);

    AddonResourceResponse {
        protocol_version: ADDON_PROTOCOL_VERSION.to_owned(),
        addon_id: request.addon_id,
        resource: request.resource,
        request_id: request.request_id,
        payload: payload.clone(),
        artifacts: vec![AddonArtifact {
            kind: "metadata_suggestion".to_owned(),
            payload,
        }],
    }
}

pub(crate) fn metadata_payload(outcome: &MetadataScrapeOutcome) -> serde_json::Value {
    let mut payload = serde_json::json!({
        "query": {
            "title": &outcome.query.title,
            "year": outcome.query.year,
            "language": &outcome.query.language
        },
        "provider_execution": &outcome.provider_execution,
        "candidates": &outcome.candidates
    });
    if let Some(writeback_result) = &outcome.writeback_result {
        payload["writeback"] = serde_json::to_value(writeback_result)
            .expect("writeback result is always serializable");
    }
    if let Some(av_facts) = &outcome.av {
        payload["query"]["av"] =
            serde_json::to_value(av_facts).expect("AV query facts are always serializable");
    }
    if let Some(artwork_writeback_result) = &outcome.artwork_writeback_result {
        payload["artwork_writeback"] = serde_json::to_value(artwork_writeback_result)
            .expect("artwork writeback result is always serializable");
    }

    payload
}