DEVELOPER

기본연동

Player

JWT

개요

기존 Kollus 시스템에서 Media Token은 고객사가 Videogateway로 컨텐츠 재생 요청을 전달할 때 요청 내용을 은닉(암호화)하고, 직접 url에 대한 유효 기간을 설정하기 위해 사용했습니다. 하지만 Media Token을 사용하기 위해서는 Kollus에서 제공하는 모듈을 서버에 직접 설치해야 하고, 모듈이 서버를 지원하지 않는 경우엔 Kollus API를 호출하여 Media Token을 원격으로 생성해 사용해야 하거나, Media Token의 스펙이 변경될 때마다 서버에 모듈을 재 설치해야 하는 등 문제가 많았습니다. 이에 암호학적으로 안전하고 구현이 간단한 JSON Webtoken을 이용하여 Kollus 모듈에 대한 의존성을 줄이고 좀 더 유연하게 스펙 변경에 대응할 수 있도록 합니다.

유의사항

  • JSON Webtoken(이하 JWT)에 대해선 http://jwt.io 사이트를 참조해주세요.
  • JWT의 Payload 부분에 다음에 기술된, 먼저 등록된 Claim들을 사용해선 안됩니다. (https://tools.ietf.org/html/rfc7519#section-4) 이 경우 기대했던 대로 동작하지 않을 수 있습니다.
  • 암호화 알고리즘은 HMAC SHA256 (HS256) 만을 지원합니다

JWT Request

용어
  • 보안 키 (Security Key)
    • 보안 키는 JWT를 signing 하기 위해 Kollus와 고객사만이 공유하는 비밀 키 입니다. 보안 키는 “설정 > 서비스 계정” 페이지에서 확인할 수 있습니다. 이 값은 고객이 희망하면 언제든 변경 가능하며, 변경 즉시 기존에 사용하던 보안 키는 폐기됩니다. 따라서 보안 키는 고객사의 정기점검 시간을 이용하여 변경하는 것을 권장합니다
  • 사용자 키 (Custom Key)
    • 사용자 키는 평문 보안 키를 암호화한 키입니다. JWT를 이용하여 Videogateway에 요청시 JWT와 함께 전달되어야 합니다.
JWT 생성 방법

암호화 알고리즘은 HMAC SHA256 (HS256) 으로 하고, Secret key는 보안 키, Payload에는 아래 Payload Spec에 맞춘 JSON String을 추가하여 JWT를 생성합니다.

생성한 JWT를 이용하여 Videogateway에 요청하기

생성한 JWT와 사용자 키를 다음과 같은 형식의 url로 생성하여 호출합니다.

	http://v.kr.kollus.com/s?jwt=생성한 JWT&custom_key=사용자 키

 

JWT Payload Spec

jwt PayLoad의 형식은 다음과 같은 JSON 문자열입니다.

{
	"cuid": "CLIENT_USER_ID",
	"awtc": “AUDIO_WATERMARKING_CODE”,
         "video_watermarking_code_policy": {
                "code_kind":"client_user_id",
                "font_size":7,
                "font_color":"FFFFFF",
                "show_time":1,
                "hide_time":500,
                "alpha":50,
                "enable_html5_player":false
        },
	"expt": EXPIRE_TIME,
	"pc_skin": {
		"skin_path": "http://file.kr.dev.kollus.com/public/custom/skin2.zip",
		"skin_sha1sum": "B2B688123F68BFA7DB4B1F89EC292C0835086D9B"
	},
	"mc": [{
		"mckey": “MEDIA_CONTENT_KEY”,
		"mcpf": “MEDIA_CONTENT_PROFILE_KEY”,
		"title": “TITLE”,
		"intr": IS_INTRO,
		"seek": IS_SEEKABLE,
		"seekable_end": SEEKABLE_END,
		"disable_playrate": DISABLE_PLAYRATE,
                         "thumbnail": {
                             "enable": IS_ENABLE,
                             "thread": IS_THREAD,
                             "type": "TYPE"
                         },
		"play_section": {
                         "start_time": 0,
                         "end_time": 60
		},
		"subtitle_policy" : {
                         "filter": {
                             "name": "SUBTITLE_NAME",
                             "language_code": "SUBTITLE_LANGUAGE_CODE"
                         },
                         "show_by_filter" : false,
                         "is_showable": true
		}
	}]
}

 

Payload 항목
이름 Datatype 필수여부 내용 Mediatype
cuid
(CLIENT_USER_ID)
String 필수 컨텐츠에 억세스하려는 고객사의 사용자 아이디. 북마크나 NScreen 데이터의 Key로 사용됩니다. VOD
awtc
(AUDIO_WATERMARKING_CODE)
String 선택
(기본값: null)
Kollus 오디오 워터마킹 기능을 이용하려고 할 때에 사용하는 워터마킹 코드. 워터마킹 코드는 API를 호출하여 획득하며, 자세한 내용은 기술 담당자에게 문의 바랍니다.사용하지 않으면 해당 Entry를 삭제하거나, null로 입력하면 됩니다. VOD
expt
(EXPIRE_TIME)
Integer 필수 JWT가 유효한 시간. Unix timestamp 형식으로 입력합니다. 고객사 서버와의 시간이 정확하게 일치하지 않을 수도 있으므로, 최대 1분 정도는 유효기간이 지났더라도 접근할 수 있습니다. VOD
pc_skin
(PC_EX_PLAYER_SKIN)
Array 선택 V2 PC Player 스킨을 고객이 지정하기 위한 용도로 사용합니다. 설정할 스킨이 없는 경우는 필드 자체를 생략할 수 있으나, 이 필드를 추가했을때는 반드시 하위 필드인 skin_path, skin_sha1sum 값이 정확히 입력되어야 합니다. V2 Player
skin_path String 필수 V2 PC Player 스킨 정보를 담고 있는 압축 파일의 URL V2 Player
skin_sha1sum String 필수 V2 PC Player 스킨 정보를 담고 있는 압축 파일에 대한 sha1 checksum 값 V2 Player
mc 필수 재생할 컨텐츠의 재생정보를 담고 있는 Object 타입의 Entry를 배열로 담고 있는 배열입니다. VOD
mckey
(MEDIA_CONTENT_KEY)
String 필수 재생할 컨텐츠의 식별 키. 확장 미디어 컨텐츠 키 형식도 동일하게 사용할 수 있습니다. VOD
mcpf
(MEDIA_CONTENT_PROFILE_KEY)
String 선택
(기본값: null)
컨텐츠의 프로파일 가운데 하나를 강제로 지정해 재생할 경우에 사용합니다. 강제로 지정할 프로파일의 키를 입력합니다.
자동 선택하게 두려면 해당 Entry를 삭제하거나, null로 입력하면 됩니다.
VOD
title String 선택
(기본값: null)
컨텐츠의 기존 타이틀을 대체하는 문자열입니다. VOD
intr
(IS_INTRO)
Boolean 선택(기본값: false) 컨텐츠가 인트로인지 아닌지의 여부를 입력합니다. 인트로에 관한 내용은 하단의 예제를 참조하세요.인트로가 아닌 정상 컨텐츠인 경우엔 해당 Entry를 삭제하거나, false를 입력하면 됩니다. VOD
seek
(IS_SEEKABLE)
Boolean 선택
(기본값: true)
컨텐츠의 seek를 허용할 것인지 아닌지의 여부를 입력합니다. 보통 인트로인 경우는 seek를 허용하지 않습니다. seek를 허용하는 경우엔 해당 Entry를 삭제하거나, true를 입력하면 됩니다. VOD
seekable_end
(SEEKABLE_END)
Integer 선택
(기본값: -1)
seek 허용이 안된 컨텐츠도 시작 부터 입력 값까지의 구간은 seek가 가능하게 됩니다. VOD
disable_playrate
(DISABLE_PLAYRATE)
Boolean 선택
(기본값: true)
배속컨트롤 사용 여부를 설정합니다. VOD
thumbnail.enable Boolean 선택
(기본값: false)
썸네일 활성화 여부를 설정합니다.해당옵션은 안드로이드만 지원합니다. 안드로이드 공용앱/SDK
thumbnail.thread Boolean 선택
(기본값: false)
쓰레드 방식 여부를 설정합니다.해당옵션은 안드로이드만 지원합니다. 안드로이드 공용앱/SDK
thumbnail.type String 선택
(기본값: null)
썸네일 사이즈를 설정합니다. (big / small)해당옵션은 안드로이드만 지원합니다 안드로이드 공용앱/SDK
video_watermaring_code_policy.code_kind String 선택 현재는 사용시 필수 “client_user_id”
video_watermaring_code_policy.alpha Integer 선택(기본값:50) 비디오워터마킹코드의 alpha 값을 정의 합니다.
video_watermaring_code_policy.font_size Integer 선택(기본값:7) 비디오워터마킹코드의 font-size 값을 정의 합니다.
video_watermaring_code_policy.font_color String 선택(기본값:’FFFFFF’) 비디오워터마킹코드의 font-color 값을 정의 합니다.
video_watermaring_code_policy.show_time Integer 선택(기본값:1) 비디오워터마킹코드의 보여지는 시간을 정의 합니다.
video_watermaring_code_policy.hide_time Integer 선택)기본값:500) 비디오워터마킹코드의 보여진후 안보여지는 시간을 정의 합니다.
video_watermaring_code_policy.enable_html5_player Boolean 선택)기본값:false) 비디오워터마킹코드의 HTML5 Player 의 사용여부를 확정합니다
play_section.start_time Integer 선택 (기본값: null) 구간반복 시작시간을 설정합니다. (단위: 초) VOD
play_section.end_time Integer 선택 (기본값: null) 구간반복 종료시간을 설정합니다. (단위: 초) VOD
subtitle_policy.filter.name String 선택
(기본값: null)
자막 필터를 자막 이름을 사용하도록 합니다. show_by_filter: true 가 되어야 동작합니다. VOD
subtitle_policy.filter.language_code String 선택
(기본값: null)
자막 필터를 언어 코드를 사용하도록 합니다. show_by_filter: true 가 되어야 동작합니다.
VOD
subtitle_policy.show_by_filter Boolean 선택
(기본값: false)
자막 정책 필터에 맞게 보여주는지 여부를 판단합니다. VOD
subtitle_policy.is_showable Boolean 선택
(기본값: true)
자막을 보이게 할것인지를 판단합니다. VOD
예제
일반 컨텐츠 재생을 위한 JWT Payload

catenoid 라는 아이디를 가진 사용자가 미디어 컨텐츠 키 vnCVPVyV 를 재생하는 경우

{
	"cuid": “catenoid”,
	"expt": 1462931880,
	"mc": [{
		"mckey": “vnCVPVyV“
	}]
}

 

인트로가 포함된 컨텐츠 재생을 위한 JWT Payload

catenoid 라는 아이디를 가진 사용자가 인트로로 미디어 컨텐츠 키 gDV2B1ZG를 seek 불가능한 상태로, 본 컨텐츠로는 vnCVPVyV 를  재생하는 경우

{
	"cuid": “catenoid”,
	"expt": 1462931880,
	"mc": [{
		"mckey": “gDV2B1ZG“,
		"intr": true,
		"seek": false,
	},{
		"mckey": “vnCVPVyV“
	}]
}

 

스킵 안되는 컨텐츠 재생시 시작부분 일부만 스킵 허용하기 위한 JWT Payload

catenoid 라는 아이디를 가진 사용자가 인트로로 미디어 컨텐츠 키 gDV2B1ZG를 seek 불가능한 상태로 재생하지만, 시작 부터 30초 구간은 스킵을 허용하는 경우

{
	"cuid": “catenoid”,
	"expt": 1462931880,
	"mc": [{
		"mckey": “gDV2B1ZG“,
		"intr": true,
		"seek": false,
		"seekable_end": 30,
	}]
}

 

컨텐츠 재생시 일부만 재생하기 위한 JWT Payload

catenoid 라는 아이디를 가진 사용자가 미디어 컨텐츠 키 vnCVPVyV 를 60초간 재생을 허용하는 경우

{
    "cuid": "catenoid",
    "expt": 1535963209,
    "mc": [{
        "mckey": "gDV2B1ZG",
        "play_section": {
            "start_time": 0,
            "end_time": 60
        }
    }]
}

V/G Query String

사용방법

http://v.kr.kollus.com/[MEDIA_CONTENT_KEY]?key=value&…query string은 url 뒤에 ?를 붙이고 key와 value를 =로 엮는다. data type이 null인 경우는 key만 붙인다. key, value 쌍을 하나 이상 엮을 경우엔 &로 구분한다.

 

플레이어구분

플레이어는 다음과 같은 명칭으로 통일한다.

  • 모바일 : Mobile
    • iOS 전용 플레이어 : iOS
    • Android 전용 플레이어 : Android
  • 데스크탑 : Desktop
    • Flash 플레이어 : Flash
    • V2 플레이어 (ActiveX, NPAPI 플레이어) : V2
    • V3 전용 플레이어 (설치형, Agent 방식의 플레이어) : V3e
    • V3 플레이어 (HTML5 Agent 방식의 플레이어) : V3h
    • V4 플레이어 (HTML5 플레이어, 비암호화) : V4

 

파라미터

key DataType 지원플레이어 설명
pf string All 프로파일 자동 설정을 무시하고 지정된 프로파일 키에 해당하는 트랜스코딩 파일을 서빙. 존재하지 않으면 자동 설정.
예> ?pf=mixnut-pc-high1 (mixnut-pc-high1에 해당하는 트랜스코딩 파일을 서빙)
autoplay (a) null All 로딩 후 동영상 자동 시작. 단, 모바일 전용 플레이어는 기본이 자동시작이다. (옵션에 영향을 받지 않음)
mute null All 로딩 후 음소거된 상태에서 동영상 재생. 모바일 HTML5 플레이어는 시작시 음소거가 가능하지 않음.
download null Mobile,V3e, V3h 컨텐츠 다운로드 기능. download 옵션을 추가하면 비디오 게이트웨이가 다운로드 모드로 동작한다. 만약 채널에서 모바일이나 PC 다운로드 옵션을 사용하지 않음으로 설정하면, 실제 다운로드를 시도하더라도 플레이어가 다운로드하지 않음.
title string All 지정된 제목 외에 강제로 제목 지정. 모바일 HTML5 플레이어의 경우 원래 제목이 지원되지 않음.
t integer All 지정한 위치부터 재생함. nscreen 정보가 있더라도 이를 무시하고 주어진 시간부터 재생함. (이 경우 이어보기 팝업이 뜬다.)
예> ?t=10 (10초부터 재생)
s integer All 지정한 위치부터 재생하는 것은 t 옵션과 동일하지만, s 옵션은 이어보기 팝업이 뜨지 않는다.
force_exclusive_player null V2, V3e, V3h 비암호화 컨텐츠의 경우에도 데스크탑 전용 플레이어를 강제 사용하도록 설정. (모바일은 지원하지 않음.)
uservalue0~9 mixed All 고객사가 원하는대로 uservalue0부터 9까지 값을 설정하여 사용함.
brightness integer V2 기본 밝기 값을 설정. 값의 범위는 -50 <= brightness <= 50임. default는 0
contrast integer V2 기본 대비 값을 설정. 값의 범위는 -50 <= contrast <= 50임. default는 0
saturation integer V2 기본 색조 값을 설정. 값의 범위는 -50 <= saturation <= 50임. default는 0
mobile_return_url string iOS 재생 중 뒤로가기 버튼을 누르거나 재생 종료시에 지정한 url을 safari web browser로 오픈.
mobile_folder_download string Mobile 모바일 다운로드시 지정할 폴더명을 입력한다.
예> 폴더1/폴더2/폴더3
wmode string Flash 데스크탑의 경우 Flash player의 wmode를 강제로 지정한다. 지정하지 않은 경우는 ‘direct’ 사용.
wmode는 다음의 값 가운데서 하나를 지정할 수 있다.
예> direct, transparent, window, opaque, gpu
pc_player_version string Desktop 데스크탑에서 Player2.0 ~ 3.0 버전을 사용하도록 선택한다. 지정하지 않을 경우는 환경에 맞는 플레이어가 자동으로 실행된다.다음의 값 가운데서 하나만 지정할 수 있다.

가능한 옵션> v2, v3, v3e \

* v3e를 지정할 경우엔 v3 전용 플레이어가 호출된다.
* 호환성 이슈로 유지. 신규 사용자는 player_version 옵션을 사용하는 것을 권장한다.

player_version string Desktop 데스크탑에서 Player2.0 ~ 4.0 버전을 사용하도록 선택한다. 지정하지 않을 경우는 환경에 맞는 플레이어가 자동으로 실행된다.다음의 값 가운데서 하나만 지정할 수 있다.가능한 옵션> v2, v3, v3e, html5* v3e를 지정할 경우엔 v3 전용 플레이어가 호출된다.
pc_folder_download string V2, V3e, V3h PC 다운로드시 지정할 폴더명을 입력한다. (모바일과 형식은 동일)
play_downloaded_file null V3e, V3h 다운로드된 파일을 재생한다.
buffer integer V2, V3e, V3h 기본 버퍼링 값을 무시하고 지정한 값만큼 버퍼링을 수행한다. 2 <= buffer <= 10 사이의 정수만 유효하며, 해당 값은 기본 버퍼링 값의 배수로 작용한다.예> 2 -> 기본 버퍼링값의 2배
show_controls_paused boolean Flash, V4 값이 true이면 일시정지 상태일 경우 inactive 상태가 되었을 때 controlbar와 overlay button을 계속 보여줌. (Default : false)
show_poster_ended boolean Flash, V4 값이 true이면 컨텐츠 재생이 끝난 후 포스터를 보여준다. (Default : false)
overlay_button_position string Flash, V4 Overlay button의 위치값을 설정한다.
– TR : Top & Right
– TL : Top & Left
– BR : Bottom & Right
– BL : Bottom & Left
해당 옵션이 설정되지 않거나 위 4개의 값 외의 다른 문자열이 오면 가운데 정렬되어 보여진다.

 

Sample Code

  V/G Query String – java

 

Upload

FTP

  1. Kollus FTP 접속 정보 확인

    1. 웹 브라우저에서 Kollus 관리 페이지에 접속합니다.

    2. 로그인 계정 정보를 입력하여 로그인합니다.

    3. ‘파일 업로드 하기’ 선택

    4. 하여 ‘파일 업로드’ 페이지를 엽니다

    5. FTP 접속 정보를 확인합니다

  2. FTP 프로그램 실행

    FTP 프로그램이 있다면 ‘3) FTP 접속’ 세션으로 이동하세요. 만약 기존에 이용중인 FTP 프로그램이 있으시다면 기존 프로그램을 통하여 업로드 할 수 있습니다. 다만, FTP 업로드 가이드 문서는 ‘Filezilla’ 프로그램을 기준으로 작성하여 문서에 명시한 명칭은 FTP 프로그램 마다 다를 수 있음을 감안해주시길 바랍니다

    1. Filezilla 다운로드 웹 사이트에 접속합니다

    2. Filezilla 다운로드 후 설치합니다

    3. Filezilla 프로그램을 실행합니다

  3. FTP 접속

    Kollus FTP 접속 정보를 입력하여 접속합니다

    1. 호스트: FTP

    2. 사용자명: 아이디

    3. 패스워드: 패스워드

  4. 비디오 업로드

    FTP 프로그램을 통한 파일 업로드 시에는 ‘파일 암호화’, ‘카테고리 등록’, ‘패스쓰루’에 따라 사전에 약속된 업로드 폴더 규칙이 있습니다

    4-1. 일반/암호화 파일 업로드

    파일 방식에 따라 ‘일반 업로드’와 ‘암호화 업로드’2가지를 지원하며, 파일 방식에 맞게 사전에 정해진 규칙에 맞게 폴더를 생성하여 파일을 업로드 하셔야 합니다. ‘일반 업로드는 파일을 암호화하지 않은 표준 형태로 업로드하며, ‘암호화 업로드’는 파일을 암호화하여 업로드 합니다

    파일 보안 FTP 폴더 경로
    일반 /_카테고리
    암호화 /_encrypt/_카테고리

    서비스 계정에 SecurityPack이 적용되어 있지 않은 경우에는 ‘암호화 업로드’ 지원하지 않습니다

    4-2. 카테고리 등록

    Kollus 관리 페이지에서 생성한 카테고리에 파일을 등록하기 위해서는 사전에 정해진 규칙으로 폴더를 만들어 생성한 폴더에 파일을 업로드 함으로써 원하는 카테고리에 파일을 등록할 수 있습니다

    카테고리 구조 FTP 폴더 경로
    (1depth) 카테고리1 /_카테고리1
    (2depth) 카테고리1
    └ 카테고리2
    /_카테고리1/_카테고리2
    (3depth) 카테고리1
    └ 카테고리2
    └ 카테고리3
    /_카테고리1/_카테고리2/_카테고리3

    Kollus 관리 페이지에 2016- 뮤직비디오 – 빅뱅 3depth 구조로 생성한 카테고리 중 ‘빅뱅’ 카테고리에 FTP로 ‘일반 업로드’하는 경우 /-2016/-뮤직비디오/-빅뱅 폴더를 생성하여 파일을 업로드 하면 됩니다

    • Kollus 관리 페이지 생성한 카테고리(명)와 일치하지 않는 폴더(명)를 생성하여 파일을 업로드 하는 경우, 일치하지 않는 폴더 명을 카테고리로 신규 생성하여 파일을 등록합니다

    • 카테고리는 최대 3depth까지 생성할 수 있습니다

    4-3. 패쓰쓰루

    파일을 트랜스코딩 하지 않고 원본 그대로 업로드 업로드 하기 위한 방법입니다. 트랜스코딩 작업 없이 동영상의 ‘포스터 이미재와 ‘썸네일 이미지’만 추출하여 등록 합니다. ‘일반 업로드와 ‘암호화 업로드’에 따란 사전에 정해진 폴더 규칙에 맞게 폴더를 생성하여 파일을 업로드 하셔야 합니다

    파일보안 FTP 폴더 경로
    패스쓰루 일반 업로드 /_passthrough/_카테고리
    패스쓰루 암호화 업로드 /_passthrough_encrypt/_카테고리
    • 서비스 계정에 SecurityPack이 적용되어 있지 않은 경우에는 ‘암호화 업로드’ 지원하지 않습니다

    • 패스쓰루 업로드를 이용하기 위해서는 아래의 조건을 충족해야 합니다.

      • ‘MP4’ 확장자에 ‘H.264’ 포멧인 원본 파일

      • 원본 파일명에 ‘인코딩 프로파일 키’ 반영

      서비스 계정에 ‘원본 백업’ 비 활성화

    4.4 원본 파일명 ‘인코딩 프로파일 키’ 반영

    반영 다양한 화질의 원본 파일을 트랜스코딩 없이 그대로 서비스하는 경우 복수 원본 파일을 하나의 콘텐츠로 인식하고 원본 파일 화질에 맞게 프로파일을 지정하기 위해 Kollus 관리 페이지에 ‘인코딩 프로파일 키’ 확인하여 원본 파일명에 반영해야 합니다

    원본 파일명 인코딩 프로파일 키 반영
    A.mp4 A_인코딩프로파일키.mp4

    ‘인코딩 프로파일 키’는 Kollus 관리 페이지 설정 – 인코딩 프로파일 페이지에서 확인할 수 있습니다.

