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'">