| """ |
| Trends Module Router |
| API endpoints for Google Trends data |
| """ |
| import logging |
| from fastapi import APIRouter, HTTPException |
|
|
| from .schemas import ( |
| TrendingNowRequest, |
| TrendingNowResponse, |
| KeywordResearchRequest, |
| KeywordResearchResponse, |
| YouTubeTrendsRequest, |
| TrendingTopic |
| ) |
| from .services.trends_client import TrendsClient |
|
|
| logger = logging.getLogger(__name__) |
|
|
| router = APIRouter() |
|
|
| |
| trends_client = TrendsClient() |
|
|
|
|
| @router.post("/trending-now", |
| response_model=TrendingNowResponse, |
| summary="Get trending topics", |
| description="Get currently trending searches for a country" |
| ) |
| async def get_trending_now(request: TrendingNowRequest): |
| """ |
| Get trending searches right now. |
| |
| - Returns top trending topics sorted by popularity |
| - Supports different countries |
| """ |
| try: |
| results = trends_client.get_trending_now( |
| country=request.country, |
| limit=request.limit |
| ) |
| |
| return TrendingNowResponse( |
| success=True, |
| count=len(results), |
| trends=[TrendingTopic(**r) for r in results] |
| ) |
| |
| except Exception as e: |
| logger.error(f"Error getting trending now: {e}") |
| raise HTTPException(status_code=500, detail=str(e)) |
|
|
|
|
| @router.post("/keyword-research", |
| response_model=KeywordResearchResponse, |
| summary="Keyword research", |
| description="Get related topics and queries for a keyword" |
| ) |
| async def keyword_research(request: KeywordResearchRequest): |
| """ |
| Complete keyword research - related topics and queries. |
| |
| - Related Topics: topics related to the keyword |
| - Related Queries: search queries people also search |
| - Sorted by search volume (highest first) |
| """ |
| try: |
| results = trends_client.keyword_research( |
| keyword=request.keyword, |
| region=request.region, |
| timeframe=request.timeframe.value, |
| category=request.category.value, |
| search_type=request.search_type.value |
| ) |
| |
| return KeywordResearchResponse( |
| success=True, |
| **results |
| ) |
| |
| except Exception as e: |
| logger.error(f"Error in keyword research: {e}") |
| raise HTTPException(status_code=500, detail=str(e)) |
|
|
|
|
| @router.post("/youtube-trends", |
| response_model=KeywordResearchResponse, |
| summary="YouTube trends", |
| description="Get YouTube-specific trends for a keyword" |
| ) |
| async def youtube_trends(request: YouTubeTrendsRequest): |
| """ |
| Get YouTube-specific trends and related content. |
| """ |
| try: |
| results = trends_client.get_youtube_trends( |
| keyword=request.keyword, |
| region=request.region, |
| timeframe=request.timeframe.value |
| ) |
| |
| return KeywordResearchResponse( |
| success=True, |
| **results |
| ) |
| |
| except Exception as e: |
| logger.error(f"Error getting YouTube trends: {e}") |
| raise HTTPException(status_code=500, detail=str(e)) |
|
|
|
|
| @router.get("/categories", |
| summary="List categories", |
| description="Get list of available categories" |
| ) |
| async def list_categories(): |
| """Get all available trend categories""" |
| from .services.trends_client import TrendsClient |
| return { |
| "categories": list(TrendsClient.CATEGORIES.keys()) |
| } |
|
|
|
|
| @router.get("/countries", |
| summary="List countries", |
| description="Get list of supported countries" |
| ) |
| async def list_countries(): |
| """Get commonly used country codes""" |
| return { |
| "countries": [ |
| {"code": "united_states", "name": "United States"}, |
| {"code": "united_kingdom", "name": "United Kingdom"}, |
| {"code": "india", "name": "India"}, |
| {"code": "bangladesh", "name": "Bangladesh"}, |
| {"code": "japan", "name": "Japan"}, |
| {"code": "germany", "name": "Germany"}, |
| {"code": "france", "name": "France"}, |
| {"code": "brazil", "name": "Brazil"}, |
| {"code": "canada", "name": "Canada"}, |
| {"code": "australia", "name": "Australia"}, |
| ] |
| } |
|
|