νλ‘ νΈμλ μ격 μ¬μ APIλ₯Ό μ¬μ©ν λ―Έλμ΄ μΊμ€ν ꡬν μ’ ν© κ°μ΄λ. Chromecast, AirPlay, DIAL κΈ°μ λ° ν¬λ‘μ€ νλ«νΌ νΈνμ±κ³Ό μ¬μ©μ κ²½νμ μν λͺ¨λ² μ¬λ‘λ₯Ό λ€λ£Ήλλ€.
νλ‘ νΈμλ μ격 μ¬μ API: λ―Έλμ΄ μΊμ€ν ꡬν λ§μ€ν°νκΈ°
μ€λλ λ©ν°λ―Έλμ΄κ° νλΆν νκ²½μμ μΉ μ ν리μΌμ΄μ μ μ½ν μΈ λ₯Ό λ ν° νλ©΄μΌλ‘ μννκ² μ μ‘νλ κΈ°λ₯μ λ§€μ° μ€μν©λλ€. μ΄ λΈλ‘κ·Έ κ²μλ¬Όμ Google Chromecast, Apple AirPlay, DIAL νλ‘ν μ½κ³Ό κ°μ κΈ°μ μ μ€μ μ λκ³ νλ‘ νΈμλ μ격 μ¬μ APIλ₯Ό μ¬μ©νμ¬ λ―Έλμ΄ μΊμ€ν κΈ°λ₯μ ꡬννλ ν¬κ΄μ μΈ κ°μ΄λλ₯Ό μ 곡ν©λλ€. λ€μν νλ«νΌκ³Ό μ₯μΉμμ μ¬μ©μμκ² λΆλλ½κ³ μ§κ΄μ μΈ λ―Έλμ΄ μΊμ€ν κ²½νμ μ 곡νκΈ° μν κΈ°μ μ μΈ‘λ©΄, ꡬν μ λ΅ λ° λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
μ격 μ¬μ API μ΄ν΄νκΈ°
μ격 μ¬μ APIλ μΉ μ ν리μΌμ΄μ μ΄ μ격 μ₯μΉμμ λ―Έλμ΄ μ¬μμ κ²μνκ³ μ μ΄ν μ μλ νμ€νλ λ°©λ²μ μ 곡ν©λλ€. μ΄ APIλ₯Ό ν΅ν΄ μ¬μ©μλ μΉ λΈλΌμ°μ μμ μ¬μ μμ, λ³Όλ₯¨ μ‘°μ , μΌμ μ€μ§, μ¬μ, νμ λ° κΈ°ν μΌλ°μ μΈ λ―Έλμ΄ μ μ΄λ₯Ό μννμ¬ λ€νΈμν¬μ μ°κ²°λ νΈν μ₯μΉλ‘ μ½ν μΈ λ₯Ό λ³΄λΌ μ μμ΅λλ€.
μ΄ APIμ ν΅μ¬ κ°λ μ λ€μκ³Ό κ°μ΅λλ€:
- κ²μ(Discovery): λ€νΈμν¬μμ μ¬μ© κ°λ₯ν μΊμ€ν μ₯μΉλ₯Ό μ°Ύμ΅λλ€.
- μ°κ²°(Connection): μ νν μ₯μΉμ μ°κ²°μ μ€μ ν©λλ€.
- μ μ΄(Control): μ₯μΉμ λ―Έλμ΄ μ¬μ λͺ λ Ήμ 보λ λλ€.
- μν λͺ¨λν°λ§(Status Monitoring): μ₯μΉλ‘λΆν° μ¬μ μνμ λν μ λ°μ΄νΈλ₯Ό λ°μ΅λλ€.
μ£Όμ κΈ°μ
- Chromecast: Googleμ μΈκΈ° μλ μΊμ€ν νλ‘ν μ½λ‘, μ¬μ©μκ° μμ μ μ₯μΉμμ TV λ° κΈ°ν λμ€νλ μ΄λ‘ μ½ν μΈ λ₯Ό μ€νΈλ¦¬λ°ν μ μκ² ν΄μ€λλ€. λ€μν λ―Έλμ΄ νμμ μ§μνλ©° κ°λ ₯ν κ°λ°μ λꡬλ₯Ό μ 곡ν©λλ€.
- AirPlay: Appleμ 무μ μ€νΈλ¦¬λ° κΈ°μ λ‘, μ¬μ©μκ° iOS λ° macOS μ₯μΉμμ Apple TV λ° AirPlay νΈν μ€νΌμ»€λ‘ νλ©΄μ λ―Έλ¬λ§νκ±°λ μ€λμ€ λ° λΉλμ€λ₯Ό μ€νΈλ¦¬λ°ν μ μκ² ν΄μ€λλ€.
- DIAL (Discovery and Launch): λμΌν λ€νΈμν¬ λ΄μ μ₯μΉμμ μ ν리μΌμ΄μ μ κ²μνκ³ μ€ννκΈ° μν κ°λ°©ν νλ‘ν μ½μ λλ€. μμ λ―Έλμ΄ μΊμ€ν μμλ Chromecastλ AirPlayλ³΄λ€ λ μ¬μ©λμ§λ§, μ€λ§νΈ TVμμ νΉμ μ±μ μ€ννλ λ° μ€μν μν μ ν©λλ€.
- DLNA (Digital Living Network Alliance): μ₯μΉκ° ν λ€νΈμν¬λ₯Ό ν΅ν΄ λ―Έλμ΄ μ½ν μΈ λ₯Ό 곡μ ν μ μλλ‘ λ리 μ±νλ νμ€μ λλ€. νΉμ APIλ μλμ§λ§, DLNAλ₯Ό μ΄ν΄νλ κ²μ λ―Έλμ΄ μ€νΈλ¦¬λ° μνκ³λ₯Ό νμ νλ λ° λμμ΄ λ©λλ€.
Chromecast μ°λ ꡬννκΈ°
Chromecastλ κ°μ₯ λ리 μ¬μ©λλ λ―Έλμ΄ μΊμ€ν κΈ°μ μ΄λΌκ³ ν μ μμ΅λλ€. μΉ μ ν리μΌμ΄μ μ μ΄λ₯Ό μ°λνλ €λ©΄ Google Cast SDKλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
1λ¨κ³: Google Cast SDK μ€μ
λ¨Όμ , HTML νμΌμ Google Cast SDKλ₯Ό ν¬ν¨ν΄μΌ ν©λλ€:
<script src="//www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"></script>
2λ¨κ³: Cast νλ μμν¬ μ΄κΈ°ν
λ€μμΌλ‘, JavaScript μ½λμμ Cast νλ μμν¬λ₯Ό μ΄κΈ°νν©λλ€:
window.onload = function() {
cast.framework.CastContext.getInstance().setOptions({
receiverApplicationId: 'YOUR_APPLICATION_ID',
autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED
});
const castButton = document.getElementById('castButton');
castButton.addEventListener('click', function() {
cast.framework.CastContext.getInstance().requestSession();
});
};
'YOUR_APPLICATION_ID'λ₯Ό Google Cast κ°λ°μ μ½μμμ μ»μ μ ν리μΌμ΄μ
IDλ‘ λ°κΎΈμΈμ. autoJoinPolicyλ μΉ μ±μ΄ λμΌν μΆμ²μμ μ΄λ―Έ μ§ν μ€μΈ μΊμ€ν
μΈμ
μ μλμΌλ‘ μ°κ²°λλλ‘ λ³΄μ₯ν©λλ€. castButtonμ μΊμ€ν
μΈμ
μ μμνκΈ° μν UI μμμ
λλ€. λν Google Cast κ°λ°μ μ½μμ μ ν리μΌμ΄μ
μ λ±λ‘νκ³ , Chromecast μ₯μΉ μ체μμ μ€νλλ μ ν리μΌμ΄μ
μΈ Cast μμ κΈ° μ ν리μΌμ΄μ
μ λ§λ€μ΄μΌ ν©λλ€. μ΄ μμ κΈ° μ ν리μΌμ΄μ
μ΄ μ€μ λ―Έλμ΄ μ¬μμ μ²λ¦¬ν©λλ€.
3λ¨κ³: λ―Έλμ΄ λ‘λ λ° μ¬μ
μΊμ€ν μΈμ μ΄ μ€μ λλ©΄ λ―Έλμ΄λ₯Ό λ‘λνκ³ μ¬μν μ μμ΅λλ€. λ€μμ μμμ λλ€:
function loadMedia(mediaURL, mediaTitle, mediaSubtitle, mediaType) {
const castSession = cast.framework.CastContext.getInstance().getCurrentSession();
if (!castSession) {
console.error('No cast session available.');
return;
}
const mediaInfo = new chrome.cast.media.MediaInfo(mediaURL, mediaType);
mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();
mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;
mediaInfo.metadata.title = mediaTitle;
mediaInfo.metadata.subtitle = mediaSubtitle;
const request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
function() { console.log('Load succeed'); },
function(errorCode) { console.log('Error code: ' + errorCode); });
}
μ΄ ν¨μλ μ¬μν λ―Έλμ΄μ URL, μ λͺ© λ° κΈ°ν λ©νλ°μ΄ν°λ₯Ό ν¬ν¨νλ MediaInfo κ°μ²΄λ₯Ό μμ±ν©λλ€. κ·Έλ° λ€μ Cast μμ κΈ° μ ν리μΌμ΄μ
μ LoadRequestλ₯Ό λ³΄λ΄ μ¬μμ μμν©λλ€.
4λ¨κ³: λ―Έλμ΄ μ»¨νΈλ‘€ ꡬν
μ¬μ©μκ° μ¬μμ μ μ΄ν μ μλλ‘ λ―Έλμ΄ μ»¨νΈλ‘€(μ¬μ, μΌμ μ€μ§, νμ, λ³Όλ₯¨ μ‘°μ )λ ꡬνν΄μΌ ν©λλ€. λ€μμ μ¬μ/μΌμ μ€μ§ ν κΈμ ꡬννλ κΈ°λ³Έ μμμ λλ€:
function togglePlayPause() {
const castSession = cast.framework.CastContext.getInstance().getCurrentSession();
if (!castSession) {
console.error('No cast session available.');
return;
}
const media = castSession.getMediaSession();
if (!media) {
console.error('No media session available.');
return;
}
if (media.playerState === chrome.cast.media.PlayerState.PLAYING) {
media.pause(new chrome.cast.media.PauseRequest());
} else {
media.play(new chrome.cast.media.PlayRequest());
}
}
AirPlay μ§μ μ°λνκΈ°
AirPlay μ°λμ Chromecastμ λΉν΄ μΉ μ ν리μΌμ΄μ μμ λ μ νμ μ λλ€. Appleμ μ£Όλ‘ λ€μ΄ν°λΈ iOS λ° macOS μ ν리μΌμ΄μ μ λν΄ AirPlayλ₯Ό μ§μν©λλ€. νμ§λ§ AirPlay μ¬μ© κ°λ₯ μ¬λΆλ₯Ό κ°μ§νκ³ μ¬μ©μμκ² λΈλΌμ°μ μ λ€μ΄ν°λΈ AirPlay κΈ°λ₯(μ¬μ© κ°λ₯ν κ²½μ°)μ μ¬μ©νλλ‘ μ λν¨μΌλ‘μ¨ μ¬μ ν AirPlayλ₯Ό νμ©ν μ μμ΅λλ€. macOSμ Safariμ κ°μ μΌλΆ λΈλΌμ°μ μλ AirPlayκ° λ΄μ₯λμ΄ μμ΅λλ€.
AirPlay μ¬μ© κ°λ₯ μ¬λΆ κ°μ§
λͺ¨λ λΈλΌμ°μ μμ AirPlay μ¬μ© κ°λ₯ μ¬λΆλ₯Ό μμ μ μΌλ‘ κ°μ§ν μ μλ μ§μ μ μΈ JavaScript APIλ μμ΅λλ€. νμ§λ§ μΌλ°μ μΌλ‘ κΆμ₯λμ§λ μμ§λ§ λΈλΌμ°μ μ€λνμ΄λ μ¬μ©μ μμ΄μ νΈ κ°μ§λ₯Ό μ¬μ©νμ¬ μ¬μ©μμκ² ννΈλ₯Ό μ 곡ν μ μμ΅λλ€. λλ μ¬μ©μκ° λΈλΌμ°μ μμ AirPlay κ΄λ ¨ λ¬Έμ λ₯Ό κ²ͺκ³ μλ€λ©΄ μ¬μ©μ νΌλλ°±μ μμ‘΄ν μλ μμ΅λλ€.
AirPlay μ¬μ© μλ΄ μ 곡
μ¬μ©μκ° AirPlay κΈ°λ₯μ΄ μλ Apple μ₯μΉλ₯Ό μ¬μ©νκ³ μλ€κ³ μμ¬λλ κ²½μ°, λΈλΌμ°μ λ μ΄μ체μ λ₯Ό ν΅ν΄ AirPlayλ₯Ό νμ±ννλ λ°©λ²μ λν μ§μΉ¨μ νμν μ μμ΅λλ€. μλ₯Ό λ€λ©΄ λ€μκ³Ό κ°μ΅λλ€:
<p>AirPlayλ₯Ό μ¬μ©νλ €λ©΄ λΈλΌμ°μ μ λ―Έλμ΄ μ»¨νΈλ‘€μ΄λ μμ€ν
λ©λ΄μμ AirPlay μμ΄μ½μ ν΄λ¦νμΈμ.</p>
μ¬μ©μμ μ΄μ체μ μ λΈλΌμ°μ μ λ§μΆ° λͺ ννκ³ κ°κ²°ν μ§μΉ¨μ μ 곡νλ κ²μ΄ μ€μν©λλ€.
DIAL νλ‘ν μ½ μ°λ
DIAL(Discovery and Launch)μ μ£Όλ‘ μ€λ§νΈ TVμ κ°μ μ₯μΉμμ μ ν리μΌμ΄μ μ κ²μνκ³ μ€ννλ λ° μ¬μ©λλ νλ‘ν μ½μ λλ€. μ§μ μ μΈ λ―Έλμ΄ μΊμ€ν μλ Chromecastλ AirPlayλ³΄λ€ λ μ¬μ©λμ§λ§, TVμμ νΉμ μ€νΈλ¦¬λ° μ±μ μ€ννλ λ° μ μ©ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μ¬μ©μκ° μΉμ¬μ΄νΈμμ μκ³ νΈμ λ³΄κ³ μμ λ DIALμ μ¬μ©νμ¬ TVμμ ν΄λΉ μ€νΈλ¦¬λ° μ±μ μ€ννμ¬ μ 체 μνλ₯Ό κ³μ μμ²νλλ‘ ν μ μμ΅λλ€.
DIAL κ²μ
DIAL νλ‘ν μ½μ μ₯μΉ κ²μμ μν΄ SSDP(Simple Service Discovery Protocol)λ₯Ό μ¬μ©ν©λλ€. (λ°±μλμμ Node.jsλ₯Ό μ¬μ©νλ κ²½μ°) `node-ssdp`μ κ°μ JavaScript λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νκ±°λ, (λΈλΌμ°μ λ° CORS μ μ± μμ νμ©νλ κ²½μ°) λΈλΌμ°μ κΈ°λ° WebSocket ꡬνμ μ¬μ©νμ¬ λ€νΈμν¬μμ DIAL μ§μ μ₯μΉλ₯Ό κ²μν μ μμ΅λλ€. 보μ μ νμΌλ‘ μΈν΄ λΈλΌμ°μ κΈ°λ° SSDP ꡬνμ μ’ μ’ μ νμ μ΄κ±°λ μ¬μ©μ κΆνμ΄ νμν©λλ€.
μ ν리μΌμ΄μ μ€ν
DIAL μ§μ μ₯μΉλ₯Ό λ°κ²¬ν νμλ ν΄λΉ μ₯μΉμ DIAL μλν¬μΈνΈμ HTTP POST μμ²μ λ³΄λ΄ μ ν리μΌμ΄μ μ μ€νν μ μμ΅λλ€. μμ² λ³Έλ¬Έμλ μ€ννλ €λ μ ν리μΌμ΄μ μ΄λ¦μ ν¬ν¨ν΄μΌ ν©λλ€.
async function launchApp(deviceIP, appName) {
const url = `http://${deviceIP}:8060/apps/${appName}`;
try {
const response = await fetch(url, {
method: 'POST',
mode: 'no-cors' // Necessary for some DIAL implementations
});
if (response.status === 201) {
console.log(`Successfully launched ${appName} on ${deviceIP}`);
} else {
console.error(`Failed to launch ${appName} on ${deviceIP}: ${response.status}`);
}
} catch (error) {
console.error(`Error launching ${appName} on ${deviceIP}: ${error}`);
}
}
μΌλΆ DIAL ꡬνμμ λΆκ³Όνλ CORS μ νμΌλ‘ μΈν΄ mode: 'no-cors' μ΅μ
μ΄ μ’
μ’
νμνλ€λ μ μ μ μνμΈμ. μ΄λ μλ΅ λ³Έλ¬Έμ μ½μ μλ μμ§λ§, HTTP μν μ½λλ₯Ό νμΈνμ¬ μ€νμ΄ μ±κ³΅νλμ§ μ¬λΆλ₯Ό νλ¨ν μ μμμ μλ―Έν©λλ€.
ν¬λ‘μ€ νλ«νΌ κ³ λ € μ¬ν
λ€μν νλ«νΌκ³Ό μ₯μΉμμ μνν λ―Έλμ΄ μΊμ€ν κ²½νμ λ§λ€λ €λ©΄ λͺ κ°μ§ μμλ₯Ό μ μ€νκ² κ³ λ €ν΄μΌ ν©λλ€:
- λΈλΌμ°μ νΈνμ±: μ½λκ° λ€μν λΈλΌμ°μ (Chrome, Safari, Firefox, Edge)μμ μΌκ΄λκ² μλνλμ§ νμΈνμΈμ. λ€μν λΈλΌμ°μ μ μ΄μ체μ μμ ꡬνμ μ² μ ν ν μ€νΈνμΈμ.
- μ₯μΉ νΈνμ±: μ₯μΉλ§λ€ μ§μνλ μΊμ€ν νλ‘ν μ½κ³Ό λ―Έλμ΄ νμμ΄ λ€λ¦ λλ€. νΉμ κΈ°μ μ μ§μνμ§ μλ μ₯μΉλ₯Ό μν΄ λ체 λ©μ»€λμ¦μ μ 곡νλ κ²μ κ³ λ €νμΈμ.
- λ€νΈμν¬ μν: λ―Έλμ΄ μΊμ€ν μ±λ₯μ λ€νΈμν¬ λμνκ³Ό μ§μ° μκ°μ μν₯μ λ°μ μ μμ΅λλ€. μ€νΈλ¦¬λ°μ μν΄ λ―Έλμ΄ νμΌμ μ΅μ ννκ³ μ¬μ©μμκ² λ‘λ© μ§ν μν©μ μ리λ λ²νΌλ§ νμκΈ°λ₯Ό μ 곡νμΈμ.
- μ¬μ©μ μΈν°νμ΄μ€: λ―Έλμ΄ μΊμ€ν 컨νΈλ‘€μ μν μΌκ΄λκ³ μ§κ΄μ μΈ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό λμμΈνμΈμ. μΈμ κ°λ₯ν μμ΄μ½μ μ¬μ©νκ³ μ¬μ©μμκ² μΊμ€ν μνμ λν λͺ νν νΌλλ°±μ μ 곡νμΈμ.
λ―Έλμ΄ μΊμ€ν ꡬνμ μν λͺ¨λ² μ¬λ‘
μΉ μ ν리μΌμ΄μ μμ λ―Έλμ΄ μΊμ€ν κΈ°λ₯μ ꡬνν λ λ°λΌμΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- λͺ νν μ§μΉ¨ μ 곡: λͺ ννκ³ κ°κ²°ν μ§μΉ¨μΌλ‘ μ¬μ©μλ₯Ό μΊμ€ν κ³Όμ μ λ°μ κ±Έμ³ μλ΄νμΈμ.
- μ€λ₯λ₯Ό μννκ² μ²λ¦¬: μΊμ€ν μ μ€ν¨νκ±°λ μ₯μΉλ₯Ό μ¬μ©ν μ μλ μν©μ μννκ² μ²λ¦¬νκΈ° μν μ€λ₯ μ²λ¦¬λ₯Ό ꡬννμΈμ.
- λ―Έλμ΄ νμΌ μ΅μ ν: μνν μ¬μμ 보μ₯νκ³ λ²νΌλ§μ μ΅μννκΈ° μν΄ μ€νΈλ¦¬λ°μ© λ―Έλμ΄ νμΌμ μ΅μ ννμΈμ.
- μ² μ ν ν μ€νΈ: ν¬λ‘μ€ νλ«νΌ νΈνμ±μ 보μ₯νκΈ° μν΄ λ€μν μ₯μΉμ λΈλΌμ°μ μμ ꡬνμ μ² μ ν ν μ€νΈνμΈμ.
- μ κ·Όμ± κ³ λ €: λ―Έλμ΄ μΊμ€ν 컨νΈλ‘€μ΄ μ₯μ κ° μλ μ¬μ©μλ μ κ·Όν μ μλλ‘ νμΈμ.
- μ¬μ©μ κ°μΈ μ 보 μ‘΄μ€: λ―Έλμ΄ μΊμ€ν κ³Ό κ΄λ ¨λ μ¬μ©μ λ°μ΄ν°λ₯Ό μμ§νκ³ μ¬μ©νλ λ°©λ²μ λν΄ ν¬λͺ νκ² κ³΅κ°νμΈμ.
보μ κ³ λ € μ¬ν
λ―Έλμ΄ μΊμ€ν κΈ°λ₯μ ꡬνν λ 보μμ κ°μ₯ μ€μν©λλ€. λ€μμ μ λ ν΄μΌ ν λͺ κ°μ§ 보μ κ³ λ € μ¬νμ λλ€:
- 보μ ν΅μ : HTTPSλ₯Ό μ¬μ©νμ¬ μΉ μ ν리μΌμ΄μ κ³Ό μΊμ€ν μ₯μΉ κ°μ ν΅μ μ μνΈννμΈμ.
- μ λ ₯ μ ν¨μ± κ²μ¬: λͺ¨λ μ¬μ©μ μ λ ₯μ κ²μ¦νμ¬ μ£Όμ 곡격μ λ°©μ§νμΈμ.
- μ½ν μΈ λ³΄νΈ: DRM(λμ§νΈ μ μκΆ κ΄λ¦¬) κΈ°μ μ μ¬μ©νμ¬ λ¬΄λ¨ μ‘μΈμ€λ‘λΆν° λ―Έλμ΄ μ½ν μΈ λ₯Ό 보νΈνμΈμ.
- μ₯μΉ μΈμ¦: μ₯μΉ μΈμ¦μ ꡬννμ¬ μΉμΈλ μ₯μΉλ§ λ―Έλμ΄ μ½ν μΈ μ μ‘μΈμ€ν μ μλλ‘ νμΈμ.
- μ κΈ°μ μΈ μ λ°μ΄νΈ: 보μ μ·¨μ½μ μ ν¨μΉνκΈ° μν΄ μΊμ€ν SDKμ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ΅μ μνλ‘ μ μ§νμΈμ.
μ€μ μ μ© μ¬λ‘
λ€μμ μ€μ μ ν리μΌμ΄μ μμ λ―Έλμ΄ μΊμ€ν μ΄ μ΄λ»κ² μ¬μ©λλμ§μ λν λͺ κ°μ§ μμ λλ€:
- Netflix: μ¬μ©μκ° λͺ¨λ°μΌ μ₯μΉμμ TVλ‘ μνμ TV νλ‘κ·Έλ¨μ μΊμ€ν ν μ μμ΅λλ€.
- Spotify: μ¬μ©μκ° ν΄λν°μμ μ€νΌμ»€λ‘ μμ μ μ€νΈλ¦¬λ°ν μ μμ΅λλ€.
- YouTube: μ¬μ©μκ° ν΄λν°μ΄λ νλΈλ¦Ώμμ μΊμ€ν νμ¬ TVμμ λΉλμ€λ₯Ό μμ²ν μ μμ΅λλ€.
- Hulu: TV νλ‘κ·Έλ¨κ³Ό μν μ€νΈλ¦¬λ°μ μν μΊμ€ν μ§μμ μ 곡ν©λλ€.
κ²°λ‘
μΉ μ ν리μΌμ΄μ μ λ―Έλμ΄ μΊμ€ν κΈ°λ₯μ ꡬννλ©΄ μ¬μ©μκ° μ½ν μΈ λ₯Ό λ ν° νλ©΄μΌλ‘ μννκ² μ€νΈλ¦¬λ°ν μ μκ² νμ¬ μ¬μ©μ κ²½νμ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. λ€μν μΊμ€ν κΈ°μ μ μ΄ν΄νκ³ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©° 보μ κ³ λ € μ¬νμ μ£Όμλ₯Ό κΈ°μΈμμΌλ‘μ¨ μ¬μ©μμ μꡬλ₯Ό μΆ©μ‘±νλ κ²¬κ³ νκ³ μ λ’°ν μ μλ λ―Έλμ΄ μΊμ€ν μ루μ μ λ§λ€ μ μμ΅λλ€. λ―Έλμ΄ μλΉκ° κ³μ μ§νν¨μ λ°λΌ, νλ‘ νΈμλ μ격 μ¬μ APIλ₯Ό λ§μ€ν°νλ κ²μ λ§€λ ₯μ μ΄κ³ λͺ°μ κ° μλ λ©ν°λ―Έλμ΄ κ²½νμ μ 곡νλ λ° μ μ λ μ€μν΄μ§ κ²μ λλ€.
λ―Έλμ΄ μΊμ€ν ꡬνμ μ€κ³ν λ νμ μ¬μ©μ κ²½νκ³Ό ν¬λ‘μ€ νλ«νΌ νΈνμ±μ μ°μ μν΄μΌ ν¨μ κΈ°μ΅νμΈμ. μ κΈ°μ μΈ ν μ€νΈμ λͺ¨λν°λ§μ μ¬μ©μμ μ₯μΉλ λ€νΈμν¬ μνμ κ΄κ³μμ΄ μννκ³ μ¦κ±°μ΄ κ²½νμ 보μ₯νλ λ° λμμ΄ λ κ²μ λλ€.
μ΄ κ°μ΄λλ νλ‘ νΈμλ μ격 μ¬μ APIλ₯Ό μ¬μ©ν λ―Έλμ΄ μΊμ€ν ꡬνμ λν κΈ°μ΄μ μΈ μ΄ν΄λ₯Ό μ 곡ν©λλ€. κΈ°μ νκ²½μ΄ λ°μ ν¨μ λ°λΌ μ΅μ λ°μ μ¬νκ³Ό λͺ¨λ² μ¬λ‘λ₯Ό κ³μ νμ νλ κ²μ΄ μ μΈκ³ μ¬μ©μμκ² μ΅μ²¨λ¨ λ―Έλμ΄ κ²½νμ μ 곡νλ λ° μ€μν κ²μ λλ€.