Upload API

개요

Kollus HTTP 업로드 Endpoint는 고객사가 업로드를 원하는 시점에 Kollus Open API의 일회성 업로드 URL 발급 API를 호출하여 획득한 업로드 URL로 HTTP multipart/form-data 형식으로 파일을 업로드하여, 이후 과정 (트랜스코딩) 을 진행토록 합니다.

Usecase scenario

  1. 사용자가 고객사의 Web 사이트에서 동영상 파일을 업로드 하기 위해 특정 페이지를 요청합니다.
  2. 고객사 업로드 페이지에서 사용자에게 업로드 경로를 반환하기 위해 Kollus Api를 이용해 업로드 URL 생성을 요청합니다.
  3. 업로드 URL 생성 요청에 대한 반환으로 업로드 URL과 업로드 파일키(Upload file key), 키 만료시간 정보등을 획득합니다.
  4. 3에서 반환 받은 업로드 URL 정보를 기반으로 고객에게 보여지는 업로드 페이지를 생성합니다.
  5. 고객사의 업로드 페이지에서 업로드를 하면 실제 업로드는 고객사의 웹사이트가 아닌 Kollus 업로드 서버로 직접 전송하게 됩니다.

유의사항

HTTP 프로토콜을 이용한 업로드를 지원하기 위해 사용자에게 업로드에 필요한 정보를 생성하는 API를 제공합니다. HTTP Upload API는 아래와 같은 특성을 갖습니다.

  • 생성된 업로드 URL, 업로드 파일키는 일회용입니다.
  • 생성된 업로드 파일키는 지정된 시간 이후 자동 폐기됩니다.

요청규격

업로드 URL 발급 요청시에는 다음과 같은 파라미터를 설정할 수 있습니다. Request는 Kollus API 정책에 따라 HTTP(80), POST만 지원합니다.

POST key Data type 기본값 비고
expire_time integer 600 (초) 값의 범위는 0 < expire_time <= 21600 입니다. 빈값을 보내거나 항목 자체를 제거하면 기본 600초로 설정됩니다.
category_key string (없음) 업로드한 파일이 속할 카테고리의 키입니다. 빈값을 보내거나 항목 자체를 제거하면 ‘없음’에 속합니다.
title string (없음) 입력한 제목을 컨텐츠의 제목으로 강제지정합니다. 이 값을 보내지 않거나 빈 값으로 보내면 기본적으로 파일명이 제목으로 사용됩니다.
is_encryption_upload integer 0 (일반) 0은 일반 업로드, 1은 암호화 업로드입니다. 암호화 업로드시 파일이 암호화 되어 Kollus의 전용 플레이어로만 재생됩니다. Security-pack이 적용되지 않은 서비스 계정에서 이 값을 1로 지정하여 요청한 경우는 업로드 URL 생성이 실패합니다.
is_audio_upload integer 0 (비디오) 0은 비디오 업로드, 1은 음원 파일 업로드 입니다.
is_multipart_upload integer 0 (일반) 파일의 분할 업로드를 지원하기 위한 값입니다. 추후 제공될 기능이며, 현재는 동작하지 않습니다.

 

응답규격

JSON / UTF-8 으로 결과를 반환 합니다.

(# upload_url에 사용되는 도메인 정보를 포함한 모든 정보는 Kollus 시스템 정책에 의해 변경될 수 있습니다.)

Sample
{
    "error": 0,
    "message": "",
    "result": {
        "upload_url": "http: //upload.kr.kollus.com/api/v1/UploadMultiParts/KUS_BOHG2eTQhPSIaG2511G1jfkpWOYAOjDc/20151204-dh6o2goz",
        “progress_url”: “http: //upload.kr.kollus.com/api/v1/GetUploadingProgress/KUS_BOHG2eTQhPSIaG2511G1jfkpWOYAOjDc”,
        "upload_file_key": "20141017-y4sae7td",
        "will_be_expired_at": 1413883670
    }
}

JSON Structure Description

  • error : 에러코드, 0이면 정상
  • message : 에러의 경우 상세 설명이 포함됩니다.
  • result : 정상인 경우 업로드 API 호출 결과를 포함 합니다.
    • upload_url : 업로드할 URL (HTTP)
    • progress_url : 업로드 진행률을 획득할 수 있는 URL (HTTP)
    • upload_file_key : 업로드 파일키
    • will_be_expired_at : upload_file_key 만료 시간 (unix timestamp)

파일업로드

업로드 URL 발급요청 API를 통해 획득한 업로드 URL(upload_url)이 실제 파일을 전송할 업로드 서버의 주소입니다. 이 주소에 대해 HTML multipart/form-data 형식으로 파일을 전송해야 합니다.

유의사항

  • 전송할 파일의 input name은 upload-file입니다.
  • 하나의 업로드 URL은 하나의 파일에 대응합니다. (하나의 업로드 URL로 하나 이상의 파일을 전송하려 시도할 경우 뒤에 업로드하는 파일의 업로드는 실패합니다.)
  • 업로드는 업로드 URL의 만료시간 전까지 완료되어야 합니다. 만료시간 판단은 업로드 시작 시점이 아니라 종료 시점에 판단합니다.

업로드 옵션

POST key Data type 기본값 비고
return_url string (없음) return_url이 주어지면 업로드 종료 후 해당 url로 redirect 합니다. 이때, result와 message값을 추가합니다.예> http://foo.com/result.html?result=S&message=…
disable_alert integer 0 기본적으로는 업로드 종료시 결과 메세지를 alert로 뿌려주도록 되어 있으나, 이 기능을 사용하지 않으려면 disable_alert값을 1로 하여 전송해주십시요.
redirection_scope string ‘outer’ 업로드 완료 후 redirect할 domain scope를 지정합니다. 이 옵션은 다음의 값 가운데 하나를 가질 수 있습니다.
accept string Request Header 가운데 Accept의 값 업로드 완료 후 전달받을 결과의 컨텐츠 타입을 지정합니다. 빈값으로 두면 text/html 방식으로 전달합니다. 이 경우는 return_url, disable_alert, redirection_scope 옵션들을 적용하여 생성된 html 페이지가 결과로 리턴됩니다. 이 값을 ‘application/json’ 형식으로 지정하면 위 세가지 옵션은 무시되며, 결과가 JSON 형식으로 리턴됩니다.

 

RETURN URL

  • result는 S와 F 두 값을 갖습니다. S는 업로드 성공을, F는 실패를 의미합니다.
  • message는 업로드 결과를 안내하는 메세지입니다. (alert창으로 보여지는 메세지와 같습니다.)

Sample

<form action="http: //upload.kr.kollus.com/20141017-y4sae7td" method="post" enctype="multipart/form-data">
     <!-- redirect scope 설정 -->
     <input type=”hidden” name=”redirection_scope” value=”outer” />

     <!-- 업로드 종료시 redirect할 url 설정 -->
     <input type=”hidden” name=”return_url” value=”http://www.lotte.com/upload_result.html” />

     <!-- 업로드 종료시 alert창을 띄우지 않도록 설정 (1) -->
     <input type=”hidden” name=”disable_alert” value=”1” />

     <input type=”file” name=”upload-file” />
     <input type=”submit” />
</form>

 

업로드 진행률

업로드 URL 생성 API 호출을 통해 획득한 결과 가운데 progress_url 엔트리를 참조하여 업로드 진행률을 획득합니다. (JSON 형식)

응답규격

JSON / UTF-8 으로 결과를 반환 합니다.

Sample

{
    "error": 0,
    "message": null,
    "result": {
        "progress": 100
    }
}

Callback

개요

Kollus 서비스를 이용 중 진행 상황은 직접 CMS를 통해서 확인할 수 있습니다. 다만, 편의를
위해 각 진행 상황마다 사전에 설정된 고객사의 Web URL로 진행 상황을 전송하고 있습니다.
이것을 Kollus Callback 서비스라고 부릅니다.
또한, 고객사의 Web URL로 Callback 전송이 실패했을 때 재시도합니다. 각 재시도 마다
내부적으로 로그를 기록하여 모든 재시도가 실패할 때에는 문제가 된 Callback 전송의 원인을
파악하고 정상적으로 Callback을 전송할 수 있도록 하고 있습니다.
본 문서는 Callback 전송과 재시도에 관한 Kollus Callback 전송서버의 처리 과정에 대해서
설명합니다.

Callback설정

Callback 설정은 채널과 관련된 부분의 설정은 관리자 권한을 가진 사용자가 해당 채널의
운영정책 설정 화면에서 지정할 수 있으며, 기타 Callback은 Kollus 서비스 담당자에게 설정을
요청하여야 합니다.

채널 Callback 설정 (채널 컨텐츠 추가, 삭제)

  • 상위 메뉴에서 채널을 선택합니다.
  • 생선된 채널의 속성 수정을 선택합니다.
  • 채널 속성 편집화면에서 채널 운영 정책을 선택합니다.
  • 콜백 사용을 “활성화” 합니다.
  • 필요한 채널 콜백을 등록합니다.

기타 Callback 설정 (업로드 완료, 트랜스코딩 완료, 컨텐츠 업데이트)

Kollus 서비스 담당자에게 별도 요청해 주십시오.

 

Callback전송

전송방법

  1. 모든 Callback은 고객사가 설정한 Web URL의 80번 포트로 POST 방식을 사용하여
    전달합니다.
  2. 모든 Callback은 전송 시점이 되면 즉시 전달하는 것을 원칙으로 합니다.
    (다만, Callback을 처리하는 서버의 상황이 몹시 분주한 경우 지연될 수 있습니다.)
  3. 고객사 웹서버는 Callback을 성공적으로 전달 받았을 경우 200 HTTP Status Code로
    응답해야 합니다. 이때 HTTP body 부분은 확인하지 않습니다. (200이 아닌 코드로
    응답할 경우 전송 실패로 간주하고 지정된 시간 후에 재시도 합니다.)

유의사항

고객사 서버는 Kollus의 Callback 전송 요청에 대해 2초 이내 연결이 수립되어야 하며,
연결이 수립된 이후 3초 내에 응답해야 합니다. 이 시간 내에 연결이 수립되지 않거나
응답하지 않는다면, Kollus Callback 전송서버는 전송 실패로 간주하고 지정된 시간 후에
재시도 합니다. (Connect Time­out 2초, Response Time­out 3초)

시나리오

 

Callback재전송

전송방법

  1. 기본적인 전송 방법은 “Callback 전송 처리” 항목과 동일합니다.
  2. 재시도는 5분 간격으로 최대 3번까지 시도합니다.

유의사항

고객사 서버는 Kollus의 Callback을 정상 처리했다고 간주하여 200 HTTP Status Code로
응답했다고 하여도, Connect/Response Time­out을 넘겨서 이미 Kollus Callback 전송
서버가 요청을 실패로 처리하였다면, Callback 요청이 재시도될 수 있습니다.
즉, Time­out으로 인한 동일한 Callback이 요청될 수 있으니 Callback URL 개발시
대비해야 합니다.

시나리오

Callback파라미터

업로드 완료 Callback

POST Data type 비고
content_provider_key string 고객사의 서비스 계정 키 입니다.
filename string 폴더를 포함한 업로드된 파일명입니다.
upload_file_key string 업로드 파일 키

 

트랜스코딩 완료 Callback

POST Data type 비고
content_provider_key string 고객사의 서비스 계정 키 입니다.
filename string 폴더를 포함한 업로드된 파일명입니다.
upload_file_key string 업로드 파일 키
transcoding_result string 트랜스코딩 결과 (success, fail)

 

채널 컨텐츠 추가 완료 Callback

POST Data type 비고
content_provider_key string 고객사의 서비스 계정 키 입니다.
filename string 폴더를 포함한 업로드 된 파일명입니다.
upload_file_key string 업로드 파일 키
media_content_key string 미디어 컨텐츠 키. 동영상 재생을 위해 채널에 할당된 컨텐츠를 식별하기 위한 키.
channel_key string 콘텐츠가 할당된 채널의 식별 키
channel_name string 콘텐츠가 할당된 채널의 이름
profile_key string 콘텐츠가 트랜스코딩된 프로파일 명. 하나 이상일 경우는 ‘|’를 구분자로 하여 표현합니다.
update_type string 업데이트 종류

 

채널 컨텐츠 삭제 완료 Callback

POST Data type 비고
content_provider_key string 고객사의 서비스 계정 키 입니다.
filename string 폴더를 포함한 업로드 된 파일명입니다.
upload_file_key string 업로드 파일 키
media_content_key string 미디어 컨텐츠 키. 동영상 재생을 위해 채널에 할당된 컨텐츠를 식별하기 위한 키.
channel_key string 콘텐츠가 할당된 채널의 식별 키
channel_name string 콘텐츠가 할당된 채널의 이름
update_type string 업데이트 종류

 

컨텐츠 업데이트 Callback

POST Data type 비고
content_provider_key string 고객사의 서비스 계정 키 입니다.
filename string 폴더를 포함한 업로드 된 파일명입니다.
upload_file_key string 업로드 파일 키
update_type string 업데이트 정류

Player Callback

Play

개요

Kollus 전용플레이어에서 재생을 할때 고객사에서 정의한 URL을 호출(Callback)하는 기능을
정의한 문서입니다.

Expire option

설정 항목의 data-type이나 값이 범위를 벗어나는 경우 컨텐츠 이용에 문제가 발생할 수 있으며,
잘못된 설정 값에 대한 사용 제한을 회수하는 방법은 존재하지 않습니다.

  • Expire date : 컨텐츠 만료 시간

    • data-type : integer, unixtime stamp

    • 컨텐츠 재생이 만료될 시간

      • 컨텐츠 재생이 만료될 시간

        ex) 2014. 3. 3. 5시 45분 30초 GMT → 1393825531

      • 0 : unlimited (무제한)

      • 최대값 : 2029년 12월 31일 23시 59분 59초 (1893455999)

Play callback

Play callback(이하 콜백)을 사용하기 위해서는 CMS의 관리 화면에서 관리자 이상의 권한을
소유한 로그인 계정으로 채널 속성에 Play 콜백 항목에 고객사에서 콜백을 응답받기 위해 정의된
URL을 등록하셔야 합니다.

Play 콜백이 정의되지 않은 채널은 콜백의 응답과 관계없이 재생을 진행합니다. 콜백이 정의된
채널을 통해 서비스되는 콘텐츠는 콜백에 대한 응답을 확인 후 재생하기 때문에 고객사에서
정의한 콜백 URL은 항상 응답상태를 유지하셔야 원활한 서비스를 받으실 수 있습니다.

주의:

  1. 고객사의 회원 아이디를 포함한 미디어 토큰(Media token)을 생성하여 요청된
    경우에 Play 콜백이 호출됩니다.
    (미디어 토큰 생성은 별도 문서를 참고해 주십시오.)
  2. Play 콜백 URL이 응답하지 않으면 재생 되지 않습니다.
  3. Play 콜백은 다운로드된 콘텐츠에 대한 DRM 콜백과 다르게 동작합니다.
    다운로드된 콘텐츠는 Play 콜백이 아닌 DRM 콜백으로 동작하게 됩니다.
    필요에 따라 Play 콜백과 DRM 콜백 URL을 동일하게 등록하면 다운로드와
    스트리밍시에 재생에 대한 응답을 동일하게 받으실 수 있습니다.

Callback flow

 

  1. 채널에 Play 콜백 URL을 설정합니다.

  2. Media token을 생성하여 다운로드를 요청합니다.

    • Kollus crypt SDK를 이용해 Media token을 생성합니다.
  3. Kollus mobile player가 http://www.foo.com/auth.php 에 다음의 정보를 POST 전송
    합니다.

    • kind : 1, 3

    • client_user_id : 고객사 회원 아이디

      • Media token 생성시 포함된 아이디입니다.
    • player_id : 고객사 회원이 가지고 있는 단말 아이디

    • device_name : 고객사 회원이 가지고 있는 단말명

    • media_content_key : 현재 재생하려는 콘텐츠 key 입니다.

      • 채널에 등록된 컨텐츠에 부여된 고유 키입니다.
      • 업로드된 컨텐츠를 여러채널에 등록하면 media_content_key는 모두
        다르게 생성됩니다.
  4. 고객사 Play 콜백 서버는 전달 받은 위 정보를 바탕으로 다음의 json 포멧의 data를
    아래의 방식 중에서 하나로 Http Body에 전송합니다.

    (고객사가 인증 정보를 플레이어로 전달할 때 모든 데이터의 자료형은 반드시 기술된대로
    integer 형이여야만 합니다.)

    • 지원하는 방식

      • Kollus crypt SDK를 이용해 암호화하여 전송합니다.
      • JWT Encode하여 전송합니다. 알고리즘은 HS256만 지원하며 secret키는
        콜백 요청 시 넘겨주는 custom_key파라미터 값을 사용합니다.

Response JSON spec.

Json Tag Description
expiration_date unixtime stamp (만료될 시간의 unixtime stamp)
최대값 : 2029년 12월 31일 23시 59분 59초 (1893455999)
result 반환 결과가 정상인 경우 1, 비정상인 경우 0을 반환하도록 합니다.
content_expired DRM 컨텐츠를 강제로 expire 시킵니다.

 

Callback Kind

Play 콜백이 호출되는 상황은 아래 3가지 경우입니다.

 

콘텐츠의 Expire 정보를 요청하는 경우 (kind:1)

Request
구분 Description
POST Http POST로 요청합니다. (parameter가 아닙니다.)
kind 1
client_user_id 고객사 사용자 ID, media_token 생성시 사용된 client_user_id와 동일합니다.
player_id 고객사 사용자가 가지고 있는 단말의 아이디
hardware_id 단말의 hardware 아이디(PC, 입력값이 있으면)
device_name 고객사 사용자가 가지고 있는 단말의 모델명
media_content_key Kollus 컨텐츠 unique key
uservalues JSON format (VideoGateway 호출시 사용된 uservalue0~9)
  • uservalues sample

    • uservalues={"uservalue0":"강의코드01","uservalue1":"상품코드02","uservalue9":"
      생성코드03"}
    • VideoGateway(v.kr.kollus.com)호출시 사용된 uservalue0~9 정보를 함께 전달
      받습니다.
Response
카테고리 구분 Description
Data (int) expiration_date 만료될 시간의 unixtime stamp
최대값 : 2029년 12월 31일 23시 59분 59초 (1893455999)
  (int) result 0 (비정상), 1 (정상)
  (string) message 0 (비정상)의 경우 message를 추가하면 상황에 따른 메시지가 표시됩니다.
  (int) vmcheck 0 (사용안함), 1 (사용함, default) virtural machine 체크 여부, PC(v3)용에서만 사용 가능
  (array)
play_section{
start_time,
end_time
}
미리 보기 구간 초로 구분(end_time이 start_time 보다 커야 한다)
  (int) disable_tvout 0 (tvout 차단 안함), 1 (tvout 차단) 이 항목이 없으면 채널에 있는 disable_tvout정책이 적용됩니다.
  (int)
expiration_playtime
이 항목이 없거나 0이면 재생 시간을 사용하지 않고 0보다 크면 해당 값의 초만큼만 재생 후 종료합니다.
exp (int) 사용 가능 시간 unixtime stamp(옵션)
Example
{
    “data” : {
        "expiration_date": 1402444800,
        "vmcheck": 1,
        "play_section": [
            “start_time”: 0,
            “end_time” : 60
        ],
        "disable_tvout": 1,
        "expiration_playtime": 1800,
        "result": 1
    },
    “exp” : 1477558242
}

 

콘텐츠를 재생하는 경우 (kind:3)

주의) 콘텐츠 재생을 위해 반드시 응답해야 합니다. Play 콜백에 대한 응답을 확인 후에 재생을
시작합니다.

Request
구분 Description
POST Http POST로 요청합니다. (parameter가 아닙니다.)
kind 3
client_user_id 고객사 사용자 ID, media_token 생성시 사용된 client_user_id와 동일합니다.
player_id 고객사 사용자가 가지고 있는 단말의 아이디
device_name 고객사 사용자가 가지고 있는 단말의 모델명
media_content_key Kollus 컨텐츠 unique key
uservalues JSON format (VideoGateway 호출시 사용된 uservalue0~9)
Response
카테고리 구분 Description
data (int) content_expired 0 (재생가능), 1 (재생 제한)
재생을 차단합니다. DRM 콜백과 동일한 스펙 유지를 위해 동일한 항목으로 유지됩니다.
  (int) result 0 (비정상), 1 (정상)
0 인 경우 재생되지 않습니다. 이때 conent_expired가 1이어도 expire가 수행되지 않습니다.
  (string) message 0 (비정상)의 경우나 content_expired이 1(재생 제한)의 경우 message를 추가하면 상황에 따른 메시지가 표시됩니다.
exp (int) expiration_date 사용 가능 시간 unixtime stamp(옵션)
최대값 : 2029년 12월 31일 23시 59분 59초 (1893455999)
Example
{
    “data” : {
        "content_expired": 1,
        "result": 1
    },
    "exp" : 1477558242
}	

Sample

  • Play callback url

  • 컨텐츠 만료 시간 : 2014년 6월 10일 자정 종료

    • DATE (M/D/Y @ h : m : s): 6 / 10 / 2014 @ 24:0:0 UTC
    • Unix time stamp : 1402444800
    • http://www.epochconverter.com 를 이용해 1402444800 값을 변경해 볼 수
      있습니다. GMT가 아닌 UTC입니다.
