컨텐츠를 그리드 스트리밍을 통해서 바로보는 서비스.
1-1. startIPlayer() 에서 다음과 같이 json를 작성하여, base64로 변환하여 파라메터를 전달한다
A. 컨텐츠 구매정보 json (샘플)
{
"site":"icoxs", //사이트이름 (아이콕스에서 지정된 이름을 사용해야합니다.)
"userid":"user_test_id", //사용자의 아이디
"bbsindex":"76193522", // 게시물 번호
"purchase_index":1115113924, // 구매번호
"url":"https://www.icoxs.co.kr/API/player/", //getplaylist.php, setfilterdata.php, setplay.php 을 호출하는 URL
"install":"https://www.icoxs.co.kr/setup/IcoxsPlayer_setup_1.2.9.7.exe", //플레이어 셋업 프로그램 URL
"version":"1.2.9.7", // 플레이어 버전
"param1":"", // getplaylist.php 호출시 파라메터 정보 (optional)
"param2":"", // getplaylist.php 호출시 파라메터 정보 (optional)
"param3":"", // getplaylist.php 호출시 파라메터 정보 (optional)
"web1":"", // 플레이어 프로그램의 우측의 호출 URL (optional)
"web2":"", // 플레이어 프로그램의 우측의 호출 URL (optional)
"web3":"" // 플레이어 프로그램의 우측의 호출 URL (optional)
"tab1":"%EA%B5%AC%EB%A7%A4%EC%9E%90%EB%A3%8C", // 플레이어 프로그램의 우측의 텝1 이름 (URL Encode 해야함)(optional)
"tab2":"%EC%B5%9C%EC%8B%A0%EC%9E%90%EB%A3%8C", // 플레이어 프로그램의 우측의 텝2 이름 (URL Encode 해야함)(optional)
"tab3":"%EC%8B%A4%EC%8B%9C%EA%B0%84", // 플레이어 프로그램의 우측의 텝3 이름 (URL Encode 해야함)(optional)
"force_update": true, // 버전이 다를 경우, 업데이트 버튼만 보여주고, 업데이트 합니다. false 일 경우, 다음에하기 버튼과 함께 보여고, 사용자가 선택하게 해줍니다.
"part_update_version": "", // ./Filter 폴더안에 ver.ini 파일의 내용과 다르면 ./Filter 폴더에 있는 파일만 업데이트 합니다. (부분 업데이트), 값이 없을경우 업데이트 하지 않습니다.
"part_update_url":"https://demo2.icoxs.co.kr/pc/Filter.zip", // ./Filter 폴더에 있는 파일을 압축하여, 서버에 업로드 해 줍니다.
// 1.3.9.19 버전 이후
"part_hash": "3c99fc6b70bbccfe2a91287344d611c6_60596368", // Part 업데이트시 셋업파일의 해시 및 사이즈, 보안상 해시값이 다를경우 업데이트가 되지 않습니다.
"set_hash": "3c99fc6b70bbccfe2a91287344d611c6_60596368", // 업데이트시 셋업파일의 해시 및 사이즈, 보안상 해시값이 다를경우 업데이트가 되지 않습니다.
}
.
.
.
startIPlayer(
btoa(json), // 상단 A의 구매정보 json를 base64로 인코딩합니다.
cb_succ, // 플레이어 호출이 성공 했을때의 콜백함수
cb_fail, // 플레이어 호출이 실패 했을때의 콜백함수
[] // 성공 또는 실패시에 콜백할수를 호출할때 파라메터로 전달하는 객체 (사용자가 임의 사용하세요)
);
1-2. startIPlayer() 호출후에 플레이어가 설치되어 있지 않으면, json의 "install" URL에서 다운로드 받아, 사용자가 설치하게 합니다.
2-1. 플레이어는 startIPlayer()의 파라메터를 받아서, getplaylist.php를 POST 호출합니다.
site=kdisk
userid=user_test_id
bbs_index=76193522
purchase_index=1115113924
param1=
param2=
param3=
2-2. getplaylist.php 리턴값 예제
{
"site":"kdisk",
"error_code":"0",
"bbs_title":"Q2FyaWJiZWFuLTA5MjMyMS0wMDE=", // base64로 인코딩
"bbsindex":"76193522",
"purchase_index":"1115113924",
"filelist" :
[
{
"title":"Q2FyaWJiZWFuLTA5MjMyMS0wMDE=", // base64로 인코딩
"video":
{
"index":"148284595",
"url":"mdownload.xxx.co.kr:5588/10d3f7904dd8ac04a74a0999feb29cdc_1954084005?st=gqJWVeujPJGCzu6ZrW7uqQ&e=1632369521", // 그리드 스토리지 서버아이피:포트 (mserver)
"hash":"10d3f7904dd8ac04a74a0999feb29cdc",
"filesize":"1954084005",
"filter_hash":"7f3e1fb55c7e1b7ac6d0355b28fb2b101954084005", //db에 저장된 필터링 값 (filterHash)
"filter_1hash":"dcecf44647a2a37045fdd6679098426e", //db에 저장된 필터링 값 (1M Hash)
"filter_rehash":"7f3e1fb55c7e1b7ac6d0355b28fb2b10", //db에 저장된 필터링 값 (10M Hash)
"filter_key":"xxxxxxxxxx", //db에 저장된 필터링 값 (filteringKey, 재다운로드)
"filter_db_cash":"", //db에 저장된 필터링 값
"filter_db_status":"", //db에 저장된 필터링 값
"flag":"0",
"filter_info":"" //Optional
},
"caption":
{
"index": "20003",
"url":"http://111:222@183.111.69.152:5588/e3f20ec8060f3f1f5b98718b2df6f37b_2208143958?params",
"hash": "b08726c82117eb124a21bf54f4ac290e_202243_1509425836",
"filesize":"202243"
},
},
{
"title":"Q2FyaWJiZWFuLTA5MjMyMS0wMDE=", // base64로 인코딩
"video":
{
"index":"148284595",
"url":"mdownload.xxx.co.kr:5588/10d3f7904dd8ac04a74a0999feb29cdc_1954084005?st=gqJWVeujPJGCzu6ZrW7uqQ&e=1632369521",// 그리드 스토리지 서버아이피:포트 (mserver)
"hash":"10d3f7904dd8ac04a74a0999feb29cdc",
"filesize":"1954084005",
"filter_hash":"7f3e1fb55c7e1b7ac6d0355b28fb2b101954084005", //db에 저장된 필터링 값 (filterHash)
"filter_1hash":"dcecf44647a2a37045fdd6679098426e", //db에 저장된 필터링 값 (1M Hash)
"filter_rehash":"7f3e1fb55c7e1b7ac6d0355b28fb2b10", //db에 저장된 필터링 값 (10M Hash)
"filter_key":"xxxxxxxxxx", //db에 저장된 필터링 값 (filteringKey, 재다운로드)
"filter_db_cash":"",
"filter_db_status":"",
"flag":"0",
"filter_info":""
},
"caption":
{
"index": "20003",
"url":"http://111:222@183.111.69.152:5588/e3f20ec8060f3f1f5b98718b2df6f37b_2208143958?params",
"hash": "b08726c82117eb124a21bf54f4ac290e_202243_1509425836",
"filesize":"202243"
},
}
]
}
3-1. setfilterdata.php 호출
플레이어의 필터링 결과값을 setfilterdata.php를 다음과 같이 json값을 넣어 POST 방식으로 호출합니다.
setfilterdata.php 소스에서 filterdata의 값을 json은 $post_data = urldecode( file_get_contents("php://input") ); 를 사용하세요.
$post_data = urldecode( file_get_contents("php://input") );
// $post_data 값은 아래와 같습니다
// (예제1) 버킷 필터링인 경우
{
"bbs_index":"76193522",
"file_index":"148284595",
"purch_index":"1115113924",
"title":"Caribbean-092321-001",
"hash1m":"dcecf44647a2a37045fdd6679098426e",
"re_value":"0",
"video_count":"1",
"sfilter_hash":"7f3e1fb55c7e1b7ac6d0355b28fb2b101954084005",
"user_id":"test_userid",
"filehash":"10d3f7904dd8ac04a74a0999feb29cdc",
"video":[
{
"rmi_return_code":"14",
"rmi_mreturn_code":"14",
"content_id":"",
"title":"",
"seq":"",
"price":"",
"mprice":"",
"site_ratio":"",
"ch_id":"",
"ch_name":"",
"ch_content_id":"",
"kfpa_content_id":"",
"kfpa_log_seq":"",
"release_date":"",
"category":"",
"genre":"",
"rating":"",
"country":"",
"filtering_key":"7f3e1fb55c7e1b7ac6d0355b28fb2b10202109230958420060",
"smartblock_key":"dcecf44647a2a37045fdd6679098426e"
}
],
// 바른기술
"kocsc_return": "0" // 0: 일반파일, 음수: 오류, 그외: 불발촬영물
}
// (예제2) 뮤레카 필터링인 경우 ( SPSoft )
{
"bbs_index":"2629050",
"file_index":"5596416",
"purch_index":"2511",
"user_id":"test01",
"filename":"",
"hash1m":"e03d757d9364abadb8be0fa58355d909",
"return":"0",
"video_count":"1",
"cmc_hash":"536204dd688a3c8603e9827d912299fa24504065997",
"trans_key":"0",
"video":[
{
"nFileGubun":"2",
"filename":"",
"cmc_hash":"536204dd688a3c8603e9827d912299fa24504065997",
"m1_hash":"",
"nResultCode":"0",
"video_status":"01",
"video_id":"1048099",
"video_title":"삼진그룹 영어토익반",
"video_jejak_year":"2020",
"video_right_name":"iMBC",
"video_right_content_id":"iMBC_06001390001",
"video_grade":"12",
"video_price":"3500",
"video_priceDn":"0",
"video_priceSt":"1400",
"video_cha":"1",
"video_osp_jibun":"30",
"video_osp_etc":"",
"video_onair_date":"20201021",
"video_right_id":"103866",
"video_kfpa_seq_no":"",
"video_kfpa_content_id":"",
"filtering_key":"XRN5B0923134018"
}
],
"ivms_return":"0", //IVMSDownload() 함수의 리턴값
"ivms_rtn_code":"0", //S_IVMS_RESULT 구조체의 nRtnCode 값
"ivms_detection_code":"2", //S_IVMS_RESULT 구조체의 nDetectionCode 값
"ivms_key":"52657136", //S_IVMS_RESULT 구조체의 IVMSKey 값
"ivms_log":"2023-04-04,18:48:28,PC_DN,,ca90b675b2206b463fc8b4653d756297,2023-04-04,18:48:28,none,,68U0JZIFIL2F0404184828", //S_IVMS_RESULT 구조체의 IVMS_Log 값
"ivms_filename":"", //S_IVMS_RESULT 구조체의 IVMS filename값
"ivms_cmc_hash":"6C51E8B7C647529220FC659551CF3D852269279491", //S_IVMS_RESULT 구조체의 IVMS filename값
"ivms_m1_hash":"", //S_IVMS_RESULT 구조체의 IVMS m1_hash 값
"ivms_m10_hash":"" //S_IVMS_RESULT 구조체의 IVMS m10_hash 값
}
// (예제3) Copysift 필터링인 경우 ( ENGWorks )
{
"bbs_index":"107006788",
"file_index":"184635601",
"purch_index":"3113412892",
"user_id":"test_userid",
"p1mHash":"cf21c6a4e02bc29154e5ca4cabac76fa",
"pFilename":"",
"llFileSize":"2619715829",
"iNumOfFiles":"1",
"iTotalPrice":"0",
"pFilteringKey":"20240904160951-b89d2be2a9848b31da2cc12cac6735af2619715829-15615",
"pBcLog":"2024-09-04,16:09:51,b89d2be2a9848b31da2cc12cac6735af,2024-09-04,16:09:51,none",
"llLogId":"869340035431679",
"video":[
{
"pFileHash":"b89d2be2a9848b31da2cc12cac6735af",
"p1mHash":"cf21c6a4e02bc29154e5ca4cabac76fa",
"pFilename":"",
"iKind":0,
"llFileSize":2619715829,
"iResult":14,
"iCpKey":0,
"pCpName":"",
"pCpContentId":"",
"pTitle":"",
"pEpisode":"",
"pOpenDate":"",
"iGrade":0,
"iSellPrice":0,
"iMobilePrice":0,
"dwID":0,
"iReserved":0
}
]
}
3-2. setfilterdata.php 리턴
리턴된 값에 따라서 처리합니다.
error_code 값이 0이면 정상처리
error_code 값이 0 아니면 플레이어 화면에 json의 error_msg 값을 화면에 표시되며, 플레이를 중지합니다.
필터링에 의한 조치 메시지(error_msg) 및 에러코드(error_code)는 고객사에서 정의하여 사용하시면 됩니다.
아래 예제1,2,3 번과 같이 처리하여 리턴하시면 됩니다.
//(예제1) 정상처리
{"site":"kdisk","error_code":"0", "error_msg":""}
//(예제2) 필터링에 의한 플레이 제한 조치
{"site":"kdisk","error_code":"-1", "error_msg":"유해 차단 컨텐츠입니다. 재생할 수 없습니다."}
//(예제3) 필터링에 의한 플레이 제한 조치
{"site":"kdisk","error_code":"-2", "error_msg":"저작권 보호 컨텐츠입니다. 재생할 수 없습니다."}
4. setplay.php 호출
플레이 결과값을 setplay.php를 다음과 같이 json값을 넣어 POST 방식으로 호출합니다. (참조용으로 사용하세요)
$post_data = urldecode( file_get_contents("php://input") );
// $post_data 값은 아래와 같습니다
//error_code값이 2이면 정상 재생입니다.
{
"error_code":"2","site":"kdisk","userid":"test_userid","bbsindex":"76193522",
"purchase_index":"1115113924","file_index":"148284595",
"loadtime":"2453"
}
(옵션) Slider Next Video
동영상이 종료되기 직전에 슬라이더 이미지 표시하고, 바로 구매 할 수 있다.
getplaylist.php에서 다음과 같이 next_video json을 추가한다.
//아래 예제는 getplaylist.php 리턴 json 입니다.
{
"site":"icoxs",
"userid":"test_userid",
"error_code":"0",
"bbsindex":"10001",
"purchase_index":"55121511",
"filelist":[
{
"title":"67Cx7KKF7JuQ7J2YIOqzqOuqqeyLneuLuS4=",
"video":{
"index":"20001",
"url":"111:222@183.111.69.153:5588\/89358b54d383d81f917bea37c014d981_1827449114",
"hash":"89358b54d383d81f917bea37c014d981",
"filesize":"1827449114",
"filter_hash":"",
"filter_1hash":"",
"filter_rehash":"",
"flag":"0"
},
"caption":{
"index": "20003",
"url":"http://111:222@183.111.69.152:5588/e3f20ec8060f3f1f5b98718b2df6f37b_2208143958?params",
"hash": "b08726c82117eb124a21bf54f4ac290e_202243_1509425836",
"filesize":"202243"
},
"next_video":{ //<=== 추가
"url":"https:\/\/demo2.icoxs.co.kr\/next_slider1.html", <== 다음 동영상의 이미지 및 스크립트를 작업한다.
"show_last_time":"120", <== 동영상이 끝나기전에 시간, 초 단위
"show_duration":"100" <== 보이는 시간, 초 단위
}
}
]
}
// 스크립트는 https://demo2.icoxs.co.kr/next_slider1.html 참조하세요.