Skip to content

feat: iOS YouTube 채널 연결 및 방송 송출 연동 #72

Description

@chaeyn

추가 설명

대상 및 범위

  • 대상: apps/ios
  • 목적: 사용자가 자신의 YouTube 채널을 연결하고, InnoLive 방송 중 YouTube로 송출을 시작·중지할 수 있게 한다.
  • 계약 영향: 기존 서버 API 및 WebRTC signaling을 사용하며, 요청·응답 필드는 변경하지 않는다.

연동할 API

1. YouTube 계정 연결

  • GET /auth/youtube/config
    • 인증 없이 호출한다.
    • 응답의 web_client_id를 GoogleSignIn-iOS의 serverClientID로, scopeadditionalScopes로 사용한다.
    • 404면 해당 서버 배포에 기능이 없으므로 YouTube 연결 UI를 숨긴다.
  • GoogleSignIn-iOS에서 YouTube scope 동의 후 serverAuthCode를 수집한다.
  • POST /auth/youtube/connect
    • Authorization: Bearer <InnoLive access token>
    • 본문: { "server_auth_code": "...", "code_source": "native" }
    • 성공 시 channel.id, channel.title을 저장·표시한다.
    • invalid_auth_code는 인가부터 다시 시작하고, youtube_channel_missing은 YouTube 채널 생성 안내를 표시한다.

2. YouTube 송출 제어

  • POST /sessions/{session_id}/stream/start
    • AuthorizationX-Session-Owner-Token을 모두 포함한다.
    • 본문: provider: "youtube", title, privacy.
    • 개발/테스트에서는 privacy: "private"를 기본으로 사용한다.
    • 계정 미연결, 영상 트랙 없음, 라이브 활성화 대기, 이미 송출 중 오류를 코드별로 안내한다.
  • POST /sessions/{session_id}/stream/stop
    • 동일한 인증 헤더를 사용한다.
    • YouTube 송출만 중지하며 InnoLive 방송과 카메라 연결은 유지한다.
  • GET /sessions/{session_id}
    • 시작 직후 2~3초 간격으로 폴링한다.
    • stream.status(idle/streaming/reconnecting/stopped), started_at, publisher_active, last_error, reconnect_attempts를 UI에 반영한다.

오류 및 UX 기준

  • 오류 응답은 error.code 중심으로 분기하고 request_id를 문의 대응용으로 표시한다.
  • live_streaming_blocked에서는 details.help_url을 열고, YouTube 최초 라이브 활성화에 최대 24시간이 걸릴 수 있음을 안내한다.
  • 시작 후 YouTube 라이브 반영은 약 14초, 중지 반영은 약 1분이므로 준비/재연결 상태를 명확히 표시한다.
  • 스트림 키·Google 토큰은 클라이언트에 노출하거나 저장하지 않는다.

서버 배포 대기 API (PR #89 병합·배포 후 연결)

  • GET /auth/streaming/accounts
    • 앱 재시작 후 계정 연결 상태를 서버 기준으로 복원한다.
    • provider, channel_id, channel_title, connected_at, reconnect_required를 처리한다.
  • DELETE /auth/streaming/accounts/{provider}
    • 설정의 계정 연결 해제에 사용한다.
    • 성공은 204 No Content이며 본문을 파싱하지 않는다.

완료 기준

  • iOS에서 YouTube 계정 연결, 채널명 표시, private 테스트 송출 시작·중지, 상태 폴링이 동작한다.
  • 방송 영상과 Opus 오디오가 WebRTC로 서버에 전달되고, 카메라/마이크 선택 및 방송 중 카메라 전환이 실제 캡처에 반영된다.
  • 서버 계정 조회/연결 해제 API는 PR #89가 프로덕션에 배포된 뒤 로컬 캐시 의존을 제거하고 연결한다.

Metadata

Metadata

Assignees

Labels

feat새 기능 개발

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions