개요
이 프로젝트는 EBS 외국어 방송과 같은 라디오 스트리밍을 예약된 시간에 맞춰 자동으로 녹음하고, 이를 개인용 팟캐스트 RSS 피드로 변환해 주는 Python 기반의 시스템입니다.
Synology NAS나 개인 리눅스 서버 환경에서 Docker를 이용해 손쉽게 배포할 수 있도록 설계되었으며, 선호하는 팟캐스트 앱을 통해 편리하게 어학 학습을 지속할 수 있습니다.
저장소 정보
주요 기능
이 시스템은 단순한 녹음 기능을 넘어, 팟캐스트 클라이언트와의 연동성에 중점을 두고 개발되었습니다.
- 스마트 스케줄링: 환경 변수에 정의된 시간표를 기반으로 녹음 시간을 자동으로 계산하여 실행
- 전용 팟캐스트 피드: 녹음된 오디오 파일을 Apple Podcasts, Pocket Casts 등에서 구독 가능한 표준 RSS 피드로 제공
- Docker 기반 배포: 복잡한 의존성 설치 없이 Docker Compose를 통해 즉시 운영 환경 구축 가능
- 보안 및 인증: SECRET 키 설정을 통한 피드 접근 제어 및 파일 경로 난독화 지원
시스템 구성
- 스케줄러 (Systemd Timer & Check Script): 호스트 시스템의 리소스를 최소화하기 위해 상시 실행되는 데몬 방식 대신, 운영체제의 타이머를 활용합니다.
- 작동 방식: Systemd Timer가 매 분마다 트리거 되어 가벼운 체크 스크립트 실행
- 효율성: 녹음 시간이 아닐 때는 컨테이너가 실행되지 않아 시스템 리소스 점유율 0% 유지
- 녹음 서비스 (Recorder Service): 실제 라디오 스트림을 캡처하고 저장하는 핵심 컨테이너입니다.
- 자동 계산: 환경 변수에 설정된 프로그램 시간표를 분석하여 녹음 길이(Duration) 자동 산출
- 스트림 처리: FFmpeg를 활용하여 m3u8 스트림을 손실 없이 m4a 오디오 파일로 변환
- 보안: 파일명에 랜덤 해시를 적용하여 피드에 접근할 수 없는 외부인의 무단 다운로드 방지
- 피드 서비스 (Feed Service): 저장된 오디오 파일을 팟캐스트 표준 규격으로 송출하는 경량 웹 서버입니다.
- 실시간 생성: Bottle 프레임워크를 사용하여 요청 시점에 최신 파일 목록을 반영한 XML(RSS) 생성
- 성능 최적화: cachetools를 이용한 메모리 캐싱으로 다수의 요청에도 빠른 응답 속도 보장
- 스마트 분류: 프로그램 별칭(Alias)에 따라 개별 피드(channel)를 자동 분리하여 제공
설정 예시
사용자는 .env 파일에 녹음할 프로그램의 스트림 주소와 시간만 입력하면 됩니다. Docker 컨테이너는 기동 시 이 파일을 자동으로 마운트하여 읽어 들이므로, 별도의 코드 수정이나 이미지 재빌드 없이도 녹음 스케줄과 채널 정보를 즉시 시스템에 반영할 수 있습니다.
PROGRAM1=06:40-07:00|speak|EBS 입이 트이는 영어|https://ebsonair.ebs.co.kr/fmradiofamilypc/familypc1m/chunklist.m3u8
PROGRAM2=07:40-08:00|power|EBS Power English|https://ebsonair.ebs.co.kr/fmradiofamilypc/familypc1m/chunklist.m3u8
설정이 완료되면 Docker Compose를 통해 백그라운드 서비스로 실행합니다. 녹음된 파일은 자동으로 인덱싱 되며, http://example.com/radio/feed.rss 또는 http://example.com/radio/program/feed.rss 주소를 팟캐스트 앱에 등록하여 즉시 청취가 가능합니다.
주의 사항
이 도구는 오직 개인 학습 및 사적 이용만을 목적으로 개발되었습니다. 저작권법상 사적 복제 범위를 초과하여 녹음된 파일을 제3자와 공유하거나 영리 목적으로 사용하는 경우, 모든 법적 책임은 사용자 본인에게 있습니다.