http://m.getsatisfaction.com/products/231611/topics?page=1 Topics for VOS360 - SaaS API 1970-01-01T00:00:00Z 3 2 1 0 0 3 http://m.getsatisfaction.com/topics/7319148 7319148 Getting and Managing OAuth Tokens for Third Party API Integrations 2016-09-27T00:35:50Z 2016-09-27T00:35:50Z Moore http://m.getsatisfaction.com/people/7955269 https://d2r1vs3d9006ap.cloudfront.net/public/uploaded_images/10813313/ScreenShot2016-05-02at2.11.42PM_medium.png moore_macauley <b>In this article we explain how to get and manage OAuth Token from the VOS Developer APIs. These tokens can be use by 3rd party application to integrate advanced functionality like I-Frames from the VOS UI.<br /><br />1. Registering a new Application<br /></b><br />Use VOS Developer REST APIs,and Expand "<i>Client Apps</i>":&nbsp;<br /><br /> <img src="https://d2r1vs3d9006ap.cloudfront.net/s3_images/1489296/12826-1y0tno7_inline.png?1474935640" title="Image https//d2r1vs3d9006apcloudfrontnet/s3_images/1489296/12826-1y0tno7_inlinepng1474935640" /><br /><br /> You will see these calls, click "<i>Post</i>":<br /><br /> <strong><img src="https://d2r1vs3d9006ap.cloudfront.net/s3_images/1489297/8668-1gc7mjo_inline.png?1474935714" title="Image https//d2r1vs3d9006apcloudfrontnet/s3_images/1489297/8668-1gc7mjo_inlinepng1474935714" /></strong><br /><br /> In the expanded area click "<i>ModelSchema</i>" to fill in the "<i>redirect_uri</i>" for your application, and then click "<i>Try it out</i>"<strong>&nbsp;</strong>to perform the action:<strong><br /></strong><br /><br /> <img src="https://d2r1vs3d9006ap.cloudfront.net/s3_images/1489299/8670-1jdvg64_inline.png?1474935889" title="Image https//d2r1vs3d9006apcloudfrontnet/s3_images/1489299/8670-1jdvg64_inlinepng1474935889" /><br /><br /> After successful POST in the response body, you will see (actual values will be different):<br /><br /><br /> <img src="https://d2r1vs3d9006ap.cloudfront.net/s3_images/1489300/8670-1yohbqx_inline.png?1474935957" title="Image https//d2r1vs3d9006apcloudfrontnet/s3_images/1489300/8670-1yohbqx_inlinepng1474935957" /><br /><br /> The fields <strong>client_id</strong>,<strong>&nbsp;client_secret </strong>and<strong> redirect_uri&nbsp;</strong>will be used later for authentication.<br /><br /> Please be sure to save the&nbsp;<strong>client_secret,&nbsp;</strong>because it is not possible to retrieve it later. If you lose it you will need to register a new application, remember to delete your old <b>client_id.</b><br /><br /> Now you have successfully registered new application.<br /><br /> <br /><br /> <strong>2. Obtain Access Token</strong><br /><br /> <ul><li>Open your favorite http-client.</li><li>Insert actual values you received when registering your application and perform <strong>GET </strong>request on</li></ul><blockquote>server_address/oauth/authorize?client_id=client_id_value&amp;response_type=code&amp;redirect_uri=redirect_uri_value<br /></blockquote> <b>For Example</b><br /><br /> <ul><li><b></b>The response should be a URL redirect (response code-302 Found) with the Location header set to:</li></ul><blockquote>Location:localhost:8086/oauth/string?code=f7ZPOY</blockquote><ul><li>You&nbsp;should retrieve <strong>code</strong> query-param, which in our case is <strong>code=</strong><strong>f7ZPOY&nbsp;</strong>Using code parameter, you will perform <strong>POST&nbsp;</strong>request with headers set:</li></ul><blockquote>POSTserver_address/oauth/tokenHTTP/1.1<br />Authorization:Basicbase64encode(client_id:client_secret)<br />Content-Type:application/x-www-form-urlencoded</blockquote><ul><li>Where&nbsp;base64encode is Base64 encoding of&nbsp;<em>client_id:client_secret</em> you can use&nbsp;<a href="https://www.base64encode.org/" rel="nofollow" target="_blank" title="Link https//wwwbase64encodeorg/">online service</a>&nbsp;to encode.&nbsp;In our example it is:</li></ul><blockquote>base64encode(client_id:client_secret)=base64encode(0d3de095-c991-48a1-8111-ad12a81e6b6d:a437cca6e49e367d08a6d6c13a01c0b7)=MGQzZGUwOTUtYzk5MS00OGExLTgxMTEtYWQxMmE4MWU2YjZkOmE0MzdjY2E2ZTQ5ZTM2N2QwOGE2ZDZjMTNhMDFjMGI3</blockquote><ul><li>Fill in the&nbsp;body of POST request using your <strong>code&nbsp;</strong>and <strong>redirect_uri</strong> values:</li></ul><blockquote>code=f7ZPOY&amp;redirect_uri=string&amp;grant_type=authorization_code</blockquote><ul><li>The overall setting should look like this:</li></ul> <img src="https://d2r1vs3d9006ap.cloudfront.net/s3_images/1489620/8666-1t14v2p_inline.png?1474999034" title="Image https//d2r1vs3d9006apcloudfrontnet/s3_images/1489620/8666-1t14v2p_inlinepng1474999034" /><br /><br /><br /> <ul><li>The request should return JASON response:</li></ul><blockquote>"access_token":"a5c46ee5-23c6-4e01-a63a-3c89527fa4c7",<br />"token_type":"bearer",<br />"refresh_token":"b1ff8219-bd46-4754-abf7-6ebe070f5a7a",<br />"expires_in":43199,<br />"scope":"trust"&nbsp;</blockquote><ul><li>Now you can&nbsp;access to protected resources with <strong>access_token</strong>&nbsp;you have just got using&nbsp;HTTPHeader:</li></ul><blockquote>Authorization:Bearer a5c46ee5-23c6-4e01-a63a-3c89527fa4c7</blockquote><span><br />Enjoy...</span> question vos_api vos_api complete 0 1 1 create http://m.getsatisfaction.com/topics/7317121 7317121 Grooming VOS Video Input Source through an I-Frame Window for inclusion in your own application 2016-09-23T18:55:41Z 2016-09-23T18:55:41Z Moore http://m.getsatisfaction.com/people/7955269 https://d2r1vs3d9006ap.cloudfront.net/public/uploaded_images/10813313/ScreenShot2016-05-02at2.11.42PM_medium.png moore_macauley <b>This article describes the requirements and steps to integrate the VOS Input Sources Grooming window (through an I-Frame) to a 3rd party application.<br /><br />1.&nbsp;&nbsp;&nbsp;Introduction</b><br /> The VOS Configuration App provides Grooming User Interface provides an interface&nbsp;for the&nbsp;end user to configure the Video input source for Video/Audio/Data streams to either added metadata or to exclude those streams from processing.&nbsp;For third Party Application integration, this user interface&nbsp;can’t be expose to&nbsp;their&nbsp;users because cross-origin resource sharing is not allowed in browsers by default.<br /><br /> To work around this limitation, Third Party application developers can use a special remote grooming request through an I-Frame Window in the browser to expose the VOS&nbsp;Grooming User Interface to user. This should greatly ease integration as the grooming of the source is one of the most complex tasks a Third Party developer has to undertake. However it requires third party application to use cross-window messaging to safely enable cross-origin communication.&nbsp;<br /><br /> <b>2.&nbsp;&nbsp;&nbsp;Requirements</b><br /><ul><li>Third Party Application developer must implement a&nbsp;Web Application/UI to expose cross-origin grooming user interface through an I-Frame in a browser.</li><li>Java Script will be used by the&nbsp;Third Party Client Application to send and listen to cross-window messaging for the communication between it and VOS Server.</li><li>The Cross-origin grooming request will only be allowed to the&nbsp;following URL by VOS Server through “X-Frame-Option” http response header -&nbsp;<i><a href="https://{vos-server}/groom/source" rel="nofollow" target="_blank" title="Link https//vos-server/groom/source">https://{vos-server}/groom/source</a></i></li><li>The Third Party Application must acquire OAuthAccess Token from VOS Server, and send it to VOS Server through cross-window message for Authentication. This topic is <a href="https://community.vos.tv/harmonicvos/topics/getting-and-managing-oauth-tokens-for-third-party-api-integrations" rel="nofollow" target="_blank">covered in another post</a>.</li><li>The Third Party Application must&nbsp;specify the Video input source in JSON format to be groomed, and send it to VOS Server through a&nbsp;cross-window message.</li></ul>The following is a screen capture of sample integration&nbsp;application to use cross-origin grooming feature of VOS Server.<br /><br /><img src="https://d2r1vs3d9006ap.cloudfront.net/s3_images/1489253/8670-5si6m2_inline.png?1474925906" title="Image https//d2r1vs3d9006apcloudfrontnet/s3_images/1489253/8670-5si6m2_inlinepng1474925906" /><br /><br /><b>3.&nbsp;&nbsp;&nbsp;References</b> &nbsp;The following are reference links for cross-origin x-frameoption and “postMessage” method in browser.<br /><br /> <ul><li><a href="https://tools.ietf.org/html/rfc7034" rel="nofollow" target="_blank" title="Link https//toolsietforg/html/rfc7034">X-Frame-Options (RFC7034</a>)</li><li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options" rel="nofollow" target="_blank" title="Link https//developermozillaorg/en-US/docs/Web/HTTP/Headers/X-Frame-Options">X-Frame-Options -HTTP | MDN</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage" rel="nofollow" target="_blank" title="Link https//developermozillaorg/en-US/docs/Web/API/Window/postMessage">Window postMessage</a><a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage" rel="nofollow" target="_blank" title="Link https//developermozillaorg/en-US/docs/Web/API/Window/postMessage">&nbsp;| MDN</a></li></ul><b>4.&nbsp;&nbsp;&nbsp;Workflow</b> The workflow diagram for cross-origin grooming is as shown in the&nbsp;following digram and further clarified in the detailed steps. For reference the&nbsp;Third Party Application/UI will be displayed in “Main Window” and the&nbsp;VOS Grooming User Interface served by&nbsp;VOS will be displayed in I-Frame “GroomingWindow”.<br /><br /> &nbsp;<img src="https://d2r1vs3d9006ap.cloudfront.net/s3_images/1489255/8670-v790so_inline.png?1474926038" title="Image https//d2r1vs3d9006apcloudfrontnet/s3_images/1489255/8670-v790so_inlinepng1474926038" /><br /><br /> <b>Detailed Steps</b><b>&nbsp;</b><br /><br />&nbsp;&nbsp;1. <a href="https://community.vos.tv/harmonicvos/topics/getting-and-managing-oauth-tokens-for-third-party-api-integrations" rel="nofollow" target="_blank" title="Link https//communityvostv/harmonicvos/topics/getting-and-managing-oauth-tokens-for-third-party-api-integrations">Acquire OAuth Access Token from VOS Server</a><br />&nbsp;&nbsp;2. Get the JSON for the Video Input Section by either:<br />&nbsp; &nbsp;&nbsp; &nbsp;-&nbsp;Getting the&nbsp;existing&nbsp;Video Input Source Data using the&nbsp;VOS API <br /><pre>&nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; <a href="https://{VOS-Server}/vos-api/configure/v1/sources" rel="nofollow" target="_blank" title="Link https//VOS-Server/vos-api/configure/v1/sources">https:&#47;&#47;{VOS-Server}/vos-api/configure/v1/sources</a></pre>&nbsp; &nbsp; &nbsp;&nbsp;-&nbsp;Discover raw Video InputSource through VOS API <br /><pre>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; <a href="https://{VOS-Server}/vos-api/source-monitor/v1/discover" rel="nofollow" target="_blank" title="Link https//VOS-Server/vos-api/source-monitor/v1/discover">https:&#47;&#47;{VOS-Server}/vos-api/source-monitor/v1/discover</a></pre>&nbsp;&nbsp;3. The Third Party UI is displayed in Main Window and the&nbsp;I-Frame Grooming window is hidden.&nbsp;<br />&nbsp;&nbsp;4. The Third Party UI Client builds cross-origin grooming request URL, and sets it as an&nbsp;I-Frame <br />&nbsp; &nbsp;&nbsp; &nbsp;Source URL -&nbsp;<a href="https://{VOS-Server}/groom/source" rel="nofollow" target="_blank" title="Link https//VOS-Server/groom/source">https://{VOS-Server}/groom/source</a><br />&nbsp;&nbsp;5. The Third Party UI Client in main Window and waits for 'GROOM_AUTHENTICATE' message from <br />&nbsp; &nbsp;&nbsp; &nbsp;I-Frame Grooming Window before sending&nbsp;a reply containing the OAuth Access Token.<br />&nbsp;&nbsp;6. The Third Party UI Client in main Window waits for 'GROOM_READY' message from I-Frame <br />&nbsp; &nbsp; &nbsp;&nbsp;Grooming&nbsp;Window and then unhides the&nbsp;I-Frame window, sending back a&nbsp;'GROOM_NEW_INPUT' <br />&nbsp; &nbsp; &nbsp;&nbsp;message with&nbsp;Video Input Source Data.<br />&nbsp;&nbsp;7. The&nbsp;Third Party UI Client in main Window must then&nbsp;listen for the following messages from I-Frame <br />&nbsp; &nbsp; &nbsp; to&nbsp;save or&nbsp;discard the Groomed Input Source, or resize I-Frame Window.<br /><ul><li>'GROOM_ERROR' -&nbsp;Server not able to handle Groom request&nbsp;</li><li>'GROOM_CANCEL_INPUT' -&nbsp;User discards the groom result.</li><li>'GROOM_UPDATE_INPUT' -&nbsp;User accepts the groom result.</li><li>'GROOM_SIZE_CHANGE' -&nbsp;Groom Window size is changed.</li></ul><br /> <b>5. Sample Java Script code to handle cross window messages</b><br /><br /> <b>Java Script to handle Window Message in Angular JS Controller</b><br /><br /> <blockquote>var demoInput = {"id": "ba805030-e630-9e8b-dfd9-2c6d4eb7a0ba",...} //Input Source Data<br />scope.groomReady = false;<br />scope.data = {command:'GROOM_NEW_INPUT', content:demoInput};<br />scope.authentication = {command:'GROOM_AUTHENTICATE', token:scope.accessToken};<br />scope.url = undefined;<br />window.addEventListener('message', function(e) {<br />&nbsp;&nbsp;&nbsp;&nbsp; if (e.data.command == 'GROOM_AUTHENTICATE') {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.url = e.origin;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.eFrame = angular.element($rootElement).find('#iGrooming')[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.eFrame.contentWindow.postMessage(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.authentication,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.url.replace( /([^:]+:\/\/[^\/]+).*/, '$1' )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />&nbsp;&nbsp;&nbsp;&nbsp; }else if (e.data.command == 'GROOM_READY') {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.groomReady = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.url = e.origin;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.eFrame = angular.element($rootElement).find('#iGrooming')[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.inputJSON = JSON.stringify(scope.data.content, undefined, 4);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; else if (e.data.command == 'GROOM_ERROR') {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(e.data.message);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; else if (e.data.command == 'GROOM_CANCEL_INPUT') {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; angular.element(scope.avModal).modal('hide');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VOSLOGGER.log('grooming GROOM_CANCEL_INPUT');<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; else if (e.data.command == 'GROOM_UPDATE_INPUT') {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; angular.copy(e.data.content, scope.data.content);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; angular.element(scope.avModal).modal('hide');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.inputJSON = JSON.stringify(scope.data.content, undefined, 4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VOSLOGGER.log('grooming GROOM_UPDATE_INPUT');<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; else if (e.data.command == 'GROOM_SIZE_CHANGE') {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.eFrame.style.height = e.data.height+'px';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.eFrame.style.width = e.data.width+'px';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VOSLOGGER.log('grooming GROOM_SIZE_CHANGE: width='+e.data.width+',height='+e.data.height);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br /> }, false);<br />...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.groom = {show:false};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.avModal;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.updateInput = function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.data.content = JSON.parse(scope.inputJSON);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.openGroom = function(eid) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (scope.avModal== undefined) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.avModal = angular.element($rootElement).find('#'+eid);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; angular.element(scope.avModal).modal('show');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.groom.show = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; angular.element(scope.avModal).one('hidden.bs.modal', function(event) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.groom.show = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (scope.groomReady == true) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.eFrame.contentWindow.postMessage(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.data,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope.url.replace( /([^:]+:\/\/[^\/]+).*/, '$1' )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</blockquote><b>Test HTML Template Angular JS Controller<br /></b><br /><blockquote><i>&nbsp;&lt;div class="spacer"&gt;<br /></i><i>&nbsp;&nbsp;&nbsp; &lt;div ng-disabled="!groomReady"class="btn btn-primary btn-lg pull-right"ng-click="openGroom('remote-groom')"&gt;Groom&lt;/div&gt;<br /></i><i>&nbsp;&nbsp;&nbsp; &lt;div class="form-grouppull-left"&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;labelclass="form-label-alt"&gt;Remote Server&lt;/label&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text"class="form-control input-sm" ng-model="host"style="width:400px;"&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;labelclass="form-label-alt"&gt;OAuth Token&lt;/label&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text"class="form-control input-sm" ng-model="accessToken"style="width:300px;"&gt;<br /></i><i>&nbsp;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br clear="all"&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;button class="btn btn-defaultbtn-sm" ng-click="applyToken()"&gt;Connect&lt;/button&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br /></i><i>&nbsp;<br /> </i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br clear="all"&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;labelclass="form-label-alt"&gt;Input&lt;/label&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;textareang-model="inputJSON" style="width: 800px; height: 400px"rows="20" ng-change="updateInput()"&gt;&lt;/textarea&gt;<br /></i><i>&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br /></i><i>&nbsp;<br /></i><i>&nbsp;&nbsp;&nbsp; &lt;div class="modal fade"id="remote-groom" tabindex="-1" role="dialog"aria-labelledby="groom" aria-hidden="true"data-backdrop="static" data-keyboard="false"&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;divclass="modal-dialog"&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;iframe ng-if="IfUrl"id="iGrooming" ng-src="{{IfUrl}}" scrolling="no"height="650" width="600"frameBorder="0"&gt;&lt;/iframe&gt;<br /></i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br /></i><i>&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br /></i><i>&lt;/div&gt;&nbsp; </i></blockquote><br /><b><br />Enjoy grooming....<br /><br /></b><pre></pre> idea vos_api vos_api complete 0 2 3 create vos_api http://m.getsatisfaction.com/topics/7052604 7052604 Playback TimeShift TV with VOS 360 2016-07-14T16:07:59Z 2016-07-14T16:07:59Z Ofer Aharon http://m.getsatisfaction.com/people/7935802 https://d2r1vs3d9006ap.cloudfront.net/public/uploaded_images/10943551/99489_medium.png ofer_aharon <b>Time-shift</b><br />There are two main types of time-shift TV&nbsp;applications:<br />Start-over: A presentation of an on-going live event from a specified start time.<br />Catch-up: A presentation of a past live event in a specified period of time shortly after it has been finished within a retention period.<br /><br /><b><u>Start-over</u></b><br />The playback URL has two parameters:<br /><ul><li><i>serviceId</i>: Service Id of the channel.</li><li><i>startTime</i>: Start time of the start-over, which is an unsigned 64 bit integer representing the number of 100-nanosecond intervals elapsed since the Unix Epoch in UTC.</li></ul><br />IMPORTANT:&nbsp;<br /><ul><li>Start Time &lt; Current Time</li></ul><img src="https://d2r1vs3d9006ap.cloudfront.net/s3_images/1449478/18037-1tge29x_inline.png?1468513230" title="Image https//d2r1vs3d9006apcloudfrontnet/s3_images/1449478/18037-1tge29x_inlinepng1468513230" /><br /><br /><br /><b><u>Catch-up</u></b><br />The playback URL has three parameters:<br /><ul><li><i>serviceId</i>: Service Id of the channel.</li><li><i>startTime</i>: Start time of the catch-up, which is an unsigned 64 bit integer representing the number of 100-nanosecond intervals elapsed since the Unix Epoch in UTC.</li><li><i>endTime</i>: End time of the catch-up, which is an unsigned 64 bit integer representing the number of 100-nanosecond intervals elapsed since the Unix Epoch in UTC.</li></ul>IMPORTANT:<br /><ul><li>Start Time &lt; Current Time</li><li>Start Time &lt; End Time</li><li>End Time &lt; Current Time - 2 minutes</li><li>End Time &gt; Current Time - Retention</li><li>End Time - Start Time &lt; 12 hours</li></ul><img src="https://d2r1vs3d9006ap.cloudfront.net/s3_images/1449479/18037-1lnq6l1_inline.png?1468513257" title="Image https//d2r1vs3d9006apcloudfrontnet/s3_images/1449479/18037-1lnq6l1_inlinepng1468513257" /><br /><br /><br />More information can be found in&nbsp;VOS 360 REST API Documentation (Access from our VOS Hab @ vos.tv) question 0 2 1 create