TMDB API 串接筆記

turned on projector

一些關於TMDB API的內容紀錄。

API v3 v4 到底用哪一個?

image

直接先說結論:如果沒有需要用lists功能的話,就不要用v4,因為v4目前完整的只有 lists 功能。

如果要用lists的話,就得v3 v4混合用了。

React Native 權限驗證流程

一、先取得 request_token,post body 指定重定向 URL

const getRequestToken = async () => {
  try {
    const data = await request<
      GetRequestTokenResponse,
      GetRequestTokenBody
    >('post', API_ROUTE.requestToken, {
      data: { redirect_to: 'myapp://' },
    })
    if (data.success) {
      updateRequestToken(data.request_token)
      return data.request_token
    }
    return null
  } catch (error) {
    return null
  }
}

關於 deep links 可以參考 expo docs Overview of Linking, Deep Links, Android App Links, and iOS Universal Links 以及 Linking into your app

二、跳轉至TMDB登入 https://www.themoviedb.org/auth/access?request_token={request_token} 後重定向回APP

useEffect(() => {
  const handleUrl = async (url: string) => {
    // 重定向後請求 access token
  }

  Linking.addEventListener('url', (event) => handleUrl(event.url))

  return () => {
    Linking.removeAllListeners('url')
  }
}, [requestToken])

const onLogin = async () => {
  const request_token = await getRequestToken()
  if (!request_token) return
  Linking.openURL(
    `https://www.themoviedb.org/auth/access?request_token=${request_token}`,
  )
}

三、使用 request_token 獲取 access_token

useEffect(() => {
  const handleUrl = async (url: string) => {
    await createAccessToken(requestToken)
  }

  Linking.addEventListener('url', (event) => handleUrl(event.url))

  return () => {
    Linking.removeAllListeners('url')
  }
}, [requestToken])

const createAccessToken = async (request_token: string) => {
  try {
    const data = await request<
      CreateAccessTokenResponse,
      CreateAccessTokenRequest
    >('post', API_ROUTE.accessToken, { data: { request_token } })
    if (data.success) {
      updateAccessToken(data.access_token)
    }
  } catch (error) {
    console.error(error)
  }
}

四、用 access_token 獲取 v3 的 session_id

const createAccessToken = async (request_token: string) => {
  try {
    const data = await request<
      CreateAccessTokenResponse,
      CreateAccessTokenRequest
    >('post', API_ROUTE.accessToken, { data: { request_token } })
    if (data.success) {
      updateAccessToken(data.access_token)
      await createSession(data.access_token)
    }
  } catch (error) {
    console.error(error)
  }
}

const createSession = async (access_token: string) => {
  try {
    const data = await request<
      CreateSessionResponse,
      CreateSessionRequest
    >('post', API_ROUTE.createSession, { data: { access_token } })
    if (data.success) {
      updateSessionId(data.session_id)
    }
  } catch (error) {
    console.error(error)
  }
}

account_id

image 2

v3 account API 其實可以選擇只傳 account_id 或者 session_id 其中一種,這兩種方式拿到的資料都是一樣的。

  • https://api.themoviedb.org/3/account/account_id/favorite/movies
    • params: session_id
  • https://api.themoviedb.org/3/account/{account_id}/favorite/movies

順帶一提,docs 裡面 account_id 型別寫的是int32,但其實傳 string 也可以,別被這混肴了。

TMDB API 已知的 bug

以下是目前已知未處理的bug:

  1. list-remove-items不會清除票房、評分和時長
  2. list-create, public 設為 false 無效,只有編輯清單時才能設置成 private
guest

0 評論
最舊
最新 最多投票
內聯回饋
查看全部評論