amagi 0.1.1

Rust SDK, CLI, and Web API service skeleton for multi-platform social web adapters.
Documentation
use crate::{error::AppError, platforms::douyin::DouyinSearchType};

use super::{
    builder::DouyinRequestBuilder,
    shared::{build_url, join_base},
};

impl DouyinRequestBuilder {
    pub(crate) fn suggest_words(&self, query: &str) -> Result<String, AppError> {
        let mut params = self.base_params(184, true);
        params.extend([
            ("query", query.to_owned()),
            ("business_id", "30088".into()),
            ("from_group_id", "7129543174929812767".into()),
            ("version_code", "170400".into()),
            ("version_name", "17.4.0".into()),
            ("screen_width", "1552".into()),
            ("screen_height", "970".into()),
            ("round_trip_time", "50".into()),
            ("webid", "7327957959955580467".into()),
        ]);
        build_url(
            &join_base(&self.endpoints.web_base, "/aweme/v1/web/api/suggest_words/"),
            params,
        )
    }

    pub(crate) fn search(
        &self,
        query: &str,
        search_type: DouyinSearchType,
        count: u32,
        search_id: Option<&str>,
    ) -> Result<String, AppError> {
        let mut params = self.base_params(184, false);

        match search_type {
            DouyinSearchType::User => {
                params.extend([
                    ("count", count.to_string()),
                    ("disable_rs", "0".into()),
                    ("from_group_id", String::new()),
                    ("is_filter_search", "0".into()),
                    ("keyword", query.to_owned()),
                    ("list_type", "single".into()),
                    ("need_filter_settings", "1".into()),
                    ("offset", "0".into()),
                    ("pc_libra_divert", "Windows".into()),
                    (
                        "pc_search_top_1_params",
                        "{\"enable_ai_search_top_1\":1}".into(),
                    ),
                    ("query_correct_type", "1".into()),
                    ("round_trip_time", "250".into()),
                    ("screen_height", "1310".into()),
                    ("screen_width", "2328".into()),
                    ("search_channel", "aweme_user_web".into()),
                    ("search_source", "switch_tab".into()),
                    ("support_dash", "1".into()),
                    ("support_h265", "1".into()),
                    ("version_code", "170400".into()),
                    ("version_name", "17.4.0".into()),
                    ("webid", "7521399115230610959".into()),
                ]);

                if let Some(search_id) = search_id.filter(|value| !value.is_empty()) {
                    params.push(("search_id", search_id.to_owned()));
                }

                build_url(
                    &join_base(&self.endpoints.web_base, "/aweme/v1/web/discover/search/"),
                    params,
                )
            }
            DouyinSearchType::Video => {
                params.extend([
                    ("count", count.to_string()),
                    ("disable_rs", "0".into()),
                    ("enable_history", "1".into()),
                    ("from_group_id", String::new()),
                    ("is_filter_search", "0".into()),
                    ("keyword", query.to_owned()),
                    ("list_type", "single".into()),
                    ("need_filter_settings", "1".into()),
                    ("offset", "0".into()),
                    ("pc_libra_divert", "Windows".into()),
                    (
                        "pc_search_top_1_params",
                        "{\"enable_ai_search_top_1\":1}".into(),
                    ),
                    ("query_correct_type", "1".into()),
                    ("round_trip_time", "50".into()),
                    ("screen_height", "1310".into()),
                    ("screen_width", "2328".into()),
                    ("search_channel", "aweme_video_web".into()),
                    ("search_source", "switch_tab".into()),
                    ("support_dash", "1".into()),
                    ("support_h265", "1".into()),
                    ("version_code", "170400".into()),
                    ("version_name", "17.4.0".into()),
                    ("webid", "7521399115230610959".into()),
                ]);

                if let Some(search_id) = search_id.filter(|value| !value.is_empty()) {
                    params.push(("search_id", search_id.to_owned()));
                }

                build_url(
                    &join_base(&self.endpoints.web_base, "/aweme/v1/web/search/item/"),
                    params,
                )
            }
            DouyinSearchType::General => {
                params.extend([
                    ("count", count.to_string()),
                    ("disable_rs", "0".into()),
                    ("enable_history", "1".into()),
                    ("is_filter_search", "0".into()),
                    ("keyword", query.to_owned()),
                    ("list_type", String::new()),
                    ("need_filter_settings", "1".into()),
                    ("offset", "0".into()),
                    ("pc_libra_divert", "Windows".into()),
                    (
                        "pc_search_top_1_params",
                        "{\"enable_ai_search_top_1\":1}".into(),
                    ),
                    ("query_correct_type", "1".into()),
                    ("round_trip_time", "0".into()),
                    ("screen_height", "1310".into()),
                    ("screen_width", "2328".into()),
                    ("search_channel", "aweme_general".into()),
                    ("search_source", "normal_search".into()),
                    ("support_dash", "1".into()),
                    ("support_h265", "1".into()),
                    ("version_code", "190600".into()),
                    ("version_name", "19.6.0".into()),
                    ("webid", "7521399115230610959".into()),
                ]);
                build_url(
                    &join_base(
                        &self.endpoints.web_base,
                        "/aweme/v1/web/general/search/stream/",
                    ),
                    params,
                )
            }
        }
    }
}