이온디
@eond
맥에서 유튜브 보는 프로그램입니다.
https://freetubeapp.io
만들려고 했다가 좋은게 있네요.
브라우저 점유율 때문에ㅠ
사파리 쓰시던 프리튜브 쓰세요.
긴 글
Mac에서 유튜브 CPU 사용량이 많은 핵심 이유는 YouTube가 대부분 브라우저에 VP9/AV1 코덱으로…
펼치기 ▼
Mac에서 유튜브 CPU 사용량이 많은 핵심 이유는 YouTube가 대부분 브라우저에 VP9/AV1 코덱으로 영상을 보내는데, 이게 macOS의 VideoToolbox 하드웨어 디코더와 잘 안 맞아서 소프트웨어 디코딩으로 돌기 때문임. (Safari는 H.264를 받아서 그나마 나은 편.)
<br>세 가지 길이 있음. 시간/욕심에 따라 골라쓰면 됨.
<br>1. 5분 컷, 가장 가벼움 — IINA + yt-dlp
<br>mpv 기반 macOS 네이티브 플레이어. VideoToolbox 하드웨어 가속이 제대로 먹어서 CPU 사용량이 브라우저 대비 1/5~1/10 수준으로 떨어짐.
<br>bashbrew install --cask iina
<br>brew install yt-dlp
<br>설치 후 IINA 환경설정 → Network에서 "Use yt-dlp" 체크. 그러면 어떤 YouTube URL이든 IINA에 드래그/붙여넣기 하면 바로 재생됨. 풀스크린, PiP 다 됨.
<br>검색은 Raycast/Alfred 확장으로 붙이는 게 깔끔함. Raycast Store에서 "YouTube" 검색하면 결과를 IINA로 직접 보내는 워크플로우가 있음. 시간 대비 효율 제일 좋은 답.
<br>2. UI까지 한 앱 안에서 — FreeTube
<br>검색·구독·플레이어 UI를 다 갖춘 데스크탑 클라이언트. 광고 없고 데이터는 로컬에 저장됨.
<br>bashbrew install --cask freetube
<br>솔직한 단점: Electron 기반이라 IINA만큼 가볍진 않음. 최근 v0.23대에 SABR 지원과 Shaka Player UI 업데이트가 들어와서 안정성은 많이 개선됐지만, YouTube IP 차단으로 영상이 가끔 안 뜨는 이슈는 여전함. 그래도 "검색+플레이어+풀스크린"이 한 앱에 다 들어있는 건 이쪽임. macOS 12 이상 필요. GitHubGitHub
<br>3. 직접 만들기 — Tauri + Svelte (스택 일치)
<br>이게 본인 스택에 가장 잘 맞음. 무거운 Electron 대신 Tauri 쓰면 macOS 네이티브 WebKit + Rust 백엔드라 메모리/CPU 둘 다 가벼움.
<br>구조는 이렇게 잡으면 됨. 프론트는 Svelte로 검색바·결과 그리드·플레이어 영역만 짜고, 백엔드 Rust에서 yt-dlp 명령으로 검색 결과 JSON과 stream URL을 뽑아옴. 재생은 두 가지 선택지: (a) Tauri 윈도우 안의 native <video> 태그로 H.264 스트림 직접 재생 — WebKit이 하드웨어 디코딩함, (b) "외부 IINA로 열기" 버튼 — 가장 가벼움, mpv가 알아서 처리.
<br>뼈대 코드:
<br>bashnpm create tauri-app@latest -- --template svelte
<br>src-tauri/src/main.rs:
<br>rust#[tauri::command]
<br>async fn search(query: String) -> Result<String, String> {
<br> let out = std::process::Command::new("yt-dlp")
<br> .args(["--dump-json", "--flat-playlist",
<br> &format!("ytsearch20:{}", query)])
<br> .output().map_err(|e| e.to_string())?;
<br> Ok(String::from_utf8_lossy(&out.stdout).to_string())
<br>}
<br>
<br>#[tauri::command]
<br>async fn open_in_iina(url: String) -> Result<(), String> {
<br> std::process::Command::new("open")
<br> .args(["-a", "IINA", &url])
<br> .spawn().map_err(|e| e.to_string())?;
<br> Ok(())
<br>}
<br>Svelte 쪽:
<br>svelte<script>
<br> import { invoke } from '@tauri-apps/api/core';
<br> let query = '';
<br> let results = [];
<br>
<br> async function search() {
<br> const raw = await invoke('search', { query });
<br> results = raw.trim().split('\n').map(JSON.parse);
<br> }
<br>
<br> const play = (id) => invoke('open_in_iina', {
<br> url: `https://youtu.be/${id}`
<br> });
<br></script>
<br>검색은 Svelte UI에서, 재생은 IINA(mpv)에서 하는 하이브리드 구조. 코드 200줄 안쪽으로 끝남. AI 코딩으로 한두 세션이면 됨. 풀스크린/PiP는 IINA가 자동으로 처리해주니 신경 안 써도 됨.
<br>추천 흐름
<br>먼저 1번을 깔고 며칠 써보고, 검색-재생 흐름이 답답하면 그때 3번을 주말에 만들면 됨. 2번 FreeTube는 채널 둘러볼 때 보조용으로만 깔아두는 정도가 적당함. 본인 스택과 "다이머형" 성향(기성품으로 끝낼 수도 있고, 직접 만들 수도 있는) 둘 다 고려하면 1번 + 3번 조합이 가장 자연스러울듯.
0 좋아요
0 답글
62 조회