Implement video channel views
This commit is contained in:
parent
cc918ac3f4
commit
170726f523
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,3 +0,0 @@
|
||||||
export * from './account-routing.module'
|
|
||||||
export * from './account.component'
|
|
||||||
export * from './account.module'
|
|
|
@ -26,7 +26,7 @@ export class AccountVideoChannelsComponent implements OnInit {
|
||||||
// Parent get the account for us
|
// Parent get the account for us
|
||||||
this.accountService.accountLoaded
|
this.accountService.accountLoaded
|
||||||
.do(account => this.account = account)
|
.do(account => this.account = account)
|
||||||
.flatMap(account => this.videoChannelService.getVideoChannels(account.id))
|
.flatMap(account => this.videoChannelService.listAccountVideoChannels(account.id))
|
||||||
.map(res => res.data)
|
.map(res => res.data)
|
||||||
.subscribe(videoChannels => this.videoChannels = videoChannels)
|
.subscribe(videoChannels => this.videoChannels = videoChannels)
|
||||||
}
|
}
|
|
@ -1,15 +1,15 @@
|
||||||
import { NgModule } from '@angular/core'
|
import { NgModule } from '@angular/core'
|
||||||
import { RouterModule, Routes } from '@angular/router'
|
import { RouterModule, Routes } from '@angular/router'
|
||||||
import { MetaGuard } from '@ngx-meta/core'
|
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 { AccountVideosComponent } from './account-videos/account-videos.component'
|
||||||
import { AccountAboutComponent } from './account-about/account-about.component'
|
import { AccountAboutComponent } from './account-about/account-about.component'
|
||||||
import { AccountVideoChannelsComponent } from './account-video-channels/account-video-channels.component'
|
import { AccountVideoChannelsComponent } from './account-video-channels/account-video-channels.component'
|
||||||
|
|
||||||
const accountRoutes: Routes = [
|
const accountsRoutes: Routes = [
|
||||||
{
|
{
|
||||||
path: ':accountId',
|
path: ':accountId',
|
||||||
component: AccountComponent,
|
component: AccountsComponent,
|
||||||
canActivateChild: [ MetaGuard ],
|
canActivateChild: [ MetaGuard ],
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
|
@ -49,7 +49,7 @@ const accountRoutes: Routes = [
|
||||||
]
|
]
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [ RouterModule.forChild(accountRoutes) ],
|
imports: [ RouterModule.forChild(accountsRoutes) ],
|
||||||
exports: [ RouterModule ]
|
exports: [ RouterModule ]
|
||||||
})
|
})
|
||||||
export class AccountRoutingModule {}
|
export class AccountsRoutingModule {}
|
|
@ -1,12 +1,12 @@
|
||||||
<div *ngIf="account" class="row">
|
<div *ngIf="account" class="row">
|
||||||
<div class="sub-menu">
|
<div class="sub-menu">
|
||||||
|
|
||||||
<div class="account">
|
<div class="actor">
|
||||||
<img [src]="account.avatarUrl" alt="Avatar" />
|
<img [src]="account.avatarUrl" alt="Avatar" />
|
||||||
|
|
||||||
<div class="account-info">
|
<div class="actor-info">
|
||||||
<div class="account-display-name">{{ account.displayName }}</div>
|
<div class="actor-display-name">{{ account.displayName }}</div>
|
||||||
<div class="account-followers">{{ account.followersCount }} subscribers</div>
|
<div class="actor-followers">{{ account.followersCount }} subscribers</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
6
client/src/app/+accounts/accounts.component.scss
Normal file
6
client/src/app/+accounts/accounts.component.scss
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
@import '_variables';
|
||||||
|
@import '_mixins';
|
||||||
|
|
||||||
|
.sub-menu {
|
||||||
|
@include sub-menu-with-actor;
|
||||||
|
}
|
|
@ -4,11 +4,10 @@ import { AccountService } from '@app/shared/account/account.service'
|
||||||
import { Account } from '@app/shared/account/account.model'
|
import { Account } from '@app/shared/account/account.model'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'my-account',
|
templateUrl: './accounts.component.html',
|
||||||
templateUrl: './account.component.html',
|
styleUrls: [ './accounts.component.scss' ]
|
||||||
styleUrls: [ './account.component.scss' ]
|
|
||||||
})
|
})
|
||||||
export class AccountComponent implements OnInit {
|
export class AccountsComponent implements OnInit {
|
||||||
account: Account
|
account: Account
|
||||||
|
|
||||||
constructor (
|
constructor (
|
|
@ -1,28 +1,28 @@
|
||||||
import { NgModule } from '@angular/core'
|
import { NgModule } from '@angular/core'
|
||||||
import { SharedModule } from '../shared'
|
import { SharedModule } from '../shared'
|
||||||
import { AccountRoutingModule } from './account-routing.module'
|
import { AccountsRoutingModule } from './accounts-routing.module'
|
||||||
import { AccountComponent } from './account.component'
|
import { AccountsComponent } from './accounts.component'
|
||||||
import { AccountVideosComponent } from './account-videos/account-videos.component'
|
import { AccountVideosComponent } from './account-videos/account-videos.component'
|
||||||
import { AccountAboutComponent } from './account-about/account-about.component'
|
import { AccountAboutComponent } from './account-about/account-about.component'
|
||||||
import { AccountVideoChannelsComponent } from './account-video-channels/account-video-channels.component'
|
import { AccountVideoChannelsComponent } from './account-video-channels/account-video-channels.component'
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
AccountRoutingModule,
|
AccountsRoutingModule,
|
||||||
SharedModule
|
SharedModule
|
||||||
],
|
],
|
||||||
|
|
||||||
declarations: [
|
declarations: [
|
||||||
AccountComponent,
|
AccountsComponent,
|
||||||
AccountVideosComponent,
|
AccountVideosComponent,
|
||||||
AccountVideoChannelsComponent,
|
AccountVideoChannelsComponent,
|
||||||
AccountAboutComponent
|
AccountAboutComponent
|
||||||
],
|
],
|
||||||
|
|
||||||
exports: [
|
exports: [
|
||||||
AccountComponent
|
AccountsComponent
|
||||||
],
|
],
|
||||||
|
|
||||||
providers: []
|
providers: []
|
||||||
})
|
})
|
||||||
export class AccountModule { }
|
export class AccountsModule { }
|
3
client/src/app/+accounts/index.ts
Normal file
3
client/src/app/+accounts/index.ts
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
export * from './accounts-routing.module'
|
||||||
|
export * from './accounts.component'
|
||||||
|
export * from './accounts.module'
|
3
client/src/app/+video-channels/index.ts
Normal file
3
client/src/app/+video-channels/index.ts
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
export * from './video-channels-routing.module'
|
||||||
|
export * from './video-channels.component'
|
||||||
|
export * from './video-channels.module'
|
|
@ -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>
|
|
@ -0,0 +1,8 @@
|
||||||
|
@import '_variables';
|
||||||
|
@import '_mixins';
|
||||||
|
|
||||||
|
.small-title {
|
||||||
|
@include in-content-small-title;
|
||||||
|
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
|
@ -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'
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
.title-page-single {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 {}
|
23
client/src/app/+video-channels/video-channels.component.html
Normal file
23
client/src/app/+video-channels/video-channels.component.html
Normal file
|
@ -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>
|
|
@ -0,0 +1,6 @@
|
||||||
|
@import '_variables';
|
||||||
|
@import '_mixins';
|
||||||
|
|
||||||
|
.sub-menu {
|
||||||
|
@include sub-menu-with-actor;
|
||||||
|
}
|
24
client/src/app/+video-channels/video-channels.component.ts
Normal file
24
client/src/app/+video-channels/video-channels.component.ts
Normal file
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
26
client/src/app/+video-channels/video-channels.module.ts
Normal file
26
client/src/app/+video-channels/video-channels.module.ts
Normal file
|
@ -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 { }
|
|
@ -9,8 +9,12 @@ const routes: Routes = [
|
||||||
loadChildren: './+admin/admin.module#AdminModule'
|
loadChildren: './+admin/admin.module#AdminModule'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'account',
|
path: 'accounts',
|
||||||
loadChildren: './+account/account.module#AccountModule'
|
loadChildren: './+accounts/accounts.module#AccountsModule'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'video-channels',
|
||||||
|
loadChildren: './+video-channels/video-channels.module#VideoChannelsModule'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -9,16 +9,29 @@ import { VideoChannel as VideoChannelServer } from '../../../../../shared/models
|
||||||
import { AccountService } from '../account/account.service'
|
import { AccountService } from '../account/account.service'
|
||||||
import { ResultList } from '../../../../../shared'
|
import { ResultList } from '../../../../../shared'
|
||||||
import { VideoChannel } from './video-channel.model'
|
import { VideoChannel } from './video-channel.model'
|
||||||
|
import { ReplaySubject } from 'rxjs/ReplaySubject'
|
||||||
|
import { environment } from '../../../environments/environment'
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class VideoChannelService {
|
export class VideoChannelService {
|
||||||
|
static BASE_VIDEO_CHANNEL_URL = environment.apiUrl + '/api/v1/video-channels/'
|
||||||
|
|
||||||
|
videoChannelLoaded = new ReplaySubject<VideoChannel>(1)
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
private authHttp: HttpClient,
|
private authHttp: HttpClient,
|
||||||
private restExtractor: RestExtractor,
|
private restExtractor: RestExtractor,
|
||||||
private restService: RestService
|
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')
|
return this.authHttp.get<ResultList<VideoChannelServer>>(AccountService.BASE_ACCOUNT_URL + accountId + '/video-channels')
|
||||||
.map(res => this.extractVideoChannels(res))
|
.map(res => this.extractVideoChannels(res))
|
||||||
.catch((res) => this.restExtractor.handleError(res))
|
.catch((res) => this.restExtractor.handleError(res))
|
||||||
|
|
|
@ -12,6 +12,6 @@
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="video-miniature-created-at-views">{{ video.publishedAt | myFromNow }} - {{ video.views | myNumberFormatter }} views</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>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -23,6 +23,8 @@ import { Video } from './video.model'
|
||||||
import { objectToFormData } from '@app/shared/misc/utils'
|
import { objectToFormData } from '@app/shared/misc/utils'
|
||||||
import { Account } from '@app/shared/account/account.model'
|
import { Account } from '@app/shared/account/account.model'
|
||||||
import { AccountService } from '@app/shared/account/account.service'
|
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()
|
@Injectable()
|
||||||
export class VideoService {
|
export class VideoService {
|
||||||
|
@ -115,6 +117,22 @@ export class VideoService {
|
||||||
.catch((res) => this.restExtractor.handleError(res))
|
.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 (
|
getVideos (
|
||||||
videoPagination: ComponentPagination,
|
videoPagination: ComponentPagination,
|
||||||
sort: VideoSortField,
|
sort: VideoSortField,
|
||||||
|
@ -175,6 +193,13 @@ export class VideoService {
|
||||||
return this.buildBaseFeedUrls(params)
|
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 (
|
searchVideos (
|
||||||
search: string,
|
search: string,
|
||||||
videoPagination: ComponentPagination,
|
videoPagination: ComponentPagination,
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="video-info-by">
|
<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>
|
<span>By {{ video.by }}</span>
|
||||||
<img [src]="video.accountAvatarUrl" alt="Account avatar" />
|
<img [src]="video.accountAvatarUrl" alt="Account avatar" />
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -321,3 +321,47 @@
|
||||||
font-weight: $font-bold;
|
font-weight: $font-bold;
|
||||||
font-size: 13px;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -140,7 +140,7 @@ describe('Test videos API validator', function () {
|
||||||
let path: string
|
let path: string
|
||||||
|
|
||||||
before(async function () {
|
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 () {
|
it('Should fail with a bad start pagination', async function () {
|
||||||
|
|
|
@ -47,7 +47,6 @@ describe('Test multiple servers', function () {
|
||||||
let servers: ServerInfo[] = []
|
let servers: ServerInfo[] = []
|
||||||
const toRemove = []
|
const toRemove = []
|
||||||
let videoUUID = ''
|
let videoUUID = ''
|
||||||
let accountId: number
|
|
||||||
let videoChannelId: number
|
let videoChannelId: number
|
||||||
|
|
||||||
before(async function () {
|
before(async function () {
|
||||||
|
@ -58,17 +57,12 @@ describe('Test multiple servers', function () {
|
||||||
// Get the access tokens
|
// Get the access tokens
|
||||||
await setAccessTokensToServers(servers)
|
await setAccessTokensToServers(servers)
|
||||||
|
|
||||||
{
|
|
||||||
const res = await getAccountsList(servers[0].url)
|
|
||||||
accountId = res.body.data[0].id
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
const videoChannel = {
|
const videoChannel = {
|
||||||
name: 'my channel',
|
name: 'my channel',
|
||||||
description: 'super 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)
|
const channelRes = await getVideoChannelsList(servers[ 0 ].url, 0, 1)
|
||||||
videoChannelId = channelRes.body.data[ 0 ].id
|
videoChannelId = channelRes.body.data[ 0 ].id
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user