aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/app')
-rw-r--r--client/src/app/+accounts/account-video-channels/account-video-channels.component.ts6
-rw-r--r--client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.ts3
-rw-r--r--client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts3
-rw-r--r--client/src/app/search/search.service.ts6
-rw-r--r--client/src/app/shared/rest/component-pagination.model.ts4
-rw-r--r--client/src/app/shared/rest/rest.service.ts4
-rw-r--r--client/src/app/shared/user-subscription/user-subscription.service.ts4
-rw-r--r--client/src/app/shared/users/user-history.service.ts4
-rw-r--r--client/src/app/shared/users/user-notification.service.ts4
-rw-r--r--client/src/app/shared/video-blacklist/video-blacklist.service.ts4
-rw-r--r--client/src/app/shared/video-channel/video-channel.service.ts4
-rw-r--r--client/src/app/shared/video-playlist/video-playlist.service.ts8
-rw-r--r--client/src/app/shared/video/abstract-video-list.ts24
-rw-r--r--client/src/app/shared/video/video.service.ts36
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comment.service.ts6
-rw-r--r--client/src/app/videos/video-list/video-local.component.ts3
-rw-r--r--client/src/app/videos/video-list/video-most-liked.component.ts3
-rw-r--r--client/src/app/videos/video-list/video-recently-added.component.ts3
-rw-r--r--client/src/app/videos/video-list/video-trending.component.ts3
-rw-r--r--client/src/app/videos/video-list/video-user-subscriptions.component.ts3
20 files changed, 75 insertions, 60 deletions
diff --git a/client/src/app/+accounts/account-video-channels/account-video-channels.component.ts b/client/src/app/+accounts/account-video-channels/account-video-channels.component.ts
index 29d2991fd..5572064c1 100644
--- a/client/src/app/+accounts/account-video-channels/account-video-channels.component.ts
+++ b/client/src/app/+accounts/account-video-channels/account-video-channels.component.ts
@@ -25,12 +25,14 @@ export class AccountVideoChannelsComponent implements OnInit, OnDestroy {
25 25
26 channelPagination: ComponentPagination = { 26 channelPagination: ComponentPagination = {
27 currentPage: 1, 27 currentPage: 1,
28 itemsPerPage: 2 28 itemsPerPage: 2,
29 totalItems: null
29 } 30 }
30 31
31 videosPagination: ComponentPagination = { 32 videosPagination: ComponentPagination = {
32 currentPage: 1, 33 currentPage: 1,
33 itemsPerPage: 12 34 itemsPerPage: 12,
35 totalItems: null
34 } 36 }
35 videosSort: VideoSortField = '-publishedAt' 37 videosSort: VideoSortField = '-publishedAt'
36 38
diff --git a/client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.ts b/client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.ts
index b30b136bd..f18c2e6ca 100644
--- a/client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.ts
+++ b/client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.ts
@@ -25,7 +25,8 @@ export class PluginListInstalledComponent implements OnInit {
25 25
26 pagination: ComponentPagination = { 26 pagination: ComponentPagination = {
27 currentPage: 1, 27 currentPage: 1,
28 itemsPerPage: 10 28 itemsPerPage: 10,
29 totalItems: null
29 } 30 }
30 sort = 'name' 31 sort = 'name'
31 32
diff --git a/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts b/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts
index 65566ab79..e08ded3f1 100644
--- a/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts
+++ b/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts
@@ -25,7 +25,8 @@ export class PluginSearchComponent implements OnInit {
25 25
26 pagination: ComponentPagination = { 26 pagination: ComponentPagination = {
27 currentPage: 1, 27 currentPage: 1,
28 itemsPerPage: 10 28 itemsPerPage: 10,
29 totalItems: null
29 } 30 }
30 sort = '-popularity' 31 sort = '-popularity'
31 32
diff --git a/client/src/app/search/search.service.ts b/client/src/app/search/search.service.ts
index bb5532757..7610fee8c 100644
--- a/client/src/app/search/search.service.ts
+++ b/client/src/app/search/search.service.ts
@@ -2,7 +2,7 @@ import { catchError, map, switchMap } from 'rxjs/operators'
2import { HttpClient, HttpParams } from '@angular/common/http' 2import { HttpClient, HttpParams } from '@angular/common/http'
3import { Injectable } from '@angular/core' 3import { Injectable } from '@angular/core'
4import { Observable } from 'rxjs' 4import { Observable } from 'rxjs'
5import { ComponentPagination } from '@app/shared/rest/component-pagination.model' 5import { ComponentPaginationLight } from '@app/shared/rest/component-pagination.model'
6import { VideoService } from '@app/shared/video/video.service' 6import { VideoService } from '@app/shared/video/video.service'
7import { RestExtractor, RestService } from '@app/shared' 7import { RestExtractor, RestService } from '@app/shared'
8import { environment } from '../../environments/environment' 8import { environment } from '../../environments/environment'
@@ -25,7 +25,7 @@ export class SearchService {
25 25
26 searchVideos (parameters: { 26 searchVideos (parameters: {
27 search: string, 27 search: string,
28 componentPagination: ComponentPagination, 28 componentPagination: ComponentPaginationLight,
29 advancedSearch: AdvancedSearch 29 advancedSearch: AdvancedSearch
30 }): Observable<ResultList<Video>> { 30 }): Observable<ResultList<Video>> {
31 const { search, componentPagination, advancedSearch } = parameters 31 const { search, componentPagination, advancedSearch } = parameters
@@ -51,7 +51,7 @@ export class SearchService {
51 51
52 searchVideoChannels (parameters: { 52 searchVideoChannels (parameters: {
53 search: string, 53 search: string,
54 componentPagination: ComponentPagination 54 componentPagination: ComponentPaginationLight
55 }): Observable<ResultList<VideoChannel>> { 55 }): Observable<ResultList<VideoChannel>> {
56 const { search, componentPagination } = parameters 56 const { search, componentPagination } = parameters
57 57
diff --git a/client/src/app/shared/rest/component-pagination.model.ts b/client/src/app/shared/rest/component-pagination.model.ts
index 85160d445..bcb73ed0f 100644
--- a/client/src/app/shared/rest/component-pagination.model.ts
+++ b/client/src/app/shared/rest/component-pagination.model.ts
@@ -1,9 +1,11 @@
1export interface ComponentPagination { 1export interface ComponentPagination {
2 currentPage: number 2 currentPage: number
3 itemsPerPage: number 3 itemsPerPage: number
4 totalItems?: number 4 totalItems: number
5} 5}
6 6
7export type ComponentPaginationLight = Omit<ComponentPagination, 'totalItems'>
8
7export function hasMoreItems (componentPagination: ComponentPagination) { 9export function hasMoreItems (componentPagination: ComponentPagination) {
8 // No results 10 // No results
9 if (componentPagination.totalItems === 0) return false 11 if (componentPagination.totalItems === 0) return false
diff --git a/client/src/app/shared/rest/rest.service.ts b/client/src/app/shared/rest/rest.service.ts
index e6d4e6e5e..16bb6d82c 100644
--- a/client/src/app/shared/rest/rest.service.ts
+++ b/client/src/app/shared/rest/rest.service.ts
@@ -1,7 +1,7 @@
1import { Injectable } from '@angular/core' 1import { Injectable } from '@angular/core'
2import { HttpParams } from '@angular/common/http' 2import { HttpParams } from '@angular/common/http'
3import { SortMeta } from 'primeng/components/common/sortmeta' 3import { SortMeta } from 'primeng/components/common/sortmeta'
4import { ComponentPagination } from './component-pagination.model' 4import { ComponentPagination, ComponentPaginationLight } from './component-pagination.model'
5 5
6import { RestPagination } from './rest-pagination' 6import { RestPagination } from './rest-pagination'
7 7
@@ -47,7 +47,7 @@ export class RestService {
47 return params 47 return params
48 } 48 }
49 49
50 componentPaginationToRestPagination (componentPagination: ComponentPagination): RestPagination { 50 componentPaginationToRestPagination (componentPagination: ComponentPaginationLight): RestPagination {
51 const start: number = (componentPagination.currentPage - 1) * componentPagination.itemsPerPage 51 const start: number = (componentPagination.currentPage - 1) * componentPagination.itemsPerPage
52 const count: number = componentPagination.itemsPerPage 52 const count: number = componentPagination.itemsPerPage
53 53
diff --git a/client/src/app/shared/user-subscription/user-subscription.service.ts b/client/src/app/shared/user-subscription/user-subscription.service.ts
index cfd5b100f..83df40a43 100644
--- a/client/src/app/shared/user-subscription/user-subscription.service.ts
+++ b/client/src/app/shared/user-subscription/user-subscription.service.ts
@@ -8,7 +8,7 @@ import { Observable, ReplaySubject, Subject } from 'rxjs'
8import { VideoChannel } from '@app/shared/video-channel/video-channel.model' 8import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
9import { VideoChannelService } from '@app/shared/video-channel/video-channel.service' 9import { VideoChannelService } from '@app/shared/video-channel/video-channel.service'
10import { VideoChannel as VideoChannelServer } from '../../../../../shared/models/videos' 10import { VideoChannel as VideoChannelServer } from '../../../../../shared/models/videos'
11import { ComponentPagination } from '@app/shared/rest/component-pagination.model' 11import { ComponentPaginationLight } from '@app/shared/rest/component-pagination.model'
12 12
13type SubscriptionExistResult = { [ uri: string ]: boolean } 13type SubscriptionExistResult = { [ uri: string ]: boolean }
14 14
@@ -54,7 +54,7 @@ export class UserSubscriptionService {
54 ) 54 )
55 } 55 }
56 56
57 listSubscriptions (componentPagination: ComponentPagination): Observable<ResultList<VideoChannel>> { 57 listSubscriptions (componentPagination: ComponentPaginationLight): Observable<ResultList<VideoChannel>> {
58 const url = UserSubscriptionService.BASE_USER_SUBSCRIPTIONS_URL 58 const url = UserSubscriptionService.BASE_USER_SUBSCRIPTIONS_URL
59 59
60 const pagination = this.restService.componentPaginationToRestPagination(componentPagination) 60 const pagination = this.restService.componentPaginationToRestPagination(componentPagination)
diff --git a/client/src/app/shared/users/user-history.service.ts b/client/src/app/shared/users/user-history.service.ts
index 9ed25bfc7..b358cdf20 100644
--- a/client/src/app/shared/users/user-history.service.ts
+++ b/client/src/app/shared/users/user-history.service.ts
@@ -5,7 +5,7 @@ import { RestExtractor } from '../rest/rest-extractor.service'
5import { RestService } from '../rest/rest.service' 5import { RestService } from '../rest/rest.service'
6import { Video } from '../video/video.model' 6import { Video } from '../video/video.model'
7import { catchError, map, switchMap } from 'rxjs/operators' 7import { catchError, map, switchMap } from 'rxjs/operators'
8import { ComponentPagination } from '@app/shared/rest/component-pagination.model' 8import { ComponentPaginationLight } from '@app/shared/rest/component-pagination.model'
9import { VideoService } from '@app/shared/video/video.service' 9import { VideoService } from '@app/shared/video/video.service'
10import { ResultList } from '../../../../../shared' 10import { ResultList } from '../../../../../shared'
11 11
@@ -20,7 +20,7 @@ export class UserHistoryService {
20 private videoService: VideoService 20 private videoService: VideoService
21 ) {} 21 ) {}
22 22
23 getUserVideosHistory (historyPagination: ComponentPagination) { 23 getUserVideosHistory (historyPagination: ComponentPaginationLight) {
24 const pagination = this.restService.componentPaginationToRestPagination(historyPagination) 24 const pagination = this.restService.componentPaginationToRestPagination(historyPagination)
25 25
26 let params = new HttpParams() 26 let params = new HttpParams()
diff --git a/client/src/app/shared/users/user-notification.service.ts b/client/src/app/shared/users/user-notification.service.ts
index ae0bc9cb1..e525a1d58 100644
--- a/client/src/app/shared/users/user-notification.service.ts
+++ b/client/src/app/shared/users/user-notification.service.ts
@@ -6,7 +6,7 @@ import { environment } from '../../../environments/environment'
6import { ResultList, UserNotification as UserNotificationServer, UserNotificationSetting } from '../../../../../shared' 6import { ResultList, UserNotification as UserNotificationServer, UserNotificationSetting } from '../../../../../shared'
7import { UserNotification } from './user-notification.model' 7import { UserNotification } from './user-notification.model'
8import { AuthService } from '../../core' 8import { AuthService } from '../../core'
9import { ComponentPagination } from '../rest/component-pagination.model' 9import { ComponentPaginationLight } from '../rest/component-pagination.model'
10import { User } from '../users/user.model' 10import { User } from '../users/user.model'
11import { UserNotificationSocket } from '@app/core/notification/user-notification-socket.service' 11import { UserNotificationSocket } from '@app/core/notification/user-notification-socket.service'
12 12
@@ -23,7 +23,7 @@ export class UserNotificationService {
23 private userNotificationSocket: UserNotificationSocket 23 private userNotificationSocket: UserNotificationSocket
24 ) {} 24 ) {}
25 25
26 listMyNotifications (pagination: ComponentPagination, unread?: boolean, ignoreLoadingBar = false) { 26 listMyNotifications (pagination: ComponentPaginationLight, unread?: boolean, ignoreLoadingBar = false) {
27 let params = new HttpParams() 27 let params = new HttpParams()
28 params = this.restService.addRestGetParams(params, this.restService.componentPaginationToRestPagination(pagination)) 28 params = this.restService.addRestGetParams(params, this.restService.componentPaginationToRestPagination(pagination))
29 29
diff --git a/client/src/app/shared/video-blacklist/video-blacklist.service.ts b/client/src/app/shared/video-blacklist/video-blacklist.service.ts
index d65da85fe..491fa698b 100644
--- a/client/src/app/shared/video-blacklist/video-blacklist.service.ts
+++ b/client/src/app/shared/video-blacklist/video-blacklist.service.ts
@@ -7,7 +7,7 @@ import { VideoBlacklist, VideoBlacklistType, ResultList } from '../../../../../s
7import { Video } from '../video/video.model' 7import { Video } from '../video/video.model'
8import { environment } from '../../../environments/environment' 8import { environment } from '../../../environments/environment'
9import { RestExtractor, RestPagination, RestService } from '../rest' 9import { RestExtractor, RestPagination, RestService } from '../rest'
10import { ComponentPagination } from '../rest/component-pagination.model' 10import { ComponentPaginationLight } from '../rest/component-pagination.model'
11 11
12@Injectable() 12@Injectable()
13export class VideoBlacklistService { 13export class VideoBlacklistService {
@@ -34,7 +34,7 @@ export class VideoBlacklistService {
34 ) 34 )
35 } 35 }
36 36
37 getAutoBlacklistedAsVideoList (videoPagination: ComponentPagination): Observable<ResultList<Video>> { 37 getAutoBlacklistedAsVideoList (videoPagination: ComponentPaginationLight): Observable<ResultList<Video>> {
38 const pagination = this.restService.componentPaginationToRestPagination(videoPagination) 38 const pagination = this.restService.componentPaginationToRestPagination(videoPagination)
39 39
40 // prioritize first created since waiting longest 40 // prioritize first created since waiting longest
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 0168d37d9..adb4f4819 100644
--- a/client/src/app/shared/video-channel/video-channel.service.ts
+++ b/client/src/app/shared/video-channel/video-channel.service.ts
@@ -10,7 +10,7 @@ import { VideoChannel } from './video-channel.model'
10import { environment } from '../../../environments/environment' 10import { environment } from '../../../environments/environment'
11import { Account } from '@app/shared/account/account.model' 11import { Account } from '@app/shared/account/account.model'
12import { Avatar } from '../../../../../shared/models/avatars/avatar.model' 12import { Avatar } from '../../../../../shared/models/avatars/avatar.model'
13import { ComponentPagination } from '@app/shared/rest/component-pagination.model' 13import { ComponentPaginationLight } from '@app/shared/rest/component-pagination.model'
14import { RestService } from '@app/shared/rest' 14import { RestService } from '@app/shared/rest'
15 15
16@Injectable() 16@Injectable()
@@ -44,7 +44,7 @@ export class VideoChannelService {
44 ) 44 )
45 } 45 }
46 46
47 listAccountVideoChannels (account: Account, componentPagination?: ComponentPagination): Observable<ResultList<VideoChannel>> { 47 listAccountVideoChannels (account: Account, componentPagination?: ComponentPaginationLight): Observable<ResultList<VideoChannel>> {
48 const pagination = componentPagination 48 const pagination = componentPagination
49 ? this.restService.componentPaginationToRestPagination(componentPagination) 49 ? this.restService.componentPaginationToRestPagination(componentPagination)
50 : { start: 0, count: 20 } 50 : { start: 0, count: 20 }
diff --git a/client/src/app/shared/video-playlist/video-playlist.service.ts b/client/src/app/shared/video-playlist/video-playlist.service.ts
index 7eddf81e1..1ec9315ef 100644
--- a/client/src/app/shared/video-playlist/video-playlist.service.ts
+++ b/client/src/app/shared/video-playlist/video-playlist.service.ts
@@ -18,7 +18,7 @@ import { Account } from '@app/shared/account/account.model'
18import { RestService } from '@app/shared/rest' 18import { RestService } from '@app/shared/rest'
19import { VideoExistInPlaylist, VideosExistInPlaylists } from '@shared/models/videos/playlist/video-exist-in-playlist.model' 19import { VideoExistInPlaylist, VideosExistInPlaylists } from '@shared/models/videos/playlist/video-exist-in-playlist.model'
20import { VideoPlaylistReorder } from '@shared/models/videos/playlist/video-playlist-reorder.model' 20import { VideoPlaylistReorder } from '@shared/models/videos/playlist/video-playlist-reorder.model'
21import { ComponentPagination } from '@app/shared/rest/component-pagination.model' 21import { ComponentPaginationLight } from '@app/shared/rest/component-pagination.model'
22import { VideoPlaylistElement as ServerVideoPlaylistElement } from '@shared/models/videos/playlist/video-playlist-element.model' 22import { VideoPlaylistElement as ServerVideoPlaylistElement } from '@shared/models/videos/playlist/video-playlist-element.model'
23import { VideoPlaylistElement } from '@app/shared/video-playlist/video-playlist-element.model' 23import { VideoPlaylistElement } from '@app/shared/video-playlist/video-playlist-element.model'
24import { uniq } from 'lodash-es' 24import { uniq } from 'lodash-es'
@@ -63,7 +63,7 @@ export class VideoPlaylistService {
63 ) 63 )
64 } 64 }
65 65
66 listChannelPlaylists (videoChannel: VideoChannel, componentPagination: ComponentPagination): Observable<ResultList<VideoPlaylist>> { 66 listChannelPlaylists (videoChannel: VideoChannel, componentPagination: ComponentPaginationLight): Observable<ResultList<VideoPlaylist>> {
67 const url = VideoChannelService.BASE_VIDEO_CHANNEL_URL + videoChannel.nameWithHost + '/video-playlists' 67 const url = VideoChannelService.BASE_VIDEO_CHANNEL_URL + videoChannel.nameWithHost + '/video-playlists'
68 const pagination = this.restService.componentPaginationToRestPagination(componentPagination) 68 const pagination = this.restService.componentPaginationToRestPagination(componentPagination)
69 69
@@ -90,7 +90,7 @@ export class VideoPlaylistService {
90 90
91 listAccountPlaylists ( 91 listAccountPlaylists (
92 account: Account, 92 account: Account,
93 componentPagination: ComponentPagination, 93 componentPagination: ComponentPaginationLight,
94 sort: string, 94 sort: string,
95 search?: string 95 search?: string
96 ): Observable<ResultList<VideoPlaylist>> { 96 ): Observable<ResultList<VideoPlaylist>> {
@@ -236,7 +236,7 @@ export class VideoPlaylistService {
236 236
237 getPlaylistVideos ( 237 getPlaylistVideos (
238 videoPlaylistId: number | string, 238 videoPlaylistId: number | string,
239 componentPagination: ComponentPagination 239 componentPagination: ComponentPaginationLight
240 ): Observable<ResultList<VideoPlaylistElement>> { 240 ): Observable<ResultList<VideoPlaylistElement>> {
241 const path = VideoPlaylistService.BASE_VIDEO_PLAYLIST_URL + videoPlaylistId + '/videos' 241 const path = VideoPlaylistService.BASE_VIDEO_PLAYLIST_URL + videoPlaylistId + '/videos'
242 const pagination = this.restService.componentPaginationToRestPagination(componentPagination) 242 const pagination = this.restService.componentPaginationToRestPagination(componentPagination)
diff --git a/client/src/app/shared/video/abstract-video-list.ts b/client/src/app/shared/video/abstract-video-list.ts
index 06d4ed43d..c2fe6f754 100644
--- a/client/src/app/shared/video/abstract-video-list.ts
+++ b/client/src/app/shared/video/abstract-video-list.ts
@@ -3,7 +3,7 @@ import { OnDestroy, OnInit } from '@angular/core'
3import { ActivatedRoute, Router } from '@angular/router' 3import { ActivatedRoute, Router } from '@angular/router'
4import { fromEvent, Observable, of, Subject, Subscription } from 'rxjs' 4import { fromEvent, Observable, of, Subject, Subscription } from 'rxjs'
5import { AuthService } from '../../core/auth' 5import { AuthService } from '../../core/auth'
6import { ComponentPagination } from '../rest/component-pagination.model' 6import { ComponentPaginationLight } from '../rest/component-pagination.model'
7import { VideoSortField } from './sort-field.type' 7import { VideoSortField } from './sort-field.type'
8import { Video } from './video.model' 8import { Video } from './video.model'
9import { ScreenService } from '@app/shared/misc/screen.service' 9import { ScreenService } from '@app/shared/misc/screen.service'
@@ -13,7 +13,7 @@ import { Notifier, ServerService } from '@app/core'
13import { DisableForReuseHook } from '@app/core/routing/disable-for-reuse-hook' 13import { DisableForReuseHook } from '@app/core/routing/disable-for-reuse-hook'
14import { I18n } from '@ngx-translate/i18n-polyfill' 14import { I18n } from '@ngx-translate/i18n-polyfill'
15import { isLastMonth, isLastWeek, isToday, isYesterday } from '@shared/core-utils/miscs/date' 15import { isLastMonth, isLastWeek, isToday, isYesterday } from '@shared/core-utils/miscs/date'
16import { ResultList, ServerConfig } from '@shared/models' 16import { ServerConfig } from '@shared/models'
17 17
18enum GroupDate { 18enum GroupDate {
19 UNKNOWN = 0, 19 UNKNOWN = 0,
@@ -25,10 +25,9 @@ enum GroupDate {
25} 25}
26 26
27export abstract class AbstractVideoList implements OnInit, OnDestroy, DisableForReuseHook { 27export abstract class AbstractVideoList implements OnInit, OnDestroy, DisableForReuseHook {
28 pagination: ComponentPagination = { 28 pagination: ComponentPaginationLight = {
29 currentPage: 1, 29 currentPage: 1,
30 itemsPerPage: 25, 30 itemsPerPage: 25
31 totalItems: null
32 } 31 }
33 sort: VideoSortField = '-publishedAt' 32 sort: VideoSortField = '-publishedAt'
34 33
@@ -47,6 +46,7 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy, DisableFor
47 groupByDate = false 46 groupByDate = false
48 47
49 videos: Video[] = [] 48 videos: Video[] = []
49 hasDoneFirstQuery = false
50 disabled = false 50 disabled = false
51 51
52 displayOptions: MiniatureDisplayOptions = { 52 displayOptions: MiniatureDisplayOptions = {
@@ -84,7 +84,9 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy, DisableFor
84 private groupedDateLabels: { [id in GroupDate]: string } 84 private groupedDateLabels: { [id in GroupDate]: string }
85 private groupedDates: { [id: number]: GroupDate } = {} 85 private groupedDates: { [id: number]: GroupDate } = {}
86 86
87 abstract getVideosObservable (page: number): Observable<ResultList<Video>> 87 private lastQueryLength: number
88
89 abstract getVideosObservable (page: number): Observable<{ data: Video[] }>
88 90
89 abstract generateSyndicationList (): void 91 abstract generateSyndicationList (): void
90 92
@@ -142,8 +144,8 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy, DisableFor
142 onNearOfBottom () { 144 onNearOfBottom () {
143 if (this.disabled) return 145 if (this.disabled) return
144 146
145 // Last page 147 // No more results
146 if (this.pagination.totalItems <= (this.pagination.currentPage * this.pagination.itemsPerPage)) return 148 if (this.lastQueryLength !== undefined && this.lastQueryLength < this.pagination.itemsPerPage) return
147 149
148 this.pagination.currentPage += 1 150 this.pagination.currentPage += 1
149 151
@@ -154,8 +156,10 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy, DisableFor
154 156
155 loadMoreVideos (reset = false) { 157 loadMoreVideos (reset = false) {
156 this.getVideosObservable(this.pagination.currentPage).subscribe( 158 this.getVideosObservable(this.pagination.currentPage).subscribe(
157 ({ data, total }) => { 159 ({ data }) => {
158 this.pagination.totalItems = total 160 this.hasDoneFirstQuery = true
161 this.lastQueryLength = data.length
162
159 if (reset) this.videos = [] 163 if (reset) this.videos = []
160 this.videos = this.videos.concat(data) 164 this.videos = this.videos.concat(data)
161 165
diff --git a/client/src/app/shared/video/video.service.ts b/client/src/app/shared/video/video.service.ts
index 2dd47d74e..996202154 100644
--- a/client/src/app/shared/video/video.service.ts
+++ b/client/src/app/shared/video/video.service.ts
@@ -15,7 +15,7 @@ import {
15} from '../../../../../shared/models/videos' 15} from '../../../../../shared/models/videos'
16import { FeedFormat } from '../../../../../shared/models/feeds/feed-format.enum' 16import { FeedFormat } from '../../../../../shared/models/feeds/feed-format.enum'
17import { environment } from '../../../environments/environment' 17import { environment } from '../../../environments/environment'
18import { ComponentPagination } from '../rest/component-pagination.model' 18import { ComponentPaginationLight } from '../rest/component-pagination.model'
19import { RestExtractor } from '../rest/rest-extractor.service' 19import { RestExtractor } from '../rest/rest-extractor.service'
20import { RestService } from '../rest/rest.service' 20import { RestService } from '../rest/rest.service'
21import { UserService } from '../users/user.service' 21import { UserService } from '../users/user.service'
@@ -34,7 +34,7 @@ import { I18n } from '@ngx-translate/i18n-polyfill'
34 34
35export interface VideosProvider { 35export interface VideosProvider {
36 getVideos (parameters: { 36 getVideos (parameters: {
37 videoPagination: ComponentPagination, 37 videoPagination: ComponentPaginationLight,
38 sort: VideoSortField, 38 sort: VideoSortField,
39 filter?: VideoFilter, 39 filter?: VideoFilter,
40 categoryOneOf?: number, 40 categoryOneOf?: number,
@@ -121,7 +121,7 @@ export class VideoService implements VideosProvider {
121 .pipe(catchError(err => this.restExtractor.handleError(err))) 121 .pipe(catchError(err => this.restExtractor.handleError(err)))
122 } 122 }
123 123
124 getMyVideos (videoPagination: ComponentPagination, sort: VideoSortField, search?: string): Observable<ResultList<Video>> { 124 getMyVideos (videoPagination: ComponentPaginationLight, sort: VideoSortField, search?: string): Observable<ResultList<Video>> {
125 const pagination = this.restService.componentPaginationToRestPagination(videoPagination) 125 const pagination = this.restService.componentPaginationToRestPagination(videoPagination)
126 126
127 let params = new HttpParams() 127 let params = new HttpParams()
@@ -138,7 +138,7 @@ export class VideoService implements VideosProvider {
138 138
139 getAccountVideos ( 139 getAccountVideos (
140 account: Account, 140 account: Account,
141 videoPagination: ComponentPagination, 141 videoPagination: ComponentPaginationLight,
142 sort: VideoSortField 142 sort: VideoSortField
143 ): Observable<ResultList<Video>> { 143 ): Observable<ResultList<Video>> {
144 const pagination = this.restService.componentPaginationToRestPagination(videoPagination) 144 const pagination = this.restService.componentPaginationToRestPagination(videoPagination)
@@ -156,7 +156,7 @@ export class VideoService implements VideosProvider {
156 156
157 getVideoChannelVideos ( 157 getVideoChannelVideos (
158 videoChannel: VideoChannel, 158 videoChannel: VideoChannel,
159 videoPagination: ComponentPagination, 159 videoPagination: ComponentPaginationLight,
160 sort: VideoSortField 160 sort: VideoSortField
161 ): Observable<ResultList<Video>> { 161 ): Observable<ResultList<Video>> {
162 const pagination = this.restService.componentPaginationToRestPagination(videoPagination) 162 const pagination = this.restService.componentPaginationToRestPagination(videoPagination)
@@ -173,15 +173,18 @@ export class VideoService implements VideosProvider {
173 } 173 }
174 174
175 getUserSubscriptionVideos (parameters: { 175 getUserSubscriptionVideos (parameters: {
176 videoPagination: ComponentPagination, 176 videoPagination: ComponentPaginationLight,
177 sort: VideoSortField 177 sort: VideoSortField,
178 skipCount?: boolean
178 }): Observable<ResultList<Video>> { 179 }): Observable<ResultList<Video>> {
179 const { videoPagination, sort } = parameters 180 const { videoPagination, sort, skipCount } = parameters
180 const pagination = this.restService.componentPaginationToRestPagination(videoPagination) 181 const pagination = this.restService.componentPaginationToRestPagination(videoPagination)
181 182
182 let params = new HttpParams() 183 let params = new HttpParams()
183 params = this.restService.addRestGetParams(params, pagination, sort) 184 params = this.restService.addRestGetParams(params, pagination, sort)
184 185
186 if (skipCount) params = params.set('skipCount', skipCount + '')
187
185 return this.authHttp 188 return this.authHttp
186 .get<ResultList<Video>>(UserSubscriptionService.BASE_USER_SUBSCRIPTIONS_URL + '/videos', { params }) 189 .get<ResultList<Video>>(UserSubscriptionService.BASE_USER_SUBSCRIPTIONS_URL + '/videos', { params })
187 .pipe( 190 .pipe(
@@ -191,26 +194,23 @@ export class VideoService implements VideosProvider {
191 } 194 }
192 195
193 getVideos (parameters: { 196 getVideos (parameters: {
194 videoPagination: ComponentPagination, 197 videoPagination: ComponentPaginationLight,
195 sort: VideoSortField, 198 sort: VideoSortField,
196 filter?: VideoFilter, 199 filter?: VideoFilter,
197 categoryOneOf?: number, 200 categoryOneOf?: number,
198 languageOneOf?: string[] 201 languageOneOf?: string[],
202 skipCount?: boolean
199 }): Observable<ResultList<Video>> { 203 }): Observable<ResultList<Video>> {
200 const { videoPagination, sort, filter, categoryOneOf, languageOneOf } = parameters 204 const { videoPagination, sort, filter, categoryOneOf, languageOneOf, skipCount } = parameters
201 205
202 const pagination = this.restService.componentPaginationToRestPagination(videoPagination) 206 const pagination = this.restService.componentPaginationToRestPagination(videoPagination)
203 207
204 let params = new HttpParams() 208 let params = new HttpParams()
205 params = this.restService.addRestGetParams(params, pagination, sort) 209 params = this.restService.addRestGetParams(params, pagination, sort)
206 210
207 if (filter) { 211 if (filter) params = params.set('filter', filter)
208 params = params.set('filter', filter) 212 if (categoryOneOf) params = params.set('categoryOneOf', categoryOneOf + '')
209 } 213 if (skipCount) params = params.set('skipCount', skipCount + '')
210
211 if (categoryOneOf) {
212 params = params.set('categoryOneOf', categoryOneOf + '')
213 }
214 214
215 if (languageOneOf) { 215 if (languageOneOf) {
216 for (const l of languageOneOf) { 216 for (const l of languageOneOf) {
diff --git a/client/src/app/videos/+video-watch/comment/video-comment.service.ts b/client/src/app/videos/+video-watch/comment/video-comment.service.ts
index 72fbf5d25..a81e5236a 100644
--- a/client/src/app/videos/+video-watch/comment/video-comment.service.ts
+++ b/client/src/app/videos/+video-watch/comment/video-comment.service.ts
@@ -3,7 +3,7 @@ import { HttpClient, HttpParams } from '@angular/common/http'
3import { Injectable } from '@angular/core' 3import { Injectable } from '@angular/core'
4import { objectLineFeedToHtml } from '@app/shared/misc/utils' 4import { objectLineFeedToHtml } from '@app/shared/misc/utils'
5import { Observable } from 'rxjs' 5import { Observable } from 'rxjs'
6import { ResultList, FeedFormat } from '../../../../../../shared/models' 6import { FeedFormat, ResultList } from '../../../../../../shared/models'
7import { 7import {
8 VideoComment as VideoCommentServerModel, 8 VideoComment as VideoCommentServerModel,
9 VideoCommentCreate, 9 VideoCommentCreate,
@@ -11,7 +11,7 @@ import {
11} from '../../../../../../shared/models/videos/video-comment.model' 11} from '../../../../../../shared/models/videos/video-comment.model'
12import { environment } from '../../../../environments/environment' 12import { environment } from '../../../../environments/environment'
13import { RestExtractor, RestService } from '../../../shared/rest' 13import { RestExtractor, RestService } from '../../../shared/rest'
14import { ComponentPagination } from '../../../shared/rest/component-pagination.model' 14import { ComponentPaginationLight } from '../../../shared/rest/component-pagination.model'
15import { CommentSortField } from '../../../shared/video/sort-field.type' 15import { CommentSortField } from '../../../shared/video/sort-field.type'
16import { VideoComment } from './video-comment.model' 16import { VideoComment } from './video-comment.model'
17 17
@@ -50,7 +50,7 @@ export class VideoCommentService {
50 50
51 getVideoCommentThreads (parameters: { 51 getVideoCommentThreads (parameters: {
52 videoId: number | string, 52 videoId: number | string,
53 componentPagination: ComponentPagination, 53 componentPagination: ComponentPaginationLight,
54 sort: CommentSortField 54 sort: CommentSortField
55 }): Observable<ResultList<VideoComment>> { 55 }): Observable<ResultList<VideoComment>> {
56 const { videoId, componentPagination, sort } = parameters 56 const { videoId, componentPagination, sort } = parameters
diff --git a/client/src/app/videos/video-list/video-local.component.ts b/client/src/app/videos/video-list/video-local.component.ts
index b96e46e6a..59f65f95c 100644
--- a/client/src/app/videos/video-list/video-local.component.ts
+++ b/client/src/app/videos/video-list/video-local.component.ts
@@ -62,7 +62,8 @@ export class VideoLocalComponent extends AbstractVideoList implements OnInit, On
62 sort: this.sort, 62 sort: this.sort,
63 filter: this.filter, 63 filter: this.filter,
64 categoryOneOf: this.categoryOneOf, 64 categoryOneOf: this.categoryOneOf,
65 languageOneOf: this.languageOneOf 65 languageOneOf: this.languageOneOf,
66 skipCount: true
66 } 67 }
67 68
68 return this.hooks.wrapObsFun( 69 return this.hooks.wrapObsFun(
diff --git a/client/src/app/videos/video-list/video-most-liked.component.ts b/client/src/app/videos/video-list/video-most-liked.component.ts
index f94a7da04..6ff7a1e0e 100644
--- a/client/src/app/videos/video-list/video-most-liked.component.ts
+++ b/client/src/app/videos/video-list/video-most-liked.component.ts
@@ -50,7 +50,8 @@ export class VideoMostLikedComponent extends AbstractVideoList implements OnInit
50 videoPagination: newPagination, 50 videoPagination: newPagination,
51 sort: this.sort, 51 sort: this.sort,
52 categoryOneOf: this.categoryOneOf, 52 categoryOneOf: this.categoryOneOf,
53 languageOneOf: this.languageOneOf 53 languageOneOf: this.languageOneOf,
54 skipCount: true
54 } 55 }
55 56
56 return this.hooks.wrapObsFun( 57 return this.hooks.wrapObsFun(
diff --git a/client/src/app/videos/video-list/video-recently-added.component.ts b/client/src/app/videos/video-list/video-recently-added.component.ts
index 5c50fd396..7568f4536 100644
--- a/client/src/app/videos/video-list/video-recently-added.component.ts
+++ b/client/src/app/videos/video-list/video-recently-added.component.ts
@@ -54,7 +54,8 @@ export class VideoRecentlyAddedComponent extends AbstractVideoList implements On
54 videoPagination: newPagination, 54 videoPagination: newPagination,
55 sort: this.sort, 55 sort: this.sort,
56 categoryOneOf: this.categoryOneOf, 56 categoryOneOf: this.categoryOneOf,
57 languageOneOf: this.languageOneOf 57 languageOneOf: this.languageOneOf,
58 skipCount: true
58 } 59 }
59 60
60 return this.hooks.wrapObsFun( 61 return this.hooks.wrapObsFun(
diff --git a/client/src/app/videos/video-list/video-trending.component.ts b/client/src/app/videos/video-list/video-trending.component.ts
index bc88679fa..e29830b5b 100644
--- a/client/src/app/videos/video-list/video-trending.component.ts
+++ b/client/src/app/videos/video-list/video-trending.component.ts
@@ -67,7 +67,8 @@ export class VideoTrendingComponent extends AbstractVideoList implements OnInit,
67 videoPagination: newPagination, 67 videoPagination: newPagination,
68 sort: this.sort, 68 sort: this.sort,
69 categoryOneOf: this.categoryOneOf, 69 categoryOneOf: this.categoryOneOf,
70 languageOneOf: this.languageOneOf 70 languageOneOf: this.languageOneOf,
71 skipCount: true
71 } 72 }
72 73
73 return this.hooks.wrapObsFun( 74 return this.hooks.wrapObsFun(
diff --git a/client/src/app/videos/video-list/video-user-subscriptions.component.ts b/client/src/app/videos/video-list/video-user-subscriptions.component.ts
index 0cd67db29..cf0b15054 100644
--- a/client/src/app/videos/video-list/video-user-subscriptions.component.ts
+++ b/client/src/app/videos/video-list/video-user-subscriptions.component.ts
@@ -55,7 +55,8 @@ export class VideoUserSubscriptionsComponent extends AbstractVideoList implement
55 const newPagination = immutableAssign(this.pagination, { currentPage: page }) 55 const newPagination = immutableAssign(this.pagination, { currentPage: page })
56 const params = { 56 const params = {
57 videoPagination: newPagination, 57 videoPagination: newPagination,
58 sort: this.sort 58 sort: this.sort,
59 skipCount: true
59 } 60 }
60 61
61 return this.hooks.wrapObsFun( 62 return this.hooks.wrapObsFun(