[{"data":1,"prerenderedAt":564},["ShallowReactive",2],{"navigation_docs":3,"-api-tmdb-import":100,"-api-tmdb-import-surround":559},[4,35,80,90],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Project Structure","\u002Fgetting-started\u002Fproject-structure","1.getting-started\u002F4.project-structure","i-lucide-folder-tree",{"title":26,"path":27,"stem":28,"icon":29},"Backend Server","\u002Fgetting-started\u002Fbackend","1.getting-started\u002F6.backend","i-lucide-server",{"title":31,"path":32,"stem":33,"icon":34},"Troubleshooting","\u002Fgetting-started\u002Ftroubleshooting","1.getting-started\u002F8.troubleshooting","i-lucide-wrench",{"title":36,"icon":6,"path":37,"stem":38,"children":39,"page":6},"API","\u002Fapi","2.api",[40,45,50,55,60,65,70,75],{"title":41,"path":42,"stem":43,"icon":44},"API Overview","\u002Fapi\u002Foverview","2.api\u002F1.overview","i-lucide-zap",{"title":46,"path":47,"stem":48,"icon":49},"TMDB Integration","\u002Fapi\u002Ftmdb-proxy","2.api\u002F2.tmdb-proxy","i-si-movie-line",{"title":51,"path":52,"stem":53,"icon":54},"Watched and My List APIs","\u002Fapi\u002Fwatched-movies","2.api\u002F3.watched-movies","i-lucide-eye",{"title":56,"path":57,"stem":58,"icon":59},"Recommendation Generation","\u002Fapi\u002Fgemini-recommendations","2.api\u002F4.gemini-recommendations","i-lucide-sparkles",{"title":61,"path":62,"stem":63,"icon":64},"Movie Search API","\u002Fapi\u002Fmovie-search","2.api\u002F5.movie-search","i-lucide-search",{"title":66,"path":67,"stem":68,"icon":69},"TMDB Import","\u002Fapi\u002Ftmdb-import","2.api\u002F6.tmdb-import","i-lucide-database",{"title":71,"path":72,"stem":73,"icon":74},"Movie Details & Caching","\u002Fapi\u002Fmovie-details","2.api\u002F7.movie-details","i-lucide-film",{"title":76,"path":77,"stem":78,"icon":79},"Recommendations (Cached)","\u002Fapi\u002Frecommendations-cache","2.api\u002F8.recommendations-cache","i-lucide-brain",{"title":81,"icon":6,"path":82,"stem":83,"children":84,"page":6},"Frontend","\u002Ffrontend","4.frontend",[85],{"title":86,"path":87,"stem":88,"icon":89},"Components","\u002Ffrontend\u002Fcomponents","4.frontend\u002F1.components","i-lucide-layout",{"title":91,"icon":6,"path":92,"stem":93,"children":94,"page":6},"Reference","\u002Freference","5.reference",[95],{"title":96,"path":97,"stem":98,"icon":99},"Rate Limiting","\u002Freference\u002Frate-limiting","5.reference\u002F2.rate-limiting","i-lucide-shield",{"id":101,"title":66,"body":102,"description":552,"extension":553,"links":554,"meta":555,"navigation":556,"path":67,"seo":557,"stem":68,"__hash__":558},"docs\u002F2.api\u002F6.tmdb-import.md",{"type":103,"value":104,"toc":543},"minimark",[105,117,122,127,185,189,200,204,207,329,397,401,407,410,415,442,445,449,493,497,539],[106,107,108,112,113,116],"p",{},[109,110,111],"code",{},"POST \u002Fapi\u002Fadmin\u002Ftmdb-import"," downloads TMDB's daily export and writes it into the Supabase ",[109,114,115],{},"movies"," table. The same endpoint is intended for local manual runs and production GitHub Actions schedules.",[118,119,121],"callout",{"type":120},"warning","The import is network and database intensive. Run manual imports only when needed.",[123,124,126],"h2",{"id":125},"how-it-works","How It Works",[128,129,130,138,141,144,154,157,166,179],"ol",{},[131,132,133,134,137],"li",{},"Builds a URL for yesterday's TMDB export (",[109,135,136],{},"movie_ids_MM_DD_YYYY.json.gz",")",[131,139,140],{},"Downloads the gzipped NDJSON export and decompresses it in the import runner",[131,142,143],{},"Parses each line as JSON and skips lines that are empty, invalid JSON, or do not match the expected TMDB export shape",[131,145,146,147,150,151],{},"Filters out rows where ",[109,148,149],{},"adult: true"," or ",[109,152,153],{},"popularity \u003C 0.25",[131,155,156],{},"Collects valid rows into batches of 1000",[131,158,159,160,162,163],{},"Upserts each batch into ",[109,161,115],{}," on ",[109,164,165],{},"tmdb_id",[131,167,168,169,171,172,175,176],{},"Only search-relevant fields are populated during import: ",[109,170,165],{},", ",[109,173,174],{},"original_title",", and ",[109,177,178],{},"popularity",[131,180,181,182],{},"Detailed metadata is filled later by ",[109,183,184],{},"GET \u002Fapi\u002Fmovies\u002F:id",[123,186,188],{"id":187},"scheduling","Scheduling",[106,190,191,192,195,196,199],{},"Production scheduling is handled in GitHub Actions by sending authenticated ",[109,193,194],{},"POST"," requests to ",[109,197,198],{},"\u002Fapi\u002Fadmin\u002Ftmdb-import",".",[123,201,203],{"id":202},"result","Result",[106,205,206],{},"Manual calls and GitHub Actions-triggered calls return the same object:",[208,209,214],"pre",{"className":210,"code":211,"language":212,"meta":213,"style":213},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"imported\": 312847,\n  \"skipped\": 14,\n  \"adultExcluded\": 4201,\n  \"lowPopularityExcluded\": 188932,\n  \"durationSeconds\": \"47.83\"\n}\n","json","",[109,215,216,225,249,266,283,300,323],{"__ignoreMap":213},[217,218,221],"span",{"class":219,"line":220},"line",1,[217,222,224],{"class":223},"sP7_E","{\n",[217,226,228,232,236,239,242,246],{"class":219,"line":227},2,[217,229,231],{"class":230},"s39Yj","  \"",[217,233,235],{"class":234},"sseR_","imported",[217,237,238],{"class":230},"\"",[217,240,241],{"class":223},":",[217,243,245],{"class":244},"srdBf"," 312847",[217,247,248],{"class":223},",\n",[217,250,252,254,257,259,261,264],{"class":219,"line":251},3,[217,253,231],{"class":230},[217,255,256],{"class":234},"skipped",[217,258,238],{"class":230},[217,260,241],{"class":223},[217,262,263],{"class":244}," 14",[217,265,248],{"class":223},[217,267,269,271,274,276,278,281],{"class":219,"line":268},4,[217,270,231],{"class":230},[217,272,273],{"class":234},"adultExcluded",[217,275,238],{"class":230},[217,277,241],{"class":223},[217,279,280],{"class":244}," 4201",[217,282,248],{"class":223},[217,284,286,288,291,293,295,298],{"class":219,"line":285},5,[217,287,231],{"class":230},[217,289,290],{"class":234},"lowPopularityExcluded",[217,292,238],{"class":230},[217,294,241],{"class":223},[217,296,297],{"class":244}," 188932",[217,299,248],{"class":223},[217,301,303,305,308,310,312,316,320],{"class":219,"line":302},6,[217,304,231],{"class":230},[217,306,307],{"class":234},"durationSeconds",[217,309,238],{"class":230},[217,311,241],{"class":223},[217,313,315],{"class":314},"sjJ54"," \"",[217,317,319],{"class":318},"s_sjI","47.83",[217,321,322],{"class":314},"\"\n",[217,324,326],{"class":219,"line":325},7,[217,327,328],{"class":223},"}\n",[330,331,332,345],"table",{},[333,334,335],"thead",{},[336,337,338,342],"tr",{},[339,340,341],"th",{},"Field",[339,343,344],{},"Description",[346,347,348,358,367,378,388],"tbody",{},[336,349,350,355],{},[351,352,353],"td",{},[109,354,235],{},[351,356,357],{},"Number of valid rows queued for Supabase upsert",[336,359,360,364],{},[351,361,362],{},[109,363,256],{},[351,365,366],{},"Rows skipped because they were empty, invalid JSON, or failed shape validation",[336,368,369,373],{},[351,370,371],{},[109,372,273],{},[351,374,375,376],{},"Rows dropped because ",[109,377,149],{},[336,379,380,384],{},[351,381,382],{},[109,383,290],{},[351,385,375,386],{},[109,387,153],{},[336,389,390,394],{},[351,391,392],{},[109,393,307],{},[351,395,396],{},"Wall-clock time for the full run, as a string with two decimal places",[123,398,400],{"id":399},"manual-trigger","Manual Trigger",[402,403,405],"h3",{"id":404},"post-apiadmintmdb-import",[109,406,111],{},[106,408,409],{},"Runs the import on demand and returns the result object above. GitHub Actions should call this same endpoint for scheduled imports.",[411,412,414],"h4",{"id":413},"headers","Headers",[330,416,417,426],{},[333,418,419],{},[336,420,421,424],{},[339,422,423],{},"Header",[339,425,344],{},[346,427,428],{},[336,429,430,435],{},[351,431,432],{},[109,433,434],{},"x-admin-token",[351,436,437,438,441],{},"Must match ",[109,439,440],{},"ADMIN_API_TOKEN"," in the server environment",[106,443,444],{},"This endpoint does not accept a request body.",[411,446,448],{"id":447},"error-codes","Error Codes",[450,451,452,458,466,472,478,484],"ul",{},[131,453,454,457],{},[109,455,456],{},"400"," request body was provided",[131,459,460,463,464],{},[109,461,462],{},"401"," missing or incorrect ",[109,465,434],{},[131,467,468,471],{},[109,469,470],{},"409"," another import is already running",[131,473,474,477],{},[109,475,476],{},"429"," too many failed admin-token attempts from the same IP",[131,479,480,483],{},[109,481,482],{},"502"," import failed because the TMDB export stream or Supabase write failed",[131,485,486,489,490,492],{},[109,487,488],{},"503"," ",[109,491,440],{}," is not configured",[123,494,496],{"id":495},"environment-variables","Environment Variables",[330,498,499,508],{},[333,500,501],{},[336,502,503,506],{},[339,504,505],{},"Variable",[339,507,344],{},[346,509,510,520,530],{},[336,511,512,517],{},[351,513,514],{},[109,515,516],{},"NUXT_PUBLIC_SUPABASE_URL",[351,518,519],{},"Supabase project URL",[336,521,522,527],{},[351,523,524],{},[109,525,526],{},"NUXT_SUPABASE_SERVICE_ROLE_KEY",[351,528,529],{},"Required for server-side import writes",[336,531,532,536],{},[351,533,534],{},[109,535,440],{},[351,537,538],{},"Guards the manual trigger endpoint",[540,541,542],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":213,"searchDepth":227,"depth":227,"links":544},[545,546,547,548,551],{"id":125,"depth":227,"text":126},{"id":187,"depth":227,"text":188},{"id":202,"depth":227,"text":203},{"id":399,"depth":227,"text":400,"children":549},[550],{"id":404,"depth":251,"text":111},{"id":495,"depth":227,"text":496},"Admin API-driven TMDB import that populates the Supabase movies table","md",null,{},{"icon":69},{"title":66,"description":552},"0bYctrFct5phCUwnARiLfrDuV02UAKateFdB2n7g0fw",[560,562],{"title":61,"path":62,"stem":63,"description":561,"icon":64,"children":-1},"Search movies through the current TMDB-backed search endpoint",{"title":71,"path":72,"stem":73,"description":563,"icon":74,"children":-1},"Fetch enriched movie metadata with Supabase-backed caching",1782138812696]