Java Library · 5 platforms · 1 API · Apache OkHttp + Gson

5개 플랫폼
채팅과 후원을
하나의 API로

치지직 · 씨미 · 숲(SOOP, 구 아프리카TV/아프리카티비) · 유튜브 · 투네이션 — 플랫폼마다 다른 WebSocket 프로토콜, 후원 단위, 인증 방식을 stream4j가 단일 StreamChat 인터페이스로 통합합니다. URL만 넣으면 끝, 자동 재연결도 내장.

치지직
Chzzk · chat · don
씨미
CiMe · chat · don
SOOP · 구 아프리카TV · chat · don
유튜브
YouTube · chat · don
투네이션
Toonation · — · don
QUICK START

URL을 넣고,
이벤트를 받습니다.

stream4j의 핵심 사용법은 한 화면에 들어옵니다. Builder에 URL을 추가하고, Listener를 달고, connectAll(). 나머지는 라이브러리가 처리합니다 — WebSocket 핸드셰이크, 후원 파싱, 통화 환산, 재연결까지.

01
→ +
URL 추가
5개 플랫폼 URL을 Builder에 던져넣기
02
Listener 등록
onChat / onDonation 두 메서드 구현
03
connectAll()
전부 동시에 WebSocket 연결, 끝
1StreamChat chat = new StreamChatBuilder()
2 .add("https://chzzk.naver.com/live/924a636224c9203259af46ad7d8b70ca")
3 .add("https://ci.me/@lyn")
4 .add("https://play.sooplive.co.kr/tjrdbs999/292536969")
5 .add("https://www.youtube.com/watch?v=Qv6o6WACJ60")
6 .add("https://toon.at/widget/alertbox/abc123")
7 .withListener(new StreamChatEventListener() {
8 @Override
9 public void onDonation(Donation donation) {
10 System.out.println("[" + donation.platform() + "] "
11 + donation.nickname() + ": "
12 + donation.formattedAmount());
13 }
14 
15 @Override
16 public void onChat(DonationPlatform platform, String channelId,
17 String nickname, String message) {
18 System.out.println("[" + platform + "] " + nickname + ": " + message);
19 }
20 })
21 .build();
22 
23chat.connectAll();
01
L2–6
5개 URL — Builder가 자동으로 플랫폼 감지
02
L7–21
단일 Listener로 모든 플랫폼 이벤트 처리
03
L23
전체 연결을 동시에 시작 — 비동기 처리
UNIFIED STREAM

5개 채널이
하나의 콜백으로.

플랫폼마다 따로 연결할 필요 없이, onChat()onDonation() 두 콜백에서 모두 받습니다. 아래는 시뮬레이션된 통합 이벤트 스트림 — 실제로 동작할 때의 구조를 그대로 보여줍니다.

// INPUT — URLs
CHZZKchzzk.naver.com/live/924a...
CIMEci.me/@lyn
SOOPplay.sooplive.co.kr/tjrdbs999
YOUTUBEyoutube.com/watch?v=Qv6o...
TOONATIONtoon.at/widget/alertbox/abc
▼   STREAM4J   ▼
// OUTPUT — unified events
LIVE — onChat() / onDonation()
[CHZZK]
minki_dev:빌더 패턴 깔끔함
[CHZZK]
삼겹살왕:이게 그 라이브러리인가요?
[CHZZK]
라이브러리덕후:ㅋㅋㅋㅋㅋㅋ 미쳤다
[CHZZK]
minki_dev:통합 채팅 진짜 편해보임
[CHZZK]
별빛스트리머:오늘도 잘 보고 갑니다
[CHZZK]
lyn_official:이게 그 라이브러리인가요?
CORE FEATURES

겉보기는 단순,
내부는 견고.

stream4j는 chzzk4j에서 출발하여 4개 플랫폼을 더한 라이브러리로, 실제 운영 환경에서 발생하는 끊김·토큰 만료·정책 변경을 견디도록 설계되었습니다.

/ 01

URL만 넣으면 자동 감지

치지직, CiMe, SOOP, YouTube, 투네이션 — URL을 그대로 넣으면 어떤 플랫폼인지 stream4j가 알아서 판별합니다. Raw ID 방식도 지원합니다.

/ 02

통합 후원 모델 (Donation)

치즈, 별풍선, 빔, 슈퍼챗을 모두 단일 Donation record로. nickname, message, amountInKRW, formattedAmount까지 한 번에.

/ 03

안정적인 연결 유지

OkHttp ManagedWebSocket 기반. 지수 백오프 재시도, idle timeout 감지, 비복구성 에러 즉시 중단까지 내장되어 있습니다.

/ 04

방송 종료 자동 감지

치지직 폴링, CiMe LIVE_ENDED 이벤트, SOOP svc_SETBJSTAT=0 패킷 등 플랫폼별 방식을 라이브러리가 추상화합니다.

/ 05

원화 환산 내장

