diff --git a/backend/app.js b/backend/app.js index 849f9ed..93149d6 100644 --- a/backend/app.js +++ b/backend/app.js @@ -2233,6 +2233,27 @@ app.post('/api/disableSharing', optionalJwt, function(req, res) { }); }); +app.post('/api/incrementViewCount', optionalJwt, async (req, res) => { + let file_uid = req.body.file_uid; + let sub_id = req.body.sub_id; + let uuid = req.body.uuid; + + if (!uuid && req.isAuthenticated()) { + uuid = req.user.uid; + } + + const file_obj = await db_api.getVideo(file_uid, uuid, sub_id); + + const current_view_count = file_obj && file_obj['local_view_count'] ? file_obj['local_view_count'] : 0; + const new_view_count = current_view_count + 1; + + await db_api.setVideoProperty(file_uid, {local_view_count: new_view_count}, uuid, sub_id); + + res.send({ + success: true + }); +}); + // categories app.post('/api/getAllCategories', optionalJwt, async (req, res) => { @@ -2759,7 +2780,7 @@ app.get('/api/stream/:id', optionalJwt, (req, res) => { var head; let optionalParams = url_api.parse(req.url,true).query; let id = decodeURIComponent(req.params.id); - let file_path = req.query.file_path ? decodeURIComponent(req.query.file_path) : null; + let file_path = req.query.file_path ? decodeURIComponent(req.query.file_path.split('?')[0]) : null; if (!file_path && (req.isAuthenticated() || req.can_watch)) { let usersFileFolder = config_api.getConfigItem('ytdl_users_base_path'); if (optionalParams['subName']) { diff --git a/backend/db.js b/backend/db.js index f95b43f..e609a30 100644 --- a/backend/db.js +++ b/backend/db.js @@ -205,10 +205,28 @@ async function importUnregisteredFiles() { } +async function getVideo(file_uid, uuid, sub_id) { + const base_db_path = uuid ? users_db.get('users').find({uid: uuid}) : db; + const sub_db_path = sub_id ? base_db_path.get('subscriptions').find({id: sub_id}).get('videos') : base_db_path.get('files'); + return sub_db_path.find({uid: file_uid}).value(); +} + +async function setVideoProperty(file_uid, assignment_obj, uuid, sub_id) { + const base_db_path = uuid ? users_db.get('users').find({uid: uuid}) : db; + const sub_db_path = sub_id ? base_db_path.get('subscriptions').find({id: sub_id}).get('videos') : base_db_path.get('files'); + const file_db_path = sub_db_path.find({uid: file_uid}); + if (!(file_db_path.value())) { + logger.error(`Failed to find file with uid ${file_uid}`); + } + sub_db_path.find({uid: file_uid}).assign(assignment_obj).write(); +} + module.exports = { initialize: initialize, registerFileDB: registerFileDB, updatePlaylist: updatePlaylist, getFileDirectoriesAndDBs: getFileDirectoriesAndDBs, - importUnregisteredFiles: importUnregisteredFiles + importUnregisteredFiles: importUnregisteredFiles, + getVideo: getVideo, + setVideoProperty: setVideoProperty } diff --git a/src/app/player/player.component.html b/src/app/player/player.component.html index 5eb1e71..e96156b 100644 --- a/src/app/player/player.component.html +++ b/src/app/player/player.component.html @@ -12,7 +12,7 @@
- {{db_file['local_view_count'] ? db_file['local_view_count'] : 0}} views + {{db_file['local_view_count'] ? db_file['local_view_count']+1 : 1}} views
diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index 412a583..c2aa1c2 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -160,6 +160,10 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { this.openSnackBar('Failed to get file information from the server.', 'Dismiss'); return; } + this.postsService.incrementViewCount(this.db_file['uid'], null, this.uuid).subscribe(res => {}, err => { + console.error('Failed to increment view count'); + console.error(err); + }); this.sharingEnabled = this.db_file.sharingEnabled; if (!this.fileNames) { // means it's a shared video @@ -186,6 +190,10 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { subscription.videos.forEach(video => { if (video['id'] === this.fileNames[0]) { this.db_file = video; + this.postsService.incrementViewCount(this.db_file['uid'], this.subscription['id'], this.uuid).subscribe(res => {}, err => { + console.error('Failed to increment view count'); + console.error(err); + }); this.show_player = true; this.parseFileNames(); } diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index c3934c7..77acefc 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -286,6 +286,10 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'enableSharing', {uid: uid, type: type, is_playlist: is_playlist}, this.httpOptions); } + incrementViewCount(file_uid, sub_id, uuid) { + return this.http.post(this.path + 'incrementViewCount', {file_uid: file_uid, sub_id: sub_id, uuid: uuid}, this.httpOptions); + } + disableSharing(uid, type, is_playlist) { return this.http.post(this.path + 'disableSharing', {uid: uid, type: type, is_playlist: is_playlist}, this.httpOptions); }