kind1 : request expire option
request
  • URL : http://www.foo.com/auth.php

  • post data

    • kind=1
    • client_user_id=guest1
    • media_content_key=VXBW1VdY
    • uservalues={"uservalue0":"강의코드01","uservalue1":"상품코드02","uservalue9":"
      생성코드03"}
response
{
    “data” : {
        "expiration_date": 1402444800,
        "result": 1
    },
    "exp" : 1477558242
}

 

kind3 : play content (expire content)
request
  • URL : http://www.foo.com/auth.php

  • post data

    • kind=3
    • client_user_id=guest1
    • media_content_key=VXBW1VdY
    • uservalues={"uservalue0":"강의코드01","uservalue1":"상품코드02","uservalue9":"
      생성코드03"}
response
{
    “data” : {
        "content_expired": 1,
        "result": 1
    },
    "exp" : 1477558242
}

 

Code sample

다음과 같은 고객사의 DB가 구성된 것으로 고려되어 샘플이 구성되어있습니다.

 

 

PHP sample
<?php
    /**
    * PHP Version : 5.4 above
    * by yupmin
    */
    include "./config.php";
    
    // 주의 : kind가 1일때 자동으로 expiration_date가 생성되는 샘플 페이지입니다.
    // 재생 제한 횟수
    $_default_expiration_count = 3;
    $_expired_duration = 60 * 60 * 24; // 1 day
    // DB Connection
    $_db_conn = mysql_connect($_hostname, $_username, $_password);
    if (!$_db_conn) {
   		die('Could not connect: ' . mysql_error());
    }
    $_db_selected = mysql_select_db($_database, $_db_conn);
    if (!$_db_selected) {
    	die ('Can\'t use database : ' . mysql_error());
    }
    $_kind = isset($_POST['kind']) ? ((int) $_POST['kind']) : NULL;
    $_media_content_key = isset($_POST['media_content_key']) ? $_POST['media_content_key'] : 		NULL;
    $_client_user_id = isset($_POST['client_user_id']) ? $_POST['client_user_id'] : NULL;
    
    $channel = NULL;
    $_query = sprintf("SELECT * FROM `channels` WHERE `media_content_key` = '%s'",
   		mysql_real_escape_string($_media_content_key, $_db_conn));
    $_result = mysql_query($_query, $_db_conn);
    if ($_result) {
   		$channel = mysql_fetch_array($_result, MYSQL_ASSOC);
    	if ($channel === FALSE) $channel = NULL;
    } else {
    	die('Invalid query: ' . mysql_error());
    }
    
    $user = NULL;
    $_query = sprintf("SELECT * FROM `users` WHERE `client_user_id` = '%s'",
    	mysql_real_escape_string($_client_user_id, $_db_conn));
    $_result = mysql_query($_query, $_db_conn);
    if ($_result) {
    	$channel = mysql_fetch_array($_result, MYSQL_ASSOC);
    	if ($channel === FALSE) $channel = NULL;
    } else {
    	die('Invalid query: ' . mysql_error());
    }
    
    $channel_user = NULL;
    if (!is_null($_media_content_key) && !is_null($_client_user_id)) {
    	$_query = sprintf("SELECT * FROM `channel_users` WHERE `user_id` = '%s', `channel_id` = 			'%s'",
    	$user['id'], $channel['id']);
    	$_result = mysql_query($_query, $_db_conn);
        if ($_result) {
        	$channel_user = mysql_fetch_array($_result, MYSQL_ASSOC);
            if ($channel_user === FALSE) $channel_user = NULL;
        } else {
        	die('Invalid query: ' . mysql_error());
        }
   	}
    $_json_result = array('result' => 0);
    switch($_kind) {
    case 1:
        if (is_null($channel_user)){
            $_expiration_date = time() + $_expired_duration;
            $_expiration_count = $_default_expiration_count;
            $_query = sprintf("INSERT INTO `channel_users`(`user_id`, `channel_id`, 						`expiration_date`
                ,`expiration_count` , `created_at`, `updated_at`) VALUES('%s', '%s', '%s', '%s', 			 UNIX_TIMESTAMP(),
                UNIX_TIMESTAMP())", $user['id'], $channel['id'], $_expiration_date, 						$_expiration_count);

            $_result = mysql_query($_query, $_db_conn);
             if (!$_result) {
                die('Invalid query: ' . mysql_error());
            }
        } else {
            $_expiration_date = $channel_user['expiration_date'];
            $_expiration_count = $channel_user['$expiration_count'];
        }
        $_json_result['expiration_date'] = (int) $_expiration_date;
        $_json_result['expiration_count'] = (int) $_expiration_count;
        break;
    case 3:
    	if (!is_null($channel_user) && $channel_user['is_expired']) {
    		$_json_result['content_expired'] = 1;
    	}
    	break;
    }
    
    // DB Close
    mysql_close($_db_conn);
    
    // json_encode된 결과를 kollus_encrypt를 통해 암호화시킴
    echo kollus_encrypt(json_encode($_json_encode));
}

 

JSP ​sample
<%@page import="org.codehaus.jettison.json.JSONObject"%>
<%@page import="java.util.Locale"%>
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.ArrayList"%>
<%@page import="org.codehaus.jackson.map.ObjectMapper"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.sql.*"%>
<%@ page import="test.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    String kind_str = request.getParameter("kind");
    String media_content_key = request.getParameter("media_content_key");
    String client_user_id = request.getParameter("client_user_id");
    int kind = Integer.parseInt(kind_str);
    int _default_expiration_count = 3;
    int _expired_duration = 60 * 60 * 24; //one day
    int channel_id = 0;
    int user_id = 0;
    int channel_user_id = 0;
    int expiration_count = 0;
    int is_expired = 0;
    int download_times = 0;

    Long expiration_date = 0l;
    Connection conn = null; // null로 초기화 한다.
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    JSONObject jsonobj = new JSONObject();
	try {
        String url = "jdbc:mysql://localcost:3306/kollus_base";
        String id = "test"; // 사용자 계정
        String pw = "test"; // 사용자 계정의 패스워드
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        conn = DriverManager.getConnection(url, id, pw);
        String sql = "SELECT * FROM `channels` WHERE `media_content_key` = ? ";
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1,media_content_key);
        rs = pstmt.executeQuery();
		while(rs.next()){
			channel_id = rs.getInt("id");
		}
        rs.close();
        pstmt.close();
        sql = "SELECT * FROM `users` WHERE `client_user_id` = ?";
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1,client_user_id);
        rs = pstmt.executeQuery();
        while(rs.next()){
        	user_id = rs.getInt("id");
        }
		rs.close();
		pstmt.close();
		if (channel_id > 0 && user_id > 0) {
            sql = "SELECT * FROM `channel_users` WHERE `user_id` = ?, `channel_id` = ? ";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, channel_id);
            pstmt.setInt(2, user_id);
            rs = pstmt.executeQuery();
		   while(rs.next()){
                channel_user_id = rs.getInt("id");
                expiration_date = rs.getLong("expiration_date");
                expiration_count = rs.getInt("expiration_date");
                is_expired = rs.getInt("is_expired");
                download_times = rs.getInt("download_times");
	       }	
           rs.close();
           pstmt.close();
	    }
		jsonobj.put("result", "0");
        switch(kind) {
            case 1:
                if (channel_user_id == 0) {
                    Long starttime = System.currentTimeMillis()/1000;
                    expiration_date = starttime + _expired_duration;
                    expiration_count = _default_expiration_count;
                    sql = "INSERT INTO `channel_users`(`user_id`, `channel_id`,
                    `expiration_date` ,`expiration_count` , `created_at`, `updated_at`) VALUES 						(?,?,?,?,?,?)"; // sql 쿼리
                    pstmt = conn.prepareStatement(sql); // prepareStatement에서 해당 sql을 미리 컴파일한다.

                    pstmt.setInt(1, user_id);
                    pstmt.setInt(2, channel_id);
                    pstmt.setLong(3, expiration_date);
                    pstmt.setInt(4, expiration_count);
                    pstmt.setLong(5, starttime); // 현재 날짜와 시간
                    pstmt.setLong(6, starttime); // 현재 날짜와 시간
                    pstmt.executeUpdate();
                    pstmt.close();
                 }
                 jsonobj.put("expiration_date", expiration_date);
                 jsonobj.put("expiration_count", expiration_count);
                 break;
            case 3:
                 if (channel_user_id > 0 && is_expired > 0) {
                    jsonobj.put("expiration_date", expiration_date);
                }
        }
		break;
		conn.close();
	} catch (Exception e) { // 예외가 발생하면 예외 상황을 처리한다.
		e.printStackTrace();
	}
	String sendMsg = jsonobj.toString();
	// System.out.println(sendMsg);
%>
<%= kollus_encrypt(sendMsg)%>

 

샘플코드

 Playcallback – dotnet

 Playcallback – jsp

 

DRM

개요

Kollus 모바일 다운로드 DRM을 이용해 다운로드한 컨텐츠의 ‘재생 재한 횟수’, ‘컨텐츠 만료
기간’, ‘컨텐츠 재생시간’을 설정하여 컨텐츠의 재생을 제어하는 기능을 설명하는 문서입니다.
서비스 모델에 따라 중복 제한으로 설정되어 사용될 수 있습니다.

Expire option

설정 항목의 data-type이나 값이 범위를 벗어나는 경우 컨텐츠 이용에 문제가 발생할 수 있으며,
잘못된 설정 값에 대한 사용 제한을 회수하는 방법은 존재하지 않습니다.

  • Expire count : 재생 제한 횟수
    • data-type : integer
    • range : 0 ~ 1000
    • 0 : unlimited (무제한)
  • Expire date : 컨텐츠 만료 시간
    • data-type : integer, unixtime stamp
    • 컨텐츠 재생이 만료될 시간
      • 컨텐츠 재생이 만료될 시간ex) 2014. 3. 3. 5시 45분 30초 GMT → 1393825531
      • 0 : unlimited (무제한)
      • 최대값 : 2029년 12월 31일 23시 59분 59초 (1893455999)
  • Expire playtime : 재생시간 제한 (배속의 경우 배속이 적용된 시간 적용)
    • data-type : integer
    • range : 0, 60 ~ 604800 (단위:초, 최소: 60초, 최대:1주일)
    • 0 : unlimited (무제한)

DRM callback

DRM 정책을 적용하기 위해서는 채널에 DRM 콜백 URL(DRM callback url)을 설정해야 합니다.

채널에 DRM 콜백 URL을 설정하면 컨텐츠를 다운로드하는 시점에 채널에 설정된 DRM 콜백
URL을 호출하여 반환된 값을 DRM 정책으로 사용하게 됩니다.
​ 이때 다운로드되는 DRM 정책 정보는 JWT Encode 되어 Http Body에 반환 되어야 합니다.

주의:

  1. DRM 콜백 URL이 응답하지 않으면 다운로드가 되지 않습니다.
  2. 알고리즘은 HS256만 지원을 하며 Http 헤더에 지정된
    헤더(X-KOLLUS-USERKEY)의 값으로 “사용자키”를 함께 전송해야 합니다.

Callback ​flow

 

  1. 채널에 DRM 콜백 URL을 설정합니다.
  2. JSON 데이터를 생성 후 JWT로 인코딩 한다.
  3. Kollus mobile player가 http://www.foo.com/auth.php 에 다음의 정보를 POST 전송
    합니다.

    • session_key : 플레이어에서 생성한 요청 확인용 세션키
      • kind3의 content_expire_reset 경우 요청한 session_key를 확인합니다.
      • Callback v2가 적용되는 v1.6에서 적용됩니다.
    • kind : 1 – 3
    • client_user_id : 고객사 회원 아이디
      • Media token 생성시 포함된 아이디입니다.
    • player_id : 고객사 회원이 가지고 있는 단말 아이디
    • device_name : 고객사 회원이 가지고 있는 단말명
      • 안드로이드, 아이폰에 따라 단말명이 다르게 전달됩니다.
      • 아이폰의 경우 사전에 Apple에서 정의한 문자열로 전달되며 안드로이드의
        경우 ​디바이스명, ​모델명이 ​함께 ​전달됩니다.
        안드로이드의 경우 해당 정보가 없을 경우 NULL을 전달 합니다.
    • media_content_key : 현재 다운로드하려는 컨텐츠 key 입니다.
      • 채널에 등록된 컨텐츠에 부여된 고유 키입니다.
      • 업로드된 컨텐츠를 여러채널에 등록하면 media_content_key는 모두
        다르게 ​생성됩니다.
  4. 고객사 DRM 인증서버는 전달받은 위 정보를 바탕으로 다음의 json 포멧의 data를 JWT의
    payload ​에 ​추가하여 Encoding ​하고 ​헤더에 ​지정된 “시용자키(X-KOLLUS-USERKEY)”를
    함께 ​전송합니다.​(고객사가 인증 정보를 플레이어로 전달할 때 모든 데이터의 자료형은 반드시 기술된대로
    integer 형이여야만 합니다.)

Response JSON spec.

Json Tag Description
expiration_date unixtime stamp (만료될 시간의 unixtime stamp)
최대값 : 2029년 12월 31일 23시 59분 59초 (1893455999)
expiration_count 재생 제한 횟수
expiration_playtime 재생시간 제한
result 반환 결과가 정상인 경우 1, 비정상인 경우 0을 반환하도록 합니다.
content_expired DRM 콘텐츠를 강제로 expire 시킵니다.
content_delete DRM 콘텐츠를 강제 삭제 합니다.
content_expire_reset expire 콘텐츠를 복구합니다.
session_key * v1.6 이후 Callback v2에서 적용됩니다.
kind3의 요청으로 content_expire_reset
작업시 Request에 포함된 session_key를 Response에 포함시켜야 합니다.
media_content_key Kollus 컨텐츠 Unique Key
kind 요청에 대한 구분

device_name 추가 설명

  • Andoid안드로이드 어플 개발시 사용되는 Build.DEVICE, Build.MODEL을 /(슬래쉬)로 구분한
    문자열로 ​만들어 ​사용합니다.

    • Build.DEVICE+”/”+Build.MODEL
    • 단말기의 특성에 따라 해당 정보는 NULL로 표시될 수 있습니다.
  • iOSiOS의 경우 iOS에서 제공하는 device-name을 사용합니다.
@"i386" on 32-bit Simulator
@"x86_64" on 64-bit Simulator
@"iPod1,1" on iPod Touch
@"iPod2,1" on iPod Touch Second Generation
@"iPod3,1" on iPod Touch Third Generation
@"iPod4,1" on iPod Touch Fourth Generation
@"iPhone1,1" on iPhone
@"iPhone1,2" on iPhone 3G
@"iPhone2,1" on iPhone 3GS
@"iPad1,1" on iPad
@"iPad2,1" on iPad 2
@"iPad3,1" on 3rd Generation iPad
@"iPhone3,1" on iPhone 4
@"iPhone4,1" on iPhone 4S
@"iPhone5,1" on iPhone 5 (model A1428, AT&T/Canada)
@"iPhone5,2" on iPhone 5 (model A1429, everything else)
@"iPad3,4" on 4th Generation iPad
@"iPad2,5" on iPad Mini
@"iPhone5,3" on iPhone 5c (model A1456, A1532 | GSM)
@"iPhone5,4" on iPhone 5c (model A1507, A1516, A1526 (China), A1529 | Global)
@"iPhone6,1" on iPhone 5s (model A1433, A1533 | GSM)
@"iPhone6,2" on iPhone 5s (model A1457, A1518, A1528 (China), A1530 | Global)
@"iPad4,1" on 5th Generation iPad (iPad Air) - Wifi
@"iPad4,2" on 5th Generation iPad (iPad Air) - Cellular
@"iPad4,4" on 2nd Generation iPad Mini - Wifi
@"iPad4,5" on 2nd Generation iPad Mini - Cellular
@"iPhone7,1" on iPhone 6 Plus
@"iPhone7,2" on iPhone 6

 

Callback ​kind

DRM callback이 호출되는 상황은 아래 3가지 경우입니다.

DRM 컨텐츠의 Expire 정보를 요청하는 경우 (kind:1)
Request
구분 Description
POST Http POST로 요청합니다. (parameter가 아닙니다.)
kind 1
client_user_id 고객사 사용자 ID, media_token 생성시 사용된 client_user_id와 동일합니다.
player_id 고객사 사용자가 ​가지고 ​있는 ​단말의 ​아이디
device_name 고객사 사용자가 가지고 있는 단말의 모델명
media_content_key Kollus 컨텐츠 unique key
uservalues JSON format (VideoGateway 호출시 사용된 uservalue0~9)
  • uservalues sample
    • uservalues={“uservalue0″:”강의코드01″,”uservalue1″:”상품코드02″,”uservalue9″:”
      생성코드03″}
    • VideoGateway(v.kr.kollus.com)호출시 사용된 uservalue0~9 정보를 함께 전달
      받습니다.
Response
카테고리 구분 Description
data (int) expiration_date 만료될 시간의 unixtime stamp
최대값 : 2029년 12월 31일 23시 59분 59초
(1893455999)
(int) expiration_count 재생 제한 횟수, 예) 10 ← 10번 재생 가능
(int) result 0 (비정상), 1 (정상)
0 인 경우 다운로드 되지 않습니다.
0 인 경우 재요청되지 않습니다.
(string) message 0 (비정상)의 경우 message를 추가하면 상황에 따른 메시지가 표시됩니다.
(int) expiration_refresh_popup 만료후 갱신 여부 팝업 표시
0 인 경우 표시하지 않음 (기본값)
1 인 경우 DRM 만료후 갱신이 필요할때 사용자
확인을 받는 팝업을 표시합니다.
(int) disable_tvout 0 (tvout 차단 안함), 1 (tvout 차단)
이 항목이 없으면 채널에 있는 disable_tvout정책이 적용됩니다.

 

Example
{
    “data” : {
        "expiration_date": 1402444800,
        "expiration_count": 10,
   		"result": 1
    }
}

 

DRM 컨텐츠의 Download가 100% 완료된 경우 (kind:2)

주의) 반드시 응답해야 하며, Block 상태로 통신합니다.

Request
구분 Description
POST Http POST로 요청합니다. (parameter가 아닙니다.)
kind 2
client_user_id 고객사 사용자 ID, media_token 생성시 사용된 client_user_id와 동일합니다.
player_id 고객사 사용자가 ​가지고 ​있는 ​단말의 ​아이디
device_name 고객사 사용자가 가지고 있는 단말의 모델명
media_content_key Kollus 컨텐츠 unique key
uservalues JSON format (VideoGateway 호출시 사용된 uservalue0~9)
Response
카테고리 구분 Descriptsion
data (int) expiration_date 만료될 시간의 unixtime stamp
해당 항목이 있으면 kind1의 값을 대체합니다.
최대값 : 2029년 12월 31일 23시 59분 59초
(1893455999)
(int) content_delete 0 (삭제하지 않음), 1 (다운로드 받은 파일 삭제)
다운로드된 컨텐츠를 요청에 의해 삭제하는 옵션입니다.
(int) result 0 (비정상), 1 (정상)
0 인 경우 추가 작업은 없습니다.
0 인경우 추가 옵션은 무시됩니다.
0 인 경우 재요청되지 않습니다.
(string) message 0 (비정상)의 경우나 content_delete이 1(다운로드 받은 파일 삭제) 시 message를 추가하면 상황에 따른 메시지가 표시됩니다.
Example
{

    “data” : {

        "content_delete": 1,

        "result": 1

	}

}

 

DRM 컨텐츠를 재생하는 경우 (kind:3)

​ 주의) v1.6 이후 재생시 네트워크 통신이 가능한 경우 전송되며 요청 실패시
네트워크 통신이 가능할 때 재 전송 됩니다.

Request
구분 Description
POST Http POST로 요청합니다. (parameter가 아닙니다.)
kind 3
client_user_id 고객사 사용자 ID, media_token 생성시 사용된 client_user_id와 동일합니다.
player_id 고객사 사용자가 가지고 있는 단말의 아이디
device_name 고객사 사용자가 가지고 있는 단말의 모델명
media_content_key Kollus 컨텐츠 unique key
start_at unixtimestamp (localtime)
– 전송 요청 시간
uservalues JSON format (VideoGateway 호출시 사용된 uservalue0~9)
Response
카테고리 구분 Description
data (int) content_expired 0 (재생가능), 1 (재생 제한)
다운로드 컨텐츠를 강제로 expire 시킵니다.
필요시 content_expire_reset 옵션으로 다시 복구 할 수 있습니다.
* expired 컨텐츠는 0(재생가능)으로 응답해도 재생되지 않습니다.
(int) result 0 (비정상), 1 (정상)
0 인 경우 재생되지 않습니다.
0 인 경우 추가 옵션은 무시됩니다.
0 인 경우 재요청되지 않습니다.
(string) message 0 (비정상)의 경우나 content_expired이 1(재생 제한) 시 message를 추가하면 상황에 따른 메시지가 표시됩니다.
Example
{

    “data: {

        "content_expired" : 1,

        "result": 1

	}

}

Sample

  • DRM callback url
  • 컨텐츠 만료 시간 : 2014년 6월 10일 자정 종료
    • DATE (M/D/Y @ h : m : s): 6 / 10 / 2014 @ 24:0:0 UTC
    • Unix time stamp : 1402444800
    • http://www.epochconverter.com 를 이용해 1402444800 값을 변경해 볼 수
      있습니다. GMT가 아닌 UTC입니다.
  • 컨텐츠 재생 횟수 제한 : 10회
kind1 : request expire option
request
  • URL : http://www.foo.com/auth.php
  • post data
    • kind=1
    • client_user_id=guest1
    • media_content_key=VXBW1VdY
    • uservalues={“uservalue0″:”강의코드01″,”uservalue1″:”상품코드02″,”uservalue9″:”
      생성코드03″}
response
{

    “data” : {

        "expiration_date": 1402444800,

        "expiration_count": 10,

        "result": 1

	}

}

 

kind2 ​:​ ​download​ ​complete
request
  • URL : http://www.foo.com/auth.php
  • post data
    • kind=2
    • client_user_id=guest1
    • media_content_key=VXBW1VdY
    • uservalues={“uservalue0″:”강의코드01″,”uservalue1″:”상품코드02″,”uservalue9″:”
      생성코드03″}
response
{

    “data” : {

    	"result": 1

    }

}

 

DRM Callback 신규 버전 v2

이전 1.4까지 제공되던 kind1, kind2, kind3의 호출이 한번의 호출로 통합되어 호출되는 버전으로
변경됩니다. ​이전 ​버전은 ​사용자의 ​사용자의 ​빈번한 ​호출에 ​대응하기 ​용이하지 ​않다는 ​다수
고객사의 요청에 따라 추가 되었습니다. 편의상 새로운 버전을 v2로 이전버전을 v1으로 합니다.

Reuest

구분 Description
POST Http POST로 요청합니다. (parameter가 아닙니다.)
items JsonArray로 구성된 string 입니다.

items 항목은 kind1, kind2, kind3의 데이터를 모두 포함한 호출이 될 수 있습니다.

 

items (JsonArray)
kind1, kind2
구분 Description
kind 1,2
client_user_id 고객사 사용자 ID, media_token 생성시 사용된 client_user_id와 동일합니다.
player_id 고객사 사용자가 가지고 있는 단말의 아이디
hardware_id 단말의 hardware 아이디(PC, 입력값이 있으면)
device_name 고객사 사용자가 가지고 있는 단말의 모델명
media_content_key Kollus 컨텐츠 unique key
uservalues JSON format (VideoGateway 호출시 사용된 uservalue0~9)
kind3
구분 Description
kind 3
session_key content_expire_reset 요청시 동일한 session_key를 확인합니다.
client_user_id 고객사 사용자 ID, media_token 생성시 사용된 client_user_id와 동일합니다.
player_id 고객사 사용자가 가지고 있는 단말의 아이디
hardware_id 단말의 hardware 아이디(PC, 입력값이 있으면)
device_name 고객사 사용자가 가지고 있는 단말의 모델명
media_content_key Kollus 컨텐츠 unique key
start_at unixtimestamp (localtime)
– 전송 요청 시간
uservalues JSON format (VideoGateway 호출시 사용된 uservalue0~9)
content_expired 만료된 컨텐츠 확인 flag( 1 : 만료, 0 : 재생가능)
reset_req 일괄갱신 요청인지 판단( 0 (default), 1 : 일괄갱신)
Items Sample
[

    {

        "kind": 1,

        "media_content_key" : "XXX-MEDIA_CONTENTKEY-XXX",

        "client_user_id": "XXXXXXX",

        "player_id": "xxxxxxxxxxxxxxxx",

        "device_name": "XXXXX",

        "uservalues": {

            "uservalue0": "value0"

        }

    },

    {

        "kind": 2,

        "media_content_key" : "XXX-MEDIA_CONTENTKEY-XXX",

        "client_user_id": "XXXXXXX",

        "player_id": "xxxxxxxxxxxxxxxx",

        "device_name": "XXXXX",

        "uservalues": {

            "uservalue0": "value0"

        }

    },

    {

        "kind": 3,

        "session_key" : "XXX-SESSION_KEY-XXX", ← content_expire_reset 요청시 확인합니다.

        "media_content_key" : "XXX-MEDIA_CONTENTKEY-XXX",

        "client_user_id": "XXXXXXX",

        "player_id": "xxxxxxxxxxxxxxxx",

        "device_name": "XXXXX",

        "uservalues": {

       		"uservalue1": "value1"

        }

    }

]

 