치즈, 빔, 별풍선, USD를 KRW로 자동 환산. CurrencyUtils가 통화 단위를 처리하므로 후원 합산이 간단합니다.

/ 06

CiMe 토큰 자동 갱신

JWT 만료 5분 전 자동 갱신, 메시지 ID 기반 중복 제거. 새 연결을 먼저 열고 구 연결을 닫아 메시지 유실을 막습니다.

ARCHITECTURE

플랫폼별 차이를
추상화하는 레이어.

각 플랫폼은 고유의 WebSocket / 폴링 / Webhook 방식으로 동작합니다. stream4j는 이 차이를 흡수하고 통합 이벤트로 정규화합니다.

CHZZK WS · 폴링
CIME WS · JWT
SOOP WS · Selenium
YOUTUBE HTTP polling
TOONATION WS · alertbox
Core
Layer
URL ResolverManaged WebSocketToken RefresherDonation NormalizerCurrency UtilsReconnect Strategy
v1.0.1
MIT
onChat(platform, channelId, nickname, message) 통합 채팅 이벤트 — 어떤 플랫폼에서 왔든 동일한 시그니처
onDonation(Donation donation) type · status · amountInKRW · formattedAmount 포함된 단일 record
PLATFORM MATRIX

지원 범위.

플랫폼별 기능 지원과 인증 요구사항. 투네이션은 alertbox 기반 후원 알림 전용으로, 채팅과 방송 종료 감지는 제공하지 않습니다.

PLATFORM
CHAT
DONATION
END DETECT
AUTH
DETECT METHOD
치지직 Chzzk
선택
30초 폴링
씨미 CiMe
불필요
LIVE_ENDED 이벤트
SOOP · 구 아프리카TV
선택
svc_SETBJSTAT=0
유튜브 YouTube
불필요
continuation 부재
투네이션 Toonation
불필요
idle 60s timeout
DONATION MODEL

치즈도, 별풍선도, 슈퍼챗도 — 같은 record.

플랫폼이 다르면 후원 단위도, 메시지 구조도 다릅니다. stream4j는 이를 단일 Donation record로 정규화하고, 원화 환산까지 자동으로 처리합니다.

Donation

record · io.github.bbobbogi.stream4j

platform() DonationPlatform
type() DonationType
status() DonationStatus
nickname() String
message() String
amount() int
currencyCode() String — CHEESE, BEAM, BALLOON, KRW...
amountInKRW() int — 원화 환산
formattedAmount() String — "1000치즈 (1000원)"
anonymous() boolean
raw() Object — 플랫폼별 원본
DONATION TYPE
CHATVIDEOMISSIONPARTYSUBSCRIPTIONSUBSCRIPTION_GIFT
DONATION STATUS
SUCCESSPENDINGAPPROVEDREJECTEDEXPIRED
RAW ID USAGE
RawId.java
new StreamChatBuilder()
        .add("924a636224c9203259af46ad7d8b70ca", DonationPlatform.CHZZK)
        .add("tjrdbs999", DonationPlatform.SOOP)
        .add("@lyn", DonationPlatform.CIME)
        .add("alertbox_key", DonationPlatform.TOONATION)
        .add("@jtbc_news", DonationPlatform.YOUTUBE)
        .withListener(listener)
        .build();
USE CASES

이런 곳에
씁니다.

통합 채팅 뷰어부터 마인크래프트 서버 연동, 디스코드 봇, OBS 오버레이, TTS까지 — stream4j 위에 올라가는 실제 시나리오들입니다.

[CHZZK]코드몽키ㅋㅋㅋ
[SOOP]라이브덕후오늘 화이팅
[YOUTUBE]minki_dev굿굿
[CIME]lyn_fan사랑해요
VIEWER / 01

통합 채팅 뷰어

여러 플랫폼의 채팅을 한 화면에 모아보는 데스크탑/웹 뷰어

SCENE01 / 07
CONFIG

필요한 만큼
세밀하게.

기본값으로 바로 쓸 수도 있고, 운영 환경에 맞춰 조정할 수도 있습니다 — SOOP 로그인, YouTube 폴링 간격, 자동 재연결, 디버그 로그.

Builder.java
new StreamChatBuilder()
        .add("https://...")
        .withSoopCredentials("아이디", "비밀번호")    // SOOP 로그인 (선택)
        .withYouTubePollInterval(3000)             // YouTube 폴링 간격 (기본 5000ms)
        .withAutoReconnect(true)                   // 자동 재연결
        .withDebugMode()                           // 디버그 로그
        .withListener(listener)
        .build();
INSTALL

설치는 한 줄.

Maven Central에 배포되어 있습니다. io.github.bbobbogi:stream4j. Java 11 이상이 필요합니다.

build.gradle.kts
repositories {
    mavenCentral()
}

dependencies {
    implementation("io.github.bbobbogi:stream4j:1.0.1")
}
pom.xml
<dependency>
    <groupId>io.github.bbobbogi</groupId>
    <artifactId>stream4j</artifactId>
    <version>1.0.1</version>
</dependency>