From 170726f523ff48f89da45473fc53ca54784f43dd Mon Sep 17 00:00:00 2001 From: Chocobozzz <me@florianbigard.com> Date: Wed, 25 Apr 2018 16:56:13 +0200 Subject: [PATCH] Implement video channel views --- .../src/app/+account/account.component.scss | 46 ------------ client/src/app/+account/index.ts | 3 - .../account-about.component.html | 0 .../account-about.component.scss | 0 .../account-about/account-about.component.ts | 0 .../account-video-channels.component.html | 0 .../account-video-channels.component.scss | 0 .../account-video-channels.component.ts | 2 +- .../account-videos.component.scss | 0 .../account-videos.component.ts | 0 .../accounts-routing.module.ts} | 10 +-- .../accounts.component.html} | 8 +-- .../src/app/+accounts/accounts.component.scss | 6 ++ .../accounts.component.ts} | 7 +- .../accounts.module.ts} | 12 ++-- client/src/app/+accounts/index.ts | 3 + client/src/app/+video-channels/index.ts | 3 + .../video-channel-about.component.html | 12 ++++ .../video-channel-about.component.scss | 8 +++ .../video-channel-about.component.ts | 32 +++++++++ .../video-channel-videos.component.scss | 3 + .../video-channel-videos.component.ts | 71 +++++++++++++++++++ .../video-channels-routing.module.ts | 45 ++++++++++++ .../video-channels.component.html | 23 ++++++ .../video-channels.component.scss | 6 ++ .../video-channels.component.ts | 24 +++++++ .../+video-channels/video-channels.module.ts | 26 +++++++ client/src/app/app-routing.module.ts | 8 ++- .../video-channel/video-channel.service.ts | 15 +++- .../video/video-miniature.component.html | 4 +- client/src/app/shared/video/video.service.ts | 25 +++++++ .../+video-watch/video-watch.component.html | 2 +- client/src/sass/include/_mixins.scss | 44 ++++++++++++ server/tests/api/check-params/videos.ts | 2 +- server/tests/api/videos/multiple-servers.ts | 8 +-- 35 files changed, 375 insertions(+), 83 deletions(-) delete mode 100644 client/src/app/+account/account.component.scss delete mode 100644 client/src/app/+account/index.ts rename client/src/app/{+account => +accounts}/account-about/account-about.component.html (100%) rename client/src/app/{+account => +accounts}/account-about/account-about.component.scss (100%) rename client/src/app/{+account => +accounts}/account-about/account-about.component.ts (100%) rename client/src/app/{+account => +accounts}/account-video-channels/account-video-channels.component.html (100%) rename client/src/app/{+account => +accounts}/account-video-channels/account-video-channels.component.scss (100%) rename client/src/app/{+account => +accounts}/account-video-channels/account-video-channels.component.ts (92%) rename client/src/app/{+account => +accounts}/account-videos/account-videos.component.scss (100%) rename client/src/app/{+account => +accounts}/account-videos/account-videos.component.ts (100%) rename client/src/app/{+account/account-routing.module.ts => +accounts/accounts-routing.module.ts} (84%) rename client/src/app/{+account/account.component.html => +accounts/accounts.component.html} (71%) create mode 100644 client/src/app/+accounts/accounts.component.scss rename client/src/app/{+account/account.component.ts => +accounts/accounts.component.ts} (77%) rename client/src/app/{+account/account.module.ts => +accounts/accounts.module.ts} (70%) create mode 100644 client/src/app/+accounts/index.ts create mode 100644 client/src/app/+video-channels/index.ts create mode 100644 client/src/app/+video-channels/video-channel-about/video-channel-about.component.html create mode 100644 client/src/app/+video-channels/video-channel-about/video-channel-about.component.scss create mode 100644 client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts create mode 100644 client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.scss create mode 100644 client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.ts create mode 100644 client/src/app/+video-channels/video-channels-routing.module.ts create mode 100644 client/src/app/+video-channels/video-channels.component.html create mode 100644 client/src/app/+video-channels/video-channels.component.scss create mode 100644 client/src/app/+video-channels/video-channels.component.ts create mode 100644 client/src/app/+video-channels/video-channels.module.ts diff --git a/client/src/app/+account/account.component.scss b/client/src/app/+account/account.component.scss deleted file mode 100644 index c7b8f038f..000000000 --- a/client/src/app/+account/account.component.scss +++ /dev/null @@ -1,46 +0,0 @@ -@import '_variables'; -@import '_mixins'; - -.sub-menu { - height: 160px; - display: flex; - flex-direction: column; - align-items: start; - - .account { - display: flex; - margin-top: 20px; - margin-bottom: 20px; - - img { - @include avatar(80px); - - margin-right: 20px; - } - - .account-info { - display: flex; - flex-direction: column; - justify-content: center; - - .account-display-name { - font-size: 23px; - font-weight: $font-bold; - } - - .account-followers { - font-size: 15px; - } - } - } - - .links { - margin-top: 0; - margin-bottom: 10px; - - a { - margin-top: 0; - margin-bottom: 0; - } - } -} \ No newline at end of file diff --git a/client/src/app/+account/index.ts b/client/src/app/+account/index.ts deleted file mode 100644 index dc56ffdbd..000000000 --- a/client/src/app/+account/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './account-routing.module' -export * from './account.component' -export * from './account.module' diff --git a/client/src/app/+account/account-about/account-about.component.html b/client/src/app/+accounts/account-about/account-about.component.html similarity index 100% rename from client/src/app/+account/account-about/account-about.component.html rename to client/src/app/+accounts/account-about/account-about.component.html diff --git a/client/src/app/+account/account-about/account-about.component.scss b/client/src/app/+accounts/account-about/account-about.component.scss similarity index 100% rename from client/src/app/+account/account-about/account-about.component.scss rename to client/src/app/+accounts/account-about/account-about.component.scss diff --git a/client/src/app/+account/account-about/account-about.component.ts b/client/src/app/+accounts/account-about/account-about.component.ts similarity index 100% rename from client/src/app/+account/account-about/account-about.component.ts rename to client/src/app/+accounts/account-about/account-about.component.ts diff --git a/client/src/app/+account/account-video-channels/account-video-channels.component.html b/client/src/app/+accounts/account-video-channels/account-video-channels.component.html similarity index 100% rename from client/src/app/+account/account-video-channels/account-video-channels.component.html rename to client/src/app/+accounts/account-video-channels/account-video-channels.component.html diff --git a/client/src/app/+account/account-video-channels/account-video-channels.component.scss b/client/src/app/+accounts/account-video-channels/account-video-channels.component.scss similarity index 100% rename from client/src/app/+account/account-video-channels/account-video-channels.component.scss rename to client/src/app/+accounts/account-video-channels/account-video-channels.component.scss diff --git a/client/src/app/+account/account-video-channels/account-video-channels.component.ts b/client/src/app/+accounts/account-video-channels/account-video-channels.component.ts similarity index 92% rename from client/src/app/+account/account-video-channels/account-video-channels.component.ts rename to client/src/app/+accounts/account-video-channels/account-video-channels.component.ts index 8915eb622..4c5782f9d 100644 --- a/client/src/app/+account/account-video-channels/account-video-channels.component.ts +++ b/client/src/app/+accounts/account-video-channels/account-video-channels.component.ts @@ -26,7 +26,7 @@ export class AccountVideoChannelsComponent implements OnInit { // Parent get the account for us this.accountService.accountLoaded .do(account => this.account = account) - .flatMap(account => this.videoChannelService.getVideoChannels(account.id)) + .flatMap(account => this.videoChannelService.listAccountVideoChannels(account.id)) .map(res => res.data) .subscribe(videoChannels => this.videoChannels = videoChannels) } diff --git a/client/src/app/+account/account-videos/account-videos.component.scss b/client/src/app/+accounts/account-videos/account-videos.component.scss similarity index 100% rename from client/src/app/+account/account-videos/account-videos.component.scss rename to client/src/app/+accounts/account-videos/account-videos.component.scss diff --git a/client/src/app/+account/account-videos/account-videos.component.ts b/client/src/app/+accounts/account-videos/account-videos.component.ts similarity index 100% rename from client/src/app/+account/account-videos/account-videos.component.ts rename to client/src/app/+accounts/account-videos/account-videos.component.ts diff --git a/client/src/app/+account/account-routing.module.ts b/client/src/app/+accounts/accounts-routing.module.ts similarity index 84% rename from client/src/app/+account/account-routing.module.ts rename to client/src/app/+accounts/accounts-routing.module.ts index f72d8373f..ffe606b43 100644 --- a/client/src/app/+account/account-routing.module.ts +++ b/client/src/app/+accounts/accounts-routing.module.ts @@ -1,15 +1,15 @@ import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' import { MetaGuard } from '@ngx-meta/core' -import { AccountComponent } from './account.component' +import { AccountsComponent } from './accounts.component' import { AccountVideosComponent } from './account-videos/account-videos.component' import { AccountAboutComponent } from './account-about/account-about.component' import { AccountVideoChannelsComponent } from './account-video-channels/account-video-channels.component' -const accountRoutes: Routes = [ +const accountsRoutes: Routes = [ { path: ':accountId', - component: AccountComponent, + component: AccountsComponent, canActivateChild: [ MetaGuard ], children: [ { @@ -49,7 +49,7 @@ const accountRoutes: Routes = [ ] @NgModule({ - imports: [ RouterModule.forChild(accountRoutes) ], + imports: [ RouterModule.forChild(accountsRoutes) ], exports: [ RouterModule ] }) -export class AccountRoutingModule {} +export class AccountsRoutingModule {} diff --git a/client/src/app/+account/account.component.html b/client/src/app/+accounts/accounts.component.html similarity index 71% rename from client/src/app/+account/account.component.html rename to client/src/app/+accounts/accounts.component.html index d0e99edda..549676e5a 100644 --- a/client/src/app/+account/account.component.html +++ b/client/src/app/+accounts/accounts.component.html @@ -1,12 +1,12 @@ <div *ngIf="account" class="row"> <div class="sub-menu"> - <div class="account"> + <div class="actor"> <img [src]="account.avatarUrl" alt="Avatar" /> - <div class="account-info"> - <div class="account-display-name">{{ account.displayName }}</div> - <div class="account-followers">{{ account.followersCount }} subscribers</div> + <div class="actor-info"> + <div class="actor-display-name">{{ account.displayName }}</div> + <div class="actor-followers">{{ account.followersCount }} subscribers</div> </div> </div> diff --git a/client/src/app/+accounts/accounts.component.scss b/client/src/app/+accounts/accounts.component.scss new file mode 100644 index 000000000..909b65bc7 --- /dev/null +++ b/client/src/app/+accounts/accounts.component.scss @@ -0,0 +1,6 @@ +@import '_variables'; +@import '_mixins'; + +.sub-menu { + @include sub-menu-with-actor; +} \ No newline at end of file diff --git a/client/src/app/+account/account.component.ts b/client/src/app/+accounts/accounts.component.ts similarity index 77% rename from client/src/app/+account/account.component.ts rename to client/src/app/+accounts/accounts.component.ts index d936ce2fe..1298803c3 100644 --- a/client/src/app/+account/account.component.ts +++ b/client/src/app/+accounts/accounts.component.ts @@ -4,11 +4,10 @@ import { AccountService } from '@app/shared/account/account.service' import { Account } from '@app/shared/account/account.model' @Component({ - selector: 'my-account', - templateUrl: './account.component.html', - styleUrls: [ './account.component.scss' ] + templateUrl: './accounts.component.html', + styleUrls: [ './accounts.component.scss' ] }) -export class AccountComponent implements OnInit { +export class AccountsComponent implements OnInit { account: Account constructor ( diff --git a/client/src/app/+account/account.module.ts b/client/src/app/+accounts/accounts.module.ts similarity index 70% rename from client/src/app/+account/account.module.ts rename to client/src/app/+accounts/accounts.module.ts index 82ef06e76..8e679822a 100644 --- a/client/src/app/+account/account.module.ts +++ b/client/src/app/+accounts/accounts.module.ts @@ -1,28 +1,28 @@ import { NgModule } from '@angular/core' import { SharedModule } from '../shared' -import { AccountRoutingModule } from './account-routing.module' -import { AccountComponent } from './account.component' +import { AccountsRoutingModule } from './accounts-routing.module' +import { AccountsComponent } from './accounts.component' import { AccountVideosComponent } from './account-videos/account-videos.component' import { AccountAboutComponent } from './account-about/account-about.component' import { AccountVideoChannelsComponent } from './account-video-channels/account-video-channels.component' @NgModule({ imports: [ - AccountRoutingModule, + AccountsRoutingModule, SharedModule ], declarations: [ - AccountComponent, + AccountsComponent, AccountVideosComponent, AccountVideoChannelsComponent, AccountAboutComponent ], exports: [ - AccountComponent + AccountsComponent ], providers: [] }) -export class AccountModule { } +export class AccountsModule { } diff --git a/client/src/app/+accounts/index.ts b/client/src/app/+accounts/index.ts new file mode 100644 index 000000000..4dfb6f586 --- /dev/null +++ b/client/src/app/+accounts/index.ts @@ -0,0 +1,3 @@ +export * from './accounts-routing.module' +export * from './accounts.component' +export * from './accounts.module' diff --git a/client/src/app/+video-channels/index.ts b/client/src/app/+video-channels/index.ts new file mode 100644 index 000000000..6683d1b12 --- /dev/null +++ b/client/src/app/+video-channels/index.ts @@ -0,0 +1,3 @@ +export * from './video-channels-routing.module' +export * from './video-channels.component' +export * from './video-channels.module' diff --git a/client/src/app/+video-channels/video-channel-about/video-channel-about.component.html b/client/src/app/+video-channels/video-channel-about/video-channel-about.component.html new file mode 100644 index 000000000..65ad6f541 --- /dev/null +++ b/client/src/app/+video-channels/video-channel-about/video-channel-about.component.html @@ -0,0 +1,12 @@ +<div *ngIf="videoChannel" class="row"> + <div class="description col-md-6 col-sm-12"> + <div class="small-title">Description</div> + <div class="content">{{ getVideoChannelDescription() }}</div> + </div> + + <div class="stats col-md-6 col-sm-12"> + <div class="small-title">Stats</div> + + <div class="content">Created {{ videoChannel.createdAt | date }}</div> + </div> +</div> \ No newline at end of file diff --git a/client/src/app/+video-channels/video-channel-about/video-channel-about.component.scss b/client/src/app/+video-channels/video-channel-about/video-channel-about.component.scss new file mode 100644 index 000000000..b1be7d4ed --- /dev/null +++ b/client/src/app/+video-channels/video-channel-about/video-channel-about.component.scss @@ -0,0 +1,8 @@ +@import '_variables'; +@import '_mixins'; + +.small-title { + @include in-content-small-title; + + margin-bottom: 20px; +} diff --git a/client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts b/client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts new file mode 100644 index 000000000..5d435708e --- /dev/null +++ b/client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit } from '@angular/core' +import { ActivatedRoute } from '@angular/router' +import 'rxjs/add/observable/from' +import 'rxjs/add/operator/concatAll' +import { VideoChannelService } from '@app/shared/video-channel/video-channel.service' +import { VideoChannel } from '@app/shared/video-channel/video-channel.model' + +@Component({ + selector: 'my-video-channel-about', + templateUrl: './video-channel-about.component.html', + styleUrls: [ './video-channel-about.component.scss' ] +}) +export class VideoChannelAboutComponent implements OnInit { + videoChannel: VideoChannel + + constructor ( + protected route: ActivatedRoute, + private videoChannelService: VideoChannelService + ) { } + + ngOnInit () { + // Parent get the video channel for us + this.videoChannelService.videoChannelLoaded + .subscribe(videoChannel => this.videoChannel = videoChannel) + } + + getVideoChannelDescription () { + if (this.videoChannel.description) return this.videoChannel.description + + return 'No description' + } +} diff --git a/client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.scss b/client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.scss new file mode 100644 index 000000000..2ba85c031 --- /dev/null +++ b/client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.scss @@ -0,0 +1,3 @@ +.title-page-single { + margin-top: 0; +} \ No newline at end of file diff --git a/client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.ts b/client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.ts new file mode 100644 index 000000000..3cda630d3 --- /dev/null +++ b/client/src/app/+video-channels/video-channel-videos/video-channel-videos.component.ts @@ -0,0 +1,71 @@ +import { Component, OnDestroy, OnInit } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' +import { Location } from '@angular/common' +import { immutableAssign } from '@app/shared/misc/utils' +import { NotificationsService } from 'angular2-notifications' +import 'rxjs/add/observable/from' +import 'rxjs/add/operator/concatAll' +import { AuthService } from '../../core/auth' +import { ConfirmService } from '../../core/confirm' +import { AbstractVideoList } from '../../shared/video/abstract-video-list' +import { VideoService } from '../../shared/video/video.service' +import { VideoChannelService } from '@app/shared/video-channel/video-channel.service' +import { VideoChannel } from '@app/shared/video-channel/video-channel.model' + +@Component({ + selector: 'my-video-channel-videos', + templateUrl: '../../shared/video/abstract-video-list.html', + styleUrls: [ + '../../shared/video/abstract-video-list.scss', + './video-channel-videos.component.scss' + ] +}) +export class VideoChannelVideosComponent extends AbstractVideoList implements OnInit, OnDestroy { + titlePage = 'Published videos' + marginContent = false // Disable margin + currentRoute = '/video-channel/videos' + loadOnInit = false + + private videoChannel: VideoChannel + + constructor ( + protected router: Router, + protected route: ActivatedRoute, + protected authService: AuthService, + protected notificationsService: NotificationsService, + protected confirmService: ConfirmService, + protected location: Location, + private videoChannelService: VideoChannelService, + private videoService: VideoService + ) { + super() + } + + ngOnInit () { + super.ngOnInit() + + // Parent get the video channel for us + this.videoChannelService.videoChannelLoaded + .subscribe(videoChannel => { + this.videoChannel = videoChannel + this.currentRoute = '/video-channel/' + this.videoChannel.uuid + '/videos' + + this.loadMoreVideos(this.pagination.currentPage) + this.generateSyndicationList() + }) + } + + ngOnDestroy () { + super.ngOnDestroy() + } + + getVideosObservable (page: number) { + const newPagination = immutableAssign(this.pagination, { currentPage: page }) + + return this.videoService.getVideoChannelVideos(this.videoChannel, newPagination, this.sort) + } + + generateSyndicationList () { + this.syndicationItems = this.videoService.getVideoChannelFeedUrls(this.videoChannel.id) + } +} diff --git a/client/src/app/+video-channels/video-channels-routing.module.ts b/client/src/app/+video-channels/video-channels-routing.module.ts new file mode 100644 index 000000000..935578d2a --- /dev/null +++ b/client/src/app/+video-channels/video-channels-routing.module.ts @@ -0,0 +1,45 @@ +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' +import { MetaGuard } from '@ngx-meta/core' +import { VideoChannelsComponent } from './video-channels.component' +import { VideoChannelVideosComponent } from './video-channel-videos/video-channel-videos.component' +import { VideoChannelAboutComponent } from './video-channel-about/video-channel-about.component' + +const videoChannelsRoutes: Routes = [ + { + path: ':videoChannelId', + component: VideoChannelsComponent, + canActivateChild: [ MetaGuard ], + children: [ + { + path: '', + redirectTo: 'videos', + pathMatch: 'full' + }, + { + path: 'videos', + component: VideoChannelVideosComponent, + data: { + meta: { + title: 'Video channel videos' + } + } + }, + { + path: 'about', + component: VideoChannelAboutComponent, + data: { + meta: { + title: 'About video channel' + } + } + } + ] + } +] + +@NgModule({ + imports: [ RouterModule.forChild(videoChannelsRoutes) ], + exports: [ RouterModule ] +}) +export class VideoChannelsRoutingModule {} diff --git a/client/src/app/+video-channels/video-channels.component.html b/client/src/app/+video-channels/video-channels.component.html new file mode 100644 index 000000000..098e1eed4 --- /dev/null +++ b/client/src/app/+video-channels/video-channels.component.html @@ -0,0 +1,23 @@ +<div *ngIf="videoChannel" class="row"> + <div class="sub-menu"> + + <div class="actor"> + <img [src]="videoChannel.avatarUrl" alt="Avatar" /> + + <div class="actor-info"> + <div class="actor-display-name">{{ videoChannel.displayName }}</div> + <div class="actor-followers">{{ videoChannel.followersCount }} subscribers</div> + </div> + </div> + + <div class="links"> + <a routerLink="videos" routerLinkActive="active" class="title-page">Videos</a> + + <a routerLink="about" routerLinkActive="active" class="title-page">About</a> + </div> + </div> + + <div class="margin-content"> + <router-outlet></router-outlet> + </div> +</div> diff --git a/client/src/app/+video-channels/video-channels.component.scss b/client/src/app/+video-channels/video-channels.component.scss new file mode 100644 index 000000000..909b65bc7 --- /dev/null +++ b/client/src/app/+video-channels/video-channels.component.scss @@ -0,0 +1,6 @@ +@import '_variables'; +@import '_mixins'; + +.sub-menu { + @include sub-menu-with-actor; +} \ No newline at end of file diff --git a/client/src/app/+video-channels/video-channels.component.ts b/client/src/app/+video-channels/video-channels.component.ts new file mode 100644 index 000000000..5eca64fb5 --- /dev/null +++ b/client/src/app/+video-channels/video-channels.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core' +import { ActivatedRoute } from '@angular/router' +import { VideoChannel } from '@app/shared/video-channel/video-channel.model' +import { VideoChannelService } from '@app/shared/video-channel/video-channel.service' + +@Component({ + templateUrl: './video-channels.component.html', + styleUrls: [ './video-channels.component.scss' ] +}) +export class VideoChannelsComponent implements OnInit { + videoChannel: VideoChannel + + constructor ( + private route: ActivatedRoute, + private videoChannelService: VideoChannelService + ) {} + + ngOnInit () { + const videoChannelId = this.route.snapshot.params['videoChannelId'] + + this.videoChannelService.getVideoChannel(videoChannelId) + .subscribe(videoChannel => this.videoChannel = videoChannel) + } +} diff --git a/client/src/app/+video-channels/video-channels.module.ts b/client/src/app/+video-channels/video-channels.module.ts new file mode 100644 index 000000000..a09ea6f11 --- /dev/null +++ b/client/src/app/+video-channels/video-channels.module.ts @@ -0,0 +1,26 @@ +import { NgModule } from '@angular/core' +import { SharedModule } from '../shared' +import { VideoChannelsRoutingModule } from './video-channels-routing.module' +import { VideoChannelsComponent } from './video-channels.component' +import { VideoChannelVideosComponent } from './video-channel-videos/video-channel-videos.component' +import { VideoChannelAboutComponent } from './video-channel-about/video-channel-about.component' + +@NgModule({ + imports: [ + VideoChannelsRoutingModule, + SharedModule + ], + + declarations: [ + VideoChannelsComponent, + VideoChannelVideosComponent, + VideoChannelAboutComponent + ], + + exports: [ + VideoChannelsComponent + ], + + providers: [] +}) +export class VideoChannelsModule { } diff --git a/client/src/app/app-routing.module.ts b/client/src/app/app-routing.module.ts index 1d55b4cea..799748cfa 100644 --- a/client/src/app/app-routing.module.ts +++ b/client/src/app/app-routing.module.ts @@ -9,8 +9,12 @@ const routes: Routes = [ loadChildren: './+admin/admin.module#AdminModule' }, { - path: 'account', - loadChildren: './+account/account.module#AccountModule' + path: 'accounts', + loadChildren: './+accounts/accounts.module#AccountsModule' + }, + { + path: 'video-channels', + loadChildren: './+video-channels/video-channels.module#VideoChannelsModule' } ] diff --git a/client/src/app/shared/video-channel/video-channel.service.ts b/client/src/app/shared/video-channel/video-channel.service.ts index 1f9088c38..d8efcc171 100644 --- a/client/src/app/shared/video-channel/video-channel.service.ts +++ b/client/src/app/shared/video-channel/video-channel.service.ts @@ -9,16 +9,29 @@ import { VideoChannel as VideoChannelServer } from '../../../../../shared/models import { AccountService } from '../account/account.service' import { ResultList } from '../../../../../shared' import { VideoChannel } from './video-channel.model' +import { ReplaySubject } from 'rxjs/ReplaySubject' +import { environment } from '../../../environments/environment' @Injectable() export class VideoChannelService { + static BASE_VIDEO_CHANNEL_URL = environment.apiUrl + '/api/v1/video-channels/' + + videoChannelLoaded = new ReplaySubject<VideoChannel>(1) + constructor ( private authHttp: HttpClient, private restExtractor: RestExtractor, private restService: RestService ) {} - getVideoChannels (accountId: number): Observable<ResultList<VideoChannel>> { + getVideoChannel (videoChannelUUID: string) { + return this.authHttp.get<VideoChannel>(VideoChannelService.BASE_VIDEO_CHANNEL_URL + videoChannelUUID) + .map(videoChannelHash => new VideoChannel(videoChannelHash)) + .do(videoChannel => this.videoChannelLoaded.next(videoChannel)) + .catch((res) => this.restExtractor.handleError(res)) + } + + listAccountVideoChannels (accountId: number): Observable<ResultList<VideoChannel>> { return this.authHttp.get<ResultList<VideoChannelServer>>(AccountService.BASE_ACCOUNT_URL + accountId + '/video-channels') .map(res => this.extractVideoChannels(res)) .catch((res) => this.restExtractor.handleError(res)) diff --git a/client/src/app/shared/video/video-miniature.component.html b/client/src/app/shared/video/video-miniature.component.html index d0b305509..e26cb058a 100644 --- a/client/src/app/shared/video/video-miniature.component.html +++ b/client/src/app/shared/video/video-miniature.component.html @@ -5,13 +5,13 @@ <span class="video-miniature-name"> <a class="video-miniature-name" - [routerLink]="['/videos/watch', video.uuid]" [attr.title]="video.name" [ngClass]="{ 'blur-filter': isVideoBlur() }" + [routerLink]="[ '/videos/watch', video.uuid ]" [attr.title]="video.name" [ngClass]="{ 'blur-filter': isVideoBlur() }" > {{ video.name }} </a> </span> <span class="video-miniature-created-at-views">{{ video.publishedAt | myFromNow }} - {{ video.views | myNumberFormatter }} views</span> - <a class="video-miniature-account" [routerLink]="[ '/account', video.account.id ]">{{ video.by }}</a> + <a class="video-miniature-account" [routerLink]="[ '/accounts', video.account.id ]">{{ video.by }}</a> </div> </div> diff --git a/client/src/app/shared/video/video.service.ts b/client/src/app/shared/video/video.service.ts index f82aa7389..8870cbee4 100644 --- a/client/src/app/shared/video/video.service.ts +++ b/client/src/app/shared/video/video.service.ts @@ -23,6 +23,8 @@ import { Video } from './video.model' import { objectToFormData } from '@app/shared/misc/utils' import { Account } from '@app/shared/account/account.model' import { AccountService } from '@app/shared/account/account.service' +import { VideoChannel } from '../../../../../shared/models/videos' +import { VideoChannelService } from '@app/shared/video-channel/video-channel.service' @Injectable() export class VideoService { @@ -115,6 +117,22 @@ export class VideoService { .catch((res) => this.restExtractor.handleError(res)) } + getVideoChannelVideos ( + videoChannel: VideoChannel, + videoPagination: ComponentPagination, + sort: VideoSortField + ): Observable<{ videos: Video[], totalVideos: number}> { + const pagination = this.restService.componentPaginationToRestPagination(videoPagination) + + let params = new HttpParams() + params = this.restService.addRestGetParams(params, pagination, sort) + + return this.authHttp + .get(VideoChannelService.BASE_VIDEO_CHANNEL_URL + videoChannel.uuid + '/videos', { params }) + .map(this.extractVideos) + .catch((res) => this.restExtractor.handleError(res)) + } + getVideos ( videoPagination: ComponentPagination, sort: VideoSortField, @@ -175,6 +193,13 @@ export class VideoService { return this.buildBaseFeedUrls(params) } + getVideoChannelFeedUrls (videoChannelId: number) { + let params = this.restService.addRestGetParams(new HttpParams()) + params = params.set('videoChannelId', videoChannelId.toString()) + + return this.buildBaseFeedUrls(params) + } + searchVideos ( search: string, videoPagination: ComponentPagination, diff --git a/client/src/app/videos/+video-watch/video-watch.component.html b/client/src/app/videos/+video-watch/video-watch.component.html index 5d3361561..f38e90927 100644 --- a/client/src/app/videos/+video-watch/video-watch.component.html +++ b/client/src/app/videos/+video-watch/video-watch.component.html @@ -22,7 +22,7 @@ </div> <div class="video-info-by"> - <a [routerLink]="[ '/account', video.account.id ]" title="Go the account page"> + <a [routerLink]="[ '/accounts', video.account.id ]" title="Go the account page"> <span>By {{ video.by }}</span> <img [src]="video.accountAvatarUrl" alt="Account avatar" /> </a> diff --git a/client/src/sass/include/_mixins.scss b/client/src/sass/include/_mixins.scss index cbf9b566a..c43bd9803 100644 --- a/client/src/sass/include/_mixins.scss +++ b/client/src/sass/include/_mixins.scss @@ -320,4 +320,48 @@ color: $orange-color; font-weight: $font-bold; font-size: 13px; +} + +@mixin sub-menu-with-actor { + height: 160px; + display: flex; + flex-direction: column; + align-items: start; + + .actor { + display: flex; + margin-top: 20px; + margin-bottom: 20px; + + img { + @include avatar(80px); + + margin-right: 20px; + } + + .actor-info { + display: flex; + flex-direction: column; + justify-content: center; + + .actor-display-name { + font-size: 23px; + font-weight: $font-bold; + } + + .actor-followers { + font-size: 15px; + } + } + } + + .links { + margin-top: 0; + margin-bottom: 10px; + + a { + margin-top: 0; + margin-bottom: 0; + } + } } \ No newline at end of file diff --git a/server/tests/api/check-params/videos.ts b/server/tests/api/check-params/videos.ts index 850ad12e0..499a4fc94 100644 --- a/server/tests/api/check-params/videos.ts +++ b/server/tests/api/check-params/videos.ts @@ -140,7 +140,7 @@ describe('Test videos API validator', function () { let path: string before(async function () { - path = '/api/v1/accounts/' + accountUUID + '/video-channels/' + channelUUID + '/videos' + path = '/api/v1/video-channels/' + channelUUID + '/videos' }) it('Should fail with a bad start pagination', async function () { diff --git a/server/tests/api/videos/multiple-servers.ts b/server/tests/api/videos/multiple-servers.ts index 6238cdc08..e462a2d47 100644 --- a/server/tests/api/videos/multiple-servers.ts +++ b/server/tests/api/videos/multiple-servers.ts @@ -47,7 +47,6 @@ describe('Test multiple servers', function () { let servers: ServerInfo[] = [] const toRemove = [] let videoUUID = '' - let accountId: number let videoChannelId: number before(async function () { @@ -58,17 +57,12 @@ describe('Test multiple servers', function () { // Get the access tokens await setAccessTokensToServers(servers) - { - const res = await getAccountsList(servers[0].url) - accountId = res.body.data[0].id - } - { const videoChannel = { name: 'my channel', description: 'super channel' } - await addVideoChannel(servers[ 0 ].url, servers[ 0 ].accessToken, accountId, videoChannel) + await addVideoChannel(servers[ 0 ].url, servers[ 0 ].accessToken, videoChannel) const channelRes = await getVideoChannelsList(servers[ 0 ].url, 0, 1) videoChannelId = channelRes.body.data[ 0 ].id }