{"version":3,"file":"fetcher.cjs","names":["headers","config","clientId","options","mergeWatchedWithRatings","user","watched","url","response","fetch","ratingData","json","traktIdToRatingMap","Map","rating","set","movie","ids","trakt","mergedData","movieHist","get","push","fetchMovies","isWatchlist","movieData","mapper","merged","error","message","console"],"sources":["../../src/main/fetcher.ts"],"sourcesContent":["import fetch from 'node-fetch';\nimport config from './config.js';\nimport type {\n  TraktMovieHistoryType,\n  TraktRatingsType,\n  TraktRatingMergedHistoryType,\n  LetterboxdHistoryEntityType,\n} from './types.js';\nimport mapper from './mapper.js';\n\n/**\n * HTTP headers to send with our request to trakt's api\n */\nconst headers = {\n  'Content-Type': 'application/json',\n  'trakt-api-version': '2',\n  'trakt-api-key': config.clientId,\n};\n\n/**\n * The fetch options object (only really needs headers)\n */\nconst options = {\n  headers,\n};\n\n/**\n * Fetch the ratings of a user and merge them with the movie history based on the movie's Trakt ID\n *\n * @param {string} user The username we're getting data for\n * @param {TraktMovieHistoryType} watched A list of movies that have been watched\n * @returns {Promise<TraktRatingMergedHistoryType>} Promise that resolves to Trakt movie data with merged rating\n */\nconst mergeWatchedWithRatings = async (\n  user: string,\n  watched: TraktMovieHistoryType,\n): Promise<TraktRatingMergedHistoryType> => {\n  const url = `https://api.trakt.tv/users/${user}/ratings/movies`;\n  const response = await fetch(url, options);\n  const ratingData = (await response.json()) as TraktRatingsType;\n  const traktIdToRatingMap = new Map<number, number>();\n\n  for (const rating of ratingData) {\n    traktIdToRatingMap.set(rating.movie.ids.trakt, rating.rating);\n  }\n\n  const mergedData: TraktRatingMergedHistoryType = [];\n\n  for (const movieHist of watched) {\n    const rating = traktIdToRatingMap.get(movieHist.movie.ids.trakt);\n    mergedData.push({ ...movieHist, ...(rating ? { rating } : {}) });\n  }\n\n  return mergedData;\n};\n\n/**\n * Fetches the user's history data from the trakt api\n * @param   {string}  user    The username we're getting data for\n * @param   {boolean}  isWatchlist  Whether to fetch the history or the watchlist, defaults to the history\n * @returns {Promise<Array<LetterboxdHistoryEntityType>>}    Promise that resolves to mapped Letterboxd data\n */\nconst fetchMovies = async (\n  user: string,\n  isWatchlist = false,\n): Promise<LetterboxdHistoryEntityType[]> => {\n  let url = `https://api.trakt.tv/users/${user}/watched/movies`;\n\n  if (isWatchlist) {\n    url = `https://api.trakt.tv/users/${user}/watchlist/movies`;\n  }\n\n  try {\n    const response = await fetch(url, options);\n    const movieData = (await response.json()) as TraktMovieHistoryType;\n\n    if (isWatchlist) {\n      return mapper(movieData, isWatchlist);\n    }\n\n    const merged = await mergeWatchedWithRatings(user, movieData);\n    return mapper(merged, isWatchlist);\n  } catch (error) {\n    const message = (error as Error).message ?? 'Unknown error';\n    console.error(message, error);\n    return [];\n  }\n};\n\nexport default fetchMovies;\n"],"mappings":";;;;;;AAAA;AACA;AAOA;AAAiC;AAEjC;AACA;AACA;AACA,MAAMA,OAAO,GAAG;EACd,cAAc,EAAE,kBAAkB;EAClC,mBAAmB,EAAE,GAAG;EACxB,eAAe,EAAEC,eAAM,CAACC;AAC1B,CAAC;;AAED;AACA;AACA;AACA,MAAMC,OAAO,GAAG;EACdH;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMI,uBAAuB,GAAG,OAC9BC,IAAY,EACZC,OAA8B,KACY;EAC1C,MAAMC,GAAG,GAAI,8BAA6BF,IAAK,iBAAgB;EAC/D,MAAMG,QAAQ,GAAG,MAAM,IAAAC,kBAAK,EAACF,GAAG,EAAEJ,OAAO,CAAC;EAC1C,MAAMO,UAAU,GAAI,MAAMF,QAAQ,CAACG,IAAI,EAAuB;EAC9D,MAAMC,kBAAkB,GAAG,IAAIC,GAAG,EAAkB;EAEpD,KAAK,MAAMC,MAAM,IAAIJ,UAAU,EAAE;IAC/BE,kBAAkB,CAACG,GAAG,CAACD,MAAM,CAACE,KAAK,CAACC,GAAG,CAACC,KAAK,EAAEJ,MAAM,CAACA,MAAM,CAAC;EAC/D;EAEA,MAAMK,UAAwC,GAAG,EAAE;EAEnD,KAAK,MAAMC,SAAS,IAAId,OAAO,EAAE;IAC/B,MAAMQ,MAAM,GAAGF,kBAAkB,CAACS,GAAG,CAACD,SAAS,CAACJ,KAAK,CAACC,GAAG,CAACC,KAAK,CAAC;IAChEC,UAAU,CAACG,IAAI,CAAC;MAAE,GAAGF,SAAS;MAAE,IAAIN,MAAM,GAAG;QAAEA;MAAO,CAAC,GAAG,CAAC,CAAC;IAAE,CAAC,CAAC;EAClE;EAEA,OAAOK,UAAU;AACnB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,MAAMI,WAAW,GAAG,OAClBlB,IAAY,EACZmB,WAAW,GAAG,KAAK,KACwB;EAC3C,IAAIjB,GAAG,GAAI,8BAA6BF,IAAK,iBAAgB;EAE7D,IAAImB,WAAW,EAAE;IACfjB,GAAG,GAAI,8BAA6BF,IAAK,mBAAkB;EAC7D;EAEA,IAAI;IACF,MAAMG,QAAQ,GAAG,MAAM,IAAAC,kBAAK,EAACF,GAAG,EAAEJ,OAAO,CAAC;IAC1C,MAAMsB,SAAS,GAAI,MAAMjB,QAAQ,CAACG,IAAI,EAA4B;IAElE,IAAIa,WAAW,EAAE;MACf,OAAO,IAAAE,eAAM,EAACD,SAAS,EAAED,WAAW,CAAC;IACvC;IAEA,MAAMG,MAAM,GAAG,MAAMvB,uBAAuB,CAACC,IAAI,EAAEoB,SAAS,CAAC;IAC7D,OAAO,IAAAC,eAAM,EAACC,MAAM,EAAEH,WAAW,CAAC;EACpC,CAAC,CAAC,OAAOI,KAAK,EAAE;IACd,MAAMC,OAAO,GAAID,KAAK,CAAWC,OAAO,IAAI,eAAe;IAC3DC,OAAO,CAACF,KAAK,CAACC,OAAO,EAAED,KAAK,CAAC;IAC7B,OAAO,EAAE;EACX;AACF,CAAC;AAAC,eAEaL,WAAW;AAAA"}