From 175fab3dd1d1278e7e125171721cc7c826bd9a67 Mon Sep 17 00:00:00 2001 From: vugar Date: Sun, 18 Jun 2023 12:41:07 +0200 Subject: [PATCH 1/6] feature/upgrade-youtube-search-api --- appengines/backend/package.json | 2 +- apps/shell/src/app/app.config.ts | 4 ++-- package-lock.json | 8 ++++---- package.json | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/appengines/backend/package.json b/appengines/backend/package.json index 9f85cff..37e6aba 100644 --- a/appengines/backend/package.json +++ b/appengines/backend/package.json @@ -11,7 +11,7 @@ "@nestjs/platform-express": "9.4.2", "reflect-metadata": "0.1.13", "rxjs": "7.5.6", - "youtube-search-without-api-key": "1.0.7", + "youtube-search-without-api-key": "1.1.0", "youtube-sr": "4.1.15" } } diff --git a/apps/shell/src/app/app.config.ts b/apps/shell/src/app/app.config.ts index 1757cfd..e60c7c0 100644 --- a/apps/shell/src/app/app.config.ts +++ b/apps/shell/src/app/app.config.ts @@ -1,4 +1,4 @@ -import { provideRouter } from '@angular/router'; +import { provideRouter, withEnabledBlockingInitialNavigation } from '@angular/router'; import { ApplicationConfig, Injector, importProvidersFrom } from '@angular/core'; import { HTTP_INTERCEPTORS, provideHttpClient } from '@angular/common/http'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; @@ -16,7 +16,7 @@ import { provideClientHydration } from '@angular/platform-browser'; export const appConfig: ApplicationConfig = { providers: [ - provideRouter(APP_ROUTES), + provideRouter(APP_ROUTES, withEnabledBlockingInitialNavigation()), provideHttpClient(), provideClientHydration(), { diff --git a/package-lock.json b/package-lock.json index 63a7210..bf6d2aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "reflect-metadata": "0.1.13", "rxjs": "7.5.6", "tslib": "^2.3.0", - "youtube-search-without-api-key": "1.0.7", + "youtube-search-without-api-key": "1.1.0", "youtube-sr": "4.1.15", "zone.js": "0.13.0" }, @@ -31360,9 +31360,9 @@ } }, "node_modules/youtube-search-without-api-key": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/youtube-search-without-api-key/-/youtube-search-without-api-key-1.0.7.tgz", - "integrity": "sha512-PjwejF6YApZDqTFo46/4q6IQlztUtQsP/8ygcHYyakPHqijIKn36+yUQVPTC92/+IZtqyZBhpTKP1bG6uZKP/Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/youtube-search-without-api-key/-/youtube-search-without-api-key-1.1.0.tgz", + "integrity": "sha512-1SaOviXU5CZ9wU1YlMQx7NBysIr5IDRNe+mD/8ml6IAiiDlEOgZ8a01Hs+OhmpQAb+UuY1cOsfca8pcs/CGLUA==", "dependencies": { "got": "^11.8.3" }, diff --git a/package.json b/package.json index 7da753d..df0aa57 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "reflect-metadata": "0.1.13", "rxjs": "7.5.6", "tslib": "^2.3.0", - "youtube-search-without-api-key": "1.0.7", + "youtube-search-without-api-key": "1.1.0", "youtube-sr": "4.1.15", "zone.js": "0.13.0" }, From 5395884f32e09ebd08dd4b9d369e94a0152c5d6a Mon Sep 17 00:00:00 2001 From: vugar Date: Sun, 18 Jun 2023 13:30:56 +0200 Subject: [PATCH 2/6] add warm-up server API --- appengines/backend/app.yaml | 2 +- appengines/backend/package.json | 3 ++- apps/backend/src/app.controller.ts | 7 +++++++ apps/backend/src/main.ts | 2 +- apps/shell/src/app/app.component.ts | 8 ++++++++ .../ui/src/lib/models/youtube.service.model.ts | 1 + .../lib/services/youtube-v1/youtube.v1.service.ts | 13 +++++++++++-- .../lib/services/youtube-v2/youtube-v2.service.ts | 13 +++++++++++-- .../src/lib/services/youtube-v3/youtube.service.ts | 6 +++++- 9 files changed, 47 insertions(+), 8 deletions(-) diff --git a/appengines/backend/app.yaml b/appengines/backend/app.yaml index 25c2a3a..f20c9a6 100644 --- a/appengines/backend/app.yaml +++ b/appengines/backend/app.yaml @@ -1,4 +1,4 @@ -runtime: nodejs18.16.0 +runtime: nodejs18 instance_class: F1 automatic_scaling: min_idle_instances: 0 diff --git a/appengines/backend/package.json b/appengines/backend/package.json index 37e6aba..9793876 100644 --- a/appengines/backend/package.json +++ b/appengines/backend/package.json @@ -3,7 +3,8 @@ "version": "0.0.1", "main": "main.js", "scripts": { - "start": "node dist/main.js" + "start": "node dist/main.js", + "deploy": "gcloud config set project youtube-webapp-341311 && gcloud app deploy" }, "dependencies": { "@nestjs/common": "9.4.2", diff --git a/apps/backend/src/app.controller.ts b/apps/backend/src/app.controller.ts index cce879e..d2380ad 100644 --- a/apps/backend/src/app.controller.ts +++ b/apps/backend/src/app.controller.ts @@ -9,4 +9,11 @@ export class AppController { getHello(): string { return this.appService.getHello(); } + + @Get('/manual_warmup') + async manualWarmUp(): Promise { + return { + ok: true, + }; + } } diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index ae8decb..99dd0d2 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -24,7 +24,7 @@ async function bootstrap(): Promise { }); app.enableVersioning({ type: VersioningType.URI, - defaultVersion: '1', + defaultVersion: '', }); const port = process.env.PORT || 3333; await app.listen(port); diff --git a/apps/shell/src/app/app.component.ts b/apps/shell/src/app/app.component.ts index 3a72b88..2bbbdf3 100644 --- a/apps/shell/src/app/app.component.ts +++ b/apps/shell/src/app/app.component.ts @@ -13,6 +13,8 @@ import { LocalStorageEnum, SessionStorageEnum, NotFoundPageComponent, + IYoutubeService, + YOUTUBE_SERVICE, } from '@youtube/common-ui'; import { filter, Observable, Subject, takeUntil } from 'rxjs'; @@ -59,6 +61,7 @@ export class AppComponent implements OnInit, OnDestroy { constructor( @Inject(PLATFORM_ID) private platformId: Object, //eslint-disable-line + @Inject(YOUTUBE_SERVICE) private youtubeService: IYoutubeService, private videoStore: VideoStoreService, private router: Router, private eventDispatcher: EventDispatcherService, @@ -76,6 +79,7 @@ export class AppComponent implements OnInit, OnDestroy { this.tryRestoreMiniVideoSetings(); this.tryRestoreTheme(); this.openPolicyTermsDialog(); + this.warmUpServer(); } public ngOnDestroy(): void { @@ -177,4 +181,8 @@ export class AppComponent implements OnInit, OnDestroy { } }); } + + private warmUpServer(): void { + this.youtubeService.warmUp().subscribe(); + } } diff --git a/packages/common-ui/projects/ui/src/lib/models/youtube.service.model.ts b/packages/common-ui/projects/ui/src/lib/models/youtube.service.model.ts index 5c2a26e..2bf42e1 100644 --- a/packages/common-ui/projects/ui/src/lib/models/youtube.service.model.ts +++ b/packages/common-ui/projects/ui/src/lib/models/youtube.service.model.ts @@ -5,6 +5,7 @@ import { IYoutubeVideoResult } from './youtube-video-list.model'; export interface IYoutubeService { searchList: (params: IYoutubeSearchParams) => Observable; videoList: (params: IYoutubeVideoListParams) => Observable; + warmUp: () => Observable; } export interface IYoutubeSearchParams { diff --git a/packages/common-ui/projects/ui/src/lib/services/youtube-v1/youtube.v1.service.ts b/packages/common-ui/projects/ui/src/lib/services/youtube-v1/youtube.v1.service.ts index 646a53f..3c8d1ae 100644 --- a/packages/common-ui/projects/ui/src/lib/services/youtube-v1/youtube.v1.service.ts +++ b/packages/common-ui/projects/ui/src/lib/services/youtube-v1/youtube.v1.service.ts @@ -17,13 +17,22 @@ export class YoutubeServiceV1 implements IYoutubeService { public searchList(params: IYoutubeSearchParams): Observable { const { query } = params; - const url = `${this.appConfig.backendUrl}/api/v1/youtube/searchlist?q=${query}`; + const url = `${this.prefix}/searchlist?q=${query}`; return this.http.get(url); } public videoList(params: IYoutubeVideoListParams): Observable { const { id } = params; - const url = `${this.appConfig.backendUrl}/api/v1/youtube/videolist?id=${id}`; + const url = `${this.prefix}/videolist?id=${id}`; return this.http.get(url); } + + public warmUp(): Observable { + const url = `${this.appConfig.backendUrl}/api/manual_warmup`; + return this.http.get(url); + } + + private get prefix(): string { + return `${this.appConfig.backendUrl}/api/v1/youtube`; + } } diff --git a/packages/common-ui/projects/ui/src/lib/services/youtube-v2/youtube-v2.service.ts b/packages/common-ui/projects/ui/src/lib/services/youtube-v2/youtube-v2.service.ts index 5a6c18b..e73e037 100644 --- a/packages/common-ui/projects/ui/src/lib/services/youtube-v2/youtube-v2.service.ts +++ b/packages/common-ui/projects/ui/src/lib/services/youtube-v2/youtube-v2.service.ts @@ -17,13 +17,22 @@ export class YoutubeServiceV2 implements IYoutubeService { public searchList(params: IYoutubeSearchParams): Observable { const { query } = params; - const url = `${this.appConfig.backendUrl}/api/v2/youtube/searchlist?q=${query}`; + const url = `${this.prefix}/searchlist?q=${query}`; return this.http.get(url); } public videoList(params: IYoutubeVideoListParams): Observable { const { id } = params; - const url = `${this.appConfig.backendUrl}/api/v2/youtube/videolist?id=${id}`; + const url = `${this.prefix}/videolist?id=${id}`; return this.http.get(url); } + + public warmUp(): Observable { + const url = `${this.appConfig.backendUrl}/api/manual_warmup`; + return this.http.get(url); + } + + private get prefix(): string { + return `${this.appConfig.backendUrl}/api/v2/youtube`; + } } diff --git a/packages/common-ui/projects/ui/src/lib/services/youtube-v3/youtube.service.ts b/packages/common-ui/projects/ui/src/lib/services/youtube-v3/youtube.service.ts index 3e4a1cf..92e7cfe 100644 --- a/packages/common-ui/projects/ui/src/lib/services/youtube-v3/youtube.service.ts +++ b/packages/common-ui/projects/ui/src/lib/services/youtube-v3/youtube.service.ts @@ -1,6 +1,6 @@ import { HttpClient } from '@angular/common/http'; import { Inject, Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; +import { EMPTY, Observable } from 'rxjs'; import { IAppConfig, IYoutubeSearchResult, IYoutubeVideoResult } from '../../models'; import { IYoutubeSearchParams, IYoutubeService, IYoutubeVideoListParams } from '../../models/youtube.service.model'; import { APP_CONFIG } from '../../tokens'; @@ -23,4 +23,8 @@ export class YoutubeService implements IYoutubeService { const url = `${YT_BASE_URL}/videos?part=${part}&id=${id}&key=${apiKey}`; return this.http.get(url); } + + public warmUp(): Observable { + return EMPTY; + } } From b180a5d78fe8b345fc8cd51145d8e79d08055633 Mon Sep 17 00:00:00 2001 From: vugar Date: Sun, 18 Jun 2023 13:37:00 +0200 Subject: [PATCH 3/6] fix lint warnings --- apps/shell/src/app/components/header/header.component.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/shell/src/app/components/header/header.component.ts b/apps/shell/src/app/components/header/header.component.ts index 7af58c4..b452fce 100644 --- a/apps/shell/src/app/components/header/header.component.ts +++ b/apps/shell/src/app/components/header/header.component.ts @@ -27,11 +27,11 @@ import { } from '@youtube/common-ui'; import { catchError, EMPTY, Subject, take, takeUntil } from 'rxjs'; import { DEFAULT_SEARCH_VALUE } from 'src/app/app.constants'; -import { environment } from 'src/environments/environment'; import { SettingsStore } from '../../core/services/settings-store/settings-store.service'; import { AppTheme } from '../../core/services/theme-service/theme.constants'; import { ThemeService } from '../../core/services/theme-service/theme.service'; import { VideoStoreService } from '../../core/services/video-store/video-store.service'; +import { environment } from 'src/environments/environment'; @Component({ standalone: true, @@ -117,9 +117,9 @@ export class HeaderComponent implements OnInit, OnDestroy { private getCountryCode(): void { // load only on production to save api traffic :) - // if (!environment.production || isPlatformServer(this.platformId)) { - // return; - // } + if (!environment.production || isPlatformServer(this.platformId)) { + return; + } this.countryApiService .getCountryCode() .pipe(catchError(() => EMPTY)) From 9bf788ceb4dbfc2cf7bd24917bc87aa914e9fb6a Mon Sep 17 00:00:00 2001 From: vugar Date: Sun, 18 Jun 2023 13:47:14 +0200 Subject: [PATCH 4/6] upgrade youtube-sr package to v4.3.4 --- appengines/backend/package.json | 2 +- package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/appengines/backend/package.json b/appengines/backend/package.json index 9793876..8f6c6ff 100644 --- a/appengines/backend/package.json +++ b/appengines/backend/package.json @@ -13,6 +13,6 @@ "reflect-metadata": "0.1.13", "rxjs": "7.5.6", "youtube-search-without-api-key": "1.1.0", - "youtube-sr": "4.1.15" + "youtube-sr": "4.3.4" } } diff --git a/package-lock.json b/package-lock.json index bf6d2aa..2a2cad6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "rxjs": "7.5.6", "tslib": "^2.3.0", "youtube-search-without-api-key": "1.1.0", - "youtube-sr": "4.1.15", + "youtube-sr": "4.3.4", "zone.js": "0.13.0" }, "devDependencies": { @@ -31372,9 +31372,9 @@ } }, "node_modules/youtube-sr": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/youtube-sr/-/youtube-sr-4.1.15.tgz", - "integrity": "sha512-zYWruRHhVwREeTbQX7TwT2xh3RxTSMJyIjgYs/Da2uyKRVHXz8JH1GIpJwVHVzsrXcozsNNs/iMo8puFdFnu+Q==" + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/youtube-sr/-/youtube-sr-4.3.4.tgz", + "integrity": "sha512-olSYcR80XigutCrePEXBX3/RJJrWfonJQj7+/ggBiWU0CzTDLE1q8+lpWTWCG0JpzhzILp/IB/Bq/glGqqr1TQ==" }, "node_modules/zone.js": { "version": "0.13.0", diff --git a/package.json b/package.json index df0aa57..a59ed57 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "rxjs": "7.5.6", "tslib": "^2.3.0", "youtube-search-without-api-key": "1.1.0", - "youtube-sr": "4.1.15", + "youtube-sr": "4.3.4", "zone.js": "0.13.0" }, "devDependencies": { From a9085c0f07cc049f6a0bb7dc723900a3671ee157 Mon Sep 17 00:00:00 2001 From: vugar Date: Sun, 18 Jun 2023 13:48:33 +0200 Subject: [PATCH 5/6] bump app version --- apps/shell/src/app/app.constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/shell/src/app/app.constants.ts b/apps/shell/src/app/app.constants.ts index aa707b4..055ccc0 100644 --- a/apps/shell/src/app/app.constants.ts +++ b/apps/shell/src/app/app.constants.ts @@ -1,6 +1,6 @@ import { ICommonMetaTagConfig } from '@youtube/common-ui'; -export const APP_VERSION = '3.3.2'; +export const APP_VERSION = '3.3.4'; export const SHELL_META_TAGS: ICommonMetaTagConfig = { title: 'Youtube Angular Clone', From 51d7a99637bc6d982021053584f100c3c8988f65 Mon Sep 17 00:00:00 2001 From: vugar Date: Sun, 18 Jun 2023 14:07:02 +0200 Subject: [PATCH 6/6] add API mocks --- apps/shell/src/mocks/searchlist.ts | 656 +++++++++++++++++++++++++++++ apps/shell/src/mocks/videolist.ts | 96 +++++ 2 files changed, 752 insertions(+) create mode 100644 apps/shell/src/mocks/searchlist.ts create mode 100644 apps/shell/src/mocks/videolist.ts diff --git a/apps/shell/src/mocks/searchlist.ts b/apps/shell/src/mocks/searchlist.ts new file mode 100644 index 0000000..e66cf1f --- /dev/null +++ b/apps/shell/src/mocks/searchlist.ts @@ -0,0 +1,656 @@ +export const SEARCHLIST_MOCK = { + kind: null, + etag: null, + regionCode: null, + pageInfo: null, + items: [ + { + kind: null, + etag: null, + id: { + videoId: 'G31l5knrVQo', + }, + snippet: { + publishedAt: '6 years ago', + channelId: 'UCWaZJ2Mu5zjfhZoEEMxs1MQ', + title: 'Dreaming of Arabia | Oriental Lounge Music', + description: 'Dreaming of Arabia | Oriental Lounge Music', + thumbnails: { + default: { + id: 'G31l5knrVQo', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/G31l5knrVQo/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBdcp8ZnCoDQf9GCz-BdFHzQ6Owtg', + }, + medium: { + id: 'G31l5knrVQo', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/G31l5knrVQo/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBdcp8ZnCoDQf9GCz-BdFHzQ6Owtg', + }, + high: { + id: 'G31l5knrVQo', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/G31l5knrVQo/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBdcp8ZnCoDQf9GCz-BdFHzQ6Owtg', + }, + }, + channelTitle: "Buddha's Lounge", + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'aubKbTYx804', + }, + snippet: { + publishedAt: '5 years ago', + channelId: 'UCWaZJ2Mu5zjfhZoEEMxs1MQ', + title: 'Arabic Lounge Music خنیا Aicha', + description: 'Arabic Lounge Music خنیا Aicha', + thumbnails: { + default: { + id: 'aubKbTYx804', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/aubKbTYx804/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCWpNgQSnqigfALIbwQqcK8sDTPgw', + }, + medium: { + id: 'aubKbTYx804', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/aubKbTYx804/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCWpNgQSnqigfALIbwQqcK8sDTPgw', + }, + high: { + id: 'aubKbTYx804', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/aubKbTYx804/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCWpNgQSnqigfALIbwQqcK8sDTPgw', + }, + }, + channelTitle: "Buddha's Lounge", + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: '77kOn5NZBHw', + }, + snippet: { + publishedAt: '1 year ago', + channelId: 'UCehwgzlM3jtgWJjkIUgyITw', + title: 'Cafe De Anatolia LOUNGE - Good Feeling | Ethno Deep House | 2022 DJ Mix', + description: 'Cafe De Anatolia LOUNGE - Good Feeling | Ethno Deep House | 2022 DJ Mix', + thumbnails: { + default: { + id: '77kOn5NZBHw', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/77kOn5NZBHw/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLA_D5X0XEqUqNuBJx-iiaJi4b9vTg', + }, + medium: { + id: '77kOn5NZBHw', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/77kOn5NZBHw/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLA_D5X0XEqUqNuBJx-iiaJi4b9vTg', + }, + high: { + id: '77kOn5NZBHw', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/77kOn5NZBHw/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLA_D5X0XEqUqNuBJx-iiaJi4b9vTg', + }, + }, + channelTitle: 'Cafe De Anatolia LOUNGE', + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'DYE81dgMvms', + }, + snippet: { + publishedAt: '1 year ago', + channelId: 'UC_u5RoqG3-2ZIiOQwG8DKRQ', + title: 'Arabic Lounge Music | Middle East Cafe Music | خنیا', + description: 'Arabic Lounge Music | Middle East Cafe Music | خنیا', + thumbnails: { + default: { + id: 'DYE81dgMvms', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/DYE81dgMvms/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAVmf9qdckaa3D5xWHPRiE62KyVdQ', + }, + medium: { + id: 'DYE81dgMvms', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/DYE81dgMvms/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAVmf9qdckaa3D5xWHPRiE62KyVdQ', + }, + high: { + id: 'DYE81dgMvms', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/DYE81dgMvms/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAVmf9qdckaa3D5xWHPRiE62KyVdQ', + }, + }, + channelTitle: 'BACKGROUND WAVE', + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'BUdjqbMVJMs', + }, + snippet: { + publishedAt: '11 years ago', + channelId: 'UCIPHqoha3VqFzOKoiQNUWvg', + title: 'Wonderful Chill Out Music (Egypt & India Balance Mix)', + description: 'Wonderful Chill Out Music (Egypt & India Balance Mix)', + thumbnails: { + default: { + id: 'BUdjqbMVJMs', + width: 480, + height: 270, + url: 'https://i.ytimg.com/vi/BUdjqbMVJMs/hqdefault.jpg?sqp=-oaymwE9COADEI4CSFryq4qpAy8IARUAAAAAGAElAADIQj0AgKJDeAHwAQH4Af4EgALgA4oCDAgAEAEYfyBAKCAwDw==&rs=AOn4CLAkwhZe1yL-abx36IcP-F0_DOB5Ig', + }, + medium: { + id: 'BUdjqbMVJMs', + width: 480, + height: 270, + url: 'https://i.ytimg.com/vi/BUdjqbMVJMs/hqdefault.jpg?sqp=-oaymwE9COADEI4CSFryq4qpAy8IARUAAAAAGAElAADIQj0AgKJDeAHwAQH4Af4EgALgA4oCDAgAEAEYfyBAKCAwDw==&rs=AOn4CLAkwhZe1yL-abx36IcP-F0_DOB5Ig', + }, + high: { + id: 'BUdjqbMVJMs', + width: 480, + height: 270, + url: 'https://i.ytimg.com/vi/BUdjqbMVJMs/hqdefault.jpg?sqp=-oaymwE9COADEI4CSFryq4qpAy8IARUAAAAAGAElAADIQj0AgKJDeAHwAQH4Af4EgALgA4oCDAgAEAEYfyBAKCAwDw==&rs=AOn4CLAkwhZe1yL-abx36IcP-F0_DOB5Ig', + }, + }, + channelTitle: 'WorldBeat_Express', + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: '62tSUVOd-bM', + }, + snippet: { + publishedAt: '5 years ago', + channelId: 'UCWaZJ2Mu5zjfhZoEEMxs1MQ', + title: 'Andalusian Spanish Arabic Music | الأنْدَلُس', + description: 'Andalusian Spanish Arabic Music | الأنْدَلُس', + thumbnails: { + default: { + id: '62tSUVOd-bM', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/62tSUVOd-bM/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYZSBXKEswDw==&rs=AOn4CLAffxn0_JAEH33WZsmSwxehOESyhg', + }, + medium: { + id: '62tSUVOd-bM', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/62tSUVOd-bM/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYZSBXKEswDw==&rs=AOn4CLAffxn0_JAEH33WZsmSwxehOESyhg', + }, + high: { + id: '62tSUVOd-bM', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/62tSUVOd-bM/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYZSBXKEswDw==&rs=AOn4CLAffxn0_JAEH33WZsmSwxehOESyhg', + }, + }, + channelTitle: "Buddha's Lounge", + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'bxYIig5AxyM', + }, + snippet: { + publishedAt: '2 years ago', + channelId: 'UCWaZJ2Mu5zjfhZoEEMxs1MQ', + title: 'Relaxing Arabic Music - Lounge Mix', + description: 'Relaxing Arabic Music - Lounge Mix', + thumbnails: { + default: { + id: 'bxYIig5AxyM', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/bxYIig5AxyM/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLA14Ed7a5AAsfi2rZa1wCskX2FSMw', + }, + medium: { + id: 'bxYIig5AxyM', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/bxYIig5AxyM/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLA14Ed7a5AAsfi2rZa1wCskX2FSMw', + }, + high: { + id: 'bxYIig5AxyM', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/bxYIig5AxyM/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLA14Ed7a5AAsfi2rZa1wCskX2FSMw', + }, + }, + channelTitle: "Buddha's Lounge", + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: '8Lo5Tyw4CFI', + }, + snippet: { + publishedAt: '5 years ago', + channelId: 'UCWaZJ2Mu5zjfhZoEEMxs1MQ', + title: 'Secret Love | Buddha’s Lounge Music', + description: 'Secret Love | Buddha’s Lounge Music', + thumbnails: { + default: { + id: '8Lo5Tyw4CFI', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/8Lo5Tyw4CFI/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLB04nsI_5qnOGun3IC1k3SG9D9NAQ', + }, + medium: { + id: '8Lo5Tyw4CFI', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/8Lo5Tyw4CFI/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLB04nsI_5qnOGun3IC1k3SG9D9NAQ', + }, + high: { + id: '8Lo5Tyw4CFI', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/8Lo5Tyw4CFI/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLB04nsI_5qnOGun3IC1k3SG9D9NAQ', + }, + }, + channelTitle: "Buddha's Lounge", + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'POEvGHuH-Nw', + }, + snippet: { + publishedAt: '5 months ago', + channelId: 'UCehwgzlM3jtgWJjkIUgyITw', + title: 'Cafe De Anatolia LOUNGE - Best of Ethno Arabic 2023', + description: 'Cafe De Anatolia LOUNGE - Best of Ethno Arabic 2023', + thumbnails: { + default: { + id: 'POEvGHuH-Nw', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/POEvGHuH-Nw/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLD8vv2fRl5hcM7wqyuuRtGVKL2Q6A', + }, + medium: { + id: 'POEvGHuH-Nw', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/POEvGHuH-Nw/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLD8vv2fRl5hcM7wqyuuRtGVKL2Q6A', + }, + high: { + id: 'POEvGHuH-Nw', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/POEvGHuH-Nw/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLD8vv2fRl5hcM7wqyuuRtGVKL2Q6A', + }, + }, + channelTitle: 'Cafe De Anatolia LOUNGE', + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'N1VLrcvE2nI', + }, + snippet: { + publishedAt: '2 days ago', + channelId: 'UCI8DegIWgK51cGakXcf1dOQ', + title: 'Saudi singers Fulana, Klinsh set the mood at Riyadh event | Arab News', + description: 'Saudi singers Fulana, Klinsh set the mood at Riyadh event | Arab News', + thumbnails: { + default: { + id: 'N1VLrcvE2nI', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/N1VLrcvE2nI/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYKyAqKH8wDw==&rs=AOn4CLCilnC5omtUGNBxeJh1mvftUGwAaQ', + }, + medium: { + id: 'N1VLrcvE2nI', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/N1VLrcvE2nI/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYKyAqKH8wDw==&rs=AOn4CLCilnC5omtUGNBxeJh1mvftUGwAaQ', + }, + high: { + id: 'N1VLrcvE2nI', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/N1VLrcvE2nI/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYKyAqKH8wDw==&rs=AOn4CLCilnC5omtUGNBxeJh1mvftUGwAaQ', + }, + }, + channelTitle: 'Arab News', + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'FJeFfUKd8qc', + }, + snippet: { + publishedAt: '1 year ago', + channelId: 'UCFi9vQGme_RWuEv2zh-YIOg', + title: 'Arabian Lounge Music - Best of 2022', + description: 'Arabian Lounge Music - Best of 2022', + thumbnails: { + default: { + id: 'FJeFfUKd8qc', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/FJeFfUKd8qc/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDGNcGrUzSuVBsx8PXQV5h_EE6Rvg', + }, + medium: { + id: 'FJeFfUKd8qc', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/FJeFfUKd8qc/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDGNcGrUzSuVBsx8PXQV5h_EE6Rvg', + }, + high: { + id: 'FJeFfUKd8qc', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/FJeFfUKd8qc/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDGNcGrUzSuVBsx8PXQV5h_EE6Rvg', + }, + }, + channelTitle: 'LIFE & CHILL MUSIC', + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: '623VO51_1gY', + }, + snippet: { + publishedAt: '2 years ago', + channelId: 'UCWaZJ2Mu5zjfhZoEEMxs1MQ', + title: 'Lounge Music | Desert Rose', + description: 'Lounge Music | Desert Rose', + thumbnails: { + default: { + id: '623VO51_1gY', + width: 480, + height: 270, + url: 'https://i.ytimg.com/vi/623VO51_1gY/hqdefault.jpg?sqp=-oaymwE9COADEI4CSFryq4qpAy8IARUAAAAAGAElAADIQj0AgKJDeAHwAQH4AdQGgALgA4oCDAgAEAEYfyBCKBowDw==&rs=AOn4CLB0CLOQMiFXlJwG1AfZY_wer0-svQ', + }, + medium: { + id: '623VO51_1gY', + width: 480, + height: 270, + url: 'https://i.ytimg.com/vi/623VO51_1gY/hqdefault.jpg?sqp=-oaymwE9COADEI4CSFryq4qpAy8IARUAAAAAGAElAADIQj0AgKJDeAHwAQH4AdQGgALgA4oCDAgAEAEYfyBCKBowDw==&rs=AOn4CLB0CLOQMiFXlJwG1AfZY_wer0-svQ', + }, + high: { + id: '623VO51_1gY', + width: 480, + height: 270, + url: 'https://i.ytimg.com/vi/623VO51_1gY/hqdefault.jpg?sqp=-oaymwE9COADEI4CSFryq4qpAy8IARUAAAAAGAElAADIQj0AgKJDeAHwAQH4AdQGgALgA4oCDAgAEAEYfyBCKBowDw==&rs=AOn4CLB0CLOQMiFXlJwG1AfZY_wer0-svQ', + }, + }, + channelTitle: "Buddha's Lounge", + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'RZFf9lYHn_c', + }, + snippet: { + publishedAt: '9 years ago', + channelId: 'UCMgYvvPd5WvQS0Qrk-IOgEA', + title: 'Voices of The Night (BEAUTIFUL CHILLOUT MIX) يا ليـــــل', + description: 'Voices of The Night (BEAUTIFUL CHILLOUT MIX) يا ليـــــل', + thumbnails: { + default: { + id: 'RZFf9lYHn_c', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/RZFf9lYHn_c/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYciBIKCswDw==&rs=AOn4CLBpNHLcgY_2ENQzekRUF38nEODt_Q', + }, + medium: { + id: 'RZFf9lYHn_c', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/RZFf9lYHn_c/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYciBIKCswDw==&rs=AOn4CLBpNHLcgY_2ENQzekRUF38nEODt_Q', + }, + high: { + id: 'RZFf9lYHn_c', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/RZFf9lYHn_c/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYciBIKCswDw==&rs=AOn4CLBpNHLcgY_2ENQzekRUF38nEODt_Q', + }, + }, + channelTitle: 'Gcoups', + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'iNJTRhtgIFA', + }, + snippet: { + publishedAt: '11 years ago', + channelId: 'UCmEwFPTXPlYByemM981nEKQ', + title: 'Beautiful arabian chillout - Lost In The Desert (mixed by SpringLady)', + description: 'Beautiful arabian chillout - Lost In The Desert (mixed by SpringLady)', + thumbnails: { + default: { + id: 'iNJTRhtgIFA', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/iNJTRhtgIFA/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Ab4HgALQBYoCDAgAEAEYfyBEKDEwDw==&rs=AOn4CLBk2f0IcdA4rJQLO6Tm3JpuWRGD_w', + }, + medium: { + id: 'iNJTRhtgIFA', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/iNJTRhtgIFA/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Ab4HgALQBYoCDAgAEAEYfyBEKDEwDw==&rs=AOn4CLBk2f0IcdA4rJQLO6Tm3JpuWRGD_w', + }, + high: { + id: 'iNJTRhtgIFA', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/iNJTRhtgIFA/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Ab4HgALQBYoCDAgAEAEYfyBEKDEwDw==&rs=AOn4CLBk2f0IcdA4rJQLO6Tm3JpuWRGD_w', + }, + }, + channelTitle: 'SpringLady Music', + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'chzHd1uSP_A', + }, + snippet: { + publishedAt: '4 years ago', + channelId: 'UCWaZJ2Mu5zjfhZoEEMxs1MQ', + title: 'Arabic Spanish Music | Andalucia Nights', + description: 'Arabic Spanish Music | Andalucia Nights', + thumbnails: { + default: { + id: 'chzHd1uSP_A', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/chzHd1uSP_A/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYZSBZKEwwDw==&rs=AOn4CLCWT-JOFHwckRbU1Ok2NhcIxRs2-Q', + }, + medium: { + id: 'chzHd1uSP_A', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/chzHd1uSP_A/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYZSBZKEwwDw==&rs=AOn4CLCWT-JOFHwckRbU1Ok2NhcIxRs2-Q', + }, + high: { + id: 'chzHd1uSP_A', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/chzHd1uSP_A/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYZSBZKEwwDw==&rs=AOn4CLCWT-JOFHwckRbU1Ok2NhcIxRs2-Q', + }, + }, + channelTitle: "Buddha's Lounge", + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'hineGNZfXRw', + }, + snippet: { + publishedAt: '2 years ago', + channelId: 'UC1Tr6S-XLBk1NzNX1jErWMg', + title: 'Cafe De Anatolia - Best Ethnic Deep House (Mix by Billy Esteban)', + description: 'Cafe De Anatolia - Best Ethnic Deep House (Mix by Billy Esteban)', + thumbnails: { + default: { + id: 'hineGNZfXRw', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/hineGNZfXRw/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYciBFKC8wDw==&rs=AOn4CLAZkPNfRdp9zHEYx6Wh7oGX-ortFw', + }, + medium: { + id: 'hineGNZfXRw', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/hineGNZfXRw/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYciBFKC8wDw==&rs=AOn4CLAZkPNfRdp9zHEYx6Wh7oGX-ortFw', + }, + high: { + id: 'hineGNZfXRw', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/hineGNZfXRw/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYciBFKC8wDw==&rs=AOn4CLAZkPNfRdp9zHEYx6Wh7oGX-ortFw', + }, + }, + channelTitle: 'Cafe De Anatolia', + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'AwCA2adNQgE', + }, + snippet: { + publishedAt: '4 years ago', + channelId: 'UC1Tr6S-XLBk1NzNX1jErWMg', + title: 'Cafe De Anatolia - Arabian Nights', + description: 'Cafe De Anatolia - Arabian Nights', + thumbnails: { + default: { + id: 'AwCA2adNQgE', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/AwCA2adNQgE/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCprfTp6Gkqr603SgB8py9G-vow8A', + }, + medium: { + id: 'AwCA2adNQgE', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/AwCA2adNQgE/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCprfTp6Gkqr603SgB8py9G-vow8A', + }, + high: { + id: 'AwCA2adNQgE', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/AwCA2adNQgE/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCprfTp6Gkqr603SgB8py9G-vow8A', + }, + }, + channelTitle: 'Cafe De Anatolia', + liveBroadcastContent: null, + publishTime: null, + }, + }, + { + kind: null, + etag: null, + id: { + videoId: 'sDeKjAouKEQ', + }, + snippet: { + publishedAt: '2 years ago', + channelId: 'UCehwgzlM3jtgWJjkIUgyITw', + title: 'Cafe De Anatolia - Oriental Lounge Music خنیا Beautiful Arabic Chillout 音楽 Mix', + description: 'Cafe De Anatolia - Oriental Lounge Music خنیا Beautiful Arabic Chillout 音楽 Mix', + thumbnails: { + default: { + id: 'sDeKjAouKEQ', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/sDeKjAouKEQ/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDs72cWc9EaFx5auIgsym0kDNhegg', + }, + medium: { + id: 'sDeKjAouKEQ', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/sDeKjAouKEQ/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDs72cWc9EaFx5auIgsym0kDNhegg', + }, + high: { + id: 'sDeKjAouKEQ', + width: 720, + height: 404, + url: 'https://i.ytimg.com/vi/sDeKjAouKEQ/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDs72cWc9EaFx5auIgsym0kDNhegg', + }, + }, + channelTitle: 'Cafe De Anatolia LOUNGE', + liveBroadcastContent: null, + publishTime: null, + }, + }, + ], +}; diff --git a/apps/shell/src/mocks/videolist.ts b/apps/shell/src/mocks/videolist.ts new file mode 100644 index 0000000..cf7706e --- /dev/null +++ b/apps/shell/src/mocks/videolist.ts @@ -0,0 +1,96 @@ +export const VIDEOLIST_MOCK = [ + { + kind: null, + etag: null, + pageInfo: { + totalResults: 1, + resultsPerPage: 1, + }, + items: [ + { + kind: null, + etag: null, + id: 'G31l5knrVQo', + snippet: { + publishedAt: 'Jan 11, 2017', + channelId: 'UCWaZJ2Mu5zjfhZoEEMxs1MQ', + title: 'Dreaming of Arabia | Oriental Lounge Music', + description: + 'Dreaming of Arabia | Oriental Lounge Music\n---\nYou can find all of our music on Spotify, Apple Music and Amazon Music:\nhttps://spoti.fi/3atGnyA\nhttps://amzn.to/3cNp6RS \nhttps://apple.co/3Bo8jPm', + thumbnails: { + default: { + id: 'G31l5knrVQo', + width: 1920, + height: 1080, + url: 'https://i.ytimg.com/vi_webp/G31l5knrVQo/maxresdefault.webp', + }, + medium: { + id: 'G31l5knrVQo', + width: 1920, + height: 1080, + url: 'https://i.ytimg.com/vi_webp/G31l5knrVQo/maxresdefault.webp', + }, + high: { + id: 'G31l5knrVQo', + width: 1920, + height: 1080, + url: 'https://i.ytimg.com/vi_webp/G31l5knrVQo/maxresdefault.webp', + }, + standard: { + id: 'G31l5knrVQo', + width: 1920, + height: 1080, + url: 'https://i.ytimg.com/vi_webp/G31l5knrVQo/maxresdefault.webp', + }, + maxres: { + id: 'G31l5knrVQo', + width: 1920, + height: 1080, + url: 'https://i.ytimg.com/vi_webp/G31l5knrVQo/maxresdefault.webp', + }, + }, + channelTitle: "Buddha's Lounge", + tags: [ + 'Best Chill out Music ( Arabic Dream Lounge )', + 'arabic lounge music', + 'arabic dance music', + 'Arabic lounge', + 'arabian music', + 'middle east music', + 'lounge music', + 'chill out music', + 'lounge music chill', + 'ultra lounge music', + 'chill lounge music', + 'arabian lounge music', + 'lunge music', + 'Relax Music (Relaxation)', + 'Arabian Music (Musical Genre)', + 'Arabic Music (Musical Genre)', + 'Arabian Lounge Music (Musical Genre)', + 'Arabic Lounge Music (Musical Genre)', + 'Wonderful Chill Out Music (Egypt vs. India Balance', + ], + categoryId: null, + liveBroadcastContent: null, + localized: null, + }, + contentDetails: { + duration: '1:00:00', + dimension: null, + definition: null, + caption: null, + licensedContent: null, + contentRating: null, + projection: null, + }, + statistics: { + viewCount: 13842365, + likeCount: 0, + favoriteCount: null, + commentCount: null, + }, + }, + ], + }, +];