Response

Array은 “data” 필드로 응답 받는다.

kind1
구분 필수 Description
(int) kind O 1
(string) media_content_key O Kollus 컨텐츠 Unique Key
(int) expiration_date 만료될 시간의 unixtime stamp
최대값 : 2029년 12월 31일 23시 59분 59초 (1893455999)
(int) expiration_count 재생 제한 횟수, 예) 10 ← 10번 재생 가능
(int) expiration_playtime 재생 시간 제한, 예) 60 ← 60초 재생 가능
(int) result O 0 (비정상), 1 (정상)
0 인 경우 다운로드 되지 않습니다.
0 인 경우 재 요청되지 않습니다.
(string) message 0 (비정상)의 경우 message를 추가하면 상황에 따른 메시지가 표시됩니다.
(int)
expiration_refresh_popup
만료후 갱신 여부 팝업 표시
0 인 경우 표시하지 않음 (기본값)
1 인 경우 DRM 만료후 갱신이 필요할때 사용자 확인을 받는
팝업을 표시합니다.
(int) vmcheck virtual machine 체크 여부 판단, PC용
0 : check 안 함, 1 : check 함(기본값)
(int) check_abuse DRM kind3 항상 물어보기(0 : 안함(기본값), 1: 체크)
kind2
구분 필수 Description
(int) kind O 2
(string) media_content_key O Kollus 컨텐츠 Unique Key
(int) content_delete 0 (삭제하지 않음), 1 (다운로드 받은 파일 삭제)
다운로드된 컨텐츠를 요청에 의해 삭제하는 옵션입니다.
(string) message 0 (비정상)의 경우나 content_delete이 1(다운로드 받은 파일 삭제)시 message를 추가하면 상황에 따른 메시지가 표시됩니다.
(int) result O 0 (비정상), 1 (정상)
0 인 경우 추가 작업은 없습니다.
0 인 경우 추가 옵션은 무시됩니다.
0 인 경우 재 요청되지 않습니다.
kind3
구분 필수 Description
(int) kind O 3
(string) session_key content_expire_reset 요청시 session_key 확인합니다.
(string) media_content_key O Kollus 컨텐츠 Unique Key
(int) start_at O Request에 포함된 start_at
(int) content_expired 0 (재생가능), 1 (재생 제한)
다운로드 컨텐츠를 강제로 expire 시킵니다.
필요시 content_expire_reset 옵션으로 다시 복구 할 수 있습니다.
* expired 컨텐츠는 0(재생가능)으로 응답해도 재생되지 않습니다.
* 1인 경우 content_expire_reset 무시됩니다.
(int) content_delete 0 (삭제하지 않음), 1 (다운로드 받은 파일 삭제)
다운로드된 컨텐츠를 요청에 의해 삭제하는 옵션입니다.
content_expired 옵션과 상관 관계없이 해당 옵션이 존재하는 경우 삭제합니다.
(int) content_expire_reset 0 (추가 액션 없음), 1 (expired된 콘텐츠 권한 Reset)
expired된 콘텐츠 권한을 Reset 하는 옵션입니다.
(int) expiration_date 만료될 시간의 unixtime stamp
최대값 : 2029년 12월 31일 23시 59분 59초 (1893455999)
* content_expire_reset 옵션이 1일때 재설정 됩니다.
(int) expiration_count 재생 제한 횟수, 예) 10 ← 10번 재생 가능
* content_expire_reset 옵션이 1일때 재설정 됩니다.
(int) expiration_playtime 재생 시간 제한, 예) 3600 ← 1시간(3600초) 재생 가능
* content_expire_reset 옵션이 1일때 재설정 됩니다.
(int) result O 0 (비정상), 1 (정상)
0 인 경우 재생되지 않습니다.
0 인 경우 추가 옵션은 무시됩니다.
0 인 경우 재 요청되지 않습니다.
(string) message 0 (비정상), content_expired이 1(재생 제한) 또는 content_delete이 1(다운로드 받은 파일 삭제) 시 message를 추가하면 상황에 따른 메시지가 표시됩니다.
(int) check_abuse DRM kind3 항상 물어보기(0 : 안함(기본값), 1: 체크)
Response ​Example
{

    “data” : [

        {

            "kind": 1,

            "media_content_key": "XXX-MEDIA_CONTENT_KEY-XXX",

            "expiration_date": 1402444800,

            "expiration_count": 10,

            "expiration_playtime": 60,

            "result": 1

        },

        {

            "kind": 2,

            "media_content_key": "XXX-MEDIA_CONTENT_KEY-XXX",

            "content_delete": 1,

            "result": 1

        },

        {

            "kind": 3,

            "session_key" : "XXX-SESSION_KEY-XXX",

            "media_content_key": "XXX-MEDIA_CONTENT_KEY-XXX",

            "start_at": 140000000,

            "content_expired": 1,

            "content_delete": 1,

            "content_expire_reset": 1,

            "expiration_date": 1402444800,

            "expiration_count": 10,

            "expiration_playtime": 3600,

            "result": 1

        }

    ]

}

JWT 지원

DRM 정책을 JWT로 반환하는 것을 지원합니다. JWT 웹사이트(https://jwt.io) 에서 공인한
라이브러리를 이용하여 생성된 Token으로 변경하여 반환하도록 추가 되었습니다.

플레이어에 JWT Token으로 반환하는 경우에 지정된 헤더에 사용자키를 포함 시켜 전송해야
합니다.

HTTP/1.1 200 OK

Date: Fri, 14 Oct 2016 04:12:46 GMT

Content-Type: text/html; charset=utf-8

Transfer-Encoding: chunked

Connection: keep-alive

X-Kollus-UserKey: 0993d76eb424a72f2005b874ac49405d44a6c

Content-Encoding: gzip

​ 지정된(X-Kollus-UserKey) 해더로 전송된 사용자키가 일치 하는 경우 플레이어에서 정상적으로
동작하게 됩니다.

JWT ​Secret,​ ​JWT​ ​사용자​ ​키

​ 기존 사용자 키(2)키를 header에 추가하는 것 외에 추가적으로 기존의 JWT scpec에 명시되어
있는 secret key는 보안키(1)​를 ​입력해야 ​해야 ​합니다. ​고객사는 ​관련 ​정보를 ​아래와 ​같이 Kollus
CMS 에서 확인 할 수 있습니다.

설정 > 서비스 계정 설정

JWT payload

각 callback의 response를 JWT playload에 담아 전송합니다.

Sample

http://jwt.io 에서 제공하는 다양한 언어로 구현된 라이브러리와 예제를 이용해 구현하도록
합니다. JWT ​스펙과 ​동일하나 ​반환되는 http ​헤더에 X-Kollus-UserKey​를 ​이용하여 ​사용자키를
함께 전송해주셔야 합니다.

 

(예시) php

define('KOLLUS_KEY', '**사용자키**'); // X-Kollus-UserKey

define('JWT_KEY', '**보안키**'); // JWT 보안 키



function encode_jwt($payload, $key, $alg = 'HS256') {

    $header = array('alg' => $alg, 'typ' => 'JWT' );

    $unsignedToken = base64_encode(json_encode($header)).'.'.

    base64_encode(json_encode($payload));

    $signature = hash_hmac('sha256', $unsignedToken, $key, TRUE);

    return $unsignedToken.'.'.base64_encode($signature);

}

$payload = array(

    'data' => array(

        array(

            'kind' => 1,

            'result' =>1,

            'expiration_date' => time()+3600,

            'expiration_playtime' => 30,

            'vmcheck' => 1,

        ),

        array(

            'kind' => 2,

            'result' =>1,

            'expiration_date' => time()+3600,

            'expiration_playtime' => 30,

            'vmcheck' => 1,

        ),

        array(

            'kind' => 3,

            'result' =>1,

            'expiration_date' => time()+3600,

            'expiration_playtime' => 30,

            'vmcheck' => 1,

        ),

    ),

);



$result = encode_jwt($payload, JWT_KEY);



//header('Content-Type: application/jwt');

header('X-Kollus-UserKey: '.KOLLUS_KEY);

echo $result;

 

Code sample (v1.4 기준)

다음과 같은 고객사의 DB가 구성된 것으로 고려되어 샘플이 구성되어있습니다.

PHP ​sample

<?php

/**

* PHP Version : 5.4 above

*/

function get_jwt($payload, $key, $alg = 'HS256')

{

	$header = array('alg' => $alg, 'typ' => 'JWT' );

	$unsignedToken = base64_encode(json_encode($header)).'.'.base64_encode(json_encode($payload));

	$signature = hash_hmac('sha256', $unsignedToken, $key, TRUE);

	return $unsignedToken.'.'.base64_encode($signature);

}



function print_kollus_jwt($data)

{

    define('KOLLUS_KEY', '**사용자키**'); // X-Kollus-UserKey

    define('JWT_KEY', '**보안키**'); // JWT 보안 키

    $payload = array( ‘data’ => $data );

    $result = encode_jwt($payload, JWT_KEY);

    //header('Content-Type: application/jwt');

    header('X-Kollus-UserKey: '.KOLLUS_KEY);

    echo $result;

}



/////////////////////////////////////////////////



include "./config.php";

// 주의 : kind가 1일때 자동으로 expiration_date가 생성되는 샘플 페이지입니다.

// 재생 제한 횟수

$_default_expiration_count = 3;

$_expired_duration = 60 * 60 * 24; // 1 day



// DB Connection

$_db_conn = mysqli_connect($_hostname, $_username, $_password);

if (!$_db_conn) {

	die('Could not connect: ' . mysql_error());

}



$_db_selected = mysqli_select_db($_database, $_db_conn);

if (!$_db_selected) {

	die ('Can\'t use database : ' . mysqli_error());

}



$_kind = isset($_POST['kind']) ? ((int) $_POST['kind']) : NULL;

$_media_content_key = isset($_POST['media_content_key']) ? $_POST['media_content_key'] : NULL;

$_client_user_id = isset($_POST['client_user_id']) ? $_POST['client_user_id'] : NULL;



$channel = NULL;

$_query = sprintf("SELECT * FROM `channels` WHERE `media_content_key` = '%s'",

mysqli_real_escape_string($_media_content_key, $_db_conn));

$_result = mysqli_query($_query, $_db_conn);



if ($_result) {

	$channel = mysqli_fetch_array($_result, MYSQL_ASSOC);

	if ($channel === FALSE) $channel = NULL;

} else {

	die('Invalid query: ' . mysqli_error());

}



$user = NULL;

$_query = sprintf("SELECT * FROM `users` WHERE `client_user_id` = '%s'",

mysqli_real_escape_string($_client_user_id, $_db_conn));

$_result = mysqli_query($_query, $_db_conn);

if ($_result) {

	$user = mysqli_fetch_array($_result, MYSQL_ASSOC);

	if ($user === FALSE) $user = NULL;

} else {

	die('Invalid query: ' . mysqli_error());

}



$channel_user = NULL;

if (!is_null($_media_content_key) && !is_null($_client_user_id)) {

	$_query = sprintf("SELECT * FROM `channel_users` WHERE `user_id` = '%s', `channel_id` = '%s'", $user['id'], $channel['id']);

	$_result = mysqli_query($_query, $_db_conn);

	if ($_result) {

		$channel_user = mysqli_fetch_array($_result, MYSQL_ASSOC);

		if ($channel_user === FALSE) $channel_user = NULL;

	} else {

		die('Invalid query: ' . mysqli_error());

	}

}



$_jwt_result = array('result' => 0);

switch($_kind) {

case 1:

	if (is_null($channel_user)){

		$_expiration_date = time() + $_expired_duration;

        $_expiration_count = $_default_expiration_count;

        $_query = sprintf("INSERT INTO `channel_users`(`user_id`, `channel_id`, `expiration_date`

        ,`expiration_count` , `created_at`, `updated_at`) VALUES('%s', '%s', '%s', '%s', UNIX_TIMESTAMP(),

        UNIX_TIMESTAMP())", $user['id'], $channel['id'], $_expiration_date, $_expiration_count);

        $_result = mysqli_query($_query, $_db_conn);

		if (!$_result) {

			die('Invalid query: ' . mysqli_error());

		}

	} else {

        $_expiration_date = $channel_user['expiration_date'];

        $_expiration_count = $channel_user['$expiration_count'];

	}

    $_jwt_result['expiration_date'] = (int) $_expiration_date;

    $_jwt_result['expiration_count'] = (int) $_expiration_count;

	break;

case 2:

    if (!is_null($channel_user)){

        $_download_times = ++((int) $channel_user['download_times']);

        $_query = sprintf("UPDATE `channel_users` SET `download_times` = '%s', `updated_at` =

        UNIX_TIMESTAMP() WHERE id = %s", $_download_times, $channel_user['id']);

        $_result = mysqli_query($_query, $_db_conn);

  	    if (!$_result) {

    		die('Invalid query: ' . mysql_error());

   		}

        $_jwt_result['result'] = 1;

    }

	break;

case 3:

    if (!is_null($channel_user) && $channel_user['is_expired']) {

    	$_jwt_result['content_expired'] = 1;

    }

    break;

}



// DB Close

mysqli_close($_db_conn);

// 결과인 data array를 JWT로 변환하여 출력함

print_kollus_jwt($_jwt_result);

 

Sample Code

 DRM – dotnet

 DRM – jsp

 DRM – php

LMS

Kollus에서 제공하는 Callback 정보는 플랫폼에서 전달하는 내용과 플레이어에서 전달하는
내용으로 구분될 수 있습니다. 플레이어에서 전달하는 정보는 사용자가 컨텐츠를 이용한
정보를 활용할 수 있도록 관련 정보를 지정된 Url에 전달하는 기능입니다.
진도율을 전송할때 응답을 확인하지 않습니다. 단, 네트워크 오류인 경우 해당 데이터를 보관후 재 전송 가능할때 재 전송됩니다.
해당 기능을 사용하기 위해서는 Kollus에 접속하여 관련 정보를 설정하시면 Video-gateway를 통해 관련 내용이 전달되어 재생과 관련된 정보를 전달합니다.

Callback process

재생 정보를 전달 받는 흐름을 설명합니다.

  1. Kollus 설정에서 관련 정보 요청을 설정합니다.
    • Kollus는 컨텐츠 배포 단위인 채널 마다 다양한 옵션을 지정할 수 있습니다.
    • 배포하는 채널마다 지정된 데이터 수집이 가능합니다.
  2. 동영상 재생을 위해 Video-gateway를 호출하면 컨텐츠 재생을 위한 다양한 정보를
    플레이어 전달하게 되며, 이때 재생과 관련된 정보를 전달할 설정을 함께 전달합니다.
  3. 재생 정보를 활용하기 위해 설정한 Url에 관련 정보를 전달합니다.
  4. Kollus는 컨텐츠 재생과 관련된 기본 정보를 수집하기 위해 관련 정보를 수집합니다.
    • 사용자 정보를 일체 포함되지 않습니다.
    • Mac Address, IP Address 개인의 위치 정보와 관련된 정보를 수집 되지
      않습니다.

Customer Requirement

Kollus에서 전달하는 재생 관련 정보는 고객의 다양한 요청을 수렴하여 개발되었습니다.

  • 마지막 종료 시간
  • 컨텐츠 구간별 재생 정보
  • 사용자 정보
  • 컨텐츠 정보
  • PC 정보
  • 동영상 구간을 시스템에서 지정된 블럭으로 나누어 정보를 수집

Plugin option

  • {MAC}
    • Mac Address
    • 사용자 개인정보에 해당하여 수집을 권장하지 않습니다.
    • 고급 사용자의 경우 Mac Address를 임의로 변경할 수 있으며, 모바일
      플레이어의 경우 App의 등록 제한으로 인해 지원하지 않습니다.
  • {IP} – RemoteAddress의 이슈로 지원하지 않습니다. (서버쪽에서
    확인하도록합니다.)

    • 컨텐츠를 재생하는 사용자 PC의 IP Address
    • 사용자 개인정보에 해당하여 수집을 권장하지 않습니다.
    • 공유기를 사용하는 환경에서 수집 되는 IP Address는 Private 영역 IP Address
      입니다. 정확한 사용자의 IP를 수집하기 위해서는 Callback을 받는 Web
      서버에서 Remote_Address를 확인하는 것이 정확합니다.
  • {CLIENT_USER_ID}
    • 사용자의 User ID 입니다.
    • MediaToken 생성시 파라미터로 입력한 사용자의 ID 정보입니다.
      이때 입력된 사용자 ID는 Kollus 시스템에서 관리되지 않고 사용자를 구분하는
      Unique 정보로만 사용됩니다.
  • {START_AT}
    • Video-gateway를 호출한 시점의 Unixtimestamp 입니다.
    • 사용자의 컨텐츠 이용중 다수의 재생정보 전달이 발생할 수 있습니다.
      동일한 요청에 같은 {START_AT} 값을 갖게 되며, 같은 시간에 다수의
      이용자가 발생할 경우 Unixtimestamp 이기 때문에 중복될 수 있습니다.
    • 다운로드 컨텐츠의 경우 start_at은 컨텐츠 재생시 단말의 unixtimestamp
      입니다.
  • {BLOCK_CNT}
    • Kollus에서 설정한 블럭의 개수입니다.
    • 재생 정보를 지정된 블럭 개수로 나누어 관리하며 정보 전달시 함께
      포함시킬수 있습니다.
  • {PLAY_TIME}
    • 전체 재생 시간 (단위:초)
    • 배속 기능을 사용하는 경우 배속을 포함한 시간입니다. 시간 값은 누적입니다.
    • 10초간 2배속으로 재생한 경우 20초로 계산됩니다.
    • 모든 재생 시간을 포함한 시간입니다. (구간반복을 한 경우도 모두
      포함됩니다.)
  • {PLAYTIME_PERCENT}
    • DURATION에 대한 전체 재생 비율 (단위:%, 정수, 절사)
    • 컨텐츠를 두번 반복해서 본 경우 200%로 계산됩니다.
  • {DURATION}
    • 컨텐츠 길이 (단위:초)
  • {MEDIA_CONTENT_KEY}
    • Kollus media_content_key
  • {ENCODING_PROFILE_KEY}
    • Kollus encoding profile key
  • {PLAY_BLOCK_JSON}
    • 데이터 포멧: JSON
    • 블럭 재생 정보
  • {BLOCK_PLAY_1}~{BLOCK_PLAY_##{BLOCK_CNT}}
    • 블럭 재생 여부
    • 재생하지 않고 Skip
    • 해당 블럭 재생 (0초 이상 재생하면 1로 설정됩니다.)
  • {BLOCK_TIME_1} ~{BLOCK_TIME_##{BLOCK_CNT}}
    • 해당 블럭을 재생한 시간입니다. (단위:초)
    • 플레이어의 배속기능을 이용해 재생한 경우 재생시간은 배속을 적용하여
      계산됩니다.
    • 반복해서 3초의 범위를 갖는 블럭을 2회 재생한 경우 블럭의 재생시간은
      6초입니다.
    • {DURATION}이 {BLOCK_CNT} 보다 작은 경우 {BLOCK_TIME#}의 합은
      {DURATION}을 초과합니다. (각 블럭의 재생시간이 밀리초로 나오는 경우
      올림하여 1초로 계산합니다.)
  • {LAST_PLAY_AT}
    • 마지막 재생 위치 (단위:초)
  • {HOST_NAME}
    • 비디오 링크 요청 도메인명
    • ex) catenoid.video.kr.kollus.com
  • {PLAYER_ID}
    • Kollus 플레이어의 고유 ID 입니다.
    • 플레이어 설치시 생성된 고유 ID 입니다.
    • 플래쉬 플레이어의 경우 kfp 라는 고유 문자열을 전송합니다.
  • {PLAYLIST_SKIP}
    • 플레이어 리스트로 재생되는 경우 컨텐츠 Skip을 한 경우에 사용됩니다.
    • 0 : 모두 재생
    • 1 : Skip
  • {USERVALUE0}~{USERVALUE9}
    • Video-gateway호출에 추가된 추가 정보 입니다.
    • ex) LCD={USERVALUE0}&UCD={USERVALUE4}
    • 영문,숫자 이외의 한글등의 문자열을 전달할 경우 웹 브라우저들의 차이점이
      있기 때문에 해당 변수 전달시 UTF-8로 전달해야 합니다.
      (전달되는 문자열은 웹의 특성상 UrlEncode해서 전달해야 합니다.)
  • {JSON_DATA}
    • 데이터 포멧: JSON
    • 모든 재생 정보를 포함한 데이터

{PLAY_BLOCK_JSON}

  • {JSON_DATA}의 block_info 항목과 동일합니다.
  • block_info Object의 하위 노드를 포함합니다.

{JSON_DATA}

  • user_info
    • content_provider_key : 고객사 key
    • client_user_id : 사용자(고객) ID
    • player_id : 플레이어(player) ID
    • hardware_id : 플레이어(player) hardware ID, 고객 확인용
    • host_name : 비디오 링크 요청 도메인명
    • device : 디바이스명
  • content_info
    • duration : 컨텐츠 길이
    • encoding_profile : 인코딩 프로파일
    • media_content_key : 미디어 컨텐츠 키
    • channel_key : 채널키
    • real_playtime : 실제 전체 재생 시간 (단위:초)
      • 배속 기능을 사용하는 경우 배속을 포함한 시간입니다.
      • 10초간 2배속으로 재생한 경우 20초로 계산됩니다.
      • 모든 재생 시간을 포함한 시간입니다. (구간반복을 한 경우는
        제외됩니다.)
    • playtime : 컨텐츠 재생 시간
    • playtime_percent : duration에 대한 전체 재생 비율
    • start_at : Video-gateway를 호출한 시점의 Unixtimestamp 입니다. 다운로드
      컨텐츠의 경우 start_at은 컨텐츠 재생시 단말의 unixtimestamp 입니다.
    • last_play_at : 마지막 재생 위치 (단위:초)
  • block_info
    • block_count : 구간 횟수
    • blocks: 마일스톤 (재생시간 단위:초)
      • b0 : 블럭 재생여부 (0:재생하지 않음, 1:해당블럭 재생)
      • b1 : 0 ~ (int)
      • b2 : block_period 만큼 반복됩니다….
      • t0 : 블럭 재생시간 (단위:초)
      • t1 : 0 ~ (int)
      • t2 : block_period 만큼 반복됩니다….
      • p0 : 블럭 재생 비율 (단위:퍼센트%)
      • p1 : 0~ (int) , 블럭 재생을 반복하는 경우 100이상으로 표시됩니다.
      • p2 : block_period 만큼 반복됩니다.
    • sessions : 사용자 블럭 재생을 시간별로 관리하는 항목 (배열)
      세션 데이터는 이전 데이터를 모두 누적으로 전송합니다.

      • block : 블럭 인덱스 (0부터 시작)
      • start_time : 해당 블럭을 시작한 시간 (unixtimestamp-localtime)
      • play_time : 해당 블럭 재생 시간
  • uservalues : 사용자 정의 변수, 각 변수의 전체 합은 1KB를 넘지 않도록 해야 합니다.
    • uservalue0
    • uservalue1
    • ….
    • uservalue9

Support options

플레이어별 지원 옵션을 확인할 수 있습니다.
{MAC}, {IP}의 경우 개인정보에 해당하는 요소로 필요한 경우 별도 협의해 주십시오.

Option FlashPlayer KollusPlayer(PC) KollusPlayer(Monlie)
{MAC} X X X
{IP} X X X
{CLIENT_USER_ID} O O O
{START_AT} O O O
{BLOCK_CNT} O O O
{PLAY_TIME} O O O
{PLAYTIME_PERCENT} O O O
{DURATION} O O O
{MEDIA_CONTENT_KEY} O O O
{ENCODING_PROFILE_KEY} O O O
{PLAY_BLOCK_JSON} O O O
{BLOCK_PLAY_1} ~ O O O
{BLOCK_TIME_1} ~ O O O
{LAST_PLAY_AT} O O O
{HOST_NAME} O O O
{PLAYER_ID} X(kfp) O O
{PLAYLIST_SKIP} X O O
{USERVALUE0} ~ O O O
{JSON_DATA} O O O

 

보안/비보안 별 항목

Option 보안 비보안 비고
content_provider_key O O
client_user_id O O
player_id O 항목은 있으나 khp로 표기됨(Kollus html5 player)
hardware_id O
host_name O O
os O O
device O O
version O O
duration O O
encoding_profile O O
media_content_key O O
channel_key O O
real_playtime O O
showtime O
playtime O O
runtime O O
playtime_percent O O
start_at O O
last_play_at O O
serial O O

Settings

Callback에 대한 설정은 채널에서 할 수 있습니다. Callback이 필요한 채널 마다 설정해야
합니다.

  • Callback URLs: 캐리지 리턴으로 각각 치환자를 포함한 URL을 등록합니다.
    • 재생정보를 다수의 시스템에서 전달 받을 수 있도록 캐리지리턴(\n)으로
      구분된 다수의 callback_url 을 등록할 수 있습니다.
    • Kollus 플랫폼의 필요에 따라 URL 설정 수를 제한할 수 있습니다.
  • Format: [block_count]:[peroid]:[enable_sessions]:[callback_url]
    • 구분자 : (콜론)
    • block_count
      • 컨텐츠 재생 구간을 나누는 블럭의 수 입니다. 10으로 설정하면
        컨텐츠의 길이가 300초의 경우 각 블럭은 30초로 구성됩니다.
    • peroid
      • 데이터 전송 주기
      • Callback이 전송되는 주기로 지정된 period(단위:초) 마다 호출되고
        프로그램(플레이어)이 종료될 때 추가로 호출 됩니다.
        단, 플래시 플레이어의 경우는 플레이어 종료시 호출되지 않습니다.
      • 플레이를 일시정시 또는 정지했을 때 추가로 호출 됩니다.
      • 단위 :초
    • enable_blocks
      • 1 이면 block_info 항목에 blocks 정보를 포함 시킵니다.
      • 0 이면 block_info 항목에 blocks 정보는 없습니다.
    • enable_sessions
      • 1 이면 block_info 항목에 sessions 정보를 포함 시킵니다.
      • 0 이면 block_info 항목에 sessions 정보는 없습니다.
    • callback_url
      • Callback Url 입니다. 컨텐츠를 재생하는 사용자 환경에서 전송하기
        때문에 방화벽 환경을 고려하여 http, 80포트 사용을 권장합니다.

 

Callback URLs

10:30:1:0:http://domain.com/check.asp?ip={IP}&id={CLIENT_USER_ID}&start={START_AT}&lms={

PLAY_BLOCK_JSON}&uservalue0={USERVALUE0}

20:180:0:1:http://another_domain.com/anohter_check.php?ip={IP}&id={CLIENT_USER_ID}&start={

START_AT}&lms={JSON_DATA}&uservalue0={USERVALUE0}

 

Plugin options

재생 정보를 전달하기 위한 옵션은 JSON 형태의 Array로 전달됩니다.

  • progress_plugin (array)
    • http://domain.com/check.asp?block_period=10&ip={IP}&id={CLIENT_USER_ID}&start={START_AT}&json_data={JSON_DATA}&uservalue0={USERVALUE0}
    • http://another_domain.com/anohter_check.php?block_period=20&ip={IP}&id={CLIENT_USER_ID}&start={START_AT}&lms={PLAY_BLOCK_JSON}&uservalue0={USERVALUE0}

 

Callback data sample

● URL: http://lms.servicedomain.com/lms/register

● Method: POST

● Params:

    ● ID={CLIENT_USER_ID}

    ● MAC={MAC}

    ● LRN={USERVALUE0}

    ● LHF={USERVALUE1}

    ● IP={IP}

    ● LCD={USERVALUE2}

    ● TM={START_AT}

    ● PT={PLAY_TIME}

    ● ET={LAST_PLAT_AT}

    ● B1={BLOCK_PLAY_1}

    ● T1={BLOCK_TIME_1}

    ● ...

    ● SKIP={PLAYLIST_SKIP}

● http://lms.servicedomain.com/lms/register?ID=pobi&MAC=123456789ABCDEF&LRN=

123456789ABCDEF&LHF=1&IP=192.168.0.118&LCD=L123&UCD=U123&TM=12345678

9&PT=123456789&E T=123456789&SKIP=0&B1=1&B2=1&B3=1&B4=1&B5=1&B6=1&B7

=1&B8=1&B9=1&B10=1&T 1=123456789&T2=123456789&T3=123456789&T4=12345678

9&T5=123456789&T6=123456789&T7=123456789&T8=123456789&T9=123456789&T10

=123456789

 

 

Etc.

블럭개수 제한 (Limit the number of blocks)

  • 최대 100을 넘을 수 없습니다. (range: 1~100)
    • 100을 넘는 데이터가 입력되면 최대값 100으로 처리 됩니다.
    • 0으로 입력되는 경우 1로 처리 됩니다.
  • 모든 컨텐츠의 {DURATION}보다 작거나 같도록 {BLOCK_CNT}를 설정하는 것을
    권장합니다. {DURATION}이 {BLOCK_CNT}보다 작은 경우 아래와 같이 처리됩니다.

    • {BLOCK_CNT}가 100일때 {DURATION}이 30이면 전송되는 블럭 정보는
      30개로 조정됩니다.

Callback 호출 주기 (Callback period)

  • Callback은 시스템에 설정된 Callback Url 정보의 period 설정에 따라 호출됩니다.
  • 플레이어가 일시정지, 정지를 하는 경우도 Callback이 호출됩니다.
  • 주기적으로 호출되는 동일한 사용자의 정보는 {START_AT},
    {CLIENT_USER_ID}값으로 구분하여 마지막 정보를 확인할 수 있습니다.
  • 플래시 플레이어의 경우는 플레이어 종료시 호출되지 않습니다.

USERVALUE0 ~ USERVALUE9 사용시 주의 할 점

  • 특수문자(영문,숫자이외의 모든문자:한글,한자,일어등)는 반드시 UTF-8문자열을
    UrlEncode된 상태로 전달되어야 합니다.

crossdomain.xml

  • Flash Player 사용시 callback을 받을 서버(고객사)에는 crossdomain.xml 파일이
    있어야 합니다.
<?xml version="1.0"?>

<!DOCTYPE cross-domain-policy SYSTEM

"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">

<cross-domain-policy>

    <site-control permitted-cross-domain-policies="master-only" />

    <allow-access-from domain="*" to-ports="*" />

    <allow-http-request-headers-from domain="*" headers="*" to-ports="*" />

</cross-domain-policy>

 

데이터 보안

  • LMS callback 데이터를 변조 방지를 위해 POST로 전달되는 모든 정보에 대해 Hash
    를 생성하여 전달되는 Hash값과 일치하는 지 확인합니다.※ Hash 생성방식에 대해 노출 우려가 있는 Flash Player, HTML5 Single Player는
    제외합니다.
  • Hash 생성 규칙은 아래와 같습니다.
    hash_1 = md5 ( post-data )
    hash_2 = md5 ( hash_1 + service_account ) ← + 문자 포함
    hash_2값을 post data의 hash 파라메터의 값으로 전송합니다.
  • 전송되는 Post 데이터 예시
    ID=pobi&MAC=123456789ABCDEF&LRN=123456789ABCDEF&LHF=1&IP=192.16
    8.0.118&LCD=L123&UCD=U123&TM=123456789&PT=123456789&ET=123456789
    &SKIP=0&B1=1&B2=1&B3=1&B4=1&B5=1&B6=1&B7=1&B8=1&B9=1&B10=1&T1=
    123456789&T2=123456789&T3=123456789&T4=123456789&T5=123456789&T6=1
    23456789&T7=123456789&T8=123456789&T9=123456789&T10=123456789&hash
    =7dec341ff384574f24c6c441b46bc9b1

 

 

Live streaming

JWT Payload Spec (Live)

Kollus Live 를 위해 신설된 jwt spec 입니다.

JWT Payload의 형식은 다음과 같은 JSON 문자열입니다.

{
    "cuid": "CLIENT_USER_ID",
    "expt": EXPIRE_TIME,
    "lmckey": "LIVE_MEDIA_CHANNEL_KEY",
    "lmcpf": "LIVE_MEDIA_CONTENT_PROFILE_KEY",
    "title": "TITLE",
    "seek": IS_SEEKABLE
}

 

Live iframe sample

Kollus Live 적용을 위한 iframe 형식의 셈플 코드입니다
{livesample url} 해당 영역에 “비디오 게이트웨이 링크” 입력 하시면 됩니다.

1. 해당 Live 채널을 선택

2. 채널의 비디오 게이트웨이 링크 URL 복사

{
 <iframe src="{livesample url}" width="420" height="236"></iframe> } 

 

Payload 항목
이름 Datatype 필수 여부 내용 Mediatype
cuid
(CLIENT_USER_ID)
String 필수 컨텐츠에 억세스하려는 고객사의 사용자 아이디. 북마크나 NScreen 데이터의 Key로 사용됩니다. LIVE
expt

(EXPIRE_TIME)

Integer 필수 JWT가 유효한 시간. Unix timestamp 형식으로 입력합니다. 고객사 서버와의 시간이 정확하게 일치하지 않을 수도 있으므로, 최대 1분 정도는 유효기간이 지났더라도 접근할 수 있습니다. LIVE
lmckey

(MEDIA_CONTENT_KEY)

String 필수 재생할 컨텐츠의 식별 키. 확장 라이브 미디어 채널 키 형식도 동일하게 사용할 수 있습니다. LIVE
lmcpf

(MEDIA_CONTENT_PROFILE_KEY)

String 선택


(기본값: null)

컨텐츠의 프로파일 가운데 하나를 강제로 지정해 재생할 경우에 사용합니다. 강제로 지정할 프로파일의 키를 입력합니다.

자동 선택하게 두려면 해당 Entry를 삭제하거나, null로 입력하면 됩니다. 없으면 ABR로 작동합니다.

LIVE
title

(TITLE)

String 선택

(기본값: null)

컨텐츠의 기존 타이틀을 대체하는 문자열입니다. LIVE
seek

(IS_SEEKABLE)

Boolean 선택

(기본값: true)

컨텐츠의 seek를 허용할 것인지 아닌지의 여부를 입력합니다.

seek를 허용하는 경우엔 해당 Entry를 삭제하거나, true를 입력하면 됩니다.

LIVE

Kollus CMS API

Kollus VOD API 주소

http://api.dev.kollus.com

 

Kollus LIVE API 주소

https://live-kr.kollus.com/api/docs/live-api

How to Use

API Interface URI 규칙

Kollus API는 아래와 같은 규칙을 갖도록 구성었으며, 향후 API의 업그레이드 시에도 하위 버전의 안정적인 버전 지원을 위해 API 경로에 버전을 포함하고 있습니다.

버전의 업그레이드가 진행될 때 이전 버전의 전체 지원이 제한되지 않을 때 까지 해당 버전은 지속적으로 지원될 것 입니다.

 

http://[api_domain]/[major_version]/{path:[container]/[controller]/[action]}?[parameters]

 

  • api_domain : api.kr.kollus.com, api.jp.kollus.com 해당 도메인은 서비스 지역에 따라 변경될 수 있습니다.
  • major_version : API의 Major 버젼입니다. 현재 0 입니다.
  • path : api 경로 입니다. 각 경로는 아래와 같은 규칙을 갖습니다.
  • container : controller 이전까지의 path
  • controller : action의 묶음 단위
  • action : 행위(action)를 뜻하는 기능(method)이다. 예를 들자면, create, edit, delete, read, index(=list)
  • parameters : ex) api_key=443ede01f6bc021514233cea82a09aee&content_provider_key=kollus

 

