작품 · 02
B시기 · BTelly
서드파티 Bilibili Android TV / 차량용 클라이언트 —— 비공식·광고 없음. Kotlin + Koin으로 만든 듀얼 재생 코어, 탄막 댓글, 공강 도우미로 거실과 차안의 그 화면을 시청자에게 돌려준다.
저장소 보기 › Codeberg ›왜 만들었나
TV와 차량에서의 Bilibili 경험은 오랫동안 낮은 땅이었다. 공식 클라이언트는 리모컨과 차내 인터페이스를 “대충”으로 대하는 반면, 광고와 피드 소음은 그대로였다. 나는 그저 거실 소파 위에서, 그리고 출퇴근 한 시간 속에서, 조용히 내가 팔로우하는 사람이 무언가를 올렸는지 보고 싶었다. 서드파티 클라이언트의 의미는 결코 “해독”이 아니라, 시청자에게 속해야 할 화면을 시청자에게 돌려주는 것이었다.
어려움은 어디에 있는가
- 엔드포인트 고고학: 서드파티 클라이언트는 “API가 예고 없이 바뀌는” 세계에 산다. 팔로우 목록 인터페이스가 죽었을 때, 공개된 인터페이스 수집 저장소조차 비어 있었다——올바른 엔드포인트는 결국 다른 오픈소스 클라이언트의 소스에서 파내어졌고, 실제 응답에 맞춰 필드별로 교정됐다. 커버 필드가 실제로 무엇이라 불리는지, 페이지네이션 종료 표시를 누가 내리는지, 라이브 수가 어디서 오는지. 모두 실제 트래픽으로 검증했고, 추측이 아니다.
- 하나의 코드베이스에 두 가지 형태: 같은 십 피트 인터페이스도 의미는 다르다. TV는 리모컨 방향키에 의한 포커스 이동을 원하고, 차량용은 주행 중 생각 제로 조작을 원한다. 두 가지 인터랙션 철학이 하나의 저장소에 공존해야 한다.
- 워터마크와 서명: 서명은 README 안에만 머물게 해선 안 된다. 빌드 시점에 저자 신원과 저장소 출처를 결과물에 구워 넣는다——앱 안에서 보이고, 자체 검증된다. 이것은 서드파티 프로젝트가 이용자에게 지는 최소한의 정직함이다.
현재 상태
- 듀얼 재생 코어, 탄막 댓글, 공강 도우미——광고 없음, 피드 삽입 없음
- 「내 구독」라이브 페이지는 「방송 중 / 미방송」으로 그룹화. 방송 중은 전체 표시와 페이지네이션 로딩, 미방송은 회색 처리되어 개인 공간으로 바로 이동
- 앱 내 업데이트는 이중 채널(GitHub 메인 + Codeberg 예비), 메인 실패 시 자동 폴백
- Mac 빌드 머신이 서명된 결과물을 생산하고, GitHub Actions 출력은 로컬 인증서와 비트 단위로 일치
배운 것
남의 API 위에 사는 프로젝트를 유지하는 데 중요한 능력은 새 기능을 내는 것이 아니다——API가 등을 돌렸을 때 얼마나 빨리 다시 일어서는가다. 네트워크 층을 독립 모듈에 가두고, 엔드포인트 고고학의 과정을 기록으로 남기고, 서명을 문서가 아니라 결과물에 구워 넣는다. 그것들은 순조로운 날에는 모두 쓸데없어 보이고, API가 얼굴을 바꾸는 날에는 모두 생명줄이 된다. 또한 두 차례의 계정 정지가 가르쳐 준 것이 하나 있다. 미러 채널은 백업의 의식이 아니다——실제로 지나게 될 그 길이다.