diff --git a/app/app.js b/app/app.js index b519f74..5d76535 100644 --- a/app/app.js +++ b/app/app.js @@ -6,6 +6,7 @@ angular.module('settings', []); angular.module('schemaorg', [ 'ui.materialize', 'angular.filter', + 'videosharing-embed', 'rzModule', 'search', 'settings'], diff --git a/app/components/search/cse-data.factory.js b/app/components/search/cse-data.factory.js index 139f719..2523dc6 100644 --- a/app/components/search/cse-data.factory.js +++ b/app/components/search/cse-data.factory.js @@ -126,6 +126,8 @@ function(schemaorgVocab) { return refineUrlData(value); } else if (type === "url+image") { return refineImageUrlData(value); + } else if (type === "url+video") { + return refineVideoUrlData(value); } else if (type === "enum") { return refineEnumData(value); } @@ -162,12 +164,23 @@ function(schemaorgVocab) { return component.url; } - function refineImageUrlData(url, accepted=["jpg", "jpeg", "png", "gif", "bmp"]) { + function refineImageUrlData(url, supported=["jpg", "jpeg", "png", "gif", "bmp"]) { url = refineUrlData(url); var component = parseUrl(url); var ext = getFileExtension(component.pathname); - if (!include(accepted, ext)) { - throw new UnsupportedImageException(ext, accepted); + if (!include(supported, ext)) { + throw new UnsupportedImageException(ext, supported); + } + return component.protocol + "//" + component.host + component.pathname; + } + + function refineVideoUrlData(url, supported=["www.youtube.com", "www.dailymotion.com", + "vimeo.com"]) { + url = refineUrlData(url); + var component = parseUrl(url); + var hostname = component.hostname; + if (!include(supported, hostname)) { + throw new UnsupportedVieoProviderException(hostname, supported); } return component.protocol + "//" + component.host + component.pathname; } @@ -250,9 +263,14 @@ function(schemaorgVocab) { return (arr.indexOf(value) != -1); } - function UnsupportedImageException(ext, accepted) { + function UnsupportedImageException(ext, supported) { this.name = "UnsupportedImageException"; - this.message = "Image extension '" + ext + "' is not supported, only [" + accepted + "]"; + this.message = "Image extension '" + ext + "' is not supported, only [" + supported + "]"; + } + + function UnsupportedVieoProviderException(provider, supported) { + this.name = "UnsupportedVieoProviderException"; + this.message = "Video provider '" + provider + "' is not supported, only [" + supported + "]"; } var isServiceFor = function(rawData) { diff --git a/app/components/search/vocab.constant.js b/app/components/search/vocab.constant.js index 5b3a6d4..359b593 100644 --- a/app/components/search/vocab.constant.js +++ b/app/components/search/vocab.constant.js @@ -291,6 +291,124 @@ angular.module('search') } ] }, + 'movie': { + 'name': 'movie', + 'label': 'Movie', + 'canonicalUrl': 'http://schema.org/Movie', + 'properties': [ + { 'name': 'name', + 'label': 'Name', + 'type': 'text', + 'canonicalUrl': 'http://schema.org/name', + 'discoverable': false + }, + { 'name': 'description', + 'label': 'Description', + 'type': 'text', + 'canonicalUrl': 'http://schema.org/description', + 'discoverable': false + }, + { 'name': 'contentrating', + 'label': 'Movie Rating', + 'type': 'enum', + 'canonicalUrl': 'http://schema.org/contentRating', + 'discoverable': true + }, + { 'name': 'duration', + 'label': 'Movie Duration', + 'type': 'duration', + 'unit': 'minute', + 'canonicalUrl': 'http://schema.org/duration', + 'discoverable': true + }, + { 'name': 'genre', + 'label': 'Movie Genre', + 'type': 'enum', + 'canonicalUrl': 'http://schema.org/genre', + 'discoverable': true + }, + { 'name': 'datepublished', + 'label': 'Release Date', + 'type': 'date', + 'canonicalUrl': 'http://schema.org/datePublished', + 'discoverable': false + }, + { 'name': 'trailer', + 'label': 'Movie Trailer', + 'type': 'url+video', + 'canonicalUrl': 'http://schema.org/trailer', + 'discoverable': false + } + ] + }, + 'videoobject': { + 'name': 'videoobject', + 'label': 'Video', + 'canonicalUrl': 'http://schema.org/VideoObject', + 'properties': [ + { 'name': 'name', + 'label': 'Name', + 'type': 'text', + 'canonicalUrl': 'http://schema.org/name', + 'discoverable': false + }, + { 'name': 'description', + 'label': 'Description', + 'type': 'text', + 'canonicalUrl': 'http://schema.org/description', + 'discoverable': false + }, + { 'name': 'datepublished', + 'label': 'Publication Date', + 'type': 'date', + 'canonicalUrl': 'http://schema.org/datePublished', + 'discoverable': true + }, + { 'name': 'duration', + 'label': 'Duration', + 'type': 'duration', + 'unit': 'minute', + 'canonicalUrl': 'http://schema.org/duration', + 'discoverable': true + }, + { 'name': 'isfamilyfriendly', + 'label': 'Family Friendly?', + 'type': 'boolean', + 'canonicalUrl': 'http://schema.org/isFamilyFriendly', + 'discoverable': true + }, + { 'name': 'genre', + 'label': 'Video Genre', + 'type': 'enum', + 'canonicalUrl': 'http://schema.org/genre', + 'discoverable': true + }, + { 'name': 'embedurl', + 'label': 'Video URL', + 'type': 'url+video', + 'canonicalUrl': 'http://schema.org/embedUrl', + 'discoverable': false + }, + { 'name': 'interactioncount', + 'label': 'Total Viewer', + 'type': 'numeric', + 'canonicalUrl': 'http://schema.org/interactionCount', + 'discoverable': false + }, + { 'name': 'interactionstatistic', + 'label': 'Total Viewer', + 'type': 'numeric', + 'canonicalUrl': 'http://schema.org/interactionStatistic', + 'discoverable': false + }, + { 'name': 'uploaddate', + 'label': 'Upload Date', + 'type': 'date', + 'canonicalUrl': 'http://schema.org/uploadDate', + 'discoverable': false + } + ] + }, 'dataset': { 'name': 'dataset', 'label': 'Dataset', diff --git a/assets/css/refinry.css b/assets/css/refinry.css index ca4ab4e..80f110c 100644 --- a/assets/css/refinry.css +++ b/assets/css/refinry.css @@ -189,6 +189,11 @@ input[type="submit"] { transform-origin: center; } +iframe { + width: 100%; + margin-top: 5px; +} + /* Materializecss Overrides */ ::-webkit-input-placeholder { /* WebKit, Blink, Edge */ color: #F0F0F0; diff --git a/assets/libs/ng-videosharing-embed.min.js b/assets/libs/ng-videosharing-embed.min.js new file mode 100644 index 0000000..e4cb41f --- /dev/null +++ b/assets/libs/ng-videosharing-embed.min.js @@ -0,0 +1,2 @@ +/*! ng-videosharing-embed - v0.3.8 - Embed videos using AngularJS directives - built 2017-04-04 - License MIT (http://www.opensource.org/licenses/MIT) */ +angular.module("videosharing-embed",[]),angular.module("videosharing-embed").service("PlayerConfig",function(){"use strict";this.createInstance=function(a){var b=function(a){this.type=a.type,this.playerRegExp=a.playerRegExp,this.timeRegExp=a.timeRegExp,this.whitelist=a.whitelist,this.playerID=a.playerID,this.settings=a.settings,this.transformAttrMap=a.transformAttrMap,this.processSettings=a.processSettings,this.isPlayerFromURL=function(a){return null!=a.match(this.playerRegExp)},this.buildSrcURL=a.buildSrcURL,this.isAdditionaResRequired=a.isAdditionaResRequired,this.additionalRes=a.additionalRes};return new b(a)}}),angular.module("videosharing-embed").factory("RegisteredPlayers",["PlayerConfig","$filter","$window",function(a,b,c){"use strict";var d={youtube:{type:"youtube",settings:{autoplay:0,controls:1,loop:0},whitelist:["autohide","cc_load_policy","color","disablekb","enablejsapi","autoplay","controls","loop","playlist","rel","wmode","start","showinfo","end","fs","hl","iv_load_policy","list","listType","modestbranding","origin","playerapiid","playsinline","theme"],transformAttrMap:{},processSettings:function(a,b){return 1==a.loop&&void 0==a.playlist&&(a.playlist=b),a},buildSrcURL:function(a,c){return a+this.playerID+c+b("videoSettings")(this.processSettings(this.settings))},playerID:"www.youtube.com/embed/",playerRegExp:/([a-z\:\/]*\/\/)(?:www\.)?(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/,timeRegExp:/t=(([0-9]+)h)?(([0-9]{1,2})m)?(([0-9]+)s?)?/,isAdditionaResRequired:function(){return!1},additionalRes:[]},vimeo:{type:"vimeo",settings:{autoplay:0,loop:0,api:0,player_id:""},whitelist:["autoplay","autopause","badge","byline","color","portrait","loop","api","playerId","title"],transformAttrMap:{playerId:"player_id"},processSettings:function(a,b){return a},buildSrcURL:function(a,c){return a+this.playerID+c+b("videoSettings")(this.processSettings(this.settings))},playerID:"player.vimeo.com/video/",playerRegExp:/([a-z\:\/]*\/\/)(?:www\.)?vimeo\.com\/(?:channels\/[A-Za-z0-9]+\/)?([A-Za-z0-9]+)/,timeRegExp:"",isAdditionaResRequired:function(){return!1},additionalRes:[]},dailymotion:{type:"dailymotion",settings:{autoPlay:0,logo:0},whitelist:["api","autoplay","background","chromeless","controls","foreground","highlight","html","id","info","logo","network","quality","related","startscreen","webkit-playsinline","syndication"],transformAttrMap:{},processSettings:function(a,b){return a},buildSrcURL:function(a,c){return a+this.playerID+c+b("videoSettings")(this.processSettings(this.settings))},playerID:"www.dailymotion.com/embed/video/",playerRegExp:/([a-z\:\/]*\/\/)(?:www\.)?www\.dailymotion\.com\/video\/([A-Za-z0-9]+)/,timeRegExp:/start=([0-9]+)/,isAdditionaResRequired:function(){return!1},additionalRes:[]},youku:{type:"youku",settings:{},whitelist:[],transformAttrMap:{},processSettings:function(a,b){return a},buildSrcURL:function(a,c){return a+this.playerID+c+b("videoSettings")(this.processSettings(this.settings))},playerID:"player.youku.com/embed/",playerRegExp:/([a-z\:\/]*\/\/)(?:www\.)?youku\.com\/v_show\/id_([A-Za-z0-9]+).html/,timeRegExp:"",isAdditionaResRequired:function(){return!1},additionalRes:[]},vine:{type:"vine",settings:{audio:0,start:0,type:"simple"},whitelist:["audio","start","type"],transformAttrMap:{},processSettings:function(a,b){return a},buildSrcURL:function(a,c){var d=this.settings.type;return a+this.playerID+c+/embed/+d+b("videoSettings")(this.processSettings(this.settings))},playerID:"vine.co/v/",playerRegExp:/([a-z\:\/]*\/\/)(?:www\.)?vine\.co\/v\/([A-Za-z0-9]+)/,timeRegExp:"",isAdditionaResRequired:function(){return!c.VINE_EMBEDS},additionalRes:[{id:"ng-video-embed-vine-res-1",element:''}]}},e=[];return angular.forEach(d,function(b){e.push(a.createInstance(b))}),e}]),angular.module("videosharing-embed").filter("whitelist",function(){"use strict";return function(a,b){var c={};return angular.forEach(a,function(a,d){b.indexOf(d)!=-1&&(c[d]=a)}),c}}),angular.module("videosharing-embed").filter("videoSettings",function(){"use strict";return function(a){var b=[];return angular.forEach(a,function(a,c){b.push([c,a].join("="))}),b.length>0?"?"+b.join("&"):""}}),angular.module("videosharing-embed").directive("embedVideo",["$filter","RegisteredPlayers","$sce","$window",function(a,b,c,d){"use strict";return{restrict:"E",template:'',scope:{allowfullscreen:"@",height:"@",width:"@",onChange:"&"},link:function(e,f,g){var h=f.find("iframe"),i=void 0,j=angular.isString(g.forceProtocol)?g.forceProtocol+"://":void 0;e.allowfullscreen=void 0===e.allowfullscreen||"true"===e.allowfullscreen,e.allowfullscreen?h.attr("allowfullscreen",""):h.removeAttr("allowfullscreen"),g.$observe("width",function(a){e.width=a}),g.$observe("height",function(a){e.height=a}),g.$observe("iframeId",function(a){return a?void h.attr("id",a):void h.removeAttr("id")}),g.$observe("href",function(f){if(void 0!==f&&f!==i){i=f;var h=null;if(angular.forEach(b,function(a){a.isPlayerFromURL(f)&&(h=a)}),null===h)return void e.onChange();var k=f.match(h.playerRegExp);j=j||k[1];var l=k[2],m=f.match(h.timeRegExp);h.config;if(angular.forEach(a("whitelist")(g,h.whitelist),function(a,b){var c=void 0!=h.transformAttrMap[b]?h.transformAttrMap[b]:b;h.settings[c]=a}),h.settings.start=0,m)switch(h.type){case"youtube":h.settings.start+=60*parseInt(m[2]||"0")*60,h.settings.start+=60*parseInt(m[4]||"0"),h.settings.start+=parseInt(m[6]||"0");break;case"dailymotion":h.settings.start+=parseInt(m[1]||"0")}if(h.isAdditionaResRequired())for(var n=angular.element(d.document.querySelector("body")),o=0;o + @@ -117,7 +118,8 @@ ng-repeat="(domain, object) in item.properties | groupBy: 'domain.name'">