[{"data":1,"prerenderedAt":954},["ShallowReactive",2],{"navigation_docs":3,"-api-movie-details":100,"-api-movie-details-surround":949},[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":71,"body":102,"description":942,"extension":943,"links":944,"meta":945,"navigation":946,"path":72,"seo":947,"stem":73,"__hash__":948},"docs\u002F2.api\u002F7.movie-details.md",{"type":103,"value":104,"toc":933},"minimark",[105,119,124,134,138,171,175,248,252,290,297,301,613,810,814,873,880,884,929],[106,107,108,109,113,114,118],"p",{},"The Movie Details endpoint fetches enriched metadata for a single movie by its TMDB ID. Results are cached server-side in the Supabase ",[110,111,112],"code",{},"movies"," table for about ",[115,116,117],"strong",{},"3 months"," to avoid redundant TMDB API calls.",[120,121,123],"h2",{"id":122},"endpoint","Endpoint",[125,126,132],"pre",{"className":127,"code":129,"language":130,"meta":131},[128],"language-text","GET \u002Fapi\u002Fmovies\u002F:id\n","text","",[110,133,129],{"__ignoreMap":131},[120,135,137],{"id":136},"how-it-works","How It Works",[139,140,141,149,155,161],"ol",{},[142,143,144,145,148],"li",{},"Client requests ",[110,146,147],{},"\u002Fapi\u002Fmovies\u002F:id"," with a TMDB movie ID",[142,150,151,152,154],{},"Server checks ",[110,153,112],{}," for a cached row",[142,156,157,160],{},[115,158,159],{},"Cache hit"," - returns the cached record immediately, no TMDB call made",[142,162,163,166,167,170],{},[115,164,165],{},"Cache miss or stale\u002Fincomplete row"," - fetches from TMDB (",[110,168,169],{},"\u002Fmovie\u002F:id?append_to_response=credits,videos","), upserts the movie row in Supabase, and returns the normalized response",[120,172,174],{"id":173},"example-usage","Example Usage",[125,176,180],{"className":177,"code":178,"language":179,"meta":131,"style":131},"language-js shiki shiki-themes material-theme-lighter github-light github-dark","const response = await fetch('\u002Fapi\u002Fmovies\u002F550')\nconst movie = await response.json()\n","js",[110,181,182,224],{"__ignoreMap":131},[183,184,187,191,195,199,203,207,211,215,219,221],"span",{"class":185,"line":186},"line",1,[183,188,190],{"class":189},"sbsja","const",[183,192,194],{"class":193},"s_hVV"," response",[183,196,198],{"class":197},"smGrS"," =",[183,200,202],{"class":201},"sVHd0"," await",[183,204,206],{"class":205},"sGLFI"," fetch",[183,208,210],{"class":209},"su5hD","(",[183,212,214],{"class":213},"sjJ54","'",[183,216,218],{"class":217},"s_sjI","\u002Fapi\u002Fmovies\u002F550",[183,220,214],{"class":213},[183,222,223],{"class":209},")\n",[183,225,227,229,232,234,236,238,242,245],{"class":185,"line":226},2,[183,228,190],{"class":189},[183,230,231],{"class":193}," movie",[183,233,198],{"class":197},[183,235,202],{"class":201},[183,237,194],{"class":209},[183,239,241],{"class":240},"sP7_E",".",[183,243,244],{"class":205},"json",[183,246,247],{"class":209},"()\n",[120,249,251],{"id":250},"path-parameter","Path Parameter",[253,254,255,271],"table",{},[256,257,258],"thead",{},[259,260,261,265,268],"tr",{},[262,263,264],"th",{},"Parameter",[262,266,267],{},"Type",[262,269,270],{},"Description",[272,273,274],"tbody",{},[259,275,276,282,287],{},[277,278,279],"td",{},[110,280,281],{},"id",[277,283,284],{},[110,285,286],{},"number",[277,288,289],{},"TMDB movie ID (positive integer)",[106,291,292,293,296],{},"Returns ",[110,294,295],{},"400"," if the ID is missing or not a positive integer.",[120,298,300],{"id":299},"response-format","Response Format",[125,302,305],{"className":303,"code":304,"language":244,"meta":131,"style":131},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"id\": 550,\n  \"title\": \"Fight Club\",\n  \"poster\": \"https:\u002F\u002Fimage.tmdb.org\u002Ft\u002Fp\u002Fw500\u002Fpath\u002Fto\u002Fposter.jpg\",\n  \"rating\": 8.4,\n  \"year\": 1999,\n  \"duration\": \"2h 19m\",\n  \"runtime\": 139,\n  \"genres\": [\"Drama\", \"Thriller\"],\n  \"actors\": [\"Brad Pitt\", \"Edward Norton\", \"Helena Bonham Carter\", \"Meat Loaf\", \"Zach Grenier\"],\n  \"directors\": [\"David Fincher\"],\n  \"description\": \"A ticking-time-bomb insomniac...\",\n  \"trailer\": \"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=SUXWAEX2jlg\"\n}\n",[110,306,307,312,334,356,377,394,411,432,449,484,543,566,587,607],{"__ignoreMap":131},[183,308,309],{"class":185,"line":186},[183,310,311],{"class":240},"{\n",[183,313,314,318,321,324,327,331],{"class":185,"line":226},[183,315,317],{"class":316},"s39Yj","  \"",[183,319,281],{"class":320},"sseR_",[183,322,323],{"class":316},"\"",[183,325,326],{"class":240},":",[183,328,330],{"class":329},"srdBf"," 550",[183,332,333],{"class":240},",\n",[183,335,337,339,342,344,346,349,352,354],{"class":185,"line":336},3,[183,338,317],{"class":316},[183,340,341],{"class":320},"title",[183,343,323],{"class":316},[183,345,326],{"class":240},[183,347,348],{"class":213}," \"",[183,350,351],{"class":217},"Fight Club",[183,353,323],{"class":213},[183,355,333],{"class":240},[183,357,359,361,364,366,368,370,373,375],{"class":185,"line":358},4,[183,360,317],{"class":316},[183,362,363],{"class":320},"poster",[183,365,323],{"class":316},[183,367,326],{"class":240},[183,369,348],{"class":213},[183,371,372],{"class":217},"https:\u002F\u002Fimage.tmdb.org\u002Ft\u002Fp\u002Fw500\u002Fpath\u002Fto\u002Fposter.jpg",[183,374,323],{"class":213},[183,376,333],{"class":240},[183,378,380,382,385,387,389,392],{"class":185,"line":379},5,[183,381,317],{"class":316},[183,383,384],{"class":320},"rating",[183,386,323],{"class":316},[183,388,326],{"class":240},[183,390,391],{"class":329}," 8.4",[183,393,333],{"class":240},[183,395,397,399,402,404,406,409],{"class":185,"line":396},6,[183,398,317],{"class":316},[183,400,401],{"class":320},"year",[183,403,323],{"class":316},[183,405,326],{"class":240},[183,407,408],{"class":329}," 1999",[183,410,333],{"class":240},[183,412,414,416,419,421,423,425,428,430],{"class":185,"line":413},7,[183,415,317],{"class":316},[183,417,418],{"class":320},"duration",[183,420,323],{"class":316},[183,422,326],{"class":240},[183,424,348],{"class":213},[183,426,427],{"class":217},"2h 19m",[183,429,323],{"class":213},[183,431,333],{"class":240},[183,433,435,437,440,442,444,447],{"class":185,"line":434},8,[183,436,317],{"class":316},[183,438,439],{"class":320},"runtime",[183,441,323],{"class":316},[183,443,326],{"class":240},[183,445,446],{"class":329}," 139",[183,448,333],{"class":240},[183,450,452,454,457,459,461,464,466,469,471,474,476,479,481],{"class":185,"line":451},9,[183,453,317],{"class":316},[183,455,456],{"class":320},"genres",[183,458,323],{"class":316},[183,460,326],{"class":240},[183,462,463],{"class":240}," [",[183,465,323],{"class":213},[183,467,468],{"class":217},"Drama",[183,470,323],{"class":213},[183,472,473],{"class":240},",",[183,475,348],{"class":213},[183,477,478],{"class":217},"Thriller",[183,480,323],{"class":213},[183,482,483],{"class":240},"],\n",[183,485,487,489,492,494,496,498,500,503,505,507,509,512,514,516,518,521,523,525,527,530,532,534,536,539,541],{"class":185,"line":486},10,[183,488,317],{"class":316},[183,490,491],{"class":320},"actors",[183,493,323],{"class":316},[183,495,326],{"class":240},[183,497,463],{"class":240},[183,499,323],{"class":213},[183,501,502],{"class":217},"Brad Pitt",[183,504,323],{"class":213},[183,506,473],{"class":240},[183,508,348],{"class":213},[183,510,511],{"class":217},"Edward Norton",[183,513,323],{"class":213},[183,515,473],{"class":240},[183,517,348],{"class":213},[183,519,520],{"class":217},"Helena Bonham Carter",[183,522,323],{"class":213},[183,524,473],{"class":240},[183,526,348],{"class":213},[183,528,529],{"class":217},"Meat Loaf",[183,531,323],{"class":213},[183,533,473],{"class":240},[183,535,348],{"class":213},[183,537,538],{"class":217},"Zach Grenier",[183,540,323],{"class":213},[183,542,483],{"class":240},[183,544,546,548,551,553,555,557,559,562,564],{"class":185,"line":545},11,[183,547,317],{"class":316},[183,549,550],{"class":320},"directors",[183,552,323],{"class":316},[183,554,326],{"class":240},[183,556,463],{"class":240},[183,558,323],{"class":213},[183,560,561],{"class":217},"David Fincher",[183,563,323],{"class":213},[183,565,483],{"class":240},[183,567,569,571,574,576,578,580,583,585],{"class":185,"line":568},12,[183,570,317],{"class":316},[183,572,573],{"class":320},"description",[183,575,323],{"class":316},[183,577,326],{"class":240},[183,579,348],{"class":213},[183,581,582],{"class":217},"A ticking-time-bomb insomniac...",[183,584,323],{"class":213},[183,586,333],{"class":240},[183,588,590,592,595,597,599,601,604],{"class":185,"line":589},13,[183,591,317],{"class":316},[183,593,594],{"class":320},"trailer",[183,596,323],{"class":316},[183,598,326],{"class":240},[183,600,348],{"class":213},[183,602,603],{"class":217},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=SUXWAEX2jlg",[183,605,606],{"class":213},"\"\n",[183,608,610],{"class":185,"line":609},14,[183,611,612],{"class":240},"}\n",[253,614,615,627],{},[256,616,617],{},[259,618,619,622,624],{},[262,620,621],{},"Field",[262,623,267],{},[262,625,626],{},"Notes",[272,628,629,642,656,673,689,705,725,742,756,769,782,795],{},[259,630,631,635,639],{},[277,632,633],{},[110,634,281],{},[277,636,637],{},[110,638,286],{},[277,640,641],{},"TMDB ID",[259,643,644,648,653],{},[277,645,646],{},[110,647,341],{},[277,649,650],{},[110,651,652],{},"string",[277,654,655],{},"Movie title",[259,657,658,662,666],{},[277,659,660],{},[110,661,363],{},[277,663,664],{},[110,665,652],{},[277,667,668,669,672],{},"Full image URL (",[110,670,671],{},"w500","). Empty string if no poster",[259,674,675,679,683],{},[277,676,677],{},[110,678,384],{},[277,680,681],{},[110,682,286],{},[277,684,685,688],{},[110,686,687],{},"vote_average"," rounded to 1 decimal place",[259,690,691,695,699],{},[277,692,693],{},[110,694,401],{},[277,696,697],{},[110,698,286],{},[277,700,701,702],{},"Release year parsed from ",[110,703,704],{},"release_date",[259,706,707,711,715],{},[277,708,709],{},[110,710,418],{},[277,712,713],{},[110,714,652],{},[277,716,717,718,720,721,724],{},"Formatted as ",[110,719,427],{},". ",[110,722,723],{},"\"N\u002FA\""," if runtime is unknown",[259,726,727,731,735],{},[277,728,729],{},[110,730,439],{},[277,732,733],{},[110,734,286],{},[277,736,737,738,741],{},"Raw runtime in minutes, or ",[110,739,740],{},"null"," when unavailable",[259,743,744,748,753],{},[277,745,746],{},[110,747,456],{},[277,749,750],{},[110,751,752],{},"string[]",[277,754,755],{},"Genre names",[259,757,758,762,766],{},[277,759,760],{},[110,761,491],{},[277,763,764],{},[110,765,752],{},[277,767,768],{},"Top 5 cast members",[259,770,771,775,779],{},[277,772,773],{},[110,774,550],{},[277,776,777],{},[110,778,752],{},[277,780,781],{},"Director names",[259,783,784,788,792],{},[277,785,786],{},[110,787,573],{},[277,789,790],{},[110,791,652],{},[277,793,794],{},"Movie overview",[259,796,797,801,805],{},[277,798,799],{},[110,800,594],{},[277,802,803],{},[110,804,652],{},[277,806,807,808],{},"YouTube link or ",[110,809,740],{},[120,811,813],{"id":812},"caching-details","Caching Details",[253,815,816,826],{},[256,817,818],{},[259,819,820,823],{},[262,821,822],{},"Property",[262,824,825],{},"Value",[272,827,828,839,847,857],{},[259,829,830,833],{},[277,831,832],{},"Cache store",[277,834,835,836,838],{},"Supabase ",[110,837,112],{}," table",[259,840,841,844],{},[277,842,843],{},"TTL",[277,845,846],{},"~3 months (90 days)",[259,848,849,852],{},[277,850,851],{},"Cache key",[277,853,854],{},[110,855,856],{},"tmdb_id",[259,858,859,862],{},[277,860,861],{},"Trailer selection",[277,863,864,865,868,869,872],{},"Most recent official YouTube trailer (",[110,866,867],{},"type = \"Trailer\"",", ",[110,870,871],{},"official = true",")",[106,874,875,876,879],{},"Cache freshness is checked via the ",[110,877,878],{},"cached_at"," timestamp column. A record is also refreshed when required detail fields are still empty.",[120,881,883],{"id":882},"error-handling","Error Handling",[253,885,886,896],{},[256,887,888],{},[259,889,890,893],{},[262,891,892],{},"Status",[262,894,895],{},"Cause",[272,897,898,909,919],{},[259,899,900,904],{},[277,901,902],{},[110,903,295],{},[277,905,906,908],{},[110,907,281],{}," is missing or not a positive integer",[259,910,911,916],{},[277,912,913],{},[110,914,915],{},"404",[277,917,918],{},"TMDB returned no movie for that ID",[259,920,921,926],{},[277,922,923],{},[110,924,925],{},"500",[277,927,928],{},"TMDB API or Supabase failure",[930,931,932],"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);}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":131,"searchDepth":226,"depth":226,"links":934},[935,936,937,938,939,940,941],{"id":122,"depth":226,"text":123},{"id":136,"depth":226,"text":137},{"id":173,"depth":226,"text":174},{"id":250,"depth":226,"text":251},{"id":299,"depth":226,"text":300},{"id":812,"depth":226,"text":813},{"id":882,"depth":226,"text":883},"Fetch enriched movie metadata with Supabase-backed caching","md",null,{},{"icon":74},{"title":71,"description":942},"b8NLhfBwXwonLTfd8OSE92l0rT1_7e4TMxomgtXFp7w",[950,952],{"title":66,"path":67,"stem":68,"description":951,"icon":69,"children":-1},"Admin API-driven TMDB import that populates the Supabase movies table",{"title":76,"path":77,"stem":78,"description":953,"icon":79,"children":-1},"Main recommendation endpoint with per-user Supabase caching",1782138812845]