블로그

유튜브 RSS가 채널마다 404를 낼 때

요약

  • 10월 30일 오후, 구독 채널 3개를 막 가져온 화면이 비어 있었습니다. 확인해 본 유튜브 RSS는 큰 채널까지 모두 404였어요.
  • 전에 받아 둔 채널은 API로 대신 받았지만, 처음 보는 채널은 대신 받지 않게 막아 둔 상태였습니다. 지어낸 채널 ID로 할당량을 쓰지 못하게 하려던 규칙이었어요.
  • 이제는 처음 보는 채널이 정말 있는지 1유닛으로 먼저 묻고, 있는 채널만 대신 받습니다. 그래도 받지 못하면 화면이 그렇다고 알려요.

Plainfeed는 고른 유튜브 채널의 새 영상만 추천과 쇼츠 없이 올라온 순서대로 보여주는 웹사이트예요. 새 영상 목록은 무료인 유튜브 RSS로 받고, RSS가 안 될 때만 그 목록을 유튜브 API로 대신 받습니다. 이번 글은 그 "RSS가 안 될 때"가 한꺼번에 온 날의 짧은 기록이에요.

무슨 일이 있었나

미리보기 사이트에서 구글 계정으로 구독 채널 3개를 가져왔는데, 타임라인에 아무것도 나오지 않았습니다. 서버 캐시를 보니 세 채널 모두 15:43과 15:46(한국 시간)에 "받지 못함"으로 적혀 있었어요.

15:50 무렵 맥에서 RSS 주소를 직접 열어 보니 그 세 채널뿐 아니라 구글의 개발자 채널 같은 큰 채널도 404였습니다. 채널 페이지는 정상으로 열렸고요. 16:08에 다시 열었을 때는 돌아와 있었습니다. 언제 시작해 언제 끝났는지는 정확히 모릅니다.

처음 있는 일은 아니었습니다. RSS 리더 Feeder의 도움말은 유튜브 피드 서버가 몇 시간씩 모든 피드에 404를 줄 때가 있다고 안내하고, Google AI 개발자 포럼에도 2025년 12월 말부터 RSS가 간헐적으로 404를 낸다는 사용자 글이 이어지고 있어요 (구글의 답은 없습니다).

왜 화면이 비었나

결론: 전에 받아 둔 채널은 버텼고, 처음 보는 채널만 비었습니다.

실제 사이트의 캐시에는 그때 받아 둔 채널이 40개 있었습니다. 이런 채널은 RSS가 실패해도 받아 둔 목록을 그대로 보여 주거나 API로 대신 받아요.

처음 보는 채널은 달랐습니다. 대신 받기를 하지 않고 1시간 동안 "받지 못함"으로 두었어요. 누가 지어낸 채널 ID를 잔뜩 보내도 할당량을 쓰지 못하게 하려던 규칙인데, 이런 장애 때는 막 처음 온 사람의 첫 화면을 1시간 동안 비워 버립니다. 이미 쓰는 사람에게는 맞고, 처음 온 사람에게는 틀린 규칙이었어요.

고친 것

결론: 처음 보는 채널은 있는지 먼저 묻고, 있는 채널만 대신 받습니다.

RSS가 실패한 처음 보는 채널들을 모아 channels.list에 한 번 묻습니다. 한 번에 여러 채널을 물어도 1유닛이고(이 사이트는 요청당 많아야 30채널), 유튜브가 돌려준 채널만 업로드 목록으로 대신 받아요(채널마다 1유닛). 지어낸 ID는 돌려주지 않으니 대신 받기 할당량이 새지 않고, 채널 이름과 사진도 같은 응답으로 채워져 따로 묻지 않아도 됩니다.

// 줄인 코드 (lib/youtube.js)
const unchecked = results.filter((r) => r.check);   // RSS가 실패한 처음 보는 채널
if (unchecked.length) {
  const found = await channelsList(unchecked.map((r) => r.id));   // 1유닛
  for (const r of unchecked) {
    if (!found.has(r.id) || fallbacks >= maxFallback) { r.dead = true; continue; }   // 1시간 뒤 다시
    fallbacks++;
    r.feed = await fetchUploads(r.id);   // 1유닛
  }
}

대신 받기는 이미 있던 상한을 그대로 따릅니다. 요청 한 번에 6채널(아는 채널과 합쳐서), 하루에 전체 1,000채널과 요청한 곳마다 200채널이에요(채널마다 1유닛). 있는지 묻는 1유닛은 처음 보는 채널의 하루 예산에서 셉니다.

결론: 받지 못한 채널이 있으면 화면이 그렇다고 말합니다.

전에는 하나도 받지 못해도 "새 영상이 없어요"가 떴습니다. 틀린 말이죠. 이제는 하나도 받지 못하면 그 문구 대신 아래 안내만 띄우고, 일부만 받지 못하면 그 개수를 알려 줍니다.

모든 채널을 받지 못했을 때 타임라인 위에 뜨는 안내. 유튜브에서 새 영상을 아직 받지 못했고, 잠시 뒤 저절로 다시 확인한다는 문장만 보인다.
하나도 받지 못했을 때. '새 영상이 없어요' 대신 이 안내만 보입니다.

드는 유닛

RSS가 실패했을 때 (처음 보는 채널만 있을 때) 전 지금
처음 보는 채널 3개 0유닛 (최대 1시간 빈 화면) 4유닛 (확인 1 + 대신 받기 3)
처음 보는 채널 30개 0유닛 (최대 1시간 빈 화면) 7유닛 (확인 1 + 대신 받기 6)
지어낸 채널 ID 30개 0유닛 1유닛 (확인만)

대신 받은 영상의 길이를 묻는 비용(50개에 1유닛, 6채널이면 2유닛)은 표에서 뺐습니다. 지어낸 ID는 장애가 없어도 RSS가 늘 404라서, 이제는 평소에도 그런 요청마다 1유닛이 듭니다. 처음 보는 채널의 하루 예산이 그 상한이에요.

하지 않은 것

마치며

무료 RSS에 기대는 구조라면 RSS가 통째로 멈추는 때를 먼저 생각해야 했습니다. 아는 채널만 챙기는 규칙은 이미 쓰는 사람의 화면만 지켜 주고 있었어요. 다음 글에서는 이런 한도들을 Cloudflare 무료 플랜 하나로 어떻게 맞추는지 적어 보겠습니다.

블로그 글 목록