diff --git a/config/integrations/youtube_widget.yaml b/config/integrations/youtube_widget.yaml new file mode 100644 index 0000000..36ed516 --- /dev/null +++ b/config/integrations/youtube_widget.yaml @@ -0,0 +1,7 @@ +# All this configuration does is make "Youtube Widget" available in the UI +type: "widget" +integrationType: "youtube" +enabled: true +name: "YouTube Video" +about: "Embed a YouTube, Vimeo, or DailyMotion video" +avatar: "img/avatars/youtube.png" diff --git a/package-lock.json b/package-lock.json index 78190f5..76556aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2096,6 +2096,16 @@ "minimalistic-crypto-utils": "1.0.1" } }, + "embed-video": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/embed-video/-/embed-video-2.0.0.tgz", + "integrity": "sha1-1/JouzRkIg9pXbM6YCHhpgjI4fk=", + "requires": { + "fetch-ponyfill": "4.1.0", + "lodash.escape": "4.0.1", + "promise-polyfill": "6.0.2" + } + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -2107,6 +2117,14 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.15" + } + }, "enhanced-resolve": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz", @@ -2621,6 +2639,14 @@ "websocket-driver": "0.6.5" } }, + "fetch-ponyfill": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", + "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", + "requires": { + "node-fetch": "1.7.3" + } + }, "file-loader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.0.0.tgz", @@ -3739,8 +3765,7 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-svg": { "version": "2.1.0", @@ -4028,6 +4053,11 @@ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, + "lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -4470,6 +4500,15 @@ "minimatch": "3.0.4" } }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, "node-forge": { "version": "0.6.33", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", @@ -6555,6 +6594,11 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, + "promise-polyfill": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.0.2.tgz", + "integrity": "sha1-2chtPcTcLfkBboiUbe/Wm0m0EWI=" + }, "prompt": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz", diff --git a/package.json b/package.json index 0457607..d2e0f3e 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "db-migrate": "^0.10.0-beta.23", "db-migrate-sqlite3": "^0.2.1", "dns-then": "^0.1.0", + "embed-video": "^2.0.0", "express": "^4.15.4", "js-yaml": "^3.9.1", "lodash": "^4.17.4", diff --git a/web/app/app.module.ts b/web/app/app.module.ts index d91123d..74a6208 100644 --- a/web/app/app.module.ts +++ b/web/app/app.module.ts @@ -27,6 +27,8 @@ import { MyFilterPipe } from "./shared/my-filter.pipe"; import { GenericWidgetWrapperComponent } from "./widget_wrappers/generic/generic.component"; import { ToggleFullscreenDirective } from "./shared/toggle-fullscreen.directive"; import { FullscreenButtonComponent } from "./fullscreen-button/fullscreen-button.component"; +import { YoutubeWidgetConfigComponent } from "./configs/widget/youtube/youtube-config.component"; +import { VideoWidgetWrapperComponent } from "./widget_wrappers/video/video.component"; @NgModule({ imports: [ @@ -55,6 +57,8 @@ import { FullscreenButtonComponent } from "./fullscreen-button/fullscreen-button GenericWidgetWrapperComponent, ToggleFullscreenDirective, FullscreenButtonComponent, + YoutubeWidgetConfigComponent, + VideoWidgetWrapperComponent, // Vendor ], @@ -73,6 +77,7 @@ import { FullscreenButtonComponent } from "./fullscreen-button/fullscreen-button TravisCiConfigComponent, IrcConfigComponent, CustomWidgetConfigComponent, + YoutubeWidgetConfigComponent, ] }) export class AppModule { diff --git a/web/app/app.routing.ts b/web/app/app.routing.ts index dc32450..4de7ff9 100644 --- a/web/app/app.routing.ts +++ b/web/app/app.routing.ts @@ -2,11 +2,13 @@ import { RouterModule, Routes } from "@angular/router"; import { HomeComponent } from "./home/home.component"; import { RiotComponent } from "./riot/riot.component"; import { GenericWidgetWrapperComponent } from "./widget_wrappers/generic/generic.component"; +import { VideoWidgetWrapperComponent } from "./widget_wrappers/video/video.component"; const routes: Routes = [ {path: "", component: HomeComponent}, {path: "riot", component: RiotComponent}, {path: "widgets/generic", component: GenericWidgetWrapperComponent}, + {path: "widgets/video", component: VideoWidgetWrapperComponent}, ]; export const routing = RouterModule.forRoot(routes); diff --git a/web/app/configs/widget/custom_widget/custom_widget-config.component.html b/web/app/configs/widget/custom_widget/custom_widget-config.component.html index 1429f5d..ab7cb23 100644 --- a/web/app/configs/widget/custom_widget/custom_widget-config.component.html +++ b/web/app/configs/widget/custom_widget/custom_widget-config.component.html @@ -18,7 +18,7 @@