API Message

API 규격

json, utf8

각 API의 기본 결과 문자열은 UTF8로 인코딩되어 있으며 json 포멧을 기본으로 하고 있습니다.

 

API response structure

메세지 노드

  • error : 에러 코드입니다. 0이 아니면 오류 입니다. (필수)
  • message : API 호출 후 성공 여부에 대한 결과 문자열을 보여 줍니다.
  • result : API 호출 성공시 결과값입니다.

Success Message

{

	"error" : 0

	, "message" : "Sucessfully created."

	, "result" : {

		"key" : "test_key"

	}

}

Fail Message

{

	"error" : 1

	, "message" : "Failed to create."

}

 

API 인증방법

Kollus API를 사용하기 위해선 Kollus 시스템에서 제공하는 API 인증 중 하나의 인증을 따라야 API의 사용이 가능합니다.

Kollus API 인증은 다음의 순서로 인증 Level(레벨)이 있습니다. 아래 3가지 인증 방법들을 이용해 API를 사용할 수 있습니다.

 

  1. anonymous access

    해당 URI가 anonymous access이라면 자동 인증이 통과됩니다.  anonymous access를 지원하는 api는 제한적으로 사용되고 있습니다.

  2. ip base access

    Kollus 시스템에 ip base 인증를 등록하여 인증처리 합니다. Kollus 시스템 관리자에게 별도 요청해야합니다.

  3. access_token access

    각 서비스 계정에 할당되어 있는 access_token(접근 토큰)로 접근합니다.

Kollus 서비스 어카운트 인증 방법

  • 각 서비스 계정에 할당되어 있는 access_token(접근 토큰)을 확인합니다.

  • 접근 하려는 모든 api에 GET or POST로 access_token을 같이 보내면 서비스 계정에 관련된 API들 사용할수 있습니다.

     

기타 사항

  • Restful API로 GET, POST만 사용합니다.

 

고급 연동

V/G Controller

Kollus VG Controller는 Videogateway로 제공되는 미디어의 일부 컨트롤을 고객사 웹사이트 내에서 구현 할 수 있도록 지원하는 Javascript library입니다. Kollus VG Controller는 다음과 같은 특징을 가지고 있습니다.

  • Videogateway에서 자동으로 실행되는 플레이어의 타입에 관계없이 동일한 코드로 제어 가능
  • 간단한 설치 + 쉬운 사용방법
  • 플레이어의 감지 실행을 고민할 필요가 없음
  • 서드파티 자바스크립트 라이브러리가 필요치 않음
메소드와 이벤트 목록 이름 옆에 표기되는 Flash, V2, V3, V4 Player 등은 해당 메소드나 이벤트를 지원하는Player를 의미합니다.



Flash : 암호화되지 않은 파일의 경우 일반적으로 Flash Player 를 통해 재생됩니다.[^1]

V2 : 암호화된 파일의 경우 일반적으로 V2 Player를 통해 재생됩니다. V2 Player는 IE의 경우 ActiveX, Chrome이나 Firefox의 경우 NPAPI를 이용 하는 Player입니다.[^2]

V3 : 암호화된 파일이 Edge나 Chrome 45버전 이상의 웹브라우져에서 호출될 경우 실행되는 하이브리드 HTML5 Player입니다.

V4 : 암호화되지 않은 파일의 경우 실행되는 HTML5 Player이며 Flash Player를 대체합니다.



이름 옆에 아무 Player도 표시되지 않는 경우는 모든 플레이어가 공통적으로 기능을 지원한다는 의미입니다.

[^1]: Adobe에서 2020년부터 Flash Player에 대한 지원을 중단한다고 발표하였습니다.

https://blogs.adobe.com/conversations/2017/07/adobe-flash-update.html

[^2]: Chrome 42+ / Firefox 52+ 브라우저에서는 NPAPI 지원을 중단하였습니다.

설치하기

VgControllerClient

(고객사 html page에 삽입)

...
<script src="http://file.kollus.com/vgcontroller/vg-controller-client.latest.min.js"></script>
<script>
    window.onload = function() {
    try {
        var controller = new VgControllerClient({
        	target_window: document.getElementById('child').contentWindow
        });
        // 여기서부터 이벤트 리스너를 등록하거나, 웹페이지 Element에 메소드를 bind하면 됩니다.
        } catch(e) {
            // Videogateweay Controller Library는 window.postMessage API를 이용하기 때문에
            // 해당 기능을 지원하지 않는 웹브라우져에서는 동작하지 않습니다.
            // 이 부분에 적절한 fail-over 코드를 추가하여 주십시요.
        }
    };
</script>
<body>
	<iframe id="child" src="http://v.kr..."></iframe>
</body>
...
  • VgControllerClient 생성시 파라미터로 전달하는 target_window의 경우 홈페이지에 첨부한 Kollus Videogateway iframe의 HTMLElement에 contentWindow 속성을 입력해야 합니다.
  • 본 스크립트는 window.postMessage API 를 이용하여 Player와 통신하므로, 해당 기능을 지원하지 않는 웹브라우져에서는 동작하지 않습니다.
  • 웹페이지 내에 하나 이상의 iframe을 embed한 경우 제어할 iframe마다 서로 다른 VgControllerClient 를 생성해야 합니다.
  • 이전 버전과의 호환성을 위해 (v0.5이하) new VgControllerClient() 대신 new
    Kollus.VideogatewayController() 를 사용해도 정상적으로 작동합니다.

 

이벤트 리스닝

플레이어로부터 수신되는 각종 이벤트 발생시 사용자가 정의한 callback 함수를 실행하도록 이벤트 리스너(EventListener)를 등록하는 방법입니다.

controller.on('event_name', function(param) {
// 이벤트 리스너
});

하나의 이벤트에 하나 이상의 리스너를 등록할 수도 있습니다. 이 경우 이벤트 발생시에 등록된 모든 리스너가 실행됩니다.

controller.on('event_name', function(param) {
	// 첫번째 리스너
});
controller.on('event_name', function(param) {
	// 두번째 리스너
});
// 이벤트 발생시 첫번째, 두번째 리스너가 모두 실행
// 다만, 자바스크립트 이벤트 루프와 callback 함수가 실행되는 방식에 의해, 첫번째 리스너가 반드시 먼저
// 실행된다고 보장할 수 없으며, 두번째 리스너가 실행되는 것이 첫번째 리스너가 실행된 뒤인 것도 아닙니다.

이벤트 리스너를 등록하는 함수인 on 은 메소드 체이닝(Method chaining)을 지원합니다.

controller.on('event_name_1', function(param) {
	// 첫번째 리스너
}).on('event_name_2', function(param) {
	// 두번째 리스너
});

 

메소드 사용하기

Videogateway Controller Library가 지원하는 메소드를 호출하는 방법은 간단합니다.

controller.play();

이게 전부입니다. 경우에 따라서 파라미터를 요구하는 메소드도 있습니다.

controller.set_volume(90);

 

참고사항

메소드 목록

on(event_name, callback_function)

이벤트 리스너를 등록합니다.

controller.on('event_name', function(param) {

	// event_name에 해당하는 이벤트 발생시, 두번째 인자인 callback function 실행

});

Parameters:

  • event_name String callback function을 bind할 이벤트 이름입니다.
  • callback_function Function 이벤트 발생시 실행될 callback function입니다. 경우에 따라서 callback function에는 파라미터가 주어질 수 있습니다.

Return:

  • Object VG-Controller Client 객체를 반환합니다.

off(event_name)

등록된 이벤트 리스너를 제거합니다.

controller.off('event_name');

Parameters:

  • event_name String callback function으로 bind된 이벤트 이름입니다.

Return:

  • Object VG-Controller Client 객체를 반환합니다.

get_progress()

재생 진행중인 위치 정보를 반환합니다.

Parameters:

  • No parameter

Return:

  • Object percent, position, duration을 property로 갖는 object 객체를 반환합니다. 각 값들에 대한 설명은 progress 이벤트 를 참고하여 주십시요.

play([start_at])

동영상을 재생합니다.

controller.play();

특정 지점부터 재생하려면 다음과 같이 재생할 위치를 파라미터로 입력하여 주십시요.

controller.play(10); // 10초 위치부터 재생

Parameters:

  • start_at Integer (Optional) 재생 시작 위치입니다. 생략하면 처음부터 재생합니다.

Return:

  • No return

pause()

동영상 재생을 일시정지합니다.

Parameters:

  • No parameter

Return:

  • No return

set_volume(volume)

음량을 변경합니다.
음량은 0 <= volume <= 100 사이의 Integer형 값이어야 합니다. 이 범위를 벗어난 감은 0이나 100으로 재조정 됩니다.

Parameters:

  • volume Integer 변경할 음량입니다.

Return:

  • No return

get_volume()

현재 설정된 음량을 반환합니다.

Parameters:

  • No parameter

Return:

  • Integer 현재 설정된 음량입니다.

mute()

음소거를 설정하거나 해제합니다. 음소거가 해제된 상태에서 호출하면 음소거를 설정하고, 반대로 설정된 상태라면 해제합니다.

Parameters:

  • No parameter

Return:

  • No return

ff()

set_jumpstep 메소드에 의해 설정된 이동할 시간값만큼 현재 재생 위치보다 이후로 이동합니다. 초기값은 10초입니다.

Parameters:

  • No parameter

Return:

  • No return

rw()

set_jumpstep 메소드에 의해 설정된 이동할 시간값만큼 현재 재생 위치보다 이전으로 이동합니다. 초기값은 10초입니다.

Parameters:

  • No parameter

    Return:

  • No return

set_screen() V2 V3 V4

일반 윈도우 모드와 전체화면 모드로 화면 상태를 변경합니다. 화면이 일반 윈도우 모드인 경우 호출하면 전체화면으로, 전체화면 모드인 경우는 일반 윈도우 모드로 변경됩니다.

  • 이 기능은 Flash Player에서는 지원되지 않습니다.
  • IE 브라우져의 경우 IE 10 이하는 fullscreen 기능을 지원하지 않습니다.

Parameters:

  • No parameter

    Return:

  • No return

get_screen()

현재 화면 모드를 반환합니다. set_screen이 V2, V3, V4 Player에서만 지원되긴 하지만, get_screen 함수는 모든 Player에서 정상적으로 현재 화면 상태를 반환합니다. 반환되는 값은 다음과 같습니다.

  • 일반 윈도우 모드 : windowed
  • 전체화면 모드 : fullscreen

