안녕하세요

트위치 라이브 탐지 + 방송 기록 저장하기 본문

유튜브컨텐츠탐색-StelLife/Twitch API

트위치 라이브 탐지 + 방송 기록 저장하기

sakuraop 2023. 3. 24. 03:20

twitch api의 search/channels 를 이용하여 원하는 채널을 검색합니다.

/**
 * 채널이름을 query로 검색하여 live중인 채널을 반환
 * @param {string} query
 * @returns
 */
exports.getTwitchLiveChannelsData = async (query) => {
const twitch_channels_base_url = "https://api.twitch.tv/helix/search/channels";

  const headers = {
    Authorization: `Bearer ${process.env.REACT_APP_TWITCH_ACCESS_TOKEN}`,
    "Client-Id": `${process.env.REACT_APP_TWITCH_CLIENT_ID}`,
  };
  const params = {
    query,
    // live_only: true,
  };

  try {
    const request = await axios.get(`${twitch_channels_base_url}`, { headers, params });
    if (!request.data) {
      return [];
    }

    const liveChannel = request.data.data.filter((data) => validId.includes(data.id));
    if (liveChannel.length) {
      console.log("getSearchChannelsData");
      return liveChannel[0];
    }

    return [];
  } catch (error) {
    console.error("getSearchChannelsData", error);
    return [];
  }
};

live_history 배열에 방송 기록을 저장할 것입니다.

        const update = {
          $set: {
            id,
            display_name,
            is_live,
            thumbnail_url,
            title,
            live_history: [],
          },
        };

방송 기록을 저장하기 위한 전체 코드입니다.

/**
 * 트위치 라이브 정보 업데이트
 */
exports.updateTwitchLive = async (db) => {
  try {
    const twitchLivesCollection = await db.collection("twitch_lives");

    for (const searchQuery of searchQueries) {
      const liveData = await getTwitchLiveChannelsData(searchQuery);
      const currentTime = new Date().getTime();
      const { id, display_name, is_live, started_at, thumbnail_url, title } = liveData;
      const filter = { id };

      // started_at이 존재하면 duration 업데이트
      const existingHistoryItem = await twitchLivesCollection.findOneAndUpdate(
        { id, "live_history.started_at": started_at },
        { $set: { "live_history.$.duration": currentTime - new Date(started_at).getTime() } }
      );

      // 업데이트한 정보가 null이 아니라면 set으로 채널 정보만 갱신, 
      //업데이트한 값이 없고, started_at이 "" 이 아니라면 라이브 정보 추가
      let update;

      if (existingHistoryItem.value !== null) {
        update = { $set: { id, display_name, is_live, thumbnail_url, title } };
      } else {
        update = { $set: { id, display_name, is_live, thumbnail_url, title } };

        if (started_at !== "") {
          update.$addToSet = {
            live_history: {
              title,
              duration: currentTime - new Date(started_at).getTime(),
              started_at,
            },
          };
        }
      }

      await twitchLivesCollection.updateOne(filter, update);
    }
  } catch (error) {
    console.error(error);
  }
};

1. db에 연동합니다.

exports.updateTwitchLive = async (db) => {
  console.log("updateTwitchLive");
  try {
    const twitchLivesCollection = await db.collection("twitch_lives");

2. liveData를 api로 불러오고, filter는 id로 지정합니다.

    for (const searchQuery of searchQueries) {
      const liveData = await getTwitchLiveChannelsData(searchQuery);
      const currentTime = new Date().getTime();
      const { id, display_name, is_live, started_at, thumbnail_url, title } = liveData;
      const filter = { id };

3. 채널의 live_history 배열에서 일치하는 started_at 을 찾아 duration을 업데이트 합니다. 

      // started_at이 존재하면 duration 업데이트
      const existingHistoryItem = await twitchLivesCollection.findOneAndUpdate(
        { id, "live_history.started_at": started_at },
        { $set: { "live_history.$.duration": currentTime - new Date(started_at).getTime() } }
      );

=> duration은 현재 시간 - 방속 시작 시간으로 몇 분간 방송을 진행했는지에 대한 정보가 됩니다.

 

4.  삼항연산자로 started_at과 일치하는 값을 찾아 업데이트한 정보가 있는지 확인합니다.

      // 업데이트한 정보가 null이 아니라면 set으로 채널 정보만 갱신,
      // 업데이트한 값이 없고, started_at이 "" 이 아니라면 라이브 정보 추가
      let update;

      if (existingHistoryItem.value !== null) {
        update = { $set: { id, display_name, is_live, thumbnail_url, title } };
      } else {
        update = { $set: { id, display_name, is_live, thumbnail_url, title } };

        if (started_at !== "") {
          update.$addToSet = {
            live_history: {
              title,
              duration: currentTime - new Date(started_at).getTime(),
              started_at,
            },
          };
        }
      }

      await twitchLivesCollection.updateOne(filter, update);

=> 만일 업데이트 한 값이 있다면(null) ? 채널 데이터를 갱신하기만 합니다.

=> 업데이트한 값이 없고, started_at이 "" 이 아니라면 : 라이브 정보 추가