From 7311882e385188cf21f9e8297eacad5fd1437e5d Mon Sep 17 00:00:00 2001 From: Astri4-4 Date: Thu, 24 Jul 2025 21:50:53 +0000 Subject: [PATCH] FINISH manage video page --- backend/app/controllers/channel.controller.js | 9 + backend/app/controllers/comment.controller.js | 6 +- .../app/controllers/playlist.controller.js | 18 + .../controllers/recommendation.controller.js | 2 + backend/app/controllers/search.controller.js | 2 +- backend/app/controllers/user.controller.js | 21 +- backend/app/controllers/video.controller.js | 20 +- backend/logs/access.log | 999 ++++++++++++++++++ backend/requests/video.http | 6 +- backend/server.js | 6 +- frontend/src/components/Tag.jsx | 22 + frontend/src/pages/ManageVideo.jsx | 256 ++++- frontend/src/pages/Video.jsx | 8 +- nginx/default.conf | 6 + 14 files changed, 1353 insertions(+), 28 deletions(-) create mode 100644 frontend/src/components/Tag.jsx diff --git a/backend/app/controllers/channel.controller.js b/backend/app/controllers/channel.controller.js index c359fe8..f1e51ca 100644 --- a/backend/app/controllers/channel.controller.js +++ b/backend/app/controllers/channel.controller.js @@ -18,6 +18,7 @@ export async function create(req, res) { logger.action("try to create new channel with owner " + channel.owner + " and name " + channel.name); logger.write("Successfully created new channel with name " + channel.name, 200); + client.end(); res.status(200).json(channel); } @@ -50,6 +51,7 @@ export async function getById(req, res) { result.rows[0].videos = videoResult.rows; logger.write("Successfully get channel with id " + id, 200); + client.end(); res.status(200).json(result.rows[0]); } @@ -85,6 +87,7 @@ export async function getAll(req, res) { }) logger.write("Successfully get all channels", 200); + client.end(); res.status(200).json(result); } @@ -108,6 +111,7 @@ export async function update(req, res) { const nameResult = await client.query(nameQuery, [channel.name]); if (nameResult.rows.length > 0) { logger.write("failed to update channel because name already taken", 400); + client.end(); res.status(400).json({error: 'Name already used'}); return } @@ -116,6 +120,7 @@ export async function update(req, res) { const updateQuery = `UPDATE channels SET name = $1, description = $2 WHERE id = $3`; await client.query(updateQuery, [channel.name, channel.description, id]); logger.write("Successfully updated channel", 200); + client.end(); res.status(200).json(channel); } @@ -128,6 +133,7 @@ export async function del(req, res) { const query = `DELETE FROM channels WHERE id = $1`; await client.query(query, [id]); logger.write("Successfully deleted channel", 200); + client.end(); res.status(200).json({message: 'Successfully deleted'}); } @@ -152,6 +158,7 @@ export async function toggleSubscription(req, res) { const remainingSubscriptions = countResult.rows[0].count; logger.write("Successfully unsubscribed from channel", 200); + client.end(); res.status(200).json({message: 'Unsubscribed successfully', subscriptions: remainingSubscriptions}); } else { // Subscribe @@ -164,6 +171,7 @@ export async function toggleSubscription(req, res) { const totalSubscriptions = countResult.rows[0].count; logger.write("Successfully subscribed to channel", 200); + client.end(); res.status(200).json({message: 'Subscribed successfully', subscriptions: totalSubscriptions}); } } @@ -189,6 +197,7 @@ export async function getStats(req, res) { const client = await getClient(); const result = await client.query(request, [id]); logger.write("Successfully get stats", 200); + client.end(); res.status(200).json(result.rows[0]); } catch (error) { console.log(error); diff --git a/backend/app/controllers/comment.controller.js b/backend/app/controllers/comment.controller.js index 8ff3064..e77f27e 100644 --- a/backend/app/controllers/comment.controller.js +++ b/backend/app/controllers/comment.controller.js @@ -39,7 +39,7 @@ export async function upload(req, res) { createdAt: createdAt } - + client.end(); res.status(200).json(responseComment); } @@ -52,6 +52,7 @@ export async function getByVideo(req, res) { const query = `SELECT * FROM comments WHERE video = $1`; const result = await client.query(query, [videoId]); logger.write("successfully get comment", 200); + client.end() res.status(200).json(result.rows); } @@ -63,6 +64,7 @@ export async function getById(req, res) { const query = `SELECT * FROM comments WHERE id = $1`; const result = await client.query(query, [id]); logger.write("successfully get comment", 200); + client.end(); res.status(200).json(result.rows[0]); } @@ -74,6 +76,7 @@ export async function update(req, res) { const query = `UPDATE comments SET content = $1 WHERE id = $2`; const result = await client.query(query, [req.body.content, id]); logger.write("successfully update comment", 200); + client.end(); res.status(200).json(result.rows[0]); } @@ -85,5 +88,6 @@ export async function del(req, res) { const query = `DELETE FROM comments WHERE id = $1`; const result = await client.query(query, [id]); logger.write("successfully deleted comment", 200); + client.end(); res.status(200).json(result.rows[0]); } \ No newline at end of file diff --git a/backend/app/controllers/playlist.controller.js b/backend/app/controllers/playlist.controller.js index b300572..a03c86d 100644 --- a/backend/app/controllers/playlist.controller.js +++ b/backend/app/controllers/playlist.controller.js @@ -14,9 +14,11 @@ export async function create(req, res) { try { const result = await client.query(query, [name, userId]); logger.write("Playlist created with id " + result.rows[0].id, 200); + client.end() res.status(200).json({ id: result.rows[0].id }); } catch (error) { logger.write("Error creating playlist: " + error.message, 500); + client.end(); res.status(500).json({ error: "Internal server error" }); } } @@ -31,9 +33,11 @@ export async function addVideo(req, res) { try { const result = await client.query(query, [video, id]); logger.write("Video added to playlist with id " + id, 200); + client.end(); res.status(200).json({id: result.rows[0].id}); } catch (error) { logger.write("Error adding video to playlist: " + error.message, 500); + client.end(); res.status(500).json({error: "Internal server error"}); } } @@ -60,13 +64,16 @@ export async function getByUser(req, res) { const result = await client.query(query, [id]); if (result.rows.length === 0) { logger.write("No playlists found for user with id " + id, 404); + client.end(); res.status(404).json({ error: "No playlists found" }); return; } logger.write("Playlists retrieved for user with id " + id, 200); + client.end(); res.status(200).json(result.rows); } catch (error) { logger.write("Error retrieving playlists: " + error.message, 500); + client.end(); res.status(500).json({ error: "Internal server error" }); } } @@ -82,13 +89,16 @@ export async function getById(req, res) { const result = await client.query(query, [id]); if (result.rows.length === 0) { logger.write("No playlist found with id " + id, 404); + client.end(); res.status(404).json({ error: "Playlist not found" }); return; } logger.write("Playlist retrieved with id " + id, 200); + client.end(); res.status(200).json(result.rows[0]); } catch (error) { logger.write("Error retrieving playlist: " + error.message, 500); + client.end(); res.status(500).json({ error: "Internal server error" }); } } @@ -105,13 +115,16 @@ export async function update(req, res) { const result = await client.query(query, [name, id]); if (result.rows.length === 0) { logger.write("No playlist found with id " + id, 404); + client.end(); res.status(404).json({ error: "Playlist not found", result: result.rows, query: query }); return; } logger.write("Playlist updated with id " + result.rows[0].id, 200); + client.end(); res.status(200).json({ id: result.rows[0].id }); } catch (error) { logger.write("Error updating playlist: " + error.message, 500); + client.end(); res.status(500).json({ error: "Internal server error" }); } } @@ -127,13 +140,16 @@ export async function deleteVideo(req, res) { const result = await client.query(query, [videoId, id]); if (result.rows.length === 0) { logger.write("No video found in playlist with id " + id, 404); + client.end(); res.status(404).json({ error: "Video not found in playlist" }); return; } logger.write("Video deleted from playlist with id " + id, 200); + client.end(); res.status(200).json({ id: result.rows[0].id }); } catch (error) { logger.write("Error deleting video from playlist: " + error.message, 500); + client.end(); res.status(500).json({ error: "Internal server error" }); } } @@ -148,9 +164,11 @@ export async function del(req, res) { try { const result = await client.query(query, [id]); logger.write("Playlist deleted", 200); + client.end() res.status(200).json({ "message": "playlist deleted" }); } catch (error) { logger.write("Error deleting playlist: " + error.message, 500); + client.end(); res.status(500).json({ error: "Internal server error" }); } } \ No newline at end of file diff --git a/backend/app/controllers/recommendation.controller.js b/backend/app/controllers/recommendation.controller.js index 4aea0e3..f549246 100644 --- a/backend/app/controllers/recommendation.controller.js +++ b/backend/app/controllers/recommendation.controller.js @@ -30,6 +30,7 @@ export async function getRecommendations(req, res) { // Recuperer 10 videos avec les 3 tags ayant le plus d'interaction avec l'utilisateur + client.end() res.status(200).json({ message: "Recommendations based on user history and interactions are not yet implemented." }); @@ -80,6 +81,7 @@ export async function getTrendingVideos(req, res) { } + client.end(); res.status(200).json(trendingVideos); } catch (error) { console.error("Error fetching trending videos:", error); diff --git a/backend/app/controllers/search.controller.js b/backend/app/controllers/search.controller.js index f937d99..55e4d77 100644 --- a/backend/app/controllers/search.controller.js +++ b/backend/app/controllers/search.controller.js @@ -76,7 +76,7 @@ export async function search(req, res) { } - + client.end() return res.status(200).json(videos); diff --git a/backend/app/controllers/user.controller.js b/backend/app/controllers/user.controller.js index 4843587..4243899 100644 --- a/backend/app/controllers/user.controller.js +++ b/backend/app/controllers/user.controller.js @@ -99,6 +99,7 @@ export async function login(req, res) { } logger.write("Successfully logged in", 200); + client.end(); res.status(200).json({token: token, user: userData}); } @@ -108,15 +109,20 @@ export async function getById(req, res) { const logger = req.body.logger; logger.action("try to retrieve user " + id); const client = await getClient(); - const query = `SELECT id, email, username, picture FROM users WHERE id = $1`; + const query = `SELECT id, email, username, picture + FROM users + WHERE id = $1`; const result = await client.query(query, [id]); if (!result.rows[0]) { logger.write("failed to retrieve user " + id + " because it doesn't exist", 404); + client.end() res.status(404).json({error: "Not Found"}); return } logger.write("successfully retrieved user " + id, 200); - return res.status(200).json({user: result.rows[0]}); + if (result.rows[0].picture) { + return res.status(200).json({user: result.rows[0]}); + } } export async function getByUsername(req, res) { @@ -128,10 +134,12 @@ export async function getByUsername(req, res) { const result = await client.query(query, [username]); if (!result.rows[0]) { logger.write("failed to retrieve user " + username + " because it doesn't exist", 404); + client.end() res.status(404).json({error: "Not Found"}); return } logger.write("successfully retrieved user " + username, 200); + client.end(); return res.status(200).json({user: result.rows[0]}); } @@ -159,6 +167,7 @@ export async function update(req, res) { const emailResult = await client.query(emailQuery, [user.email]); if (emailResult.rows[0]) { logger.write("failed to update because email is already used", 400) + client.end(); res.status(400).json({error: "Email already exists"}); } } @@ -168,6 +177,7 @@ export async function update(req, res) { const usernameResult = await client.query(usernameQuery, [user.username]); if (usernameResult.rows[0]) { logger.write("failed to update because username is already used", 400) + client.end(); res.status(400).json({error: "Username already exists"}); } } @@ -204,9 +214,11 @@ export async function update(req, res) { const updateQuery = `UPDATE users SET email = $1, username = $2, password = $3, picture = $4 WHERE id = $5 RETURNING id, email, username, picture`; const result = await client.query(updateQuery, [user.email, user.username, user.password, profilePicture, id]); logger.write("successfully updated user " + id, 200); + client.end(); res.status(200).json(result.rows[0]); } catch (err) { console.log(err); + client.end() res.status(500).json({error: err}); } @@ -220,6 +232,7 @@ export async function deleteUser(req, res) { const query = `DELETE FROM users WHERE id = $1`; await client.query(query, [id]); logger.write("successfully deleted user " + id); + client.end(); res.status(200).json({message: 'User deleted'}); } @@ -234,11 +247,13 @@ export async function getChannel(req, res) { if (!result.rows[0]) { logger.write("failed to retrieve channel of user " + id + " because it doesn't exist", 404); + client.end(); res.status(404).json({error: "Channel Not Found"}); return; } logger.write("successfully retrieved channel of user " + id, 200); + client.end(); res.status(200).json({channel: result.rows[0]}); } @@ -285,9 +300,11 @@ export async function getHistory(req, res) { if (!result.rows[0]) { logger.write("failed to retrieve history of user " + id + " because it doesn't exist", 404); res.status(404).json({error: "History Not Found"}); + client.end(); return; } logger.write("successfully retrieved history of user " + id, 200); + client.end(); res.status(200).json(videos); } \ No newline at end of file diff --git a/backend/app/controllers/video.controller.js b/backend/app/controllers/video.controller.js index e09a7cd..7a79f17 100644 --- a/backend/app/controllers/video.controller.js +++ b/backend/app/controllers/video.controller.js @@ -52,6 +52,7 @@ export async function upload(req, res) { const query = `INSERT INTO videos (title, thumbnail, description, channel, visibility, file, slug, format, release_date) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`; await client.query(query, [video.title, 'null', video.description, video.channel, video.visibility, video.file, video.slug, video.format, releaseDate]); logger.write("successfully uploaded video", 200); + client.end() res.status(200).json({"message": "Successfully uploaded video"}); } @@ -75,6 +76,7 @@ export async function uploadThumbnail(req, res) { const updateQuery = `UPDATE videos SET thumbnail = $1 WHERE id = $2`; await client.query(updateQuery, [file, req.body.video]); logger.write("successfully uploaded thumbnail", 200); + client.end() res.status(200).json({"message": "Successfully uploaded thumbnail"}); } @@ -122,6 +124,7 @@ export async function getById(req, res) { video.tags = tagsResult.rows.map(tag => tag.name); logger.write("successfully get video " + id, 200); + client.end() res.status(200).json(video); } @@ -133,6 +136,7 @@ export async function getByChannel(req, res) { const query = `SELECT * FROM videos WHERE channel = $1`; const result = await client.query(query, [id]); logger.write("successfully get video from channel " + id, 200); + client.end() res.status(200).json(result.rows); } @@ -144,6 +148,7 @@ export async function update(req, res) { const query = `UPDATE videos SET title = $1, description = $2, visibility = $3 WHERE id = $4`; await client.query(query, [req.body.title, req.body.description, req.body.visibility, id]); logger.write("successfully updated video", 200); + client.end() res.status(200).json({"message": "Successfully updated video"}); } @@ -161,6 +166,7 @@ export async function updateVideo(req, res) { fs.unlink(pathToDelete, (error) => { if (error) { logger.write(error, 500); + client.end() res.status(500).json({"message": "Failed to delete video"}); return } @@ -172,6 +178,7 @@ export async function updateVideo(req, res) { fs.writeFileSync(destinationPath, fileBuffer); logger.write("successfully updated video", 200); + client.end() res.status(200).json({"message": "Successfully updated video"}); }) @@ -193,6 +200,7 @@ export async function del(req, res) { fs.unlink(pathToDelete, (error) => { if (error) { logger.write(error, 500); + client.end() res.status(500).json({"message": "Failed to delete video"}); return } @@ -207,6 +215,7 @@ export async function del(req, res) { const query = `DELETE FROM videos WHERE id = $1`; await client.query(query, [id]); logger.write("successfully deleted video", 200); + client.end() res.status(200).json({"message": "Successfully deleted video"}); }) }) @@ -237,6 +246,7 @@ export async function toggleLike(req, res) { const likesCount = likesCountResult.rows[0].like_count; logger.write("no likes found adding likes for video " + id, 200); + client.end(); res.status(200).json({"message": "Successfully added like", "likes": likesCount}); } else { const query = `DELETE FROM likes WHERE owner = $1 AND video = $2`; @@ -248,6 +258,7 @@ export async function toggleLike(req, res) { const likesCount = likesCountResult.rows[0].like_count; logger.write("likes found, removing like for video " + id, 200); + client.end(); res.status(200).json({"message": "Successfully removed like", "likes": likesCount}); } @@ -295,9 +306,15 @@ export async function addTags(req, res) { const insertVideoTagQuery = `INSERT INTO video_tags (tag, video) VALUES ($1, $2)`; await client.query(insertVideoTagQuery, [id, videoId]); } + + // GET UPDATED TAGS FOR VIDEO + const updatedTagsQuery = `SELECT t.name FROM tags t JOIN video_tags vt ON t.id = vt.tag WHERE vt.video = $1`; + const updatedTagsResult = await client.query(updatedTagsQuery, [videoId]); + const updatedTags = updatedTagsResult.rows; + logger.write("successfully added tags to video " + videoId, 200); await client.end(); - res.status(200).json({"message": "Successfully added tags to video"}); + res.status(200).json({"message": "Successfully added tags to video", "tags" : updatedTags.map(tag => tag.name)}); } @@ -430,5 +447,6 @@ export async function addViews(req, res) { } logger.write("successfully added views for video " + id, 200); + await client.end(); res.status(200).json({"message": "Successfully added views"}); } \ No newline at end of file diff --git a/backend/logs/access.log b/backend/logs/access.log index bb7fd67..5d41eeb 100644 --- a/backend/logs/access.log +++ b/backend/logs/access.log @@ -2692,3 +2692,1002 @@ [2025-07-23 18:59:15.160] [undefined] GET(/:id/likes/day): try to get likes per day [2025-07-23 18:59:15.171] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 [2025-07-23 18:59:15.175] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:03:42.260] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:03:42.271] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:03:42.282] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 18:03:42.290] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 18:03:42.308] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 18:03:42.317] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 18:03:43.972] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-07-24 18:03:43.980] [undefined] GET(/:id/like): likes found, removing like for video 3 with status 200 +[2025-07-24 18:03:48.567] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-07-24 18:03:48.577] [undefined] GET(/:id/like): no likes found adding likes for video 3 with status 200 +[2025-07-24 18:04:20.170] [undefined] POST(/login): try to login with username 'astria' +[2025-07-24 18:04:20.221] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-24 18:04:27.397] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:04:27.405] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:04:27.415] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 18:04:27.424] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 18:04:27.440] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 18:04:27.449] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 18:04:29.637] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 18:04:29.640] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 18:04:29.641] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 18:04:29.644] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 18:04:29.652] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 18:04:30.507] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-24 18:04:30.516] [undefined] GET(/:id/stats): try to get stats +[2025-07-24 18:04:30.518] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-24 18:04:30.526] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-24 18:04:31.152] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:04:31.154] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:04:31.163] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:04:31.168] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:31:47.959] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:31:47.960] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:31:47.971] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:31:47.975] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:32:08.994] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:32:08.995] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:32:09.015] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:32:09.018] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:32:42.056] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:32:42.060] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:32:42.067] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:32:42.069] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:33:45.203] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:33:45.205] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:33:45.216] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:33:45.219] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:34:05.063] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:34:05.064] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:34:05.073] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:34:05.076] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:34:14.305] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:34:14.307] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:34:14.318] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:34:14.321] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:34:33.526] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:34:33.528] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:34:33.561] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:34:33.565] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:34:37.842] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-07-24 18:35:24.288] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:35:24.291] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:35:24.298] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:35:24.301] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:35:41.135] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:35:41.137] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:35:41.145] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:35:41.147] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:36:02.830] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:36:02.831] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:36:02.841] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:36:02.845] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:36:13.249] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:36:13.251] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:36:13.261] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:36:13.265] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:36:24.434] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:36:24.436] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:36:24.445] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:36:24.449] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:36:33.527] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:36:33.530] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:36:33.539] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:36:33.543] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:36:52.676] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:36:52.678] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:36:52.688] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:36:52.691] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:37:57.617] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:37:57.619] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:37:57.628] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:37:57.633] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:38:15.305] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:38:15.307] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:38:15.315] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:38:15.319] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:38:25.350] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:38:25.353] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:38:25.360] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:38:25.363] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:39:53.311] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:39:53.312] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:39:53.323] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:39:53.327] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:40:07.978] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:40:07.980] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:40:07.992] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:40:07.996] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:41:00.422] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:41:00.424] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:41:00.434] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:41:00.439] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:47:18.951] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:47:18.953] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:47:18.963] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:47:18.966] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:49:38.250] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:51:24.010] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:51:24.012] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:51:24.024] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:51:24.030] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 18:51:34.623] [undefined] GET(/:id): try to get video 3 +[2025-07-24 18:51:34.624] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 18:51:34.633] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 18:51:34.636] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:32:55.058] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 20:32:55.060] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 20:32:55.062] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 20:32:55.064] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 20:32:55.072] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 20:32:56.539] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-24 20:32:56.547] [undefined] GET(/:id/stats): try to get stats +[2025-07-24 20:32:56.549] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-24 20:32:56.556] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-24 20:34:17.395] [undefined] POST(/thumbnail): try to add thumbnail to video 3 +[2025-07-24 20:34:17.398] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-07-24 20:34:19.538] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-24 20:34:19.546] [undefined] GET(/:id/stats): try to get stats +[2025-07-24 20:34:19.548] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-24 20:34:19.557] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-24 20:34:20.890] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:34:20.891] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:34:20.900] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:34:20.904] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:36:14.486] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:36:14.488] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:36:14.498] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:36:14.501] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:37:30.050] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:37:30.052] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:37:30.061] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:37:30.064] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:37:44.659] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:37:44.661] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:37:44.672] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:37:44.677] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:38:18.559] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:38:18.562] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:38:18.568] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:38:18.571] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:38:30.313] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:38:30.315] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:38:30.324] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:38:30.328] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:40:57.000] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:40:57.004] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:40:57.024] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:40:57.028] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:40:59.531] [undefined] POST(/thumbnail): try to add thumbnail to video 3 +[2025-07-24 20:40:59.533] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-07-24 20:41:02.165] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:41:02.166] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:41:02.177] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:41:02.181] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:41:41.119] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:41:41.121] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:41:41.130] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:41:41.135] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:42:01.177] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:42:01.179] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:42:01.188] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:42:01.192] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:42:04.116] [undefined] POST(/thumbnail): try to add thumbnail to video 3 +[2025-07-24 20:42:04.118] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-07-24 20:42:05.461] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:42:05.463] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:42:05.473] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:42:05.477] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:42:07.663] [undefined] POST(/thumbnail): try to add thumbnail to video 3 +[2025-07-24 20:42:07.665] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-07-24 20:42:08.383] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:42:08.385] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:42:08.395] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:42:08.397] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:42:14.642] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:42:14.644] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:42:14.654] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:42:14.658] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:44:59.018] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:44:59.020] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:44:59.030] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:44:59.033] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:45:05.604] [undefined] PUT(/:id): try to update video 3 +[2025-07-24 20:45:42.600] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:45:42.601] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:45:42.611] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:45:42.615] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:45:52.280] [undefined] PUT(/:id): try to update video 3 +[2025-07-24 20:45:52.287] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-07-24 20:45:54.916] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:45:54.917] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:45:54.927] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:45:54.931] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:45:58.425] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:45:58.426] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:45:58.436] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:45:58.439] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:46:17.140] [undefined] PUT(/:id): try to update video 3 +[2025-07-24 20:46:17.147] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-07-24 20:46:18.740] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:46:18.741] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:46:18.752] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:46:18.754] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:47:03.684] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:47:03.686] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:47:03.698] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:47:03.706] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:47:07.405] [undefined] PUT(/:id): try to update video 3 +[2025-07-24 20:47:07.414] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-07-24 20:47:09.377] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:47:09.379] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:47:09.389] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:47:09.391] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:49:54.899] [undefined] PUT(/:id): try to update video 3 +[2025-07-24 20:49:54.908] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-07-24 20:50:02.922] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:50:02.924] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:50:02.934] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:50:02.938] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:50:06.034] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:50:06.043] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:50:06.052] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 20:50:06.061] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 20:50:06.072] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 20:50:06.080] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 20:50:17.695] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 20:50:17.696] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 20:50:17.698] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 20:50:17.700] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 20:50:17.708] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 20:50:20.068] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-24 20:50:20.077] [undefined] GET(/:id/stats): try to get stats +[2025-07-24 20:50:20.078] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-24 20:50:20.085] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-24 20:50:21.239] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:50:21.241] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:50:21.250] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:50:21.253] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:50:33.603] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-07-24 20:50:43.849] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-07-24 20:51:37.954] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:51:37.959] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:51:37.966] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:51:37.969] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:51:44.740] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-07-24 20:52:27.362] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:52:27.366] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:52:27.373] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:52:27.376] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:52:32.753] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-07-24 20:53:21.216] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:53:21.218] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:53:21.227] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:53:21.230] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:53:55.277] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:53:55.282] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:53:55.288] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:53:55.292] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:54:01.114] [undefined] PUT(/:id): try to update video 3 +[2025-07-24 20:54:01.121] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-07-24 20:55:33.611] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:55:33.612] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:55:33.645] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:55:33.651] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:55:37.818] [undefined] PUT(/:id): try to update video 3 +[2025-07-24 20:55:37.825] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-07-24 20:55:38.444] [undefined] PUT(/:id/video): try to update video file 3 +[2025-07-24 20:55:38.453] [undefined] PUT(/:id/video): successfully deleted video CFE69DBF4ADB684F.mp4 +[2025-07-24 20:55:38.556] [undefined] PUT(/:id/video): successfully updated video with status 200 +[2025-07-24 20:55:45.465] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:55:45.477] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:55:45.493] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 20:55:45.502] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 20:55:45.565] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 20:55:45.574] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 20:56:04.985] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 20:56:04.986] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 20:56:04.988] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 20:56:04.991] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 20:56:04.999] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 20:56:06.724] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-24 20:56:06.733] [undefined] GET(/:id/stats): try to get stats +[2025-07-24 20:56:06.735] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-24 20:56:06.742] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-24 20:56:08.514] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:56:08.515] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:56:08.531] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:56:08.536] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:57:25.824] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:57:25.826] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:57:25.833] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:57:25.835] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:57:56.065] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:57:56.068] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:57:56.075] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:57:56.078] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:58:33.167] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:58:33.169] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:58:33.177] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:58:33.180] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:59:20.258] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:59:20.260] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:59:20.270] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:59:20.275] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 20:59:44.984] [undefined] GET(/:id): try to get video 3 +[2025-07-24 20:59:44.985] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 20:59:44.995] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 20:59:44.998] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:00:02.382] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:00:02.383] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:00:02.394] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:00:02.397] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:00:16.064] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:00:16.066] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:00:16.076] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:00:16.080] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:00:34.369] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:00:34.371] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:00:34.384] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:00:34.388] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:00:43.328] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:00:43.329] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:00:43.338] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:00:43.343] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:00:54.952] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:00:54.954] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:00:54.964] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:00:54.967] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:01:08.894] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:01:08.895] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:01:08.906] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:01:08.910] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:01:16.479] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:01:16.481] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:01:16.491] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:01:16.495] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:01:31.893] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:01:31.895] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:01:31.905] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:01:31.908] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:01:53.351] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:01:53.355] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:01:53.362] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:01:53.366] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:02:30.129] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:02:30.130] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:02:30.139] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:02:30.143] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:02:42.834] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:02:42.835] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:02:42.846] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:02:42.850] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:03:03.854] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:03:03.855] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:03:03.864] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:03:03.868] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:03:30.387] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:03:30.390] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:03:30.399] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:03:30.401] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:03:42.383] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:03:42.385] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:03:42.396] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:03:42.399] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:03:46.714] [undefined] PUT(/:id): try to update video 3 +[2025-07-24 21:03:46.720] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-07-24 21:03:48.780] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:03:48.782] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:03:48.791] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:03:48.793] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:04:41.970] [undefined] PUT(/:id): try to update video 3 +[2025-07-24 21:04:41.980] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-07-24 21:04:42.629] [undefined] PUT(/:id/video): try to update video file 3 +[2025-07-24 21:04:42.661] [undefined] PUT(/:id/video): successfully deleted video CFE69DBF4ADB684F.mp4 +[2025-07-24 21:04:42.762] [undefined] PUT(/:id/video): successfully updated video with status 200 +[2025-07-24 21:04:51.342] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:04:51.351] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:04:51.362] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:04:51.373] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 21:04:51.393] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:04:51.401] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:04:55.987] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 21:04:55.988] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 21:04:55.990] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 21:04:55.992] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 21:04:56.001] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 21:04:57.122] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-24 21:04:57.131] [undefined] GET(/:id/stats): try to get stats +[2025-07-24 21:04:57.133] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-24 21:04:57.141] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-24 21:04:58.043] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:04:58.045] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:04:58.055] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:04:58.058] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:05:22.374] [undefined] PUT(/:id): try to update video 3 +[2025-07-24 21:05:22.380] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-07-24 21:05:23.356] [undefined] PUT(/:id/video): try to update video file 3 +[2025-07-24 21:05:23.389] [undefined] PUT(/:id/video): successfully deleted video CFE69DBF4ADB684F.mp4 +[2025-07-24 21:05:23.549] [undefined] PUT(/:id/video): successfully updated video with status 200 +[2025-07-24 21:05:30.773] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:05:30.782] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:05:30.792] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:05:30.801] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 21:05:30.813] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:05:30.820] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:05:32.982] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 21:05:32.987] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 21:05:32.991] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 21:05:32.996] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 21:05:33.024] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 21:05:33.616] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-24 21:05:33.626] [undefined] GET(/:id/stats): try to get stats +[2025-07-24 21:05:33.629] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-24 21:05:33.636] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-24 21:05:34.621] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:05:34.623] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:05:34.634] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:05:34.638] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:05:41.505] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:05:41.506] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:05:41.516] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:05:41.520] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:07:37.767] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:07:37.769] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:07:37.780] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:07:37.784] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:07:39.741] [undefined] POST(/thumbnail): try to add thumbnail to video 3 +[2025-07-24 21:07:39.743] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-07-24 21:07:43.860] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:07:43.870] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:07:43.879] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:07:43.888] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 21:07:43.901] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:07:43.909] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:07:48.946] [undefined] DELETE(/:id): try to delete comment 7 +[2025-07-24 21:07:48.954] [undefined] DELETE(/:id): successfully deleted comment with status 200 +[2025-07-24 21:07:48.962] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:07:48.970] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:07:48.980] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:07:48.986] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 21:07:48.995] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:07:49.002] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:07:49.355] [undefined] DELETE(/:id): try to delete comment 6 +[2025-07-24 21:07:49.363] [undefined] DELETE(/:id): successfully deleted comment with status 200 +[2025-07-24 21:07:49.372] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:07:49.380] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:16:39.642] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:16:39.655] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:16:39.668] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:16:39.677] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 21:16:39.694] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:16:39.702] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:16:41.348] [undefined] DELETE(/:id): try to delete comment 5 +[2025-07-24 21:16:41.355] [undefined] DELETE(/:id): successfully deleted comment with status 200 +[2025-07-24 21:16:41.363] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:16:41.371] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:16:41.380] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:16:41.387] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 21:16:41.396] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:16:41.407] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:16:42.217] [undefined] DELETE(/:id): try to delete comment 4 +[2025-07-24 21:16:42.223] [undefined] DELETE(/:id): successfully deleted comment with status 200 +[2025-07-24 21:16:42.231] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:16:42.240] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:16:42.248] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:16:42.255] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 21:16:42.264] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:16:42.270] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:16:42.938] [undefined] DELETE(/:id): try to delete comment 3 +[2025-07-24 21:16:42.945] [undefined] DELETE(/:id): successfully deleted comment with status 200 +[2025-07-24 21:16:42.953] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:16:42.961] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:16:42.969] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:16:42.976] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 21:16:42.986] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:16:42.992] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:16:43.814] [undefined] DELETE(/:id): try to delete comment 2 +[2025-07-24 21:16:43.820] [undefined] DELETE(/:id): successfully deleted comment with status 200 +[2025-07-24 21:16:43.829] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:16:43.837] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:16:43.845] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:16:43.852] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 21:16:43.861] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:16:43.868] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:16:45.394] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:16:45.404] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:16:45.413] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:16:45.423] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-24 21:16:45.441] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:16:45.452] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:16:48.935] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 21:16:48.937] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 21:16:48.939] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 21:16:48.941] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 21:16:48.947] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 21:16:49.768] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-24 21:16:49.777] [undefined] GET(/:id/stats): try to get stats +[2025-07-24 21:16:49.780] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-24 21:16:49.786] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-24 21:16:53.309] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:16:53.311] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:16:53.320] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:16:53.323] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:17:21.597] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:17:21.598] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:17:21.627] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:17:21.631] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:20:34.908] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:20:34.909] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:20:34.940] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:20:34.946] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:20:51.566] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:20:51.567] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:20:51.578] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:20:51.582] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:22:23.032] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:22:23.044] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:22:24.712] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:22:24.713] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:22:24.723] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:22:24.726] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:22:32.625] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:22:32.627] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:22:32.638] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:22:32.641] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:22:46.223] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:22:46.225] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:22:46.236] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:22:46.239] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:23:02.801] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:23:02.802] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:23:02.813] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:23:02.817] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:23:10.995] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:23:10.996] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:23:11.006] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:23:11.010] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:26:02.687] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:26:02.688] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:26:02.698] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:26:02.702] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:26:23.631] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:26:23.632] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:26:23.642] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:26:23.645] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:26:31.517] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:26:31.518] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:26:31.529] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:26:31.532] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:26:39.987] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:26:39.989] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:26:39.999] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:26:40.002] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:26:49.185] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:26:49.186] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:26:49.196] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:26:49.200] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:27:01.601] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:27:01.602] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:27:01.613] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:27:01.617] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:27:22.498] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:27:22.500] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:27:22.509] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:27:22.513] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:27:31.420] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:27:31.421] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:27:31.430] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:27:31.434] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:27:43.349] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:27:43.351] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:27:43.362] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:27:43.366] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:28:23.468] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:28:23.469] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:28:23.478] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:28:23.482] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:28:36.876] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 21:28:36.878] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 21:28:36.879] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 21:28:36.881] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 21:28:36.888] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 21:28:38.911] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:28:38.920] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:28:38.929] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:28:38.940] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-07-24 21:28:38.961] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:28:38.969] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:28:50.180] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 21:28:50.182] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 21:28:50.184] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 21:28:50.187] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 21:28:50.193] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 21:28:50.989] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:28:50.990] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:28:51.001] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:28:51.005] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:29:03.367] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:29:03.368] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:29:03.378] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:29:03.382] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:29:33.081] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:29:33.082] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:29:33.092] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:29:33.096] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:29:34.371] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 21:29:34.372] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 21:29:34.374] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 21:29:34.376] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 21:29:34.383] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 21:29:36.021] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:29:36.031] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:29:36.041] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:29:36.055] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-07-24 21:29:36.073] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:29:36.081] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:29:43.715] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:29:43.725] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:29:43.736] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:30:33.256] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 21:30:33.260] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 21:30:33.264] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 21:30:33.268] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 21:30:33.276] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 21:30:34.460] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-24 21:30:34.469] [undefined] GET(/:id/stats): try to get stats +[2025-07-24 21:30:34.472] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-24 21:30:34.479] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-24 21:30:35.564] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:30:35.566] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:30:35.576] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:30:35.580] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:32:20.589] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:32:20.590] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:32:20.601] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:32:20.604] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:32:21.438] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:32:21.440] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:32:21.450] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:32:21.453] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:32:45.458] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:32:45.460] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:32:45.468] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:32:45.473] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:32:55.088] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:32:55.090] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:32:55.100] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:32:55.104] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:32:56.362] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:32:56.364] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:32:56.375] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:32:56.378] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:33:05.419] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:33:05.421] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:33:05.431] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:33:05.435] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:33:56.672] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:33:56.674] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:33:56.681] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:33:56.684] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:34:25.774] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:34:25.775] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:34:25.786] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:34:25.790] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:34:35.798] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:34:35.800] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:34:35.812] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:34:35.815] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:34:53.227] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:34:53.229] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:34:53.240] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:34:53.244] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:35:10.846] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:35:10.848] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:35:10.860] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:35:10.863] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:35:32.373] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:35:32.374] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:35:32.384] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:35:32.388] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:35:33.553] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:35:33.555] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:35:33.565] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:35:33.569] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:35:36.725] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:35:36.735] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:35:36.738] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:35:36.744] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:36:13.760] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:36:13.761] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:36:13.772] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:36:13.775] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:36:33.865] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:36:33.870] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:36:33.879] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:36:33.882] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:36:57.722] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:36:57.723] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:36:57.741] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:36:57.744] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:37:11.979] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:37:11.981] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:37:11.990] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:37:11.995] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:37:17.732] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:37:17.733] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:37:17.742] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:37:17.747] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:38:29.622] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:38:29.625] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:38:29.632] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:38:29.635] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:39:11.215] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:39:11.217] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:39:11.227] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:39:11.230] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:40:56.062] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:40:56.063] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:40:56.073] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:40:56.076] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:40:57.679] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:40:57.687] [undefined] PUT(/:id/tags): Tag Create Mod already exists for video 3 with status 200 +[2025-07-24 21:40:57.690] [undefined] PUT(/:id/tags): Tag Redstone already exists for video 3 with status 200 +[2025-07-24 21:40:57.693] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:41:03.488] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:41:03.490] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:41:03.499] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:41:03.502] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:41:04.452] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:41:04.460] [undefined] PUT(/:id/tags): Tag Redstone already exists for video 3 with status 200 +[2025-07-24 21:41:04.464] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:41:05.005] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:41:05.007] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:41:05.015] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:41:05.017] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:41:06.002] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:41:06.015] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:41:06.836] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:41:06.838] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:41:06.848] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:41:06.852] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:41:07.772] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:41:07.774] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:41:07.781] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:41:07.783] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:41:10.418] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:41:10.425] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:41:10.429] [undefined] PUT(/:id/tags): Tag Create Mod already exists for video 3 with status 200 +[2025-07-24 21:41:10.434] [undefined] PUT(/:id/tags): Tag Redstone already exists for video 3 with status 200 +[2025-07-24 21:41:10.436] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:41:12.865] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:41:12.866] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:41:12.877] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:41:12.881] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:42:57.693] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:42:57.696] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:42:57.707] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:42:57.711] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:42:59.535] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:42:59.543] [undefined] PUT(/:id/tags): Tag Create Mod already exists for video 3 with status 200 +[2025-07-24 21:42:59.545] [undefined] PUT(/:id/tags): Tag Redstone already exists for video 3 with status 200 +[2025-07-24 21:42:59.548] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:43:28.888] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:43:28.889] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:43:28.900] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:43:28.904] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:43:29.981] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:43:29.989] [undefined] PUT(/:id/tags): Tag Redstone already exists for video 3 with status 200 +[2025-07-24 21:43:29.993] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:43:31.990] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:43:31.997] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:44:25.228] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:44:25.230] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:44:25.240] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:44:25.243] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:45:34.279] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:45:34.281] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:45:34.291] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:45:34.295] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:45:38.111] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:45:38.118] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:45:38.137] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:45:46.618] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:45:46.632] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:45:46.637] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:45:51.312] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:45:51.314] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:45:51.324] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:45:51.328] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:47:07.572] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:47:07.576] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:47:07.583] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:47:07.586] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:47:15.627] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:47:15.630] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:47:15.638] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:47:15.641] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:47:16.642] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:47:16.652] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:47:16.663] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:47:16.674] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-07-24 21:47:16.694] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:47:16.702] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:47:51.534] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:47:51.536] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:47:51.545] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:47:51.548] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:48:27.254] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:48:27.255] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:48:27.267] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:48:27.270] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:48:43.798] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:48:43.810] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:48:43.821] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:48:43.830] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-07-24 21:48:43.857] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:48:43.866] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-24 21:48:51.420] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-24 21:48:51.423] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-24 21:48:51.424] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-24 21:48:51.426] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-24 21:48:51.432] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-24 21:48:52.182] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-24 21:48:52.191] [undefined] GET(/:id/stats): try to get stats +[2025-07-24 21:48:52.192] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-24 21:48:52.199] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-24 21:48:53.118] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:48:53.120] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:48:53.141] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:48:53.145] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:49:08.659] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:08.669] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:49:08.673] [undefined] PUT(/:id/tags): Tag Naho Saenoki already exists for video 3 with status 200 +[2025-07-24 21:49:08.677] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:09.737] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:09.745] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:49:09.748] [undefined] PUT(/:id/tags): Tag Naho Saenoki already exists for video 3 with status 200 +[2025-07-24 21:49:09.751] [undefined] PUT(/:id/tags): Tag qsdf already exists for video 3 with status 200 +[2025-07-24 21:49:09.755] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:10.355] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:10.363] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:49:10.366] [undefined] PUT(/:id/tags): Tag Naho Saenoki already exists for video 3 with status 200 +[2025-07-24 21:49:10.369] [undefined] PUT(/:id/tags): Tag qsdf already exists for video 3 with status 200 +[2025-07-24 21:49:10.372] [undefined] PUT(/:id/tags): Tag fds already exists for video 3 with status 200 +[2025-07-24 21:49:10.376] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:11.154] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:11.162] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:49:11.165] [undefined] PUT(/:id/tags): Tag Naho Saenoki already exists for video 3 with status 200 +[2025-07-24 21:49:11.169] [undefined] PUT(/:id/tags): Tag qsdf already exists for video 3 with status 200 +[2025-07-24 21:49:11.171] [undefined] PUT(/:id/tags): Tag fds already exists for video 3 with status 200 +[2025-07-24 21:49:11.174] [undefined] PUT(/:id/tags): Tag ezrt already exists for video 3 with status 200 +[2025-07-24 21:49:11.178] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:11.737] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:11.745] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:49:11.748] [undefined] PUT(/:id/tags): Tag Naho Saenoki already exists for video 3 with status 200 +[2025-07-24 21:49:11.750] [undefined] PUT(/:id/tags): Tag qsdf already exists for video 3 with status 200 +[2025-07-24 21:49:11.753] [undefined] PUT(/:id/tags): Tag fds already exists for video 3 with status 200 +[2025-07-24 21:49:11.756] [undefined] PUT(/:id/tags): Tag ezrt already exists for video 3 with status 200 +[2025-07-24 21:49:11.759] [undefined] PUT(/:id/tags): Tag gdf already exists for video 3 with status 200 +[2025-07-24 21:49:11.762] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:12.523] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:12.531] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:49:12.534] [undefined] PUT(/:id/tags): Tag Naho Saenoki already exists for video 3 with status 200 +[2025-07-24 21:49:12.537] [undefined] PUT(/:id/tags): Tag qsdf already exists for video 3 with status 200 +[2025-07-24 21:49:12.540] [undefined] PUT(/:id/tags): Tag fds already exists for video 3 with status 200 +[2025-07-24 21:49:12.542] [undefined] PUT(/:id/tags): Tag ezrt already exists for video 3 with status 200 +[2025-07-24 21:49:12.546] [undefined] PUT(/:id/tags): Tag gdf already exists for video 3 with status 200 +[2025-07-24 21:49:12.548] [undefined] PUT(/:id/tags): Tag hgf already exists for video 3 with status 200 +[2025-07-24 21:49:12.552] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:13.085] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:13.093] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:49:13.096] [undefined] PUT(/:id/tags): Tag Naho Saenoki already exists for video 3 with status 200 +[2025-07-24 21:49:13.099] [undefined] PUT(/:id/tags): Tag qsdf already exists for video 3 with status 200 +[2025-07-24 21:49:13.102] [undefined] PUT(/:id/tags): Tag fds already exists for video 3 with status 200 +[2025-07-24 21:49:13.104] [undefined] PUT(/:id/tags): Tag ezrt already exists for video 3 with status 200 +[2025-07-24 21:49:13.107] [undefined] PUT(/:id/tags): Tag gdf already exists for video 3 with status 200 +[2025-07-24 21:49:13.110] [undefined] PUT(/:id/tags): Tag hgf already exists for video 3 with status 200 +[2025-07-24 21:49:13.112] [undefined] PUT(/:id/tags): Tag jhh already exists for video 3 with status 200 +[2025-07-24 21:49:13.117] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:15.005] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:15.013] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:49:15.016] [undefined] PUT(/:id/tags): Tag Naho Saenoki already exists for video 3 with status 200 +[2025-07-24 21:49:15.019] [undefined] PUT(/:id/tags): Tag qsdf already exists for video 3 with status 200 +[2025-07-24 21:49:15.021] [undefined] PUT(/:id/tags): Tag fds already exists for video 3 with status 200 +[2025-07-24 21:49:15.024] [undefined] PUT(/:id/tags): Tag ezrt already exists for video 3 with status 200 +[2025-07-24 21:49:15.027] [undefined] PUT(/:id/tags): Tag gdf already exists for video 3 with status 200 +[2025-07-24 21:49:15.030] [undefined] PUT(/:id/tags): Tag hgf already exists for video 3 with status 200 +[2025-07-24 21:49:15.033] [undefined] PUT(/:id/tags): Tag jhh already exists for video 3 with status 200 +[2025-07-24 21:49:15.035] [undefined] PUT(/:id/tags): Tag gyj already exists for video 3 with status 200 +[2025-07-24 21:49:15.039] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:15.385] [undefined] PUT(/:id/tags): failed due to invalid values with status 400 +[2025-07-24 21:49:24.000] [undefined] PUT(/:id/tags): failed due to invalid values with status 400 +[2025-07-24 21:49:33.870] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:49:33.872] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-24 21:49:33.882] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-24 21:49:33.885] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:49:37.028] [undefined] PUT(/:id/tags): failed due to invalid values with status 400 +[2025-07-24 21:49:53.343] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:53.352] [undefined] PUT(/:id/tags): Tag Naho Saenoki already exists for video 3 with status 200 +[2025-07-24 21:49:53.355] [undefined] PUT(/:id/tags): Tag qsdf already exists for video 3 with status 200 +[2025-07-24 21:49:53.358] [undefined] PUT(/:id/tags): Tag fds already exists for video 3 with status 200 +[2025-07-24 21:49:53.361] [undefined] PUT(/:id/tags): Tag ezrt already exists for video 3 with status 200 +[2025-07-24 21:49:53.364] [undefined] PUT(/:id/tags): Tag gdf already exists for video 3 with status 200 +[2025-07-24 21:49:53.367] [undefined] PUT(/:id/tags): Tag hgf already exists for video 3 with status 200 +[2025-07-24 21:49:53.369] [undefined] PUT(/:id/tags): Tag jhh already exists for video 3 with status 200 +[2025-07-24 21:49:53.372] [undefined] PUT(/:id/tags): Tag gyj already exists for video 3 with status 200 +[2025-07-24 21:49:53.375] [undefined] PUT(/:id/tags): Tag t already exists for video 3 with status 200 +[2025-07-24 21:49:53.378] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:54.005] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:54.013] [undefined] PUT(/:id/tags): Tag qsdf already exists for video 3 with status 200 +[2025-07-24 21:49:54.016] [undefined] PUT(/:id/tags): Tag fds already exists for video 3 with status 200 +[2025-07-24 21:49:54.019] [undefined] PUT(/:id/tags): Tag ezrt already exists for video 3 with status 200 +[2025-07-24 21:49:54.022] [undefined] PUT(/:id/tags): Tag gdf already exists for video 3 with status 200 +[2025-07-24 21:49:54.024] [undefined] PUT(/:id/tags): Tag hgf already exists for video 3 with status 200 +[2025-07-24 21:49:54.027] [undefined] PUT(/:id/tags): Tag jhh already exists for video 3 with status 200 +[2025-07-24 21:49:54.030] [undefined] PUT(/:id/tags): Tag gyj already exists for video 3 with status 200 +[2025-07-24 21:49:54.033] [undefined] PUT(/:id/tags): Tag t already exists for video 3 with status 200 +[2025-07-24 21:49:54.036] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:54.978] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:54.986] [undefined] PUT(/:id/tags): Tag fds already exists for video 3 with status 200 +[2025-07-24 21:49:54.988] [undefined] PUT(/:id/tags): Tag ezrt already exists for video 3 with status 200 +[2025-07-24 21:49:54.991] [undefined] PUT(/:id/tags): Tag gdf already exists for video 3 with status 200 +[2025-07-24 21:49:54.994] [undefined] PUT(/:id/tags): Tag hgf already exists for video 3 with status 200 +[2025-07-24 21:49:54.996] [undefined] PUT(/:id/tags): Tag jhh already exists for video 3 with status 200 +[2025-07-24 21:49:54.999] [undefined] PUT(/:id/tags): Tag gyj already exists for video 3 with status 200 +[2025-07-24 21:49:55.002] [undefined] PUT(/:id/tags): Tag t already exists for video 3 with status 200 +[2025-07-24 21:49:55.004] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:55.663] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:55.689] [undefined] PUT(/:id/tags): Tag ezrt already exists for video 3 with status 200 +[2025-07-24 21:49:55.691] [undefined] PUT(/:id/tags): Tag gdf already exists for video 3 with status 200 +[2025-07-24 21:49:55.695] [undefined] PUT(/:id/tags): Tag hgf already exists for video 3 with status 200 +[2025-07-24 21:49:55.697] [undefined] PUT(/:id/tags): Tag jhh already exists for video 3 with status 200 +[2025-07-24 21:49:55.699] [undefined] PUT(/:id/tags): Tag gyj already exists for video 3 with status 200 +[2025-07-24 21:49:55.702] [undefined] PUT(/:id/tags): Tag t already exists for video 3 with status 200 +[2025-07-24 21:49:55.705] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:56.283] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:56.291] [undefined] PUT(/:id/tags): Tag gdf already exists for video 3 with status 200 +[2025-07-24 21:49:56.293] [undefined] PUT(/:id/tags): Tag hgf already exists for video 3 with status 200 +[2025-07-24 21:49:56.296] [undefined] PUT(/:id/tags): Tag jhh already exists for video 3 with status 200 +[2025-07-24 21:49:56.299] [undefined] PUT(/:id/tags): Tag gyj already exists for video 3 with status 200 +[2025-07-24 21:49:56.302] [undefined] PUT(/:id/tags): Tag t already exists for video 3 with status 200 +[2025-07-24 21:49:56.305] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:56.857] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:56.865] [undefined] PUT(/:id/tags): Tag hgf already exists for video 3 with status 200 +[2025-07-24 21:49:56.868] [undefined] PUT(/:id/tags): Tag jhh already exists for video 3 with status 200 +[2025-07-24 21:49:56.871] [undefined] PUT(/:id/tags): Tag gyj already exists for video 3 with status 200 +[2025-07-24 21:49:56.873] [undefined] PUT(/:id/tags): Tag t already exists for video 3 with status 200 +[2025-07-24 21:49:56.876] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:57.412] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:57.420] [undefined] PUT(/:id/tags): Tag jhh already exists for video 3 with status 200 +[2025-07-24 21:49:57.422] [undefined] PUT(/:id/tags): Tag gyj already exists for video 3 with status 200 +[2025-07-24 21:49:57.425] [undefined] PUT(/:id/tags): Tag t already exists for video 3 with status 200 +[2025-07-24 21:49:57.428] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:58.062] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:58.070] [undefined] PUT(/:id/tags): Tag gyj already exists for video 3 with status 200 +[2025-07-24 21:49:58.073] [undefined] PUT(/:id/tags): Tag t already exists for video 3 with status 200 +[2025-07-24 21:49:58.075] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:58.618] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:58.627] [undefined] PUT(/:id/tags): Tag t already exists for video 3 with status 200 +[2025-07-24 21:49:58.629] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:49:59.218] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:49:59.226] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:50:02.840] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:50:02.847] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:50:02.850] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:50:05.359] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:50:05.367] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:50:05.370] [undefined] PUT(/:id/tags): Tag Redstone already exists for video 3 with status 200 +[2025-07-24 21:50:05.373] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:50:08.551] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-07-24 21:50:08.560] [undefined] PUT(/:id/tags): Tag Minecraft already exists for video 3 with status 200 +[2025-07-24 21:50:08.563] [undefined] PUT(/:id/tags): Tag Redstone already exists for video 3 with status 200 +[2025-07-24 21:50:08.567] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-07-24 21:50:12.925] [undefined] GET(/:id): try to get video 3 +[2025-07-24 21:50:12.934] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-24 21:50:12.944] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-24 21:50:12.955] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-07-24 21:50:12.973] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-24 21:50:12.980] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 diff --git a/backend/requests/video.http b/backend/requests/video.http index f62d269..7af8b26 100644 --- a/backend/requests/video.http +++ b/backend/requests/video.http @@ -1,4 +1,4 @@ -@token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwidXNlcm5hbWUiOiJhc3RyaWEiLCJpYXQiOjE3NTI5NDQxMDF9.dbGCL8qqqLR3e7Ngns-xPfZAvp0WQzAbjaEHjDVg1HI +@token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhc3RyaWEiLCJpYXQiOjE3NTMzODAyNjB9._rUcieo3acJp6tjQao7V3UQz0_ngHuB2z36_fG_fIX8 ### UPDATE VIDEO PUT http://127.0.0.1:8000/api/videos/3 @@ -16,7 +16,7 @@ GET http://127.0.0.1:8000/api/videos/14/like Authorization: Bearer {{token}} ### ADD TAGS -PUT http://127.0.0.1:8000/api/videos/2/tags +PUT http://127.0.0.1:8000/api/videos/3/tags Content-Type: application/json Authorization: Bearer {{token}} @@ -26,7 +26,7 @@ Authorization: Bearer {{token}} "Create Mod", "Redstone" ], - "channel": 2 + "channel": 1 } ### diff --git a/backend/server.js b/backend/server.js index 6647ab1..1371162 100644 --- a/backend/server.js +++ b/backend/server.js @@ -20,9 +20,9 @@ const app = express(); // INITIALIZE DATABASE - -app.use(express.urlencoded({extended: true})); -app.use(express.json()); +// Increase body size limits for file uploads +app.use(express.urlencoded({extended: true, limit: '500mb'})); +app.use(express.json({limit: '500mb'})); app.use(cors()) // ROUTES diff --git a/frontend/src/components/Tag.jsx b/frontend/src/components/Tag.jsx new file mode 100644 index 0000000..ea1aab0 --- /dev/null +++ b/frontend/src/components/Tag.jsx @@ -0,0 +1,22 @@ +export default function Tag({ tag, onSuppress, doShowControls=true }) { + + return ( +
+ #{tag} + {doShowControls && ( + + + + + + + )} +
+ ) + +} \ No newline at end of file diff --git a/frontend/src/pages/ManageVideo.jsx b/frontend/src/pages/ManageVideo.jsx index 2997ec2..a5e8ada 100644 --- a/frontend/src/pages/ManageVideo.jsx +++ b/frontend/src/pages/ManageVideo.jsx @@ -4,6 +4,7 @@ import {useAuth} from "../contexts/AuthContext.jsx"; import {useEffect, useState} from "react"; import LinearGraph from "../components/LinearGraph.jsx"; import Comment from "../components/Comment.jsx"; +import Tag from "../components/Tag.jsx"; export default function ManageVideo() { @@ -17,9 +18,12 @@ export default function ManageVideo() { const [viewsPerDay, setViewsPerDay] = useState([]); const [videoTitle, setVideoTitle] = useState(null); const [description, setDescription] = useState(null); + const [visibility, setVisibility] = useState("private"); const [editMode, setEditMode] = useState(false); + const [thumbnailPreview, setThumbnailPreview] = useState(null); + const [videoFile, setVideoFile] = useState(null); - const nonEditModeClasses = "text-2xl font-semibold text-white p-2 focus:text-white focus:outline-none w-full font-montserrat resizable-none"; + const nonEditModeClasses = "text-md font-normal text-white p-2 focus:text-white focus:outline-none w-full font-montserrat resizable-none"; const editModeClasses = nonEditModeClasses + " glassmorphism"; const nonEditModeClassesTextArea = "text-md font-normal text-white p-2 focus:text-white focus:outline-none w-full font-montserrat resizable-none w-full" @@ -38,6 +42,9 @@ export default function ManageVideo() { } const data = await request.json(); setVideo(data); + setVisibility(data.visibility) + setVideoTitle(data.title); + setDescription(data.description); } const fetchLikesPerDay = async () => { const request = await fetch(`/api/videos/${id}/likes/day`, { @@ -62,6 +69,142 @@ export default function ManageVideo() { } }, [user, id, token]); + const onSubmit = async (e) => { + e.preventDefault(); + if (!editMode) return; + + const request = await fetch(`/api/videos/${id}`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ + title: videoTitle, + description: description, + visibility: visibility, + channel: video.channel + }) + }); + + if (!request.ok) { + console.error("Failed to update video"); + return; + } + + const form = new FormData(); + if (videoFile) { + form.append('file', videoFile); + form.append('video', id); + form.append('channel', video.channel); + + const videoRequest = await fetch(`/api/videos/${id}/video`, { + method: 'PUT', + headers: { + 'Authorization': `Bearer ${token}` + }, + body: form + }); + + if (!videoRequest.ok) { + console.error("Failed to update video file"); + return; + } + } + + const data = await request.json(); + setVideo(data); + setEditMode(false); + } + + const handleThumbnailChange = async (e) => { + const file = e.target.files[0]; + if (file) { + const reader = new FileReader(); + reader.onload = (e) => { + setThumbnailPreview(e.target.result); + }; + reader.readAsDataURL(file); + } + + const formData = new FormData(); + formData.append('file', file); + formData.append('video', id); + formData.append('channel', video.channel); + + console.log(formData); + + const request = await fetch(`/api/videos/thumbnail`, { + "method": 'POST', + "headers": { + "Authorization": `Bearer ${token}` + }, + body: formData + }) + if (!request.ok) { + console.error("Failed to upload thumbnail"); + return; + } + const data = await request.json(); + console.log(data); + }; + + const onAddTag = async (e) => { + if (e.key !== 'Enter' || e.target.value.trim() === "") return; + + const newTag = e.target.value.trim(); + e.target.value = ""; + + const request = await fetch(`/api/videos/${id}/tags`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ + tags: [...video.tags, newTag], + channel: video.channel + }) + }); + if (!request.ok) { + console.error("Failed to add tag"); + return; + } + const data = await request.json(); + console.log(data); + setVideo({ + ...video, + tags: [...video.tags, newTag] + }); + } + + const onSuppressTag = async (tag) => { + + const request = await fetch(`/api/videos/${id}/tags`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ + tags: video.tags.filter(t => t !== tag), + channel: video.channel + }) + }); + if (!request.ok) { + console.error("Failed to suppress tag"); + return; + } + const data = await request.json(); + console.log(data); + const newTags = video.tags.filter(t => t !== tag); + setVideo({ + ...video, + tags: newTags + }); + + } + return (
@@ -90,8 +233,8 @@ export default function ManageVideo() { { /* LEFT SIDE */ }
{ /* THUMBNAIL */ } -
- +
+ + { /* VIDEO INFOS */ } @@ -111,8 +255,8 @@ export default function ManageVideo() { type="text" id="name" value={videoTitle || videoTitle === "" ? videoTitle : video ? video.title : "Chargement"} - className={(editMode ? editModeClasses : nonEditModeClasses)} - onChange={(e) => setChannelName(e.target.value)} + onChange={(e) => setVideoTitle(e.target.value)} + className={(editMode ? editModeClasses : nonEditModeClasses) + " text-xl"} placeholder="Nom d'utilisateur" disabled={!editMode} /> @@ -130,12 +274,61 @@ export default function ManageVideo() { disabled={!editMode} > - + +
+ ) : ( + + ) + } @@ -172,6 +365,47 @@ export default function ManageVideo() {
+ { /* TAGS */ } +
+

Tags

+
+ { video && video.tags && video.tags.length > 0 ? ( + video.tags.map((tag) => ( + onSuppressTag(tag)} /> + )) + ) : ( +

Aucun tag

+ )} +
+ onAddTag(e)} + /> + +
+ + { /* LINK */ } + +
+ +

Lien de la vidéo

+

+ + {window.location.origin}/video/{id} + + +

+ +
diff --git a/frontend/src/pages/Video.jsx b/frontend/src/pages/Video.jsx index 9320f90..f45434c 100644 --- a/frontend/src/pages/Video.jsx +++ b/frontend/src/pages/Video.jsx @@ -4,6 +4,7 @@ import Navbar from "../components/Navbar.jsx"; import { useAuth } from "../contexts/AuthContext.jsx"; import Comment from "../components/Comment.jsx"; import VideoCard from "../components/VideoCard.jsx"; +import Tag from "../components/Tag.jsx"; export default function Video() { @@ -396,12 +397,7 @@ export default function Video() {
{video.tags.map((tag, index) => ( - - #{tag} - + ))}
diff --git a/nginx/default.conf b/nginx/default.conf index 20e8df5..6d6e209 100644 --- a/nginx/default.conf +++ b/nginx/default.conf @@ -12,6 +12,9 @@ server { root /usr/share/nginx/html; index index.html index.htm; + # Allow large file uploads for videos (up to 500MB) + client_max_body_size 500M; + ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt; ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key; @@ -26,6 +29,9 @@ server { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_buffering off; + # Also set timeout for large uploads + proxy_read_timeout 300s; + proxy_send_timeout 300s; } # Static assets - NO CACHING for development