Parameters:

  • No parameter

    Return:

  • String 반환되는 현재 화면 모드입니다. windowed, fullscreen 두 값 가운데 하나를 갖습니다.

set_jumpstep(jumpstep)

ff 메소드나 rw 메소드를 통해 이동할 시간값을 설정합니다. 시간값은 초단위 정수로 입력합니다.

Parameters:

  • jumpstep Integer 이동할 시간값 입니다.

    Return:

  • No return

get_jumpstep()

현재 설정된 이동할 시간값을 반환합니다.

Parameters:

  • No parameter

    Return:

  • Integer 반환되는 이동할 시간값입니다.

set_control_visibility(visibility)

Player 내장 Control들을 숨김하거나 숨김을 해제합니다. 파라미터로 true를 주면 숨김 해제, false를 주면 숨김입니다.

Parameters:

  • visibility Boolean 내장 Control 숨김 여부입니다.

    Return:

  • No return

get_control_visibility()

설정된 내장 Control 숨김 여부를 반환합니다.

Parameters:

  • No parameter

    Return:

  • Boolean 내장 Control 숨김 여부입니다.

set_scalemode(scalemode) Flash

Flash Player의 Scalemode를 변경합니다.
Flash Player가 아닌 환경에서 호출할 경우 오류를 발생시키진 않지만, Scalemode가 변경되진 않습니다.
Scalemode는 다음 4가지 중 하나여야 합니다. (다른 값일 경우는 동작하지 않습니다.)

  • letterbox, stretch, zoom, none

Parameters:

  • scalemode String 설정할 scalemode의 값입니다.

    Return:

  • No return

get_scalemode() Flash

설정된 Flash Player의 Scalemode를 반환합니다.
Flash Player가 아닌 경우는 가장 이전에 호출된 set_scalemode 메소드에서 설정된 값이 반환됩니다.

Parameters:

  • No parameter

    Return:

  • String 설정된 Scalemode값 입니다.

set_speed(speed) V2 V3 V4

재생 배속을 설정합니다. 배속의 범위는 기본적으로 0.5 <= speed <= 4 입니다. 배속 최대값은 플레이어의 설정에 따라 바뀔 수 있습니다.
또한, 배속은 0.1씩 증가하거나 감소할 수 있습니다. 그보다 작은 단위로 증감할 경우 기대한대로 배속이 증감하지 않을 수 있으니 주의하여 주십시요.
0.5보다 작거나 4보다 큰 값을 입력할 경우는 각각 0.5와 4로 값이 고정됩니다.

Parameters:

  • speed Integer 설정할 배속값 입니다.

    Return:

  • No return

get_speed() V2 V3 V4

설정된 배속값을 반환합니다.
Javascript에는 명시적인 Float형이 존재하지 않으므로, 소수점을 표현하기 위해 String형으로 반환합니다.

Parameters:

  • No parameter

    Return:

  • String 설정된 배속값입니다. 1이나 2인 경우 각각 문자열 '1.0'과 '2.0'으로 표현합니다.

set_playback_rates(playback_rates) V3 V4

배속값 그룹을 설정합니다. Array type으로 순서는 상관없습니다. (Player 내부에서 Sort하여 UI를 구성합니다.)
이중배열의 형태로 들어가는 경우 UI에서 보여지는 배속값 그룹의 세로 줄 수를 설정 할 수 있습니다. 이 경우 첫번째 인자는 배속값의 배열이며, 두번째 인자는 세로 줄 수를 나타냅니다. ex) [[0.5, 1, 1.5, 2, 3, 4], 2]

Parameters:

  • playback_rates Array 설정할 배속값 그룹의 배열입니다.

    Return:

  • No return

get_playback_rates() V3 V4

배속값 그룹의 배열을 반환합니다.

Parameters:

  • No parameter

    Return:

  • Array 설정된 배속값 그룹 배열입니다.

set_topmost(topmost) V2

윈도우 최상위 여부를 설정합니다.
최상위로 설정하면 현재 웹브라우져가 백그라운드 상태가 되어도 항상 다른 윈도우보다 위에 있게 됩니다.

Parameters:

  • No parameter

    Return:

  • No return

get_topmost() V2

윈도우 최상위 설정을 반환합니다.
V2 Player를 제외한 다른 Player에서 호출시 항상 false를 반환합니다.

Parameters:

  • topmost Boolean true는 최상위 설정, false는 최상위 설정 해제입니다.

    Return:

  • Boolean 윈도우 최상위 설정값 입니다.

set_brightness(brightness) V2

영상의 밝기를 설정합니다.
이 설정은 V2 Player에서만 동작합니다. 영상의 밝기는 -50 <= brightness <= 50입니다.
-50보다 작거나 50보다 큰 값을 입력하면 각각 -50과 50으로 재조정됩니다.

Parameters:

  • brightness Integer 영상 밝기값 입니다.

    Return:

  • No return

get_brightness() V2

설정된 영상 밝기값을 반환합니다. V2 Player가 아닌 경우 이 메소드를 호출하면 무조건 0을 반환합니다.

Parameters:

  • No parameter

    Return:

  • Integer 설정된 영상 밝기값 입니다.

set_contrast(contrast) V2

영상의 대비를 설정합니다.
이 설정은 V2 Player에서만 동작합니다. 영상의 대비는 -50 <= contrast <= 50입니다.
-50보다 작거나 50보다 큰 값을 입력하면 각각 -50과 50으로 재조정됩니다.

Parameters:

  • contrast Integer 영상 대비값 입니다.

    Return:

  • No return

get_contrast() V2

설정된 영상 대비값을 반환합니다. V2 Player가 아닌 경우 이 메소드를 호출하면 무조건 0을 반환합니다.

Parameters:

  • No parameter

    Return:

  • Integer 설정된 영상 대비값 입니다.

set_saturation(saturation) V2

영상의 색조를 설정합니다.
이 설정은 V2 Player에서만 동작합니다. 영상의 색조는 -50 <= saturation <= 50입니다.
-50보다 작거나 50보다 큰 값을 입력하면 각각 -50과 50으로 재조정됩니다.

Parameters:

  • saturation Integer 영상 색조값 입니다.

    Return:

  • No return

get_saturation() V2

설정된 영상 색조값을 반환합니다. V2 Player가 아닌 경우 이 메소드를 호출하면 무조건 0을 반환합니다.

Parameters:

  • No parameter

    Return:

  • Integer 설정된 영상 색조값 입니다.

set_repeat_start([position])

구간반복의 시작 위치를 설정합니다. 인자 없이 호출하면 현재 위치를 구간반복의 시작 위치로 설정합니다.

controller.set_repeat_start();

인자로 위치(초)값을 입력하면 지정한 위치를 구간반복의 시작 위치로 설정합니다.

controller.set_repeat_start(10); // 10초 위치를 시작 위치로 설정

만약 먼저 설정된 종료 위치보다 시작 위치가 나중이라면 종료 위치가 해제됩니다.

Parameters:

  • position Integer (Optional) 시작 위치값 입니다.

    Return:

  • No return

set_repeat_end([position])

구간반복의 종료 위치를 설정합니다. 인자 없이 호출하면 현재 위치를 구간반복의 종료 위치로 설정합니다.

controller.set_repeat_end();

인자로 위치(초)값을 입력하면 지정한 위치를 구간반복의 종료 위치로 설정합니다.

controller.set_repeat_end(20); // 20초 위치를 종료 위치로 설정

만약 먼저 설정된 시작 위치보다 종료 위치가 먼저라면 시작 위치가 해제됩니다.

Parameters:

  • position Integer (Optional) 종료 위치값 입니다.

    Return:

  • No return

unset_repeat()

설정된 구간반복을 해제합니다.

Parameters:

  • No parameter

    Return:

  • No return

refresh_bookmark()

플레이어 내 bookmark 리스트를 새로 갱신합니다.

Parameters:

  • No parameter

    Return:

  • No return

enable_fullscreen_button() V3 V4

플레이어 내부의 fullscreen button을 활성화시킵니다.
(IE 10 이하는 웹브라우져에서 fullscreen 기능을 지원하지 않으므로, 해당 웹브라우져에선 자동적으로 fullscreen button이 비활성화된 상태로 표시됩니다.)

Parameters:

  • No parameter

    Return:

  • No return

get_player_id() V2 V3

플레이어 고유 아이디를 반환합니다. 이 함수는 ready 이벤트가 호출되기 전까지는 null을 리턴합니다.

Parameters:

  • No parameter

    Return:

  • String 플레이어 고유 아이디입니다.

get_hardware_id() V2 V3

하드웨어 고유 아이디를 반환합니다. 이 함수는 ready 이벤트가 호출되기 전까지는 null을 리턴합니다.

Parameters:

  • No parameter

    Return:

  • String 하드웨어 고유 아이디입니다.

set_subtitle_visibility(visibility)

자막 출력을 설정합니다.

Parameters:

  • visibility Boolean 출력 여부입니다.

    Return:

  • No return

get_video_info() Flash V4

미디어의 width, height, bitrate값을 반환합니다. 이 함수는 ready 이벤트가 호출되기 전까지는 null을 리턴합니다.

Parameters:

  • No parameter

    Return:

  • Object width, height, bitrate를 property로 갖는 Object를 반환합니다.

이벤트 목록

loaded

플레이어 로딩이 완료되면 이벤트가 발생합니다.

ready

플레이어 로딩이 끝나고 재생 정보를 서버로부터 획득하였으며, 실제 재생준비가 완료된 시점입니다.

play

재생 시작시에 발생합니다. 초기 재생 시작을 제외하고 일시 멈춤 상태에서 다시 재생을 시작할때도 발생합니다.

progress

재생시 매초마다 발생합니다.

controller.on('progress', function(percent, position, duration) {
	// 인자의 순서는 위와과 같습니다.
});

단, V3, V4 Player의 경우 HTML5 Video Player의 구조상 progress 이벤트가 정확하게 1초마다 발생하지 않을수 있습니다. (0.1에서 최대 0.5초 가량 차이가 날 수도 있습니다.)
V3, V4 Player와 관련하여 progress 이벤트로 작업하실 경우 이 부분을 유념하여 주십시요.

Parameters:

  • percent Integer 진행 백분율입니다. 값의 범위는 0 <= percent <= 100 입니다.
  • position Integer 현재 재생중인 위치의 값입니다. 초단위입니다.
  • duration Integer 동영상의 전체 재생 길이입니다. 초단위입니다.

pause

일시 정지시에 발생합니다.

done

재생 완료시에 발생합니다. 재생 완료는 duration의 끝까지 모두 재생한 경우를 의미합니다.

muted Flash V3 V4

음소거 상태가 변경시 호출됩니다. (음소거시, 음소거 해제시 모두 발생)

controller.on('muted', function(is_muted) {
	// is_muted가 true면 음소거, false면 해제입니다.
});

다만, V2 Player의 경우 현재 muted 이벤트를 제공하지 않습니다. 대신 음소거가 되는 경우 volumechange 이벤트가 발생되고 변경된 음량을 0으로 제공합니다.

Parameters:

  • is_muted Boolean true면 음소거, false면 음소거 해제입니다.

scalemodechange Flash

스케일모드가 변경시 발생합니다.

controller.on('scalemodechange', function(scalemode) {
// ...
});

스케일모드는 Flash Player에만 존재하는 기능입니다. 다른 Player에서는 이벤트를 발생시키지 않습니다. 파라미터로는 다음의 4가지 문자열 가운데 하나를 제공합니다.

  • letterbox, stretch, zoom, none

Parameters:

  • scalemode String letterbox, stretch, zoom, none 가운데 하나입니다.

topmostchange V2

화면 최상위 설정 변경시 발생합니다.

controller.on('topmostchange', function(is_topmost) {
	// is_topmost가 true면 최상위 설정, false면 최상위 설정 해제입니다.
});

화면 최상위 설정은 V2 Player에만 존재하는 기능입니다. 다른 Player에서는 이벤트를 발생시키지 않습니다.

Parameters:

  • is_topmost Boolean true면 최상위 설정, false면 최상위 설정 해제입니다.

screenchange

전체, 일반화면 변경시 발생합니다.

  • IE10 이하의 브라우져의 경우, enable_fullscreen_button()이 활성화 되어 있는 상태라면, fullscreen 버튼 클릭시 실제 fullscreen/windowed 전환이 이루어 지지는 않지만 screenchange 이벤트는 정상적으로 반환이 됩니다.
controller.on('screenchange', function(screen) {
	// ...
});

screen 파라미터는 다음의 2가지 문자열 가운데 하나를 제공합니다. screen: windowed, fullscreen

Parameters:

  • screen String windowed는 일반화면, fullscreen은 전체화면입니다.

volumechange

음량 변경시 발생합니다.

controller.on('volumechange', function(volume) {
	// volume의 범위는 0 <= volume <= 100 입니다.
});

Parameters:

  • volume Integer 변경된 음량입니다. 범위는 0 <= volume <= 100 입니다.

speedchange V2 V3 V4

배속 변경시 발생합니다. 배속 최대값은 Player의 설정에 따라 바뀔 수 있습니다.

controller.on('speedchange', function(speed) {
	// speed의 범위는 0.5 <= speed <= 4 입니다.
});

Parameters:

  • speed String 변경된 배속입니다. 범위는 0.5 <= speed <= 4 입니다. Javascript 언어 특성상 2.0은 2로 표기
    되기 때문에, Integer형 대신에 String형을 사용해 제공합니다.

videosettingchange V2

비디오 속성 변경시 발생합니다.

controller.on('videosettingchange', function(videosetting) {
    // videosetting 파라미터는 다음의 형태로 표시되는 Object 타입입니다.
    //
    // {
        // "brightness": 0,
        // "contrast": 0,
        // "saturation": 0
    // }
});	

비디오 속성 변경 기능은 V2 Player에만 존재하는 기능입니다. 다른 Player에서는 이벤트를 발생시키지 않습니다. 각 값의 범위는 모두 -50 <= value <= 50의 범위를 갖습니다. 사용자가 별도로 지정하지 않았을 경우 기본값은 0 입니다.

Parameters:

  • videosetting Object brightness(밝기), contrast(대비), saturation(채도)를 property로 갖는 object입니다.

jumpstepchange

ff, rw 메소드를 통해 이동할 시간값 변경시 발생합니다.

controller.on('jumpstepchange', function(jumpstep) {
	// jumpstep은 초단위입니다.
});	

Parameters:

  • jumpstep Integer 변경된 이동할 시간값입니다. 초단위입니다.

html5_video_supported V3 V4

