diff options
author | Chocobozzz <me@florianbigard.com> | 2018-08-21 16:18:59 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2018-08-27 09:41:54 +0200 |
commit | 22a16e36f6526887ed8f5e5d3c9f9e5da0b4a8cd (patch) | |
tree | 93c53e0619f966bd9ff1bb698c411277a9447a41 /client/src/app/shared/video | |
parent | 99492dbc0d87ef54d0dab7d8d44f8d0de5722bdd (diff) | |
download | PeerTube-22a16e36f6526887ed8f5e5d3c9f9e5da0b4a8cd.tar.gz PeerTube-22a16e36f6526887ed8f5e5d3c9f9e5da0b4a8cd.tar.zst PeerTube-22a16e36f6526887ed8f5e5d3c9f9e5da0b4a8cd.zip |
Add local user subscriptions
Diffstat (limited to 'client/src/app/shared/video')
8 files changed, 72 insertions, 16 deletions
diff --git a/client/src/app/shared/video/abstract-video-list.html b/client/src/app/shared/video/abstract-video-list.html index e8ded6ab8..d4b00c07c 100644 --- a/client/src/app/shared/video/abstract-video-list.html +++ b/client/src/app/shared/video/abstract-video-list.html | |||
@@ -14,7 +14,7 @@ | |||
14 | <div *ngFor="let videos of videoPages" class="videos-page"> | 14 | <div *ngFor="let videos of videoPages" class="videos-page"> |
15 | <my-video-miniature | 15 | <my-video-miniature |
16 | class="ng-animate" | 16 | class="ng-animate" |
17 | *ngFor="let video of videos" [video]="video" [user]="user" | 17 | *ngFor="let video of videos" [video]="video" [user]="user" [ownerDisplayType]="ownerDisplayType" |
18 | > | 18 | > |
19 | </my-video-miniature> | 19 | </my-video-miniature> |
20 | </div> | 20 | </div> |
diff --git a/client/src/app/shared/video/abstract-video-list.ts b/client/src/app/shared/video/abstract-video-list.ts index 59d3c1ebe..b8fd7f8eb 100644 --- a/client/src/app/shared/video/abstract-video-list.ts +++ b/client/src/app/shared/video/abstract-video-list.ts | |||
@@ -11,6 +11,7 @@ import { VideoSortField } from './sort-field.type' | |||
11 | import { Video } from './video.model' | 11 | import { Video } from './video.model' |
12 | import { I18n } from '@ngx-translate/i18n-polyfill' | 12 | import { I18n } from '@ngx-translate/i18n-polyfill' |
13 | import { ScreenService } from '@app/shared/misc/screen.service' | 13 | import { ScreenService } from '@app/shared/misc/screen.service' |
14 | import { OwnerDisplayType } from '@app/shared/video/video-miniature.component' | ||
14 | 15 | ||
15 | export abstract class AbstractVideoList implements OnInit, OnDestroy { | 16 | export abstract class AbstractVideoList implements OnInit, OnDestroy { |
16 | private static LINES_PER_PAGE = 4 | 17 | private static LINES_PER_PAGE = 4 |
@@ -34,6 +35,7 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy { | |||
34 | videoWidth: number | 35 | videoWidth: number |
35 | videoHeight: number | 36 | videoHeight: number |
36 | videoPages: Video[][] = [] | 37 | videoPages: Video[][] = [] |
38 | ownerDisplayType: OwnerDisplayType = 'account' | ||
37 | 39 | ||
38 | protected baseVideoWidth = 215 | 40 | protected baseVideoWidth = 215 |
39 | protected baseVideoHeight = 230 | 41 | protected baseVideoHeight = 230 |
diff --git a/client/src/app/shared/video/video-details.model.ts b/client/src/app/shared/video/video-details.model.ts index d346f985c..fa4ca7f93 100644 --- a/client/src/app/shared/video/video-details.model.ts +++ b/client/src/app/shared/video/video-details.model.ts | |||
@@ -1,14 +1,8 @@ | |||
1 | import { | 1 | import { UserRight, VideoConstant, VideoDetails as VideoDetailsServerModel, VideoFile, VideoState } from '../../../../../shared' |
2 | UserRight, | ||
3 | VideoChannel, | ||
4 | VideoConstant, | ||
5 | VideoDetails as VideoDetailsServerModel, | ||
6 | VideoFile, | ||
7 | VideoState | ||
8 | } from '../../../../../shared' | ||
9 | import { AuthUser } from '../../core' | 2 | import { AuthUser } from '../../core' |
10 | import { Video } from '../../shared/video/video.model' | 3 | import { Video } from '../../shared/video/video.model' |
11 | import { Account } from '@app/shared/account/account.model' | 4 | import { Account } from '@app/shared/account/account.model' |
5 | import { VideoChannel } from '@app/shared/video-channel/video-channel.model' | ||
12 | 6 | ||
13 | export class VideoDetails extends Video implements VideoDetailsServerModel { | 7 | export class VideoDetails extends Video implements VideoDetailsServerModel { |
14 | descriptionPath: string | 8 | descriptionPath: string |
@@ -30,7 +24,7 @@ export class VideoDetails extends Video implements VideoDetailsServerModel { | |||
30 | 24 | ||
31 | this.descriptionPath = hash.descriptionPath | 25 | this.descriptionPath = hash.descriptionPath |
32 | this.files = hash.files | 26 | this.files = hash.files |
33 | this.channel = hash.channel | 27 | this.channel = new VideoChannel(hash.channel) |
34 | this.account = new Account(hash.account) | 28 | this.account = new Account(hash.account) |
35 | this.tags = hash.tags | 29 | this.tags = hash.tags |
36 | this.support = hash.support | 30 | this.support = hash.support |
diff --git a/client/src/app/shared/video/video-miniature.component.html b/client/src/app/shared/video/video-miniature.component.html index 3010e5ccc..de84bccf9 100644 --- a/client/src/app/shared/video/video-miniature.component.html +++ b/client/src/app/shared/video/video-miniature.component.html | |||
@@ -10,6 +10,12 @@ | |||
10 | </a> | 10 | </a> |
11 | 11 | ||
12 | <span i18n class="video-miniature-created-at-views">{{ video.publishedAt | myFromNow }} - {{ video.views | myNumberFormatter }} views</span> | 12 | <span i18n class="video-miniature-created-at-views">{{ video.publishedAt | myFromNow }} - {{ video.views | myNumberFormatter }} views</span> |
13 | <a class="video-miniature-account" [routerLink]="[ '/accounts', video.by ]">{{ video.by }}</a> | 13 | |
14 | <a *ngIf="displayOwnerAccount()" class="video-miniature-account" [routerLink]="[ '/accounts', video.byAccount ]"> | ||
15 | {{ video.byAccount }} | ||
16 | </a> | ||
17 | <a *ngIf="displayOwnerVideoChannel()" class="video-miniature-channel" [routerLink]="[ '/video-channels', video.byVideoChannel ]"> | ||
18 | {{ video.byVideoChannel }} | ||
19 | </a> | ||
14 | </div> | 20 | </div> |
15 | </div> | 21 | </div> |
diff --git a/client/src/app/shared/video/video-miniature.component.scss b/client/src/app/shared/video/video-miniature.component.scss index 588eea3a7..6883650f4 100644 --- a/client/src/app/shared/video/video-miniature.component.scss +++ b/client/src/app/shared/video/video-miniature.component.scss | |||
@@ -38,7 +38,8 @@ | |||
38 | font-size: 13px; | 38 | font-size: 13px; |
39 | } | 39 | } |
40 | 40 | ||
41 | .video-miniature-account { | 41 | .video-miniature-account, |
42 | .video-miniature-channel { | ||
42 | @include disable-default-a-behaviour; | 43 | @include disable-default-a-behaviour; |
43 | 44 | ||
44 | display: block; | 45 | display: block; |
diff --git a/client/src/app/shared/video/video-miniature.component.ts b/client/src/app/shared/video/video-miniature.component.ts index d3f6dc1f6..07193ebd5 100644 --- a/client/src/app/shared/video/video-miniature.component.ts +++ b/client/src/app/shared/video/video-miniature.component.ts | |||
@@ -1,20 +1,51 @@ | |||
1 | import { Component, Input } from '@angular/core' | 1 | import { Component, Input, OnInit } from '@angular/core' |
2 | import { User } from '../users' | 2 | import { User } from '../users' |
3 | import { Video } from './video.model' | 3 | import { Video } from './video.model' |
4 | import { ServerService } from '@app/core' | 4 | import { ServerService } from '@app/core' |
5 | 5 | ||
6 | export type OwnerDisplayType = 'account' | 'videoChannel' | 'auto' | ||
7 | |||
6 | @Component({ | 8 | @Component({ |
7 | selector: 'my-video-miniature', | 9 | selector: 'my-video-miniature', |
8 | styleUrls: [ './video-miniature.component.scss' ], | 10 | styleUrls: [ './video-miniature.component.scss' ], |
9 | templateUrl: './video-miniature.component.html' | 11 | templateUrl: './video-miniature.component.html' |
10 | }) | 12 | }) |
11 | export class VideoMiniatureComponent { | 13 | export class VideoMiniatureComponent implements OnInit { |
12 | @Input() user: User | 14 | @Input() user: User |
13 | @Input() video: Video | 15 | @Input() video: Video |
16 | @Input() ownerDisplayType: OwnerDisplayType = 'account' | ||
17 | |||
18 | private ownerDisplayTypeChosen: 'account' | 'videoChannel' | ||
14 | 19 | ||
15 | constructor (private serverService: ServerService) { } | 20 | constructor (private serverService: ServerService) { } |
16 | 21 | ||
22 | ngOnInit () { | ||
23 | if (this.ownerDisplayType === 'account' || this.ownerDisplayType === 'videoChannel') { | ||
24 | this.ownerDisplayTypeChosen = this.ownerDisplayType | ||
25 | return | ||
26 | } | ||
27 | |||
28 | // If the video channel name an UUID (not really displayable, we changed this behaviour in v1.0.0-beta.12) | ||
29 | // -> Use the account name | ||
30 | if ( | ||
31 | this.video.channel.name === `${this.video.account.name}_channel` || | ||
32 | this.video.channel.name.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/) | ||
33 | ) { | ||
34 | this.ownerDisplayTypeChosen = 'account' | ||
35 | } else { | ||
36 | this.ownerDisplayTypeChosen = 'videoChannel' | ||
37 | } | ||
38 | } | ||
39 | |||
17 | isVideoBlur () { | 40 | isVideoBlur () { |
18 | return this.video.isVideoNSFWForUser(this.user, this.serverService.getConfig()) | 41 | return this.video.isVideoNSFWForUser(this.user, this.serverService.getConfig()) |
19 | } | 42 | } |
43 | |||
44 | displayOwnerAccount () { | ||
45 | return this.ownerDisplayTypeChosen === 'account' | ||
46 | } | ||
47 | |||
48 | displayOwnerVideoChannel () { | ||
49 | return this.ownerDisplayTypeChosen === 'videoChannel' | ||
50 | } | ||
20 | } | 51 | } |
diff --git a/client/src/app/shared/video/video.model.ts b/client/src/app/shared/video/video.model.ts index df8253301..d80c10459 100644 --- a/client/src/app/shared/video/video.model.ts +++ b/client/src/app/shared/video/video.model.ts | |||
@@ -8,9 +8,12 @@ import { Actor } from '@app/shared/actor/actor.model' | |||
8 | import { VideoScheduleUpdate } from '../../../../../shared/models/videos/video-schedule-update.model' | 8 | import { VideoScheduleUpdate } from '../../../../../shared/models/videos/video-schedule-update.model' |
9 | 9 | ||
10 | export class Video implements VideoServerModel { | 10 | export class Video implements VideoServerModel { |
11 | by: string | 11 | byVideoChannel: string |
12 | byAccount: string | ||
13 | |||
12 | accountAvatarUrl: string | 14 | accountAvatarUrl: string |
13 | videoChannelAvatarUrl: string | 15 | videoChannelAvatarUrl: string |
16 | |||
14 | createdAt: Date | 17 | createdAt: Date |
15 | updatedAt: Date | 18 | updatedAt: Date |
16 | publishedAt: Date | 19 | publishedAt: Date |
@@ -110,7 +113,8 @@ export class Video implements VideoServerModel { | |||
110 | this.account = hash.account | 113 | this.account = hash.account |
111 | this.channel = hash.channel | 114 | this.channel = hash.channel |
112 | 115 | ||
113 | this.by = Actor.CREATE_BY_STRING(hash.account.name, hash.account.host) | 116 | this.byAccount = Actor.CREATE_BY_STRING(hash.account.name, hash.account.host) |
117 | this.byVideoChannel = Actor.CREATE_BY_STRING(hash.channel.name, hash.channel.host) | ||
114 | this.accountAvatarUrl = Actor.GET_ACTOR_AVATAR_URL(this.account) | 118 | this.accountAvatarUrl = Actor.GET_ACTOR_AVATAR_URL(this.account) |
115 | this.videoChannelAvatarUrl = Actor.GET_ACTOR_AVATAR_URL(this.channel) | 119 | this.videoChannelAvatarUrl = Actor.GET_ACTOR_AVATAR_URL(this.channel) |
116 | 120 | ||
diff --git a/client/src/app/shared/video/video.service.ts b/client/src/app/shared/video/video.service.ts index e44f1ee65..1a934c8e2 100644 --- a/client/src/app/shared/video/video.service.ts +++ b/client/src/app/shared/video/video.service.ts | |||
@@ -27,6 +27,7 @@ import { Account } from '@app/shared/account/account.model' | |||
27 | import { AccountService } from '@app/shared/account/account.service' | 27 | import { AccountService } from '@app/shared/account/account.service' |
28 | import { VideoChannelService } from '@app/shared/video-channel/video-channel.service' | 28 | import { VideoChannelService } from '@app/shared/video-channel/video-channel.service' |
29 | import { ServerService } from '@app/core' | 29 | import { ServerService } from '@app/core' |
30 | import { UserSubscriptionService } from '@app/shared/user-subscription' | ||
30 | 31 | ||
31 | @Injectable() | 32 | @Injectable() |
32 | export class VideoService { | 33 | export class VideoService { |
@@ -157,6 +158,23 @@ export class VideoService { | |||
157 | ) | 158 | ) |
158 | } | 159 | } |
159 | 160 | ||
161 | getUserSubscriptionVideos ( | ||
162 | videoPagination: ComponentPagination, | ||
163 | sort: VideoSortField | ||
164 | ): Observable<{ videos: Video[], totalVideos: number }> { | ||
165 | const pagination = this.restService.componentPaginationToRestPagination(videoPagination) | ||
166 | |||
167 | let params = new HttpParams() | ||
168 | params = this.restService.addRestGetParams(params, pagination, sort) | ||
169 | |||
170 | return this.authHttp | ||
171 | .get<ResultList<Video>>(UserSubscriptionService.BASE_USER_SUBSCRIPTIONS_URL + '/videos', { params }) | ||
172 | .pipe( | ||
173 | switchMap(res => this.extractVideos(res)), | ||
174 | catchError(err => this.restExtractor.handleError(err)) | ||
175 | ) | ||
176 | } | ||
177 | |||
160 | getVideos ( | 178 | getVideos ( |
161 | videoPagination: ComponentPagination, | 179 | videoPagination: ComponentPagination, |
162 | sort: VideoSortField, | 180 | sort: VideoSortField, |