Reduce videos sort complexity
Automatically use best sort if user is logged in and chose hot algorithm
This commit is contained in:
parent
d09ed46e71
commit
2b0d17ccf4
|
@ -44,7 +44,6 @@
|
||||||
|
|
||||||
<div class="peertube-select-container">
|
<div class="peertube-select-container">
|
||||||
<select id="trendingVideosAlgorithmsDefault" formControlName="default" class="form-control">
|
<select id="trendingVideosAlgorithmsDefault" formControlName="default" class="form-control">
|
||||||
<option i18n value="best">Best videos</option>
|
|
||||||
<option i18n value="hot">Hot videos</option>
|
<option i18n value="hot">Hot videos</option>
|
||||||
<option i18n value="most-viewed">Most viewed videos</option>
|
<option i18n value="most-viewed">Most viewed videos</option>
|
||||||
<option i18n value="most-liked">Most liked videos</option>
|
<option i18n value="most-liked">Most liked videos</option>
|
||||||
|
|
|
@ -197,10 +197,9 @@ export class VideosListCommonPageComponent implements OnInit, OnDestroy, Disable
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([ 'best', 'hot', 'trending', 'likes' ].includes(sanitizedSort)) {
|
if ([ 'hot', 'trending', 'likes' ].includes(sanitizedSort)) {
|
||||||
this.title = $localize`Trending`
|
this.title = $localize`Trending`
|
||||||
|
|
||||||
if (sanitizedSort === 'best') this.titleTooltip = $localize`Videos with the most interactions for recent videos, minus user history`
|
|
||||||
if (sanitizedSort === 'hot') this.titleTooltip = $localize`Videos with the most interactions for recent videos`
|
if (sanitizedSort === 'hot') this.titleTooltip = $localize`Videos with the most interactions for recent videos`
|
||||||
if (sanitizedSort === 'likes') this.titleTooltip = $localize`Videos that have the most likes`
|
if (sanitizedSort === 'likes') this.titleTooltip = $localize`Videos that have the most likes`
|
||||||
|
|
||||||
|
|
|
@ -31,21 +31,21 @@ export class RestService {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sort !== undefined) {
|
if (sort !== undefined) {
|
||||||
let sortString = ''
|
newParams = newParams.set('sort', this.buildSortString(sort))
|
||||||
|
|
||||||
if (typeof sort === 'string') {
|
|
||||||
sortString = sort
|
|
||||||
} else {
|
|
||||||
const sortPrefix = sort.order === 1 ? '' : '-'
|
|
||||||
sortString = sortPrefix + sort.field
|
|
||||||
}
|
|
||||||
|
|
||||||
newParams = newParams.set('sort', sortString)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return newParams
|
return newParams
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buildSortString (sort: SortMeta | string) {
|
||||||
|
if (typeof sort === 'string') {
|
||||||
|
return sort
|
||||||
|
}
|
||||||
|
|
||||||
|
const sortPrefix = sort.order === 1 ? '' : '-'
|
||||||
|
return sortPrefix + sort.field
|
||||||
|
}
|
||||||
|
|
||||||
addArrayParams (params: HttpParams, name: string, values: (string | number)[]) {
|
addArrayParams (params: HttpParams, name: string, values: (string | number)[]) {
|
||||||
for (const v of values) {
|
for (const v of values) {
|
||||||
params = params.append(name, v)
|
params = params.append(name, v)
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { from, Observable } from 'rxjs'
|
||||||
import { catchError, concatMap, map, switchMap, toArray } from 'rxjs/operators'
|
import { catchError, concatMap, map, switchMap, toArray } from 'rxjs/operators'
|
||||||
import { HttpClient, HttpParams, HttpRequest } from '@angular/common/http'
|
import { HttpClient, HttpParams, HttpRequest } from '@angular/common/http'
|
||||||
import { Injectable } from '@angular/core'
|
import { Injectable } from '@angular/core'
|
||||||
import { ComponentPaginationLight, RestExtractor, RestService, ServerService, UserService } from '@app/core'
|
import { AuthService, ComponentPaginationLight, RestExtractor, RestService, ServerService, UserService } from '@app/core'
|
||||||
import { objectToFormData } from '@app/helpers'
|
import { objectToFormData } from '@app/helpers'
|
||||||
import {
|
import {
|
||||||
BooleanBothQuery,
|
BooleanBothQuery,
|
||||||
|
@ -55,6 +55,7 @@ export class VideoService {
|
||||||
static BASE_SUBSCRIPTION_FEEDS_URL = environment.apiUrl + '/feeds/subscriptions.'
|
static BASE_SUBSCRIPTION_FEEDS_URL = environment.apiUrl + '/feeds/subscriptions.'
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
|
private auth: AuthService,
|
||||||
private authHttp: HttpClient,
|
private authHttp: HttpClient,
|
||||||
private restExtractor: RestExtractor,
|
private restExtractor: RestExtractor,
|
||||||
private restService: RestService,
|
private restService: RestService,
|
||||||
|
@ -418,7 +419,7 @@ export class VideoService {
|
||||||
? this.restService.componentToRestPagination(videoPagination)
|
? this.restService.componentToRestPagination(videoPagination)
|
||||||
: undefined
|
: undefined
|
||||||
|
|
||||||
let newParams = this.restService.addRestGetParams(params, pagination, sort)
|
let newParams = this.restService.addRestGetParams(params, pagination, this.buildListSort(sort))
|
||||||
|
|
||||||
if (skipCount) newParams = newParams.set('skipCount', skipCount + '')
|
if (skipCount) newParams = newParams.set('skipCount', skipCount + '')
|
||||||
|
|
||||||
|
@ -434,6 +435,22 @@ export class VideoService {
|
||||||
return newParams
|
return newParams
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private buildListSort (sortArg: VideoSortField | SortMeta) {
|
||||||
|
const sort = this.restService.buildSortString(sortArg)
|
||||||
|
|
||||||
|
if (typeof sort === 'string') {
|
||||||
|
// Silently use the best algorithm for logged in users if they chose the hot algorithm
|
||||||
|
if (
|
||||||
|
this.auth.isLoggedIn() &&
|
||||||
|
(sort === 'hot' || sort === '-hot')
|
||||||
|
) {
|
||||||
|
return sort.replace('hot', 'best')
|
||||||
|
}
|
||||||
|
|
||||||
|
return sort
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private setVideoRate (id: number, rateType: UserVideoRateType) {
|
private setVideoRate (id: number, rateType: UserVideoRateType) {
|
||||||
const url = `${VideoService.BASE_VIDEO_URL}/${id}/rate`
|
const url = `${VideoService.BASE_VIDEO_URL}/${id}/rate`
|
||||||
const body: UserVideoRateUpdate = {
|
const body: UserVideoRateUpdate = {
|
||||||
|
|
|
@ -47,7 +47,6 @@
|
||||||
|
|
||||||
<ng-option i18n *ngIf="isTrendingSortEnabled('most-viewed')" value="-trending">Sort by <strong>"Recent Views"</strong></ng-option>
|
<ng-option i18n *ngIf="isTrendingSortEnabled('most-viewed')" value="-trending">Sort by <strong>"Recent Views"</strong></ng-option>
|
||||||
<ng-option i18n *ngIf="isTrendingSortEnabled('hot')" value="-hot">Sort by <strong>"Hot"</strong></ng-option>
|
<ng-option i18n *ngIf="isTrendingSortEnabled('hot')" value="-hot">Sort by <strong>"Hot"</strong></ng-option>
|
||||||
<ng-option i18n *ngIf="isTrendingSortEnabled('best')" value="-best">Sort by <strong>"Best"</strong></ng-option>
|
|
||||||
<ng-option i18n *ngIf="isTrendingSortEnabled('most-liked')" value="-likes">Sort by <strong>"Likes"</strong></ng-option>
|
<ng-option i18n *ngIf="isTrendingSortEnabled('most-liked')" value="-likes">Sort by <strong>"Likes"</strong></ng-option>
|
||||||
</ng-select>
|
</ng-select>
|
||||||
|
|
||||||
|
|
|
@ -72,15 +72,10 @@ export class VideoFiltersHeaderComponent implements OnInit, OnDestroy {
|
||||||
return this.auth.getUser().hasRight(UserRight.SEE_ALL_VIDEOS)
|
return this.auth.getUser().hasRight(UserRight.SEE_ALL_VIDEOS)
|
||||||
}
|
}
|
||||||
|
|
||||||
isTrendingSortEnabled (sort: 'most-viewed' | 'hot' | 'best' | 'most-liked') {
|
isTrendingSortEnabled (sort: 'most-viewed' | 'hot' | 'most-liked') {
|
||||||
const serverConfig = this.serverService.getHTMLConfig()
|
const serverConfig = this.serverService.getHTMLConfig()
|
||||||
|
|
||||||
const enabled = serverConfig.trending.videos.algorithms.enabled.includes(sort)
|
return serverConfig.trending.videos.algorithms.enabled.includes(sort)
|
||||||
|
|
||||||
// Best is adapted from the user
|
|
||||||
if (sort === 'best') return enabled && this.auth.isLoggedIn()
|
|
||||||
|
|
||||||
return enabled
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resetFilter (key: string, canRemove: boolean) {
|
resetFilter (key: string, canRemove: boolean) {
|
||||||
|
|
Loading…
Reference in New Issue