그리드 PC Stream 개발자 페이지

1. 개요

컨텐츠를 그리드 스트리밍을 통해서 바로보는 서비스. 

2. 플레이어 동작방식

  1. 홈페이지(고객사)
    • iplayer.js 를 웹페이지에 include 한 후, startIPlayer() 호출
    • startIPlayer() 콜백에 따른 처리
    •  
  2. Player(사용자 PC)
    • 그리드 플레이어 및 필터링(XXX_Filter.exe) 프로그램 설치
    • 필터링(XXX_Filter.exe) 프로그램은 플레이어에 동반 설치됩니다.
    • 플레이어 및 필터링 프로그램은 아이콕스에서 제공합니다.
    •  
  3. Server(고객사)
    • 웹하드 고객사에서 작성하는 스크립트입니다. (getplaylist.php, setfilterdata.php, setplay.php)
    • getplaylist.php : 플레이 리스트 정보를 json으로 가져와서 플레이어 합니다. (플레이어 좌측에 컨텐츠 이름이 표시됩니다.)
    • setfilterdata.php : 필터링된 정보를 json으로 전송하고, 결과값에 따라서 플레이 됩니다.
    • setplay.php : 플레이 결과값을 json으로 전송합니다.
    •  
  4. 스토리지 Server(고객사)
    • 웹하드 고객사의 스토리지 서버에 실행하는 그리드 서버 프로그램입니다.
    • 각각 OS에 맞게 설치 및 실행하여 주십시오.
    • PC 그리드 개발자 페이지의 파일 서버 모듈 - mserver 을 참조하세요.
    •  

3. 세부설명

플레이어 동작방식 그림의 번호에 따라 설명합니다.

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 참조하세요.

 

DEMO

  1. 데모 사이트

메뉴얼 링크

PC 다운로드 메뉴얼

PC 스트리밍 메뉴얼

모바일 다운로드 메뉴얼

모바일 스트리밍 메뉴얼

Mac 다운로드 어플리케이션 메뉴얼

 

다운로드

  1. php, iplayer.js 파일
  2. iplayer setup 파일