
Spritz GitHub 저장소는 동영상을 로컬에서 재생하거나 AirPlay, Chromecast/Google Cast, DLNA로 TV에 보내는 macOS 미디어 플레이어다. 파일과 수신 기기의 지원 형식을 확인해 원본을 그대로 보내거나 필요한 부분만 변환한다고 소개한다.
웹사이트는 oolab-labs.github.io/spritz이며, 앱은 릴리스 페이지에서 받을 수 있다. 현재 버전은 릴리스 후보인 2.0.0-rc.16이다. macOS 11 이상을 실행하는 애플 실리콘(arm64) 맥이 필요하며, 인텔 맥에서는 지원되지 않고 Rosetta로도 실행되지 않는다. 사용 전 상태와 알려진 제한을 확인해야 한다.
Spritz는 libmpv로 로컬 재생을 하거나 AirPlay 2, Chromecast/Google Cast, DLNA를 통해 영상을 전송한다. 제작자는 앱이 사용자의 기기와 네트워크에서 동작하며 계정이 필요 없고 콘텐츠를 업로드하거나 원격 측정을 하지 않는다고 설명한다. GitHub에 접속하는 경우는 사용자가 Help → Check for Updates…를 선택할 때뿐이며, 자동으로 업데이트를 확인하거나 내려받지 않는다. 앱에는 미디어·카탈로그·색인이 없고, 파일과 링크, 스트림은 사용자가 제공한다.
재생과 TV 전송
HEVC, AV1, VP9, HDR, 다중 오디오 트랙과 자막을 포함한 다양한 파일을 libmpv로 재생한다. 수신 기기에 따라 전송 경로와 변환을 정한다. 호환되는 TV에는 4K HEVC/HDR10 원본을 그대로 보낼 수 있고, 1080p 수신 기기에는 필요한 변환을 적용한다. TV가 영상은 재생할 수 있지만 오디오는 지원하지 않으면 오디오만 변환하며, 서라운드 음향은 스테레오로 축소하지 않고 유지한다고 설명한다.
자막은 영상에 포함된 자막과 외부 자막 파일, ASS 형식을 지원한다. 수신 기기가 이미지 기반 자막을 표시하지 못하면 영상에 자막을 입혀 전송할 수 있다. OpenSubtitles 검색과 Whisper를 이용한 자막 생성도 선택 기능으로 제공한다. 이어보기, 재생목록과 대기열, 작품별 오디오·자막 언어 설정, 키보드 단축키, Anime4K 업스케일링 기능도 있다.
미디어는 파일이나 폴더, 사용자의 네트워크 공유와 외장 드라이브, 접근 권한이 있는 직접 미디어 URL에서 열 수 있다. yt-dlp로 해석하는 스트리밍 사이트 페이지, .m3u, .m3u8, .pls 재생목록과 사용자가 구독하는 IPTV 목록, 직접 제공한 토렌트 파일과 마그넷 링크도 지원한다. Spritz에는 이러한 콘텐츠를 찾는 검색·색인·디렉터리나 내장 소스가 없다. 토렌트 기능은 Linux·BSD 이미지, 크리에이티브 커먼즈 및 퍼블릭 도메인 영화, Internet Archive 자료, 게임·소프트웨어 배포물과 독립 창작물 등 합법적으로 배포된 자료를 대상으로 한다고 안내한다. 자세한 내용은 허용되는 사용에 있다.
AirPlay 2는 Apple TV와 AirPlay 2 지원 TV·수신기에 H.264/SDR 최대 1080p로 전송한다. 4K/HDR 영상은 낮은 해상도와 SDR로 변환되며 AC3/E-AC3 서라운드 오디오는 통과시킨다. Chromecast/Google Cast는 기기별로 전송 방식을 협상한다. 최신 4K TV에는 4K HEVC와 HDR10을 전송하고, 구형 1080p 동글에는 H.264로 변환한다. 오디오만 지원하는 Cast 기기는 제외된다. DLNA/UPnP는 LG webOS, Samsung, Sony, Vizio, TCL, Philips 스마트 TV와 독립형 DLNA 렌더러 등에서 사용할 수 있으며, 원본 파일을 그대로 보내는 방식이다.
4K HDR에는 전송 메뉴에서 native 4K/HDR (best)로 표시되는 DLNA 경로를 권장한다. AirPlay는 1080p H.264/SDR로 제한된다. Dolby Vision은 그대로 전달되지 않으며 HDR10/HDR10+는 전달된다. Dolby Vision 영상은 HDR10을 지원하는 TV에서 HDR10 기반 레이어로 재생된다. 개발·테스트는 주로 Chromecast 내장, AirPlay 2, DLNA를 함께 지원하는 LG NANO80T6A에서 이뤄졌다.
설치 및 사용
각 릴리스에는 애플 실리콘용 Mac 앱 .dmg와 .zip, LG TV용 Spritz Receiver .ipk가 들어 있다. .dmg를 열어 Spritz를 Applications로 드래그한다. 먼저 Mac 앱을 설치해야 TV와 페어링할 수 있다. Receiver는 선택 사항이며, 일반 DLNA·Chromecast·AirPlay 전송에는 TV에 별도 앱을 설치할 필요가 없다.
앱은 임시 서명(ad hoc signing)만 되어 있고 공증(notarization)은 되지 않았다. 유료 Apple Developer ID를 사용하지 않아 다운로드한 앱을 처음 열 때 macOS가 실행을 막을 수 있다. 터미널을 이용하는 방법은 다음과 같다.
xattr -dr com.apple.quarantine /Applications/Spritz.app
그 뒤 평소처럼 Spritz를 연다. macOS 15(Sequoia) 이상에서는 앱을 한 번 열어 경고를 닫은 뒤 System Settings → Privacy & Security의 Security 항목에서 Spritz 옆 Open Anyway를 누르고 암호나 Touch ID로 확인한다. 이 버전에서는 마우스 오른쪽 버튼을 눌러 Open을 선택하는 방법이 더는 작동하지 않는다. macOS 11~14에서는 Spritz를 오른쪽 클릭해 Open → Open을 선택한다. 이 안내는 Apple이 문서화한 동작을 따른 것이며, Spritz를 한 번도 실행한 적 없는 맥에서는 아직 시험하지 않았다고 저장소가 밝힌다. 문제가 다르면 이슈를 등록할 수 있다.
파일을 창에 끌어다 놓거나 Finder에서 파일을 오른쪽 클릭해 Open With → Spritz를 선택하면 로컬 재생을 시작한다. Spritz는 일반적인 동영상 확장자에 연결되며 기본 앱으로 지정할 수도 있다. 미디어 라이브러리로 가져오거나 파일을 분류·업로드하지 않는다. 주요 키는 Space 재생·일시정지, ←/→ 탐색, ↑/↓ 음량, F 전체 화면, PgUp/PgDn 챕터 이동, ,/. 프레임 이동, Ctrl+D 진단 오버레이다.
TV로 보내려면 Mac과 TV를 같은 Wi-Fi나 유선 LAN에 연결하고 전송 버튼을 누른 뒤 기기 검색을 기다려 선택한다. Spritz는 전송 경로를 정하고 선택한 경로를 표시한다. 미디어는 인터넷을 거치지 않고 LAN에서 전송된다. 기기가 검색되지 않으면 System Settings → Privacy & Security → Local Network에서 Spritz의 접근 권한을 확인한다. 이미 허용된 상태라도 권한을 껐다 켜 보라고 안내한다. 기기가 검색 결과에 계속 나타나지 않으면 시작 화면이나 Cast/AirPlay 메뉴의 Retry discovery를 사용한다. Cast와 DLNA는 검색 결과를 따로 표시하며, AirPlay 기기는 macOS 선택기에 표시된다. TV에서 Spritz Receiver를 사용하는 경우 Receiver를 열어야 한다. 스스로 검색 정보를 알리지 않는 TV는 Settings → Manual TV addresses에서 IP 주소로 추가할 수 있다.
URL 열기 기능은 직접 미디어 링크, yt-dlp가 해석하는 스트리밍 사이트 페이지, 재생목록 파일, 사용자가 제공한 마그넷 링크나 .torrent를 연다. 토렌트는 내려받는 동안 재생하며 현재 시청 중인 부분을 우선한다. 토렌트 HTTP 서버는 루프백 주소에서 선택한 파일만 제공한다. TV는 LAN 서버의 토큰 범위 프록시를 통해 해당 파일을 가져오며, 토렌트 서버는 파일 목록을 공개하거나 브라우저 출처 요청을 받지 않는다.
토렌트 오류는 사용자가 닫을 때까지 화면에 남는다. 스트림 상태에는 선택한 파일의 다운로드 진행률과 대략적인 버퍼 여유 시간이 표시된다. 선택한 파일이 저장 공간에 들어가지 않으면 경고하며, 여유 공간이 1 GiB 아래로 떨어지면 다운로드를 멈춘다. 새 캐시 디렉터리에는 충돌 복구를 위한 프로세스 소유권 정보가 기록된다. 기존의 표시되지 않은 캐시 디렉터리는 삭제하지 않고 보존한다.
포함 자막과 외부 자막을 자동으로 찾으며 영상 옆의 Movie.en.srt 파일이나 Subs/ 폴더도 처리한다. 수신 기기가 표시하지 못하는 이미지 기반 자막은 영상에 입혀 전송한다. 자막이 없는 파일에는 OpenSubtitles 검색과 Whisper 생성 기능을 사용할 수 있다.
LG webOS용 Receiver
Spritz Receiver는 LG webOS TV에서 실행되는 작은 웹 앱으로 Mac에서 보낸 영상을 재생한다. TV 리모컨으로 오디오 언어를 바꾸거나 자막을 고르는 등 일반 전송 방식에서 충분히 지원하지 않는 기능을 위해 제공한다. LG Content Store에는 없으며 개발자 앱으로 설치해야 한다.
설치하려면 TV에서 LG Developer Mode 앱을 설치하고 무료 LG 개발자 계정으로 로그인해 Developer Mode를 켠다. 릴리스의 .ipk 파일을 LG webOS CLI의 ares-install 명령이나 dev-manager-desktop 같은 도구로 설치한다. Developer Mode 세션은 만료된다. 처음에는 세션이 50시간이었으며, LG는 현재 최대 1000시간이라고 문서화했다. 세션이 끝나면 TV에서 개발자 앱이 제거되므로 Developer Mode 앱에서 세션을 연장하거나 Receiver를 다시 설치해야 한다. 자세한 내용은 LG 문서를 참고한다.
페어링은 TV 한 대를 Mac 한 대에 연결한다. TV에서 Spritz Receiver를 열면 네트워크에서 Spritz를 찾아 4자리 코드를 표시한다. 사용자는 TV가 아니라 Mac의 Spritz에서 홈 화면이나 전송 메뉴의 Devices 항목에 코드를 입력한다. 코드는 5분마다 새로 바뀌며 남은 시간이 표시된다. 코드를 다섯 번 잘못 입력하면 페어링이 취소된다. TV의 대기 화면에서 Pair again을 누르면 새 인증 정보가 발급되고, Change Mac을 선택하면 다른 Mac을 지정할 수 있다. TV 연결 해제는 Mac에서 Forget을 선택해 처리한다.
Receiver를 재설치하거나 업데이트하면 TV의 식별 정보가 바뀌어 다시 페어링해야 할 수 있다. Mac에는 마지막으로 확인된 시각과 함께 이전 TV 항목이 오프라인 중복 항목으로 남을 수 있으므로 오래된 항목을 Forget으로 지운다. Developer Mode 세션 만료 때 앱이 제거되는 점도 유의해야 한다.
TV가 Mac을 찾지 못하면 먼저 TV가 연결된 네트워크를 검색한 뒤 192.168.1.x, 192.168.0.x, 10.0.0.x, 10.0.1.x 등 흔한 가정용 주소 범위를 짧게 검색한다. 게스트 네트워크나 별도 VLAN, 일반적이지 않은 주소 범위에서는 Mac을 찾지 못할 수 있으므로 두 기기를 같은 네트워크에 연결해야 한다. 검색에 약 1분이 걸릴 수 있다. 검색 결과가 없으면 TV에 Can't find Spritz와 Mac 주소 입력란이 표시되며, 주소는 Mac 앱의 Devices에서 확인한다.
Receiver는 LG 55NANO80T6A 한 대에서 시험했다. Receiver 0.3.2는 webOS 펌웨어 33.31.61에서 검색, 주소 직접 입력, 페어링, 코드 갱신과 다시 페어링, 로컬 파일 및 스트리밍 토렌트 재생, Mac과 TV 메뉴 양쪽에서의 오디오·자막 전환을 시험했다. Receiver 0.4.0은 같은 TV의 webOS 24(펌웨어 33.31.75)에서 Mac 코드 입력란을 통한 페어링, 화면 표시 시작·종료 시각, 실행 아이콘과 시작 화면, 이전 버전에서 멈췄던 위치부터 전송을 시작하는 동작을 확인했다. TV 웹 인스펙터와 Mac으로 조작했으며 사람이 리모컨을 직접 들고 시험한 것은 아니다. 다른 모델과 webOS 버전은 시험하지 않았다. Receiver와 Mac 앱은 같은 버전끼리 사용할 것을 전제로 한다. Devices에는 Receiver 버전이 표시되고 구버전 TV에는 알림이 뜨지만, Mac 앱이 Receiver를 자동 업데이트하지는 않는다.
알려진 제한과 시험 범위
Spritz는 한 사람이 Mac 한 대와 TV 한 대에서 만들고 시험한 릴리스 후보이며, 일상적으로 작동하지만 미완성된 부분이 있을 수 있다고 안내한다. macOS 11 이상과 애플 실리콘이 필요하다. libmpv 0.41.0의 CoreAudio 출력에는 일부 출력 장치에서 시작에 실패할 때 장치 변경 감시자가 해제된 메모리를 가리키는 버그가 있다. Sony WH-1000XM5 같은 Bluetooth 헤드폰에서 unable to set the input channel layout… -50 오류가 기록되는 사례가 있으며, 독립 실행형 mpv에서도 같은 문제가 발생한다. 이후 macOS에서 오디오 장치가 추가되거나 제거되면 앱이 충돌할 수 있다.
rc.4부터는 mpv의 AVFoundation 출력을 먼저 시작하고 CoreAudio는 대체 경로로 남겨 이 문제를 피한다. 기존 버전은 오디오 장치를 추가·제거할 때 매번 충돌했고, rc.4는 재생 중 CoreAudio 장치를 만들고 제거하는 반복 시험을 통과했다고 설명한다. 다만 libmpv는 여전히 0.41.0이므로 AVFoundation을 시작하지 못해 CoreAudio를 사용하면 기존 문제가 다시 나타날 수 있다. mpv 오류는 ~/Library/Application Support/Spritz/mpv.log에 저장되며 충돌 보고에 첨부할 수 있다.
앱은 공증되지 않았다. 첫 실행 방법은 설치 안내를 참고해야 하며, Apple이 검증한 빌드인 것처럼 재배포해서는 안 된다. 번들에 포함된 yt-dlp에는 JavaScript 런타임이 없어 YouTube의 일부 형식이 나타나지 않을 수 있다. LG NANO80T6A에서는 rc.11부터 Google Cast가 작동한다. 그 전에는 자막이 있는 영화에서 충돌하고 TV가 라이브 스트림에서 멈추는 문제가 있었다. 영화는 전송 중 변환되므로 탐색하거나 오디오·자막을 바꾸면 가장 가까운 키프레임부터 다시 전송되고 몇 초 뒤로 돌아갈 수 있다. 다른 Chromecast 기기는 시험하지 않았다. 번들 ffmpeg는 GPL 빌드다. 라이선스는 라이선스 안내에 있다.
하드웨어 시험을 통과하지 않아 아직 입증되지 않은 항목도 있다. 매우 큰 리먹스 파일을 처음부터 재생할 때 첫 화면까지 오래 걸릴 것으로 예상되지만 확인하지 않았다. 개발 중 HDMI 연결에서 TV를 재부팅해야 하는 영상 정지가 한 번 있었으나 원인은 밝혀지지 않았다. 영화 전체에서 화면·소리·자막의 동기화가 눈으로 보아 유지되는지도 자동 검사가 TV 플레이어 상태를 읽을 뿐 화면과 소리를 직접 확인하지 못해 검증되지 않았다. Spritz를 한 번도 실행하지 않은 Mac에서의 첫 실행 절차도 아직 시험하지 않았다. 영화 중간 위치에서 AirPlay를 처음 시작했을 때 한 번 Cannot Decode가 표시됐고 재시도는 성공했으나 원인은 파악하지 못했다.
AirPlay 전송을 중단해도 TV는 Spritz를 종료하거나 TV 리모컨으로 AirPlay 화면을 벗어날 때까지 AirPlay 화면에 남는다. macOS는 재생은 끝내지만 TV 연결은 유지한다. Mac에서 재생을 이어가면 TV가 재생하던 위치부터 시작한다.
4K/HDR 전송은 DLNA가 안정적인 경로다. 원본을 변환하지 않고 TV가 4K HEVC, HDR10 또는 HDR10+를 직접 디코딩한다. 호환 TV에서는 Chromecast가 4K HEVC와 HDR10을 기본 재생한다. AirPlay는 1080p H.264/SDR만 지원해 4K/HDR을 낮춘다. 번들 ffmpeg에는 zscale과 tonemap이 포함돼 HDR을 단순히 평평하게 만드는 대신 적절히 톤 매핑하지만, 재인코딩하지 않는 DLNA가 4K HDR에는 더 나은 경로라고 설명한다. Dolby Vision은 그대로 전달되지 않으며, 일부 4K Dolby Vision 파일은 엄격한 DLNA TV에서 file cannot be recognized 오류로 거부된다. 이 문제는 작업 중이다.
LG NANO80T6A에서 로컬 1080p·4K 파일과 스트리밍 토렌트를 대상으로 Mac과 TV에서 오디오·자막 전환을 시험했다. Spritz Receiver에서는 Mac과 TV 양쪽에서 전환할 수 있다. AirPlay 2에서는 Mac에서 가능하며 TV 리모컨은 해당 없음이다. Google Cast는 Mac에서 가능하지만 다시 전송한다. DLNA에서는 TV가 원본 파일을 재생하므로 Mac에서 전환할 수 없고 TV 메뉴와 리모컨으로 조작한다. 아직 내려받는 중인 토렌트에서는 자막·탐색·트랙 변경이 이미 받은 부분에만 적용된다. 느린 토렌트에서는 AirPlay 준비에 약 40초가 걸린다.
포함된 텍스트 자막과 외부 SRT는 잘 작동한다고 설명한다. 이미지 기반 PGS/VOBSUB와 스타일이 적용된 ASS는 수신 기기가 렌더링하지 못할 때 번들 ffmpeg의 libass를 이용해 영상에 입힐 수 있지만, 이 경로는 다른 기능보다 새롭고 시험이 적다. 일부 전송 세션에서는 자막 전환이 여전히 실패할 수 있고 OpenSubtitles 검색은 최선 노력 방식이다. 토렌트 전송은 대체로 시작하지만 가끔 재시도가 필요하며, 대역폭이 부족하면 토렌트로 4K 영상을 볼 때 버퍼링이 다시 발생한다. 버그 보고와 PR을 받는다.
소스 빌드와 배포
소스 빌드에는 macOS 11 이상 애플 실리콘, Node.js 22 이상과 npm, Homebrew가 필요하다. 테스트 실행기의 파일 패턴은 Node 21 이상이 필요하며 CI는 Node 22를 사용한다. Homebrew에서 libmpv와 ffmpeg를 제공한다. Objective-C++ 애드온을 빌드하려면 Xcode 명령줄 도구도 필요하다. 저장소에는 GPL 미디어 바이너리인 libmpv, ffmpeg, ffprobe와 컴파일된 네이티브 *.node 애드온이 들어 있지 않아 직접 설치하거나 빌드해야 한다.
# 1. Get the source
git clone https://github.com/Oolab-labs/spritz.git
cd spritz
# 2. Media libraries and build tools
brew install mpv ffmpeg nasm pkg-config
# 3. JS dependencies. npm 11.19 and later skip packages' install scripts by default,
# which leaves Electron's binary undownloaded; fetch it explicitly.
npm install
node node_modules/electron/install.js
# 4. Build the three native addons (libmpv render, AirPlay, Now Playing).
# Compiles against the Electron version in package.json — not your system Node —
# because the addons load inside Electron and the ABIs differ.
npm run rebuild
# 5. Run it
npm start
npm test로 TV나 미디어 파일이 필요 없는 단위 테스트를 실행하고 npx eslint .로 검사할 수 있다. node_modules는 현재 체크아웃의 잠금 파일로 설치한 실제 디렉터리여야 한다. 다른 체크아웃의 node_modules를 심볼릭 링크하면 electron-builder가 오류 없이 패키지에서 npm 의존성 대부분을 빼버릴 수 있다. npm run dist는 app.asar 안의 의존성을 확인하는 패키지 검사를 통해 이런 빌드를 거부한다.
Homebrew의 ffmpeg에는 HDR에서 SDR로 톤 매핑하는 데 필요한 zscale(libzimg)과 tonemap, 자막을 영상에 입히는 subtitles(libass)가 없다. Spritz는 시작할 때 ffmpeg -filters를 확인해 해당 필터가 있을 때만 두 기능을 켠다. 따라서 Homebrew 빌드는 플레이어로는 작동하지만 두 기능이 조용히 빠진다. HDR 전송 화면은 색이 평평해지고 이미지 기반 자막은 영상에 입혀지지 않는다. 고장 난 빌드가 아니라 기능이 줄어든 빌드라 버그로 오인하기 쉽다고 안내한다.
두 기능을 사용하려면 관련 라이브러리를 포함해 ffmpeg를 빌드하고 필요한 동적 라이브러리를 함께 묶어야 한다.
brew install libass zimg x264 x265 dav1d libvpx opus lame svt-av1
curl -LO https://ffmpeg.org/releases/ffmpeg-8.1.1.tar.xz && tar xf ffmpeg-8.1.1.tar.xz
cd ffmpeg-8.1.1
./configure --extra-cflags="-I/opt/homebrew/include" --extra-ldflags="-L/opt/homebrew/lib" \
--enable-gpl --enable-version3 --enable-pthreads \
--enable-libass --enable-libzimg --enable-libfreetype --enable-libfribidi \
--enable-libx264 --enable-libx265 --enable-libsvtav1 --enable-libdav1d --enable-libvpx \
--enable-libopus --enable-libmp3lame \
--enable-videotoolbox --enable-audiotoolbox --enable-neon \
--enable-openssl --disable-ffplay --disable-doc --disable-libxcb --disable-xlib
make -j$(sysctl -n hw.ncpu)
cd ..
# Copy the binaries plus every Homebrew dylib they need, rewriting the load paths so
# the result runs on a machine without Homebrew. Fails loudly if anything is missed.
./build/bundle-dylibs.sh /tmp/ffstage ffmpeg-8.1.1/ffmpeg ffmpeg-8.1.1/ffprobe
--disable-libxcb를 지정하지 않으면 configure가 X11을 감지해 macOS 미디어 플레이어에 필요 없는 라이브러리 일곱 개를 끌어올 수 있다. 결과물은 저장소 루트의 bin/에 둔다. 이 디렉터리는 소스가 아니라 빌드 결과물이므로 Git에 포함되지 않는다. npm run dist는 이를 Contents/Resources/bin/으로 복사하며, 앱은 실행할 때 이 경로를 찾는다. 소스에서 실행할 때는 Homebrew보다 앞서도록 PATH에 넣는다. npm test에는 필터가 있고 /opt/homebrew 경로가 재배치 후 남지 않았는지 확인하는 test/ffmpeg-capabilities.test.js가 포함된다.
native/mpv는 libmpv에 연결된다. 새로 빌드한 mpv_render.node는 기본적으로 /opt/homebrew/opt/mpv/lib/libmpv.2.dylib를 직접 가리킨다. 빌드한 맥에서는 작동해도 Homebrew mpv가 없는 다른 맥에서는 실행 즉시 실패한다. 배포 전에 다음처럼 동적 라이브러리를 함께 묶어야 한다.
npm run rebuild
./build/bundle-dylibs.sh /tmp/mpvstage native/mpv/build/Release/mpv_render.node
cp -R /tmp/mpvstage/ native/mpv/build/Release/
이 스크립트는 파일 확장자로 참조 기준 경로를 고른다. .node 모듈에는 Electron이 모듈을 불러오므로 @loader_path를 사용한다. @executable_path는 애드온이 아닌 Electron 실행 파일의 디렉터리를 기준으로 해 잘못된 경로가 된다. 결과에 otool -L을 실행했을 때 /opt/homebrew 경로가 없어야 한다.
./deploy.sh는 src/, vendor/, 네이티브 소스를 /Applications/Spritz.app에 rsync하고 다시 서명해 전체 패키지를 다시 만들지 않고 빠르게 반복 작업하도록 한다. 컴파일된 애드온과 node_modules는 앱 번들 안에 유지되며, 내부 Electron 버전에 ABI가 맞춰져 있다. .app 안에서 파일을 직접 수정하면 안 된다. 서명되지 않은 변경은 서명을 깨고 macOS가 로컬 네트워크 권한을 조용히 취소할 수 있어 전송 기기 검색 오류와 똑같이 보인다. 재서명만으로도 권한이 사라질 수 있다. 배포 후 전송이 작동하지 않으면 코드를 의심하기 전에 System Settings → Privacy & Security → Local Network에서 권한을 껐다 켠다.
배포용 .app/.dmg는 npm run dist로 만든다. 이 명령은 electron-builder를 실행하기 전 build/preflight-dist.js를 실행해 bin/ffmpeg 누락, /opt/homebrew를 가리키는 애드온, 누락된 권한 설정처럼 이 컴퓨터에서만 실행되는 패키지를 거부하고 해결 명령을 안내한다. 이런 문제는 빌드 시 보이지 않아 electron-builder가 ffmpeg 없는 .dmg도 만들 수 있고, 그 결과는 다른 사람이 열 때까지 정상처럼 보일 수 있다고 저장소는 설명한다. GPL ffmpeg/libmpv 바이너리가 든 빌드를 재배포하면 GPL 바이너리와 해당 소스에 안내된 해당 소스 제공 절차도 따라야 한다.
서명, 라이선스와 콘텐츠 책임
npm run dist만 실행하면 임시 서명된 .dmg가 생성된다. 앱은 실행되지만 Gatekeeper 경고가 표시된다. 마찰 없는 배포에는 연 99달러의 Apple Developer 계정이 필요하다. 유지관리자는 로그인 키체인에 Developer ID Application 인증서를 설치하고 package.json의 build.mac에서 공증을 설정한 뒤 계정 자격 증명을 내보내 빌드한다.
"notarize": { "teamId": "<TEAMID>" }
export APPLE_ID="you@example.com"
export APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
# appleid.apple.com → App-Specific Passwords
npm run dist
릴리스는 빌드 산출물을 저장소에 커밋하지 않고 GitHub 사전 릴리스로 게시한다. 앱을 만든 커밋에 태그를 달고 .dmg, .zip, Receiver .ipk, 해당 소스 tar, SHA256SUMS 등 다섯 파일을 첨부한다. 릴리스 노트에는 RELEASE-NOTES-v<version>.md를 사용한다.
V=2.0.0-rc.16
gh release create v$V --target <build-commit> --prerelease --title "Spritz $V" \
--notes-file RELEASE-NOTES-v$V.md \
dist/Spritz-$V-arm64.dmg dist/Spritz-$V-arm64-mac.zip \
dist-receiver/com.spritz.receiver_<receiver-version>_all.ipk \
Spritz-$V-corresponding-source.tar SHA256SUMS
Spritz는 GNU General Public License 버전 3 이상(GPL-3.0-or-later)의 자유 소프트웨어다. 전체 라이선스는 LICENSE, 번들 및 연결된 구성요소의 라이선스는 THIRD_PARTY_NOTICES.md에 있다. 빌드 앱에는 GPL, 고지문, Electron·Chromium 라이선스와 번들 npm 패키지별 라이선스를 Spritz.app/Contents/Resources/licenses/에 포함한다. Help → Show Licenses in Finder에서 확인할 수 있다. 패키지 검사는 라이선스 문서가 빠지거나 고지문에 없는 공유 라이브러리가 번들에 포함된 빌드를 거부한다.
각 릴리스에는 Spritz-<version>-corresponding-source.tar가 첨부된다. 릴리스에 포함된 GPL·LGPL 구성요소와 정확히 같은 버전의 소스 아카이브, 각 라이브러리의 Homebrew 빌드 방법, README.md 색인과 체크섬이 들어간다. 요청하지 않아도 받을 수 있다. 누락된 자료가 있으면 이슈를 열면 무료로 제공한다고 안내한다. Spritz는 GPL 인코더 x264/x265를 포함해 빌드한 FFmpeg와 GPL librubberband 및 libass에 연결된 libmpv를 결합하고, 패키지 빌드에서는 배포한다. 해당 구성요소의 전체 소스는 상위 프로젝트에서 제공된다.
- FFmpeg 8.1.1: ffmpeg.git, 태그
n8.1.1 - x264: VideoLAN 저장소
- x265: MulticoreWare 저장소
- mpv/libmpv 0.41.0: mpv 저장소, Homebrew
mpvformula
저장소에는 이 바이너리와 컴파일한 *.node 애드온이 포함되지 않는다. 위 상위 프로젝트 소스로 빌드해야 한다. 바이너리가 든 컴파일 버전, 예를 들어 .dmg를 재배포하는 경우 동일한 해당 소스 제공 제안을 함께 제공해야 한다.
Spritz는 개인용 미디어 플레이어이자 호환성 계층이며 콘텐츠를 호스팅·제공·배포·추천·색인하거나 보증하지 않는다. 미디어, 토렌트, 마그넷 링크, 스트림이나 콘텐츠 카탈로그를 포함하지 않는다. 사용자가 열거나 스트리밍·다운로드·전송하는 미디어는 사용자가 제공한 출처에서 온다. 해당 콘텐츠를 접근·재생·배포할 권리가 있는지, 적용되는 법과 서비스 약관을 따르는지는 사용자의 책임이다. Spritz는 권리가 없는 저작물을 취득하거나 배포하는 용도가 아니며, 이를 돕는 기능도 포함하지 않는다. DRM이나 복사 방지를 우회하지 않고 그런 기능을 추가할 계획도 없다. 저작권 침해 우려가 저장소 자체의 자료에 관한 것이라면 이슈를 등록할 수 있다. 소프트웨어는 GPL-3.0 라이선스에 명시된 대로 어떠한 보증도 없이 제공된다.
Spritz는 고전적인 Soda Player의 정신을 잇는 독립 프로젝트라고 소개한다. Soda Player 또는 Rocketeer Studios Limited와 제휴·승인·후원을 받거나 그 프로젝트에서 파생되지 않았으며 Soda Player의 소스 코드나 자산을 포함하지 않는다. 코드와 그래픽은 Spritz의 독자 제작물이라고 밝힌다. 유사성은 mDNS/eureka Cast 검색, DLNA/UPnP 제어 등 일반적으로 쓰이는 프로토콜과 기법에 한정된다고 설명한다. 제품명과 로고, 브랜드는 각 소유자의 것이며 식별 목적으로 사용됐을 뿐 제휴나 보증을 뜻하지 않는다.
Spritz는 mpv, FFmpeg, WebTorrent, Electron, Anime4K을 기반으로 한다. 전체 구성요소 목록은 THIRD_PARTY_NOTICES.md에서 확인할 수 있다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요