V3, V4 Player에서만 발생합니다.
Player가 내부에서 HTML5 Video 재생기능을 사용할 수 있다고 판단하여 HTML5 Video Player를 로드할 경우 엔 true를, 전용 플레이어를 재생해야 한다고 판단할 경우엔 false를 리턴합니다. (http://caniuse.com/#feat=video 참조)

Parameters:

  • html5_video_supported Boolean Player가 HTML5 Player로 로드될 경우 true, 전용 플레이어로 로드될 경우는 false가 리턴됩니다.

error

Player가 재생오류를 반환하는 경우 발생합니다.

controller.on('error', function(error_code) {
	// ...
});

Parameters:

  • error_code Integer Kollus Player 에러 코드입니다.

 

Bookmark

Requirement (v1.0)

  • 오프라인 상태에서 북마크/이어보기 정보는 다음 온라인 상태일 때 전송하여 데이터
    동기화 필요함.

  • 이어보기의 경우 앱(어플) 종료 시점에 전송한다. PC 재생중 종료시 javascript 로
    종료 확인 메시지를 주면 PC 도 종료 시점에 한번만 이어보기 정보를 전송해도 된다.

    • Flash 의 경우 일정 주기마다 전송합니다.
  • SDK 에서 누적된 북마크,이어보기 정보 리스트를 획득하고 clear 하는 기능 요청

    • SDK 업그레이드 일정에 반영하여 제공될 예정입니다.
  • SDK – bookmark, n-screen 정보 전송에 대한 처리 callback

    • SDK 업그레이드 일정에 반영하여 제공될 예정입니다.
  • 북마크, 이어보기 각 항목에 시간 정보 추가

    • 시간정보는 사용자 단말의 localtime 으로 시간 동기화 이슈가 있으므로
      데이터 사용시 주의해야 합니다.

Kollus 설정하기

북마크와 이어보기 연동은 해당 서비스 계정에 한가지 URL 로 적용됩니다.
Kollus 의 다른 Callback 과 다르게 채널별 설정이 불가능합니다.

  • Kollus 관리자 화면에서 별도 등록하는 절차를 거쳐야 적용됩니다.
    기능 필요시 Kollus 담당자에게 요청해 주십시오.

Bookmark API

북마크 정보를 사용하는 KollusPlayer 와 고객 데이터베이스의 북마크 정보를 연동하기
위해 사용됩니다.

API Params

Name Type Note
upload_file_key string 콘텐츠 업로드시 생성되는 키 (Unique)
media_content_key string
client_user_id string 사용자 아이디
position integer 북마크 위치
localtime integer 북마크 생성 시간 (참조값: 사용자 system time,
value string 북마크 제목
label string 북마크 리스트 제목
uservalue(0~9) string User Value

북마크 목록 획득 Api (List Url)

북마크 목록을 획득하기 위해 호출되는 Url 입니다. 북마크 정보를 Json 형태의 UTF-8 로
반환되어야 합니다.

Request

  • 인덱스 북마크
    • method : GET
    • params:
      • (string) upload_file_key
      • (string) media_content_key : 존재하지 않는 경우 있음.
  • 인덱스+사용자 북마크
    • method : GET
    • params :
      • (string) media_content_key
      • (string) client_user_id
  • 북마크 url 의 인자에 {USERVALUE0~9}항목이 있으면 uservalue0(~9)로 치환하여
    request 함

Response

  • error : 정상인 경우 0 (반드시 0 이어야 합니다.)
  • bookmark_labels : 리스트 항목에 보여주는 목록 이름
    • kind 0 : Bookmark
    • kind 1 : Index
  • result : 모든 결과는 result 항목 하위에 노출되어야 합니다.
    • bookmark_positions : 북마크 정보 리스트
      • poistion : 북마크 위치
      • value : 북마크 제목
      • kind
        • 0 : 사용자 북마크
        • 1 : 인덱스 북마크
      • label : 인덱스 북마크 제목 (사용자 북마크는 해당값 무시됨)
      • localtime : 북마크 생성 요청 시간 (사용자 local
      • time – 참고
        데이터로만 사용됨, unixtimestamp 형식)

Sample data

{

    "error" : 0,

    "result" : {

   		“bookmark_labels” : [

            "Bookmark",

            “Index”

        ],

        "bookmark_positions" : [

            {

                "position" : 3,

                "value" : "",

                "kind" : 0,

                "label" : "",

                "localtime" : 1417568260 },

            {

                "position" : 5,

                "value" : "시작",

                "kind" : 0,

                "label" : "",

                "localtime": 1417568265 },

            {

                "position": 7,

                "value" : "",

                "kind" : 1,

                "label" : "김강사님 북마크",

                "localtime" : 1417538260 },

            {

                "position" : 12,

                "value" : "",

                "localtime" : 1417568270 },

            {

                "position" : 13,

                "value" : "",

                "kind" : 1,

                "label" : "최강사님 북마크",

                "localtime" : 1417538260 }

      	  ]

    }

}

 

북마크 정보 일괄 수정 Api (Update Url)

다수의 북마크를 일괄 처리하기 위한 Url 입니다. action 은 register, remove 이며, 각각
기능은 register, remove 의 기능을 순서대로 처리합니다.

Update Url 이 호출되는 경우 Register/Remove Url 은 호출되지 않습니다.

Request

  • method : POST
  • params:
    • (string) bookmarks : {action block}이 array 로 구성된 json 포맷의 문자열
  • {action block}
    • action : ‘register’ or ‘remove’
    • 인덱스 북마크
      • (string) upload_file_key
      • (integer) position
      • (string) label
      • (string) value : remove 에서는 포함되지 않음.
      • (integer) localtime
    • 사용자 북마크
      • (string) media_content_key
      • (string) client_user_id
      • (integer) position
      • (string) value : remove 에서는 포함되지 않음.
      • (integer) localtime
    • user_value
      • 북마크 url 의 인자에 {USERVALUE0~9}항목이 있으면
        uservalue0(~9)로 치환하여 request 함
  • bookmarks 의 예)
[

    {

        "action" : "register"

        , "media_content_key" : "x53gaH3a"

        , "client_user_id" : "test_user_id"

        , "position" : 45

        , "localtime" : 1414538260

        , "LC" : “LC001”

        , "device" : “mobile”

     },

     {

        "action" : "remove"

        , "media_content_key" : "x53gaH3a"

        , "client_user_id" : "test_user_id"

        , "position" : 67

        , "localtime" : 1417538260

        , "LC" : “LC001”

        , "device" : “mobile”

    }

]

 

Scheme Option

모바일 전용 플레이어 (Android, iOS)

Android, iOS에서 KollusPlayer를 호출하는 scheme 호출 옵션을 설명합니다. 일반적인 모바일 웹에서 KollusPlayer가 설치되어 있는 경우 scheme(kollus://)를 통해 KollusPlayer를 자동 실행할 수 있습니다.

 

kollus://path – 스트리밍(Streaming)

동영상을 스트리밍하기 위해 사용됩니다.

Params Datatype Description
url URL(http://~) 동영상 재생을 위한 링크를 지정합니다
folder path 저장할 가상 폴더로 폴더구분은 /로 합니다. 예:media/movie/video

 

kollus://download – 다운로드(Download)

동영상 다운로드를 위해 사용됩니다. 다운로드시 저장되는 가상폴더를 지정할 수 있습니다. 폴더는 물리적인 폴더가 아닌 플레이어에서 지원하는 가상의 폴더로 media/movie/video와 같이 multi-depth를 지원합니다.

다운로드를 하기 위해서는 해당 컨텐츠가 다운로드 가능하도록 Policy 설정이 되어 있어야 합니다. 해당 설정은 Kollus CMS의  채널 설정에서 할 수 있습니다.

Params Datatype Description
url http://~ 동영상 재생을 위한 링크를 지정합니다.
멀티 다운로드의 경우 반복될 수 있습니다.
folder Movie 다운로드 폴더를 지정합니다.
해당폴더는 다운로드 기능을 제공하는 플레이어의 가상 폴더입니다.
멀티 다운로드의 경우 반복될 수 있습니다.

 

kollus://download_play – 다운로드 컨텐츠 플레이**

다운로드된 컨텐츠를 재생할 때 사용됩니다. 다운로드된 컨텐츠가 삭제된 경우 아무런 작업을 하지 않습니다.

Params Datatype Description
url http://~ 동영상 재생을 위한 링크를 지정합니다.

 

kollus://list – 다운로드 리스트 (List)

앱 실행 시 다운로드한 목록으로 곧바로 보여주기를 원할 때 아래 형식을 따른다. 특정 위치의 리스트를 원할 때는 folder 파라미터를 주면 된다.

Params Datatype Description
folder String KollusPlayer의 다운로드 리스트 화면으로 바로 이동합니다. 해당 폴더가 없는 경우 루트 폴더의 목록이 표시 됩니다.

 

KollusPlayer for Mac

kollus://path – 스트리밍(Streaming)

동영상을 스트리밍하기 위해 사용됩니다.

Parmas Datatype Description
url URL(http://~) 동영상 재생을 위한 링크를 지정합니다.*URL Encoding 된 문자열을 사용해야 합니다.

 

KollusPlayer V3 (for Windows)

다운로드 (POST)

  • 싱글/복수 파일 다운로드에 사용할 수 있습니다.
http://127.0.0.1:8388/download

Post 파라미터

Params Datatype Description
download Json 다운로드 파일의 정보를 json으로 구성한 정보로 입력합니다. 별도 인코딩을 하지 않습니다.
JSON    
result   다운로드 파일 객체의 배열
  title 다운로드 목록에 표시될 제목입니다.
  url 미디어 경로입니다.
  dir 다운로드 파일이 다운로드 후 등록될 경로입니다.

Example

{

    "result": [

        {

            "title": "CF2 실패",

            "url": "http://v.kr.kollus.com/JSAPHzuT?a",

            "dir": "/"

        },

        {

            "title": "MAXIM 하니",

            "url": "http://v.kr.kollus.com/JSAPHzuT?a",

            "dir": "/CF"

        }

    ]

}

 

Custom Log

개요

Kollus Videogateway 접근 로그를 기록하는 시점에, 고객사가 Videogateway에 접근할때
부가정보를 추가하여, Kollus의 사용자 접근 로그에 데이터가 남겨지도록 하여 별도 제공되는
서비스를 통해 해당 로그를 분석할 수 있는 기능을 제공하기 위한 참고 문서입니다.

 

Videogateway 요청 방식

접근 로그에 다음과 같은 방식으로 사용자 정의 로그 키를 추가할 수 있습니다.

http://v.kr.kollus.com/MEDIA_CONTENT_KEY?custom_log_key0=...&custom_log_k

ey9=...

 

Custom log key

  • 사용자 정의 로그 키는 custom_log_key0부터 custom_log_key9까지 총 10개를
    사용할 수 있습니다.
  • 각 필드의 길이가 10바이트를 초과하는 경우 별도 협의하여 주십시오.
  • custom_log_key의 값은 urlencode하여 사용해주시기 바랍니다.

 

Media Content Key 확장 기능

개요

미디어 컨텐츠 키(media_content_key)에 고객사가 원하는 Custom ID(이하 CID)를 추가하여 새로운(다운로드기준) 컨텐츠로 인식하도록 하는 기능입니다. 다만, 컨텐츠 재생정보는 CID가 붙지 않은 미디어 컨텐츠 키(media_content_key)에서 가져옵니다.

 

이해를 돕기 위해 구글의 이메일 Alias 기능을 설명 합니다.

메일 계정 : support@kollus.com

발송 메일 정보 : support+cid@kollus.com 

메일 수신 : support@kollus.com 

support@kollus.com, support+cid@kollus.com 과 같이 위 두 이메일 주소에 메일을 보내면 모두  support@kollus.com으로 전달 됩니다.

 

형식

비암호화 요청시

http://v.kr.kollus.com/[MEDIA_CONTENT_KEY]-[CUSTOM_ID]

  1. 미디어 컨텐츠 키와 CID는 -(하이픈)로 구분

  2. 미디어 컨텐츠 키와 -, CID를 포함한 최대 길이는 64bytes.

  3. CID에는 가급적 multi bytes character 사용을 자제.

    (UTF-8의 경우 byte가 가변적이기 때문에 사용자가 기대한 최대 길이와 상이할 수 있음)

  4. 예제 http://v.kr.kollus.com/vnCVPVyV-new-custom-id

 

암호화 요청시

  1. 수정된 kollus_crypt 필요 (버전1.6.1 이상)

    • 해당 모듈은 별도 제공합니다
  2. 미디어 컨텐츠 입력 인자에 위와 같은 형식으로 CID를 추가한 확장된 미디어 컨텐츠 키 입력

 

유의사항

  • 미디어 컨텐츠 키를 이용한 Kollus service들 (이어보기, 중복재생방지 등등)은 확장된 미디어 컨텐츠 키를 미디어 컨텐츠 키로 구분합니다. (즉, 서로 다른 컨텐츠로 인식)CID를 붙여도 kollus 서비스는 media_content_key를 기준으로 서비스 됩니다

    • DRM callback
    • LMS callback
    • 이어보기
    • 북마크
  • CID(custom-id)에 사용할 수 있는 문자

    • Alpha, Number 만 사용 가능합니다.

      • a-z,A-Z,0-9
    • 제한적으로 특수문자는 -(하이픈)  만 사용가능합니다.

모바일 연동

Kollus Mobile Player SDK

고객사에서 사용중인 APP(iOS, Android)에서 적용할 수 있도록

SDK 키 발급 , SDK 및 샘플코드 등을 지원 하고 있습니다.

해당 관련 하여 자세한 사항은 담당 AM 또는 SE 에게 문의 부탁 드립니다.

Hybrid Player

고객사에서 사용중인 Hybrid Player 연동에서 적용할 수 있도록 지원 및 가이드 하고 있습니다.

해당 관련 하여 자세한 사항은 담당 AM 또는 SE 에게 문의 부탁 드립니다.

에러코드

  Type Code Case Descript Message_KO
전용플레이어 NO_INIT -19 초기화 하지 않은 상태에서 해당 기능이 호출된 경우  
전용플레이어 BAD_VALUE -22 URL이 NULL이거나 해당 MediaContentKey로 다운로드된 컨텐츠가 없는 경우  
전용플레이어 INVALID_OPERATION -38 인자 오류  
Android ERROR_CODEC_TIMED_OUT -110 H/W Codec(OMX)이상동작  
전용플레이어 ERROR_IO -1004 데이터 사용 오류  
전용플레이어 ERROR_MALFORMED -1007 URL이 http://나 https://로 시작하지 않는 경우 컨텐츠를 불러오는데 실패했습니다.
서비스 제공 업체에 문의하여 주시기 바랍니다.
전용플레이어 ERROR_UNSUPPORTED -1010 미지원 컨텐츠 지원되지 않는 컨텐츠입니다.
서비스 제공 업체에 문의해주시기 바랍니다.
전용플레이어 ERROR_UNSUPPORTED_DEVICE -1015 미지원 디바이스 지원되지 않는 단말기입니다.
서비스 제공 업체에 문의해주시기 바랍니다.
Android ERROR_CODEC_INIT -1102 HW Codec 연동이 실패 시 서버로 에러 수집을 위해 있는 값으로 UI상으로는 Notify하지 않음 코덱 초기화에 실패하였습니다. 다시 시도해주시기 바랍니다.
전용플레이어 ERROR_CODEC_DECODE -1103 디코딩 실패 – 고객친화 문구로 대체함 시스템 초기화로 재시도가 필요합니다.
OTT ERROR_SERVER_BLACK_OUT -1105 블랙아웃 현재 방송 중이 아니거나,
방송 신호가 정상적으로 수신되지 않습니다.
잠시 후, 다시 시도해주세요.
OTT ERROR_DRM_NO_LICENSE -2001 DRM 프록시 서버 주소가 없거나 인증 실패 시  
OTT ERROR_NETWORK_CON_BASE -4000 "네트워크 연결 오류 기본 값 아래에 없는 코드는 Curl 오류에 기본 값을 더한 코드임"  
OTT ERROR_NETWORK_CON_SOCKET_IO -4103 네트워크 연결 시 ERROR_NETWORK_CON_TIMEOUT이외의 오류  
OTT ERROR_NETWORK_CON_TIMEOUT -4105 네트워크 연결 타임 아웃  
OTT ERROR_NETWORK_SEND_BASE -5000 네트워크 쓰기 오류 기본 값  
OTT ERROR_NETWORK_SEND_SOCKET_IO -5005 네트워크 쓰기 오류  
OTT ERROR_NETWORK_RECV_BASE -6000 네트워크 읽기 오류 기본 값  
OTT ERROR_NETWORK_RECV_SOCKET_IO -6005 네트워크 읽기 오류  
전용플레이어 UNKNOWN_ERROR 0x80000000 기타 여러가지 오류  
전용플레이어 ERROR_UNDEFINED_CODE 기타 기타 에러 메세지를 통합하여 보여주는 메세지 일시적인 오류가 발생하였습니다.
잠시 후 다시 시도해 주세요.

 

V3-Agent Error (-1001 ~ -2001)

Type Code Case Descript Message_KO
ERROR_NOT_RESPONSE_AGENT -1000 Kollus Agent로 요청시 응답이 3초동안 없는 경우 Kollus Agent가 실행되어 있지 않거나 응답이 없습니다.
잠시 후 재시도 해 주세요.
ERROR_UNSUPPORTED_HTML5_VIDEO -1001 HTML5가 지원되지 않을 경우. 현재 사용하시는 브라우저 환경에서 컨텐츠를 재생하실 수 없습니다.
Internet Explorer 9 버전 이상으로 업그레이드 해주시거나
Chrome, Firefox 등의 브라우저를 통해 접속해주시기 바랍니다.
ERROR_CAPUTRE -1002 캡쳐 프로그램이 감지됨 화면 녹화 또는 캡쳐 프로그램이 감지되었습니다.
해당 프로그램을 종료하신 후 다시 시도해주시기 바랍니다.
ERROR_TVOUT -1003 TV OUT 감지(HDMI 감지 또는 Device 체크) 외부 디바이스로의 출력 시도가 감지되어 재생을 중단합니다.
HDMI 등의 외부 연결을 해제하신 후 다시 시도해주시기 바랍니다.
ERROR_SCRIPT -1011 security script 오류 인증 처리 과정에서 일시적인 오류가 발생하였습니다.
잠시 후 새로고침하여 다시 재생 시도해주세요.
ERROR_DUPLICATE_APP -1012 플레이어가 동시에 두개 이상 재생 시도 되는 경우 플레이어를 동시에 하나 이상 실행할 수 없으므로 기존 재생을 종료합니다.
ERROR_CONTENTRAGE -1013 서버의 응답이 지연되는 경우 발생.
허가되지않은 방법으로 다운로드 요청시 발생
기본 플레이어(HTML5)를 통한 영상 재생이 원활하지 않습니다.
아래의 확인 버튼을 클릭하시어 전용 플레이어를 통해 재생해주시기 바랍니다.
ERROR_USERAGENT -1014 user-agent가 동일하지 않을때  
ERROR_WATERMARK_PLAY -1015 워터마킹이 들어가 있는 동영상 인 경우 전용 player로 호출 전용 Player용 컨텐츠입니다.
ERROR_HTML5_VIDEO_PLAY -1016 HTML5Player가 지원되지 않을 경우. 본 컨텐츠는 전용 플레이어를 통해 재생됩니다.
잠시만 기다려주세요.
ERROR_USER_CLOSE -1016 사용자가 Agent를 종료하는 경우  
ERROR_DATA_READ -1017 데이터 읽기 오류 영상 데이터를 읽어오지 못했습니다.
잠시 후 새로고침하여 다시 재생 시도해주세요.
ERROR_NETWORK_DISCONNECTED -1018 재생중 Network가 끊겨서 Session이 닫히는 경우 세션 연결이 끊어졌습니다.
브라우저를 새로고침 해주시기 바랍니다.
ERROR_VIRTUALMACHINE -1019 가상 머신에서 재생시 가상 머신에서는 영상을 재생하실 수 없습니다.
ERROR_BUFFERING_CONTENT -1020 처음 재생시 버퍼링이 계속 발생해서 재생이 불가한 경우 현재 브라우저 환경에서는 영상을 원활하게 재생하실 수 없습니다.
다른 브라우저에서 다시 시도해주시기 바랍니다.
ERROR_SCRIPT_FIRST -1021 script send 호출이 한번도 되지 않고 데이터를 요청할 때 First Security script 오류가 발생하였습니다.
ERROR_SCRIPT_REF -1022 connect count가 2개 이상이고 15초 동안 동시에 접속 할 때 오류 비정상적인 방법을 통하여 다운로드 하실 수 없습니다.

 

IOS SDK Error (-2100~)

Type Code Case Descript Message_KO
ERROR_DISABLED_BOOKMARK_CONTENT -2100 북마크가 없는 컨텐트에서 북마크 조작 명령을 실행한 경우 북마크가 포함되지 않은 컨텐츠입니다.
ERROR_CONTENT_NOT_PREPARED -2101 컨텐트 재생준비가 완료되지 않은 상태에서 컨텐츠 재생 시도 컨텐츠 재생 준비가 완료되지 않았습니다.
ERROR_COULD_NOT_SCROLL_MODE -2102 화면을 이동할 수 있는 컨텐트 모드가 아님 현재 모드에서는 화면을 이동할 수 없습니다.
ERROR_INCORRECT_BUNDLE_ID -2103 Bundle-ID가 상이함 입력된 Bundle ID가 정확하지 않습니다.
ERROR_EXPIRED_AUTH_DATE -2104 SDK 사용기한 만료 SDK 사용기한이 만료되었습니다.
ERROR_INCORRECT_AUTH_DATE -2105 SDK 사용기한 입력포맷이 상이함 입력된 SDK 사용기한이 정확하지 않습니다.
ERROR_INCORRECT_AUTH_KEY -2106 SDK 인증 키가 상이함 입력된 SDK 인증 키가 정확하지 않습니다.
ERROR_NOT_ENOUGH_AUTH_INFO -2107 SDK 인증정보가 모두 입력되지 않았음 SDK 인증을 위한 정보가 모두 입력되지 않았습니다.
ERROR_KOLLUS_STORAGE_IS_EMPTY -2108 플레이어에 KollusStorage를 설정하지 않고, 재생을 시도한 경우 KollusStorage가 설정되지 않았습니다.
ERROR_CONTENT_URL_IS_EMPTY -2109 재생할 컨텐츠의 URL또는 index를 설정하지 않고, 재생을 시도한 경우 재생할 컨텐츠의 URL이 설정되지 않았습니다.
ERROR_CONTENT_IS_MIRRORING -2110    
ERROR_DISCONNECT_PLAY_SESSION -2111 내장 플레이어에서 Proxy Server와 세션이 끊어지는 경우 재생할 수 없습니다. 다시 재생 시도해주세요.
ERROR_ALREADY_DOWNLOADED -9000 다운로드 완료된 파일을 다운로드 시도한 경우 이미 다운로드된 컨텐츠입니다.

 

Kollus Player V4 (3000~ )

Type Code Case Descript Message_KO
ERROR_API_CONNECTION 3000 API 호출에 실패할 경우 API 호출에 실패했습니다.
서비스 제공 업체에 문의하여 주시기 바랍니다.
MEDIA_ERR_ABORTED 3001 비디오 재생을 취소한 경우 비디오 재생을 취소했습니다.
MEDIA_ERR_NETWORK 3002 네트워크 오류 네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.
MEDIA_ERR_DECODE 3003 지원되지 않는 형식의 미디어 요청 비디오를 로드할 수 없습니다.
서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.
MEDIA_ERR_SRC_NOT_SUPPORTED 3004 브라우저 미지원 비디오 재생이 취소됐습니다.
비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.
MEDIA_ERR_SRC_NOT_SUPPORTED 3005 브라우저 미지원 비디오에 호환되지 않는 소스가 있습니다.
MEDIA_ERR_LIVE_NOT_BROADCASTING 3012 LIVE 재생을 실패한 경우 현재 방송 중이 아니거나,
방송 신호가 정상적으로 수신되지 않습니다.
잠시 후, 다시 시도해주세요.
ERROR_UNAUTHORIZED 3013 인증에 실패한 경우 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.

 

Video Gateway (4000~ )

Type Code Case Descript Message_KO
ERROR_INVALID_MEDIA_CONTENT_KEY -4001 미디어 컨텐츠 키가 올바르지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_INVALID_SECURITY_KEY -4002 보안 키가 올바르지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_INVALID_CHANNEL_KEY -4003 채널 키가 올바르지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_INVALID_USER_KEY -4004 사용자 키가 올바르지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_INVALID_TRANSCODING_FILE_PATH -4005 동영상 파일의 물리 경로가 올바르지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_INVALID_ALIAS_KEY -4006 알리아스 키가 올바르지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_INVALID_JWT -4007 JSON 토큰이 올바르지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_INVALID_MEDIA_TOKEN -4008 미디어 토큰이 올바르지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NO_TRANSCODING_FILE -4011 동영상 파일이 존재하지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NO_MEDIA_CONTENT -4012 동영상이 존재하지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NO_CONTENT_OWNER -4013 컨텐츠 공급자가 존재하지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NO_CONTENT_DISTRIBUTOR -4014 컨텐츠 공급자가 존재하지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NO_CHANNEL -4015 채널이 존재하지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NO_PAYMENT -4016 과금 이력이 존재하지 않아 서비스가 중지되었습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NO_DEFAULT_MAIN_SITE -4019 서비스 제공자 설정에 오류가 발생하였습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NO_MAIN_MEDIA_CONTENT -4020 인트로 요청 내에 본 컨텐츠가 존재하지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_UNAVAILABLE_TRANSCODING_FILE -4021 동영상 파일이 서비스 중지되었습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_UNAVAILABLE_MEDIA_CONTENT -4022 동영상이 서비스 중지되었습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_UNAVAILABLE_CONTENT_OWNER -4023 컨텐츠 공급자가 서비스 중지되었습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_UNAVAILABLE_CONTENT_DISTRIBUTOR -4024 컨텐츠 공급자가 서비스 중지되었습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_UNAVAILABLE_CHANNEL -4025 채널이 서비스 중지되었습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_UNAVAILABLE_CHANNEL_DISTRIBUTION -4026 위임된 채널이 서비스 중지되었습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NOT_ALLOWED_REFERER -4031 이 동영상은 제한된 도메인에서만 재생되도록 설정되었습니다. 본 컨텐츠는 허용되지 않은 도메인에서 재생하실 수 없습니다.
ERROR_NOT_ALLOWED_ACCESS_FOR_BLOCKING_CAPTURE -4032 귀하는 무단 캡쳐 시도로 인해 서비스 담당자로부터 컨텐츠 접근이 차단된 상태입니다.
자세한 내용은 담당자에게 문의 주시기 바랍니다.
귀하는 무단 캡쳐 시도로 인해 서비스 담당자로부터 컨텐츠 접근이 차단된 상태입니다. 자세한 내용은 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NOT_PUBLIC_SHARED_CHANNEL -4081 공개 컨텐츠가 아닙니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_MISMATCH_USER_KEY -4082 사용자 키가 설정된 것과 일치하지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_ACCESS_WITHOUT_MEDIA_CONTENT_KEY -4083 재생 요청이 올바르지 않습니다. 컨텐츠를 불러오는데 실패했습니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NOT_SUPPORT_DEVICE -4084 이 동영상은 사용자의 기기에서 재생할 수 없습니다. 본 디바이스에서 재생할 수 없는 컨텐츠입니다. 서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_TOKEN_EXPIRED -4085 재생토큰이 만료되었습니다. 다시 시도하여 주십시요. 재생 가능한 유효시간이 지났습니다. 다시 시도하여 주시기 바랍니다.

 

Flash Error (4100~ )

Type Code Case Descript Message_KO
ERROR_LOAD_SKIN_TEMPLETE 4100 SkinTemplete SWF 로드 에러. Skin Template을 불러오지 못했습니다.
ERROR_LOAD_SETTING_PANNEL 4101 SettingPannel SWF 로드 에러. Setting Pannel을 불러오지 못했습니다.
  4012 VOD 재생을 실패한 경우 서버 오류가 발생했습니다.
잠시 후 재시도 해 주세요.
  4013 LIVE 재생을 실패한 경우 현재 방송 중이 아니거나,
방송 신호가 정상적으로 수신되지 않습니다.
다시 시도해 주세요.

 

Curl 에러 (-8001 ~ -8099)

Type Code Case Descript Message_KO
ERROR_CURLE_COULDNT_RESOLVE_HOST -8006 서버 HOST 리졸빙 실패시 발생 서버에 연결할 수 없습니다.
네트워크를 확인 후 재시도 해 주세요.
ERROR_CURLE_COULDNT_CONNECT -8007 서버에 연결 실패시 서버에 연결할 수 없습니다.
네트워크를 확인 후 재시도 해 주세요.
ERROR_CURLE_PARTIAL_FILE -8018 서버에 요청한 사이즈와 응답으로 받은 데이터의 사이즈가 상이한 경우 네트워크 환경이 불안정하여
데이터 수신에 실패하였습니다.
ERROR_CURLE_WRITE_ERROR -8023 서버에서 전송받은 데이터를 파일로 저장하기 실패한 경우  
ERROR_CURLE_OPERATION_TIMEDOUT -8028 서버 연결중에 일정시간 동안 응답이 없는 경우 서버와의 통신이 불안정 합니다.
네트워크 상태를 확인 후 다시 재생 시도해 주세요.
ERROR_CURLE_RECV_ERROR -8056 서버 연결하여 응닫을 받는 도중 실패시 네트워크 상태를 확인하신 후 재시도 해 주세요.

 

  • 기타 curl 에러

    • -80XX 에러코드의 마지막 두자리수는 Curl Error입니다
    • Curl Error는 아래 URL을 참고하시기 바랍니다
https://curl.haxx.se/libcurl/c/libcurl-errors.html

 

 

표준 HTTP 서버 에러 (-8400~-8505)

Type Code Case Descript Message_KO
ERROR_BAD_REQUEST -8400   컨텐츠를 불러오는데 실패했습니다.
서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_UNAUTHORIZED_1 -8401   컨텐츠를 불러오는데 실패했습니다.
서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_UNAUTHORIZED_2 -8402   컨텐츠를 불러오는데 실패했습니다.
서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NOT_EXIST_FILE -8404   컨텐츠를 불러오는데 실패했습니다.
서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_INTERNAL_SERVER -8500   컨텐츠를 불러오는데 실패했습니다.
서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_NOT_IMPLEMENTED -8501   컨텐츠를 불러오는데 실패했습니다.
서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_BAD_GATEWAY -8502   컨텐츠를 불러오는데 실패했습니다.
서비스 제공 업체에 문의하여 주시기 바랍니다.
ERROR_SERVICE_UNAVAILABLE -8503   서버 점검 중입니다.
잠시 후에 다시 시도해주시기 바랍니다.
ERROR_GATEWAY_TIMEOUT -8504   서버 점검 중입니다.
잠시 후에 다시 시도해주시기 바랍니다.
ERROR_HTTP_VERSION_NOT_SUPPORTED -8505 브라우저의 설정에 Http1.1 설정이 되어 있는지 확인 필요합니다. 컨텐츠를 불러오는데 실패했습니다.
서비스 제공 업체에 문의하여 주시기 바랍니다.

 

엣지(인증) 서버 에러 (-8461~-8482)

Type Code Case Descript Message_KO
ERROR_REQUEST_URL -8461   알 수 없는 형식의 URL입니다.
ERROR_GET_USER_IP -8462   사용자의 IP를 확인할 수 없습니다.
ERROR_ACCESS_DENIED_FOLDER -8463   접근 권한이 없는 컨텐츠 또는 폴더입니다.
ERROR_DUPLICATION_BLOCK_PROCESS -8464   사용 가능한 기기 대수가 초과되었습니다.
관리자에게 문의해주세요.
ERROR_VERIFY_MEDIA_KEY -8465   미디어 키 오류가 발생했습니다.
ERROR_REQEST_URL_BLOCK -8466   요청한 컨텐츠가 차단되었습니다.
ERROR_MEDIA_KEY_TIME_EXPIRE -8467   미디어 키 유효기간이 만료되었습니다.
ERROR_MEDIA_DOMAIN_VALIDATE -8468   미디어 도메인이 정확하지 않습니다.
ERROR_HEAVY_REQUEST -8469   서버 과부하가 발생했습니다.
잠시 후 재시도 해 주세요.
ERROR_PLYMENT -8470   과금 오류가 발생했습니다.
ERROR_GEO_RESTRICTION -8471   해당 국가에서 재생할 수 없는 컨텐츠입니다.
ERROR_PREVIEW_ERROR -8472   미리보기가 실패했습니다.
ERROR_USER_KEY -8473   사용자 키 오류가 발생했습니다.
ERROR_CONTENT_NOT_PUBLIC_CHANNEL -8474   공개 컨텐츠가 아닙니다.
ERROR_USED_MEDIA_KEY -8475   미디어 키가 사용중 입니다.
ERROR_MAX_REQUEST_SIZE -8476   인증 확인 최대 Request 길이를 초과했습니다.
ERROR_DIFFERENT_ES_KEY -8477   비정상적인 요청입니다.
ERROR_ACCESS_DENIED_MEMCACHE_SERVER -8478   서버에 연결할 수 없습니다.
잠시 후 재시도 해 주세요.
ERROR_DUPLICATION_BLOCK_MEDIA_KEY -8479   동일한 아이디로 중복 로그인되어
재생을 중단합니다.
ERROR_NOT_NORMAL_REQUEST_VIDEO_GATEWAY -8480   정상적인 접근 경로가 아닙니다.
ERROR_EDGE_RADIS_WRITING -8481   서버 오류가 발생했습니다.
잠시 후 재시도 해 주세요.
ERROR_EDGE_RADIS_READING -8482   서버 오류가 발생했습니다.
잠시 후 재시도 해 주세요.

 

스토리지 매니저 에러 (-8600 ~ -8900)

Type Code Case Descript Message_KO
ERROR_CREATE_DIRECTORY -8600 단말에 컨텐츠를 저장할 디렉토리 생성 실패 파일 접근에 실패했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_CREATE_FILE -8601 파일 생성 실패 파일 접근에 실패했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_SAVE_DATA -8602 파일 데이타 저장 실패 파일 접근에 실패했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_OPEN_DB -8603 DB 파일을 열기 실패 DB 오류가 발생했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_CREATE_TABLE -8604 DB 테이블 생성 실패 DB 오류가 발생했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_SELECT_TABLE -8605 DB 테이블 select 실패 DB 오류가 발생했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_DELETE_RECORD -8606 DB 레코드 삭제 실패 DB 오류가 발생했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_INSERT_RECORD -8607 DB 레코드 추가 실패 DB 오류가 발생했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_OPEN_FILE -8608 파일 열기 실패 파일 접근에 실패했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_OUT_OF_MEMORY -8609 메모리 부족 메모리가 부족합니다.
사용하지 않는 어플리케이션을 종료후 재시도 해 주세요.
ERROR_READ_FILE -8610 파일 읽기 실패 파일 접근에 실패했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_WRITE_FILE -8611 파일 쓰기 실패 파일 접근에 실패했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_ABNORMAL_GATEWAY_INFO -8612    
ERROR_PARAM_VALUE -8613 "엣지 서버로 부터 얻은 컨텐츠 길이가 음수일때 V3 HTML5 Player를 지원하지 않는 브라우저에서 재생시도시" 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_NOT_LOAD -8614 사용하고자 하는 컨텐츠에 대해 load 함수를 호출후 사용할 API를 load 전에 호출시 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_CANCEL_DOWNLOAD -8615 파일 다운로드 중에 취소시 일시적인 오류가 발생하였습니다.
잠시 후 다시 시도해 주세요.
ERROR_NETWORK -8616    
ERROR_GET_CONTENTS_LENGTH -8617 엣지 서버로 부터 얻은 컨텐츠 길이가 음수일때 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_GET_ENCODE_LEVEL -8618 엣지 서버로 부터 얻은 컨텐츠 인코딩 레밸 정보가 유효하지 않을때 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_GET_MEDIA_URL -8619 엣지 서버에 요청 응답 결과 HTTP 302 코드를 받은 상태에서 LOCATION 해더로 미디어 url을 얻지 못한 경우 컨텐츠가 존재하지 않습니다.
ERROR_NOT_FOUND_DATA -8620    
ERROR_NOT_FOUND_ID -8621 스토리지 매니저 API를 존재하지 않는 컨텐츠 ID로 호출시 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_DECODE_HEADER -8622 엣지 서버에 요청 응답 결과 XHTTP_ENC_DATA 해더의 데이타를 복호화 실패시 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
잠시 후 재시도 해 주세요.
ERROR_STORAGE_FULL -8623 기기에 저장할 저장공간 부족시 저장공간이 부족합니다.
저장공간을 확보 후 재시도 해 주세요.
ERROR_UPDATE_RECORD -8624 DB 레코드 갱신 실패 DB 오류가 발생했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_REMOVE_CACHE -8625    
ERROR_NOT_FOUND_SNAPSHOT_FILENAME -8626 비디오 게이트웨이로 Media info 정보 요청후 얻은 스냅샷 url 문자열에서 파일명을 찾지 못함 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_NOT_FOUND_THUMBNAIL_FILENAME -8627 비디오 게이트웨이로 Media info 정보 요청후 얻은 썸내일 url 문자열에서 파일명을 찾지 못함 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_NOT_FOUND_RECORD -8628 DB 레코드를 찾지 못함 DB 오류가 발생했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_NOT_DOWNLOAD_COMPLETE_ALL -8629 다운로드 타입의 컨텐츠를 전부 받지 않은 상태에서 재생 시도시 컨텐츠 다운로드가 완료되지 않았습니다.
ERROR_NOT_DOWNLOAD_TYPE -8630 다운로드 타입이 아닌 컨텐츠 ID로 다운로드 관련 스토리지 매니저 API를 호출해서 사용하려는 경우 다운로드 받으실 수 없는 컨텐츠입니다.
ERROR_ALREADY_DOWNLOADING -8631 다운로드 중에 다운로드 요청 api를 호출시 이미 다운로드 중입니다.
ERROR_DECRYPT_CONTENT_INFO_LINK -8632 비디오 게이트웨이로 Media info 정보 요청후 응답받은 데이타를 복호화 실패시 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_PARSE_CONTENT_INFO_LINK -8633 비디오 게이트웨이로 Media info 정보 요청후 응답받은 데이타를 JSON 파싱 실패시 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_DECRYPT_COMPANY_AUTH_INFO -8634 DRM 콜백 호출후 응답받은 데이타를 복호화 실패시 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_PARSE_COMPANY_AUTH_INFO -8635 DRM 콜백 요청후 응답받은 데이타를 JSON 파싱 실패시 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_NOT_VAILD_COMPANY_AUTH_INFO -8636 DRM 콜백 호출(Kind 1)후 응답받은 만료 정보가 적절하지 않은 경우 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_NO_USE_CONTENT_URL -8637 "/i"나 "/si" 링크가 아닌 url로 컨텐츠를 load 하는 경우 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_NOT_EXIST_DOWNLOADED_CONTENTS -8638 다운로드 되기전에 호출 되는 경우 또는 존재하지 않는 경우 다운로드 된 컨텐츠가 존재하지 않습니다.스트리밍하여 재생하시겠습니까?
ERROR_NOT_EXIST_DOWNLOADED_CONTENTS -8638 다운로드 되기전에 호출 되는 경우 또는 존재하지 않는 경우 다운로드 된 컨텐츠가 존재하지 않습니다.
먼저 다운로드를 받으신 후 컨텐츠를 재생해주시기 바랍니다.
Unknown Error -8639 단말기 타입을 설정값이 유효하지 않습니다. 알 수 없는 오류가 발생했습니다.
ERROR_NOT_VAILD_DEVICE_LEVEL -8640 단말기 래밸을 설정값이 유효하지 않습니다. 알 수 없는 오류가 발생했습니다.
ERROR_DOWNLOADED_EXTRA_BLOCK -8641   알 수 없는 오류가 발생했습니다.
ERROR_INIT_NETWORK_LIBRARY -8642 네트웍 라이브러리 초기화 실패 알 수 없는 오류가 발생했습니다.
ERROR_EXPIRATION_DATE -8643 DRM 다운로드 컨텐츠 재생시 유효기간이 지났을 경우 재생 유효기간(%s)이 지났습니다.
ERROR_EXPIRATION_COUNT -8644 DRM 다운로드 컨텐츠 재생 유효횟수를 모두 소진했을 경우 재생 유효 회수(%d회)를 모두 소진했습니다.
삭제 후 다시 다운로드 해 주세요.
ERROR_REQUEST_CONTENT_URL -8645 다 받지 않은 다운로드 컨텐츠를 index로 컨텐츠를 load 한 경우 다운로드가 완료되지 않은 파일입니다.
컨텐츠 제공 페이지에서 다시 다운로드 시 이어받기가 가능합니다.
ERROR_NOT_VAILD_CONTENTS_INFO -8646 저장된 컨텐츠 관련 정보가 손상되었습니다. 파일 접근에 실패했습니다.
설정에서 저장소 위치를 확인해 주세요.
저장공간이 부족한지 확인해주십시오.
ERROR_CREATE_NO_MEDIA_FILE -8647 .nomedia 파일 생성 실패시 파일 접근에 실패했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_NOT_REMOVE_TYPE -8648 삭제 가능한 컨텐츠 타입이 아닌 경우 삭제가 허용되지 않는 컨텐츠입니다.
ERROR_DECRYPT -8649 kollus 암호화 문자열 복호화 실패시 서버 오류가 발생했습니다.
잠시 후 재시도 해 주세요.
ERROR_NOT_ALLOW_DOWNLOAD -8650 해당 컨텐츠 URL 링크로는 다운로드를 허용하지 않습니다. 다운로드 받으실 수 없는 컨텐츠입니다.
ERROR_EMPTY_COMPANY_AUTH_INFO -8651 DRM 콜백 요청후 응답은 받았지만 수신 데이타가 없는 경우 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_EMPTY_CONTEMT_INFO -8652 비디오 게이트웨이로 Media info 정보 요청후 응답은 받았지만 수신 데이타가 없는 경우 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
잠시 후 재시도 해 주세요.
ERROR_NOT_FOUND_DOMAIN -8653 엣지 서버로 요청시 사용한 URL 도메인이 엣지서버의 응답 정보중 도메인 목록과 일치하는 도메인이 없는 경우 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
잠시 후 재시도 해 주세요.
ERROR_NOT_RECEIVE_DOMAIN -8654 엣지 서버로 도메인 목록 정보를 받지 못한 경우 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
잠시 후 재시도 해 주세요.
ERROR_ABNORMAL_DRM_INFO -8655 "DRM 컨텐츠 다운로드 전에 DRM 콜백 호출(Kind 1)하고 응답 받은 내용의 result 값이 0(에러)인 경우 (고객사에서 지정한 메시지가 노출될 수 있습니다.)" 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_ABNORMAL_DRM_COMPLETE -8656 "DRM 컨텐츠 다운로드 후에 DRM 콜백 호출(Kind 2)하고 응답 받은 내용의 result 값이 0(에러)인 경우(고객사에서 지정한 메시지가 노출될 수 있습니다.)" 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_ABNORMAL_DRM_PLAY -8657 "DRM 컨텐츠 재생전에 DRM 콜백 호출(Kind 3)하고 응답 받은 내용의 result 값이 0(에러)인 경우 (고객사에서 지정한 메시지가 노출될 수 있습니다.)" 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_FORCE_EXPIRED -8658 DRM 콜백 서버로 부터 강제 만료된 컨텐츠를 재생하려고 한 경우 컨텐츠 사용이 제한되었습니다.
ERROR_NOT_RECEIVE_ENC_DATA -8659 엣지 서버로 XHTTP_ENC_DATA 정보를 받지 못한 경우 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_NOT_FOUND_MOBILE_LOGO_FILENAME -8660 비디오 게이트웨이로 Media info 정보를 얻은 항목중에 모바일 로고 url 문자열에서 파일명을 찾지 못함 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
잠시 후 재시도 해 주세요.
ERROR_CANNOT_CALL_API -8661 스토리지 매니저 API를 호출할 수 없습니다.(내부 객체를 종료하는 시점) API를 호출할 수 없습니다.(내부 객체를 종료하는 시점)
ERROR_NOT_FOUND_THUMBNAIL_URL -8662 비디오 게이트웨이로 Media info 정보를 얻은 항목중에 썸내일 url이 없는 경우 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_ALTER_TABLE -8663 DB 테이블 변경에러 DB 오류가 발생했습니다.
설정에서 저장소 위치를 확인해 주세요.
ERROR_DIFFERENT_TIME -8664 기기와 서버간의 시간이 일치하지 않습니다. 시스템시간이 정확하지 않습니다.
시간설정을 확인하세요.
ERROR_EMPTY_POSTER_UPLOAD_FILE_INFO -8665 포스터 파일 업로드 후, 서버로 부터 응답은 받았지만 수신 데이타가 없는 경우 서버 오류가 발생했습니다.
잠시 후 재시도 해 주세요.
ERROR_PARSE_POSTER_UPLOAD_FILE_INFO -8666 포스터 파일 업로드 후, 서버로 부터 응답받은 데이타를 JSON 파싱 실패시 서버 오류가 발생했습니다.
잠시 후 재시도 해 주세요.
ERROR_NOT_FOUND_POSTER_URL -8667 비디오 게이트웨이로 Media info 정보를 얻은 항목중에 poster url을 찾지 못함 업로드할 포스터 url이 없습니다.
ERROR_GET_MEDIA_ID -8668 엣지 서버로 부터 미디어 ID를 얻기 실패 서버 오류가 발생했습니다.
잠시 후 재시도 해 주세요.
ERROR_NOT_FOUND_SUBTITLE_FILENAME -8669 비디오 게이트웨이로  Media info 정보를 얻은 항목중에 자막 url 문자열에서 파일명을 찾지 못함 서버 오류가 발생했습니다.
잠시 후 재시도 해 주세요.
ERROR_EMPTY_PLAY_CALLBACK_INFO -8670 Play 콜백 호출후 응답은 받았지만 수신 데이타가 없는 경우 서버 오류가 발생했습니다.
잠시 후 재시도 해 주세요.
ERROR_DECRYPT_PLAY_CALLBACK_INFO -8671 Play 콜백 호출후 응답받은 데이타를 복호화 실패시 컨텐츠 정보가 정확하지 않습니다.
ERROR_PARSE_PLAY_CALLBACK_INFO -8672 Play 콜백 호출후 응답받은 데이타를 JSON 파싱 실패시 컨텐츠 정보가 정확하지 않습니다.
ERROR_ABNORMAL_PLAY_CALLBACK_INFO -8673 "Play 콜백 호출(Kind 1)하고 응답 받은 내용의 result 값이 0(에러)인 경우 (고객사에서 지정한 메시지가 노출될 수 있습니다.)" 서버 오류가 발생했습니다.
잠시 후 재시도 해 주세요.
ERROR_PLAY_CALLBACK_EXPIRED -8674 Play 콜백 호출(Kind 3)하고 응답 받은 내용의 expire 값이 1인(강제만료) 경우 컨텐츠 사용이 제한되었습니다.
ERROR_ABNORMAL_PLAY_CALLBACK_INFO_PLAY -8675 "Play 콜백 호출(Kind 3)하고 응답 받은 내용의 result 값이 0(에러)인 경우(고객사에서 지정한 메시지가 노출될 수 있습니다.)" 서버 오류가 발생했습니다.
잠시 후 재시도 해 주세요.
ERROR_ABNORMAL_UPLOAD_POSTER_INFO -8676 poster 업로드 후 서버로 응답 받은 내용중 error 값이 ture인 경우 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_GET_CONTENT_TYPE -8677 엣지 서버로 부터 미디어 컨텐츠의 CONTENT-TYPE 정보 얻기 실패 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_GET_CONTENT_LAST_MODIFIED -8678 엣지 서버로 부터 미디어 컨텐츠의 LAST-MODIFIED 정보 얻기 실패 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_ENCRYPT_KEY -8679 DB에 저장하는 데이타를 암호화하는 객체 생성 실패시 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_FORCE_DELETE -8680 DRM 콜백 호출후 응답으로 다운로드한 컨텐츠 삭제하라고 응답받은 경우 사용하실 수 없는 컨텐츠이므로 다운로드된 파일을 삭제합니다.
ERROR_DIFFERENT_EXPIRE_RESET -8681 DRM 콜백 호출후 응답으로 강제 리셋하라고 응답받았으나 호출시 전달할 session_key 값과 응답시 받은 session_key값이 다른 경우 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_NOT_FOUND_DRM_KIND -8682 DRM 콜백 요청시 서버 전달한 항목에 대한 응답 정보를 받지 못한 경우 인증 정보 확인 과정에서 오류가 발생하였습니다.
컨텐츠 제공업체 홈페이지 관리자에게 문의해주세요.
ERROR_EXPIRATION_PLAY_TIME -8683 DRM 다운로드 컨텐츠 재생 유효 재생시간을 모두 소진했을 경우 재생 유효 시간(%s)을 모두 소진했습니다.
삭제 후 다시 다운로드 해 주세요.
ERROR_PLAY_CALLBACK_RESPONSE -8684 Play Callback에서 네트워크 오류가 발생 한 경우(HTTP 200 제외한 오류) 네트워크 상태 불안정으로 서버와의 통신이 정상 연결되지 못했습니다. 네트워크 상태를 확인 후 다시 재생 시도해 주세요.
ERROR_DRM_CALLBACK_RESPONSE -8685 DRM Callback에서 네트워크 오류가 발생 한 경우(HTTP 200 제외한 오류) 네트워크 상태 불안정으로 서버와의 통신이 정상 연결되지 못했습니다. 네트워크 상태를 확인 후 다시 재생 시도해 주세요.
ERROR_PLAY_CALLBACK_EXPIRATION_PLAY_TIME -8686 Play Callback에서 전달받은 재생 유효시간이 만료된 경우(재생 종료 처리) 허용된 재생 시간이 초과되어 재생을 종료합니다.
ERROR_CHECK_EXPIRATION_DATE -8687 DRM 다운로드 컨텐츠 재생 유효 재생시간을 소진하기전 네트워크 연결에서 중간에 체크 확인 재생 유효 시간 체크가 필요합니다.
네트워크 연결하여 재생해주세요.
ERROR_NOT_FOUND_COMMON_INFO -8800 컨텐츠 목록에서 공통 정보를 찾지 못함 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_NOT_FOUND_ITEM_IN_PLAYLIST -8801 컨텐츠 목록에서 해당 항목을 찾지 못한 경우 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_EMPTY_PLAYLIST_INFO -8802 플래이 리스트 요청후 응답은 받았지만 수신 데이타가 없는 경우 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
ERROR_INTRO_CANNOT_DOWNLOAD -8803 인트로 컨텐츠는 다운로드 할 수 없음 인트로 영상은 다운로드 하실 수 없습니다.
ERROR_DUPLICATION_NETWORK_ERR -8804 중복차단 체크시 네트워크 불안전하여 실패 하는 경우 서버와의 통신이 불안정 합니다.
네트워크 상태를 확인 후 다시 재생 시도해 주세요.
INFO_NETWORK_TIMEOUT -8899    
ERROR_VIDEO_GATEWAY_ABNORMAL_RESPONSE -8900 비디오 게이트웨이에 Media info를 요청했을 때 error값이 true인 경우 (정상 재생이 불가한 상황임) 컨텐츠 정보 확인 과정에서 오류가 발생하였습니다.
잠시 후 재시도 해 주세요.

 

DRM Callback 에러 (-9001 ~ )

Type Code Case Descript Message_KO
ERROR_CURLE_COULDNT_RESOLVE_HOST -9006 서버 HOST 리졸빙 실패시 발생 서버에 연결할 수 없습니다.\n네트워크를 확인 후 재시도 해 주세요.
ERROR_CURLE_COULDNT_CONNECT -9007 서버에 연결 실패시 서버에 연결할 수 없습니다.\n네트워크를 확인 후 재시도 해 주세요.
ERROR_CURLE_PARTIAL_FILE -9018 서버에 요청한 사이즈와 응답으로 받은 데이터의 사이즈가 상이한 경우 네트워크 환경이 불안정하여\n데이터 수신에 실패하였습니다.
ERROR_CURLE_OPERATION_TIMEDOUT -9028 서버 연결중에 일정시간 동안 응답이 없는 경우 네트워크 상태 불안정으로 서버와의 통신이 정상 연결되지 못했습니다.\n네트워크 상태를 확인 후 다시 재생 시도해 주세요.
ERROR_CURLE_RECV_ERROR -9056 서버 연결하여 응닫을 받는 도중 실패시 네트워크 상태를 확인하신 후 재시도 해 주세요.
HTTP SEVER ERROR "-94XX , -95XX" 에러코드의 마지막 세자리수는 DRM Callback 서버에서 응답코드로 내려준 코드입니다.  

 

  • 기타 curl 에러

    • -90XX 에러코드의 마지막 두자리수는 Curl Error입니다
    • Curl Error는 아래 URL을 참고하시기 바랍니다
https://curl.haxx.se/libcurl/c/libcurl-errors.html

 

Play Callback 에러 (-10001 ~ )

Type Code Case Descript Message_KO
ERROR_CURLE_COULDNT_RESOLVE_HOST -10006 서버 HOST 리졸빙 실패시 발생 서버에 연결할 수 없습니다.\n네트워크를 확인 후 재시도 해 주세요.
ERROR_CURLE_COULDNT_CONNECT -10007 서버에 연결 실패시 서버에 연결할 수 없습니다.\n네트워크를 확인 후 재시도 해 주세요.
ERROR_CURLE_PARTIAL_FILE -10018 서버에 요청한 사이즈와 응답으로 받은 데이터의 사이즈가 상이한 경우 네트워크 환경이 불안정하여\n데이터 수신에 실패하였습니다.
ERROR_CURLE_OPERATION_TIMEDOUT -10028 서버 연결중에 일정시간 동안 응답이 없는 경우 서버에 연결할 수 없습니다.\n네트워크를 확인 후 재시도 해 주세요.
ERROR_CURLE_RECV_ERROR -10056 서버 연결하여 응닫을 받는 도중 실패시 네트워크 상태를 확인하신 후 재시도 해 주세요.
HTTP SERVER ERROR "-104XX , -105XX" 에러코드의 마지막 세자리수는 Play Callback 서버에서 응답코드로 내려준 코드입니다.  
  • 기타 curl 에러

    • -100XX 에러코드의 마지막 두자리수는 Curl Error입니다
    • Curl Error는 아래 URL을 참고하시기 바랍니다
https://curl.haxx.se/libcurl/c/libcurl-errors.html

 

Suggest Edit