diff --git a/.gitignore b/.gitignore index e69de29..87da954 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,9 @@ +/backend/app/uploads/ +# Ignore all files in the uploads directory + +/frontend/node_modules +/backend/node_modules +# Ignore node_modules directories in both frontend and backend + +/frontend/dist +# Ignore the build output directory for the frontend \ No newline at end of file diff --git a/README.md b/README.md index 6db5d56..0359ba0 100644 --- a/README.md +++ b/README.md @@ -1,436 +1,502 @@ -# FreeTube - Video Sharing Platform - -![FreeTube Logo](frontend/src/assets/img/hero.png) - -## 📋 Table of Contents -- [Overview](#overview) -- [Features](#features) -- [Tech Stack](#tech-stack) -- [Prerequisites](#prerequisites) -- [Installation](#installation) -- [Configuration](#configuration) -- [Usage](#usage) -- [API Documentation](#api-documentation) -- [Project Structure](#project-structure) -- [Development](#development) -- [Testing](#testing) -- [Troubleshooting](#troubleshooting) -- [Contributing](#contributing) - -## 🎯 Overview - -FreeTube is a modern video sharing platform built as a YouTube competitor. It allows users to upload, watch, and interact with videos through comments and likes. The platform features user authentication, video management, channel subscriptions, and a recommendation system. - -This project is part of a 3-part development resit assignment focusing on: -- **Part 1**: HTTP server serving HTML pages -- **Part 2**: REST API for video, user, and comment management -- **Part 3**: Interactive frontend user interface - -## ✹ Features - -### 🔐 Authentication System -- User registration with profile picture upload -- Secure login with JWT tokens -- Persistent sessions with localStorage -- Protected routes and authentication guards -- Profile management and display - -### đŸ“č Video Management -- Video upload with thumbnail generation -- Video streaming and playback -- Video metadata management -- Video search and filtering - -### đŸ‘„ User Features -- User profiles with customizable avatars -- Channel creation and management -- Subscription system -- User activity tracking - -### 💬 Social Features -- Video commenting system -- Like/dislike functionality -- Video recommendations -- Trending videos section - -### 🎹 Frontend Features -- Responsive React-based UI -- Modern design with Tailwind CSS -- Client-side routing with React Router -- Real-time updates and interactions - -## 🛠 Tech Stack - -### Backend -- **Runtime**: Node.js -- **Framework**: Express.js -- **Database**: PostgreSQL -- **Authentication**: JWT (JSON Web Tokens) -- **File Upload**: Multer -- **Testing**: Vitest - -### Frontend -- **Framework**: React 18 -- **Build Tool**: Vite -- **Styling**: Tailwind CSS -- **Routing**: React Router -- **State Management**: React Context API -- **Fonts**: Montserrat, Inter - -### Infrastructure -- **Containerization**: Docker & Docker Compose -- **Reverse Proxy**: Nginx -- **Development**: Hot reload for both frontend and backend - -## 📋 Prerequisites - -Before you begin, ensure you have the following installed: -- [Docker](https://docs.docker.com/get-docker/) (v20.10+) -- [Docker Compose](https://docs.docker.com/compose/install/) (v2.0+) -- [Git](https://git-scm.com/downloads) - -## 🚀 Installation - -### Quick Start with Docker (Recommended) - -1. **Clone the repository** - ```bash - git clone - cd 3RESIT_DOCKER - ``` - -2. **Set up environment variables** - Create a `.env` file in the root directory: - ```env - # Database Configuration - POSTGRES_USER=freetube_user - POSTGRES_PASSWORD=your_secure_password - POSTGRES_DB=freetube_db - POSTGRES_HOST=db - - # Backend Configuration - BACKEND_PORT=8000 - JWT_SECRET=your_jwt_secret_key_min_32_chars - LOG_FILE=/var/log/freetube/access.log - ``` - -3. **Build and start the application** - ```bash - docker-compose up --build - ``` - -4. **Access the application** - - Frontend: http://localhost - - Backend API: http://localhost:8000 - - Database: localhost:5432 - -### Manual Installation - -
-Click to expand manual installation steps - -#### Backend Setup -```bash -cd backend -npm install -npm run dev -``` -#### Frontend Setup -```bash -cd frontend -npm install -npm run dev -``` +## Sommaire + +1) Introduction +2) Description du projet +3) La pile technologique + 1) Le serveur + 2) Le site web + 3) La base de donnĂ©es +4) Le serveur + 1) Les dĂ©pendances + 2) Le fonctionnement +5) Le site web + 1) Les dĂ©pendances + 2) Le fonctionnement +6) La base de donnĂ©es +7) Installation du projet + 1) Docker Compose + 2) Script Shell + 3) Manuellement +8) Conclusion + +## Introduction + +Cette documentation est Ă  destination des futurs dĂ©veloppeurs travaillant sur Freetube. Elle a pour but d’expliquer le fonctionnement technique de toutes les couches de l’application et Ă  justifier les choix pris pour chaque langage et framework.  + +La documentation est une ressource indispensable pour tous ceux voulant comprendre le fonctionnement interne de Freetube. Les parties dĂ©montrĂ©es ici couvrent toutes les couches de l’application. Par ailleurs des diagrammes UML et schĂ©mas de base de donnĂ©es vous sont fournies pour une meilleure comprĂ©hension du code. Un indexe est disponible en fin de document.  + +Cette documentation est Ă  un but technique, elle rentre volontairement dans les dĂ©tails du fonctionnement de chaque partie. Elle n’est pas faite pour ĂȘtre lu par un utilisateur, un manuel utilisateur vous a Ă©tĂ© fournies pour remplir ce besoin. + +De plus les documentations externes sont disponible en fin de document et un **Swagger** est prĂ©sent sur l'endpoint `/api/api-docs` pour une documentation de l'API plus approfondie. + +## Description du projet + +Il m’a Ă©tĂ© demandĂ© de crĂ©er une plateforme concurrente à YouTube nommĂ©e Freetube. Cette alternative a pour but de mieux remplir les demandes des utilisateurs, pas d’abonnement ni publicitĂ© pour consommer ou poster des vidĂ©os sur la plateforme.  + +Le cahier des charges du projet demande certaines fonctionnalitĂ©s Ă  implĂ©menter. Les utilisateurs doivent pourvoir regarder des vidĂ©os sans avoir Ă  se connecter oĂč à crĂ©er de compte, ils doivent pouvoir crĂ©er un compte et le gĂ©rer, pouvoir crĂ©er une chaĂźne la gĂ©rer et y poster des vidĂ©os. La fonctionnalitĂ© de vidĂ©o privĂ© a aussi Ă©tĂ© demandĂ©.  + +Pour ce projet j’avais la main libre sur la pile technologique Ă  utiliser tout en respectant les demandes d’efficacitĂ© d’une plateforme de streaming vidĂ©o. + +## La pile technologique + +### Le serveur + +Le serveur a Ă©tĂ© codĂ© en **Nodejs**, j’ai choisi ce langage car il permet d’implĂ©menter une **API REST** efficacement grĂące Ă  son implĂ©mentation native de l’asynchrone indispensable pour une API REST. NodeJS Ă©tant basĂ© sur **Javascript** il n’est pas le plus efficient mais ce n’est pas dĂ©rangeant car nous travaillons avec une API, le temps de rĂ©ponse sera biaisĂ© par la connexion internet de l’utilisateur. + +### Le site web + +Le site web a lui Ă©tĂ© codĂ© en **ReactJS** une librairie Javascript permettant de crĂ©er des interfaces utilisateur. ReactJS Ă©tant lui aussi basĂ© sur Javascript, cela permet une maintenabilitĂ© plus simple car les deux parties sont dans le mĂȘme langages, de plus le site web bĂ©nĂ©ficie lui aussi de l’implĂ©mentation de l’asynchrone. J’ai choisi d’utiliser ReactJS car il permet l’utilisation de **components** permettant le live reload et Ă©vite la duplication de code inutile. + +### La base de donnĂ©es -#### Database Setup -- Install PostgreSQL -- Create database and user -- Run migrations (if available) -
+La base de donnĂ©es est en **PostgreSQL**, un langage basĂ© sur **SQL** largement utilisĂ© pour communiquer avec une base de donnĂ©es. Cependant PostgreSQL possĂšde quelques avantages par rapport Ă  une base de donnĂ©es comme **MySQL**, il intĂšgre une trĂšs bonne gestion du **JSON** que j’ai beaucoup utilisĂ© dans ce projet et il est **Open Source**. -## ⚙ Configuration +## Le serveur -### Environment Variables +### Les dĂ©pendances -| Variable | Description | Default | Required | -|----------|-------------|---------|----------| -| `POSTGRES_USER` | Database username | - | ✅ | -| `POSTGRES_PASSWORD` | Database password | - | ✅ | -| `POSTGRES_DB` | Database name | - | ✅ | -| `POSTGRES_HOST` | Database host | db | ✅ | -| `BACKEND_PORT` | Backend server port | 8000 | ✅ | -| `JWT_SECRET` | JWT signing secret | - | ✅ | -| `LOG_FILE` | Log file path | /var/log/freetube/access.log | ❌ | +Le serveur NodeJS sert de plateforme entre le site web et la base de donnĂ©es, il doit donc pouvoir recevoir des requĂȘtes HTTP et envoyer des requĂȘtes SQL. Pour les requĂȘtes HTTP j’ai choisis le framework **ExpressJS** car il est trĂšs connu et a donc beaucoup de contenu disponible sur internet. Pour les requĂȘtes SQL j'ai utilisĂ© la librairie **pg** qui permet de communiquer avec PostgreSQL, cette librairie peux gĂ©rer les fermetures de connexion inutile comme les time out ou les oublies.  -### Docker Volumes +Puisque l’API transmet des donnĂ©es sensibles j’ai dĂ» sĂ©curiser les endpoints en vĂ©rifiant les donnĂ©es entrantes, pour cela j’ai utilisĂ© **express-validator** qui permet de crĂ©er des **middlewares** pour vĂ©rifier les donnĂ©es. Pour les images et les fichiers vidĂ©o j’ai utilisĂ© **multer** qui s’intĂšgre trĂšs bien avec ExpressJS. Pour l’authentification par **Github** j’ai choisi de passĂ© par **PassportJS** qui s’occupe du passage de token entre GitHub et le backend.  -The application uses the following volumes: -- `./backend/logs:/var/log/freetube` - Application logs -- `./backend/app/uploads:/app/app/uploads` - Uploaded files (videos, images) -- Database data volume for PostgreSQL persistence +Pour la gestion de l’authentification j’ai utilisĂ© **Json Web Token** qui permet de gĂ©nĂ©rer et de vĂ©rifier des tokens d’authentifications. Pour l’encryption des mots de passe **Bcrypt** a Ă©tĂ© utilisĂ©. -## 📖 Usage +### Le fonctionnement -### Getting Started +Chaque endpoints et diviser en trois parties distinctes, la dĂ©finition de la route, qui va dĂ©finir l’URL Ă  appeler, les middlewares qui vont effectuer les vĂ©rifications et modifications des donnĂ©es avant leur utilisation, et les controllers qui vont faire les actions (appels de base donnĂ©es, dĂ©placement de fichier...). Des diagrammes UML expliquant les routes unes-Ă -unes est disponible dans le dossier “Diagramme_UML”. -1. **Create an Account** - - Navigate to http://localhost - - Click "CrĂ©er un compte" - - Fill in your details and optionally upload a profile picture - - Submit the form to register and automatically log in +Chaque endpoints qui doivent ĂȘtre protĂ©gĂ©es par l’utilisation d’un compte utilisent le middleware “auth.middleware.js” pour vĂ©rifier la validitĂ© d’un token. -2. **Login** - - Click "Se connecter" on the homepage - - Enter your username and password - - You'll be redirected to the authenticated homepage +## Le site web -3. **Upload Videos** - - Use the API endpoints to upload videos (see API documentation) - - Videos are stored in the uploads directory +### Les dĂ©pendances -4. **Browse Content** - - View recommendations on the homepage - - Search for videos using the search bar - - Browse trending videos and top creators +Le site web ne doit faire aucun calcul, tout passe donc par des requĂȘte HTTP, j'ai donc utilisĂ© la librairie **fetch** intĂ©grĂ© Ă  NodeJS dans sa version 22.  -### Authentication Flow +Pour l’hĂ©bergement j’ai choisi **NGINX** car il permet de d’hĂ©berger un site et de faire des redirections, il m’a permis de rediriger les requĂȘtes vers l’API en passant par la route “/api/” ce qui Ă©vite d’exposer des ports inutilement.  -The authentication system works as follows: -1. User registers/logs in through the frontend forms -2. Backend validates credentials and returns JWT token -3. Token is stored in localStorage for persistence -4. Protected routes check authentication status -5. Navbar updates to show user profile and logout option +NGINX permet aussi de mettre en place l’**HTTPS** avec des **certificats SSL** ce qui chiffre les requĂȘtes du site et de l'API.  -## 📚 API Documentation +Le site fonctionnant avec ReactJS nĂ©cessite l’utilisation de **Vite** pour le dĂ©veloppement et le dĂ©ploiement.  -### Authentication Endpoints +Freetube est un site multi-page et doit utiliser un systĂšme de routage. Pour cela j’ai utilisĂ© **React Router 7** car il est trĂšs utilisĂ© et donc trĂšs bien documentĂ©. -#### Register User -```http -POST /api/users/ -Content-Type: multipart/form-data +Pour la partie style du site web, j'ai utilisĂ© TailwindCSS dans sa version 4.0. Tailwind permet de crĂ©er des classes CSS directement depuis le JSX et prend en charge le responsive grĂące a des **breakpoints**. Il est notamment plus lĂ©ger que ses concurrents car il crĂ©er ses classes CSS au moment du build contrairement, par exemple, a Bootstrap qui Ă  besoin d'un fichier contenant toue les classes CSS de la librairie pour fonctionner. -email: user@example.com -username: johndoe -password: securepassword -picture: [file upload] +### Le fonctionnement + +Les Ă©lĂ©ments du site sont divisĂ©s en plusieurs parties, les pages sont dans le dossier “/src/pages” et servent Ă  accueillir et Ă  mettre en forme les composants et Ă  appeler les services.   + +Les composants dans le dossier “/src/components” servent Ă  diviser le code et Ă  Ă©viter la duplication, un composant peut ĂȘtre appelĂ© plusieurs fois sur plusieurs pages diffĂ©rentes. Les composants ne font pas d'appel aux services, les Ă©vĂ©nements liĂ©s aux composants sont passer en paramĂštre de ces dernier.  + +Les modales sont dans le dossier “/src/modals” et sont toujours afficher au-dessus de la vue principale. Comme les composants elles ne fonts aucun appels aux services, les Ă©vĂ©nements liĂ©s aux modales sont passer en paramĂštre de ces derniers. Elles sont toujours appelĂ©es en fin de fichier.  + +Les services prĂ©sent dans le dossier “/src/services” sont les seuls fichiers faisant appel Ă  l’API (Ă  l’exception du fichier AuthContext.jsx). Les services sont organisĂ©s de la mĂȘme maniĂšre que les endpoints. Un service peut ĂȘtre appelĂ© plusieurs fois dans plusieurs pages.  + +Les routes utilisĂ©es par React Router sont prĂ©sente dans le fichier “/src/routes/route.jsx”. Les routes ayant besoin d’un compte sont protĂ©gĂ©es par “ProtectedRoute” et rĂ©digeront automatiquement Ă  la page de connexion. React Router n’étant pas directement compatible avec le systĂšme de NGINX une configuration supplĂ©mentaire est nĂ©cessaire, elle est dĂ©taillĂ©e dans le fichier “/nginx/default.conf”. + +## La base de donnĂ©es + +La structure de la base de donnĂ©es est créée automatiquement par le serveur au lancement, chaque modification effectuĂ©e doit ĂȘtre modifiĂ© dans le fichier `/backend/src/utils/database.js` dans la fonction `initDb()`.   + +La base de donnĂ©es Ă©tant relationnelle, elle repose sur beaucoup de clĂ© Ă©trangĂšre dĂ©taillĂ©s dans le schĂ©ma fourni. A savoir que les enfants se dĂ©truisent automatiquement si le lien parent est supprimĂ© grĂące Ă  la condition “ON CASCADE” prĂ©sente dans chacun des liens.   + +Le port de la base de donnĂ©es (5432 par defaut) ne doit jamais ĂȘtre exposĂ© sans pare-feu, seul le serveur doit y avoir accĂšs. Pour cela PostgreSQL propose deux fichiers de configuration. `pg_hba` crĂ©er des rĂšgles internes en fonction de l’utilisateur, la base cible et l’IP du client et `postgres.conf` qui permet de dĂ©finir un schĂ©ma d’IP autorisĂ©. A savoir que si le projet et lancĂ© via Docker seul localhost peut avoir accĂšs à cette base de donnĂ©es. + +## Installation et lancement + +**Ces instructions sont prĂ©vues pour un serveur tournant sous Ubuntu 24.04/Debian 12.** Par consĂ©quent certaines commandes peuvent ĂȘtre incompatible avec votre systĂšme, cependant cotre systĂšme d'exploitation fournis des commandes alternatives. + +Freetube peut ĂȘtre installĂ© de trois maniĂšre diffĂ©rentes : +- Docker Compose +- Script Shell +- Manuellement + +### Installation avec Docker Compose + +#### Installer Docker et Docker Compose + +De part la [documentation officielle de Docker](https://docs.docker.com/engine/install/ubuntu/) +```bash +# Add Docker's official GPG key: +sudo apt-get update +sudo apt-get install ca-certificates curl +sudo install -m 0755 -d /etc/apt/keyrings +sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc +sudo chmod a+r /etc/apt/keyrings/docker.asc + +# Add the repository to Apt sources: +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +sudo apt-get update + +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` -#### Login User -```http -POST /api/users/login -Content-Type: application/json +#### ParamĂ©trages NGINX +Quelque modification doivent ĂȘtre faites pour le fonctionnement de NGINX +```nginx +server { + #------------------------------ ici ------------------------------- + server_name ; + #------------------------------------------------------------------ + listen 80; + return 301 https://$host$request_uri; +} + +server { + #------------------------------ ici ------------------------------- + server_name ; + #------------------------------------------------------------------ + listen 443 ssl; + + root /usr/share/nginx/html; + index index.html index.htm; + + client_max_body_size 500M; + + ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt; + ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key; + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + + location /api/ { + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Origin' '$http_origin' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Max-Age' 1728000 always; + add_header 'Content-Type' 'text/plain; charset=utf-8' always; + add_header 'Content-Length' 0 always; + return 204; + } + + proxy_pass http://resit_backend:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Origin $http_origin; + proxy_buffering off; + + add_header 'Access-Control-Allow-Origin' '$http_origin' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + + proxy_read_timeout 300s; + proxy_send_timeout 300s; + } + + location ~* ^/(?!api/).*\.(js|css|png|jpg|jpeg|gif|ico|svg)$ { + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + add_header Pragma "no-cache"; + add_header Expires "0"; + try_files $uri =404; + } + + location / { + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + try_files $uri $uri/ /index.html; + } -{ - "username": "johndoe", - "password": "securepassword" } ``` -### Media Endpoints +#### CrĂ©ation de clĂ© d'API Gmail + +Rendez-vous sur [Gmail](https://gmail.com) et allez dans le panel d'administration de votre compte +Dans la barre de recherche tapez `Mot de passe des applications` +CrĂ©er un mot de passe et gardez le de cĂŽtĂ© il servira pour les variables d'environnements + +#### CrĂ©ation Application OAuth Github + +Rendez-vous sur [Github](https://github.com) et allez dans les paramĂštres de votre compte +En bas du menu Ă  gauche, cliquez sur `ParamĂštres de dĂ©veloppeur` puis cliquez sur `Application OAuth` +CrĂ©ez une nouvelle application et gardez les clĂ© de cĂŽtĂ©, elle serviront pour les variables d'environnements -#### Get Profile Picture -```http -GET /api/media/profile/{filename} +#### Mise en place des variables d'environnements + +A la racine du projet crĂ©er un fichier `.env` +```bash +touch .env ``` -#### Get Video Thumbnail -```http -GET /api/media/thumbnail/{filename} +A l'aide de l'Ă©diteur de votre choix entrez dans le fichier +``` +nano .env ``` -### Additional Endpoints +Rentrez les informations dans ce format +/!\ les valeurs non-entourĂ©es de chevrons **ne doivent pas ĂȘtre modifiĂ©**. +```env +POSTGRES_USER= +POSTGRES_PASSWORD= +POSTGRES_DB= +POSTGRES_HOST=db -- **Videos**: `/api/videos/` -- **Comments**: `/api/comments/` -- **Channels**: `/api/channels/` -- **Playlists**: `/api/playlists/` -- **Recommendations**: `/api/recommendations/` +BACKEND_PORT=8000 -For detailed API documentation, check the `.http` files in the `backend/requests/` directory. +JWT_SECRET= -## 📁 Project Structure +LOG_FILE=/var/log/freetube/access.log -``` -3RESIT_DOCKER/ -├── backend/ # Node.js Express backend -│ ├── app/ -│ │ ├── controllers/ # Request handlers -│ │ ├── middlewares/ # Express middlewares -│ │ ├── routes/ # API route definitions -│ │ ├── uploads/ # File storage -│ │ └── utils/ # Utility functions -│ ├── logs/ # Application logs -│ ├── requests/ # HTTP request examples -│ └── test/ # Test files -├── frontend/ # React frontend -│ ├── src/ -│ │ ├── components/ # Reusable React components -│ │ ├── contexts/ # React Context providers -│ │ ├── pages/ # Page components -│ │ ├── routes/ # Route configuration -│ │ └── assets/ # Static assets -│ └── public/ # Public assets -├── nginx/ # Nginx configuration -└── docker-compose.yaml # Docker orchestration -``` +GMAIL_USER= +GMAIL_PASSWORD= + +FRONTEND_URL= -## 🔧 Development +GITHUB_ID= -### Available Scripts +GITHUB_SECRET= -#### Backend + +#### Lancement + +Pour lancer le groupe de conteneur ```bash -npm run dev # Start development server with hot reload -npm run start # Start production server -npm run test # Run tests +docker compose up -d # pour dĂ©tacher de la session ``` -#### Frontend +### Installation via le Script Shell + +#### Ajout des autorisations + +Pour ajouter les autorisations nĂ©cessaire au lancement du script ```bash -npm run dev # Start development server -npm run build # Build for production -npm run preview # Preview production build -npm run lint # Run ESLint +chmod +x ./deploy.sh ``` -#### Docker Commands -```bash -# Start all services -docker-compose up --build +#### CrĂ©ation de clĂ© d'API Gmail -# Stop all services -docker-compose down +Rendez-vous sur [Gmail](https://gmail.com) et allez dans le panel d'administration de votre compte +Dans la barre de recherche tapez `Mot de passe des applications` +CrĂ©er un mot de passe et gardez le de cĂŽtĂ© il servira pour les variables d'environnements -# View logs -docker-compose logs [service-name] +#### CrĂ©ation Application OAuth Github -# Restart specific service -docker-compose restart [service-name] +Rendez-vous sur [Github](https://github.com) et allez dans les paramĂštres de votre compte +En bas du menu Ă  gauche, cliquez sur `ParamĂštres de dĂ©veloppeur` puis cliquez sur `Application OAuth` +CrĂ©ez une nouvelle application et gardez les clĂ© de cĂŽtĂ©, elle serviront pour les variables d'environnements -# Reset database -docker-compose down --volumes +#### Lancer l'installation + +Lancer le script et rĂ©pondez au question +```bash +./deploy.sh +``` + +Lancer le projet +```bash +cd backend && npm run start +cd frontend && npx vite build + +systemctl enable --now nginx # Pour un dĂ©marrage automatique au lancement de la machine +systemctl enable --now postgresql ``` -### Development Workflow +### Installation manuelle -1. **Backend Changes**: Automatically reload with nodemon -2. **Frontend Changes**: Hot module replacement with Vite -3. **Database Changes**: Restart containers to apply schema changes -4. **Nginx Changes**: Restart nginx service +#### CrĂ©ation de clĂ© d'API Gmail -### File Upload Testing +Rendez-vous sur [Gmail](https://gmail.com) et allez dans le panel d'administration de votre compte +Dans la barre de recherche tapez `Mot de passe des applications` +CrĂ©er un mot de passe et gardez le de cĂŽtĂ© il servira pour les variables d'environnements -Use the provided `.http` files in `backend/requests/` to test API endpoints: -- `user.http` - User registration and authentication -- `video.http` - Video management -- `medias.http` - Media file serving -- `comment.http` - Comment system +#### CrĂ©ation Application OAuth Github -## đŸ§Ș Testing +Rendez-vous sur [Github](https://github.com) et allez dans les paramĂštres de votre compte +En bas du menu Ă  gauche, cliquez sur `ParamĂštres de dĂ©veloppeur` puis cliquez sur `Application OAuth` +CrĂ©ez une nouvelle application et gardez les clĂ© de cĂŽtĂ©, elle serviront pour les variables d'environnements -### Running Tests +#### Mise en place des variables d'environnements +A la racine du projet crĂ©er un fichier `.env` ```bash -# Backend tests -cd backend -npm test +touch .env +``` -# Frontend tests (if configured) -cd frontend -npm test +A l'aide de l'Ă©diteur de votre choix entrez dans le fichier ``` +nano .env +``` + +Rentrez les informations dans ce format +/!\ les valeurs non-entourĂ©es de chevrons **ne doivent pas ĂȘtre modifiĂ©**. +```env +POSTGRES_USER= +POSTGRES_PASSWORD= +POSTGRES_DB= +POSTGRES_HOST=db -### Test Structure +BACKEND_PORT=8000 -- **Unit Tests**: Individual component/function testing -- **Integration Tests**: API endpoint testing -- **E2E Tests**: Full application workflow testing +JWT_SECRET= -Current test coverage includes: -- User authentication -- Video management -- Comment system -- Channel operations -- Playlist functionality +LOG_FILE=/var/log/freetube/access.log -## 🔍 Troubleshooting +GMAIL_USER= +GMAIL_PASSWORD= -### Common Issues +FRONTEND_URL= -#### Authentication Problems -- **Blank screen on reload**: Check browser console for context errors -- **Login not persisting**: Verify JWT token in localStorage -- **Registration fails**: Check file upload size limits +GITHUB_ID= -#### Media File Issues -- **404 on images**: Verify nginx proxy configuration -- **Upload fails**: Check file permissions and upload directory +GITHUB_SECRET= +``` -#### Docker Issues -- **Containers won't start**: Check port conflicts -- **Database connection fails**: Verify environment variables -- **Build failures**: Clear Docker cache with `docker system prune` +#### Installation des paquets -### Debug Commands +Pour installer PostgreSQL/NGINX +```bash +apt install nginx postgresql +``` +Pour installer NodeJS de part la [documentation officielle](https://nodejs.org/en/download/) ```bash -# Check container status -docker-compose ps +# Download and install nvm: +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash -# View service logs -docker-compose logs -f [service-name] +# in lieu of restarting the shell +\. "$HOME/.nvm/nvm.sh" -# Access container shell -docker-compose exec [service-name] /bin/bash +# Download and install Node.js: +nvm install 22 -# Reset everything -docker-compose down --volumes --rmi all -docker system prune -a +# Verify the Node.js version: +node -v # Should print "v22.19.0". +nvm current # Should print "v22.19.0". + +# Verify npm version: +npm -v # Should print "10.9.3". ``` -### Performance Optimization +#### Installations des dĂ©pendances NodeJS -- Enable nginx caching for static assets -- Implement image optimization for uploads -- Use CDN for media file delivery -- Database query optimization -- Frontend code splitting +Pour le serveur +```bash +cd backend && npm i --production +``` -## đŸ€ Contributing +Pour le site web +```bash +cd frontend && npm i --production +npx vite build # pour la construction du site +``` -1. Fork the repository -2. Create a feature branch (`git checkout -b feature/amazing-feature`) -3. Commit your changes (`git commit -m 'Add amazing feature'`) -4. Push to the branch (`git push origin feature/amazing-feature`) -5. Open a Pull Request +#### Configuration de NGINX -### Code Style +Dans `/etc/nginx/conf.d/` ajouter le fichier `freetube.conf` avec cette configuration +```nginx +server { + server_name ; + listen 80; + return 301 https://$host$request_uri; +} -- **Backend**: ESLint with Node.js rules -- **Frontend**: ESLint with React rules -- **Formatting**: Prettier for consistent code style -- **Commits**: Conventional commit messages +server { + server_name ; + listen 443 ssl; + + root /usr/share/nginx/html; + index index.html index.htm; + + client_max_body_size 500M; + + ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt; + ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key; + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + + location /api/ { + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Origin' '$http_origin' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Max-Age' 1728000 always; + add_header 'Content-Type' 'text/plain; charset=utf-8' always; + add_header 'Content-Length' 0 always; + return 204; + } + + proxy_pass http://resit_backend:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Origin $http_origin; + proxy_buffering off; + + add_header 'Access-Control-Allow-Origin' '$http_origin' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + + proxy_read_timeout 300s; + proxy_send_timeout 300s; + } + + location ~* ^/(?!api/).*\.(js|css|png|jpg|jpeg|gif|ico|svg)$ { + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + add_header Pragma "no-cache"; + add_header Expires "0"; + try_files $uri =404; + } + + location / { + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + try_files $uri $uri/ /index.html; + } -## 📜 License +} +``` -This project is part of an educational assignment. All rights reserved. +#### CrĂ©ation de la base de donnĂ©es +Pour crĂ©er l'utilisateur PostgreSQL +```postgresql +CREATE ROLE "" WITH PASSWORD ""; +``` + +Pour crĂ©er la base +```postgresql +CREATE DATABASE "" OWNER " 0) { logger.write("failed to update channel because name already taken", 400); + client.release(); res.status(400).json({error: 'Name already used'}); return } @@ -96,6 +156,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.release(); res.status(200).json(channel); } @@ -108,6 +169,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.release(); res.status(200).json({message: 'Successfully deleted'}); } @@ -132,6 +194,7 @@ export async function toggleSubscription(req, res) { const remainingSubscriptions = countResult.rows[0].count; logger.write("Successfully unsubscribed from channel", 200); + client.release(); res.status(200).json({message: 'Unsubscribed successfully', subscriptions: remainingSubscriptions}); } else { // Subscribe @@ -144,6 +207,37 @@ export async function toggleSubscription(req, res) { const totalSubscriptions = countResult.rows[0].count; logger.write("Successfully subscribed to channel", 200); + client.release(); res.status(200).json({message: 'Subscribed successfully', subscriptions: totalSubscriptions}); } +} + +export async function getStats(req, res) { + + try { + const id = req.params.id; + + const logger = req.body.logger; + logger.action("try to get stats"); + + const request = ` + SELECT + (SELECT COUNT(*) FROM subscriptions WHERE channel = $1) as subscribers, + (SELECT COUNT(*) FROM history h JOIN videos v ON h.video = v.id WHERE v.channel = $1) as views + FROM channels + LEFT JOIN public.subscriptions s on channels.id = s.channel + LEFT JOIN public.videos v on channels.id = v.channel + LEFT JOIN public.history h on v.id = h.video + WHERE channels.id = $1 + `; + const client = await getClient(); + const result = await client.query(request, [id]); + logger.write("Successfully get stats", 200); + client.release(); + res.status(200).json(result.rows[0]); + } catch (error) { + console.log(error); + res.status(500).json({error: error.message}); + } + } \ No newline at end of file diff --git a/backend/app/controllers/comment.controller.js b/backend/app/controllers/comment.controller.js index 8ff3064..0c07208 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.release(); 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.release() 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.release(); 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.release(); 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.release(); res.status(200).json(result.rows[0]); } \ No newline at end of file diff --git a/backend/app/controllers/oauth.controller.js b/backend/app/controllers/oauth.controller.js new file mode 100644 index 0000000..36bdaa9 --- /dev/null +++ b/backend/app/controllers/oauth.controller.js @@ -0,0 +1,159 @@ +import passport from "passport"; +import { Strategy as GitHubStrategy } from "passport-github2"; +import { getClient } from "../utils/database.js"; +import jwt from "jsonwebtoken"; + +export async function login(req, res) { + passport.authenticate("github", { scope: ["user:email"] })(req, res); +} + +export async function callback(req, res, next) { + passport.authenticate("github", { failureRedirect: "https://localhost/login?error=oauth_failed" }, async (err, user) => { + if (err) { + console.error("OAuth error:", err); + return res.redirect("https://localhost/login?error=oauth_error"); + } + + if (!user) { + return res.redirect("https://localhost/login?error=oauth_cancelled"); + } + + try { + // Extract user information from GitHub profile + const githubId = user.id; + const username = user.username || user.login; + const email = user.emails[0].value || null; + const avatarUrl = user.photos && user.photos[0] ? user.photos[0].value : null; + const displayName = user.displayName || username; + + console.log(user); + + console.log("GitHub user info:", { + githubId, + username, + email, + displayName, + avatarUrl + }); + + const client = await getClient(); + + // Check if user already exists by GitHub ID + let existingUserQuery = `SELECT * FROM users WHERE github_id = $1`; + let existingUserResult = await client.query(existingUserQuery, [githubId]); + + let dbUser; + + if (existingUserResult.rows.length > 0) { + // User exists, update their information + dbUser = existingUserResult.rows[0]; + + const updateQuery = `UPDATE users SET + username = $1, + email = $2, + picture = $3, + is_verified = true, + updated_at = NOW() + WHERE github_id = $4 + RETURNING id, username, email, picture`; + + const updateResult = await client.query(updateQuery, [ + username, + email, + avatarUrl || "/api/media/profile/default.png", + githubId + ]); + + dbUser = updateResult.rows[0]; + } else { + // Check if username already exists + const usernameCheck = await client.query(`SELECT id FROM users WHERE username = $1`, [username]); + let finalUsername = username; + + if (usernameCheck.rows.length > 0) { + // Username exists, append GitHub ID to make it unique + finalUsername = `${username}_gh${githubId}`; + } + + // Create new user + const insertQuery = `INSERT INTO users ( + username, + email, + picture, + github_id, + password, + is_verified + ) VALUES ($1, $2, $3, $4, $5, $6) + RETURNING id, username, email, picture`; + + const insertResult = await client.query(insertQuery, [ + finalUsername, + email, + avatarUrl || "/api/media/profile/default.png", + githubId, + null, // No password for OAuth users + true // OAuth users are automatically verified + ]); + + dbUser = insertResult.rows[0]; + + // Create default playlist for new user + const playlistQuery = `INSERT INTO playlists (name, owner) VALUES ('A regarder plus tard', $1)`; + await client.query(playlistQuery, [dbUser.id]); + } + + client.release(); + + // Generate JWT token + const payload = { + id: dbUser.id, + username: dbUser.username, + }; + + const token = jwt.sign(payload, process.env.JWT_SECRET); + + // Redirect to frontend with token and user info + const userData = encodeURIComponent(JSON.stringify({ + id: dbUser.id, + username: dbUser.username, + email: dbUser.email, + picture: dbUser.picture + })); + + res.redirect(`https://localhost/login/success?token=${token}&user=${userData}`); + + } catch (error) { + console.error("Error processing GitHub OAuth callback:", error); + res.redirect("https://localhost/login?error=processing_error"); + } + })(req, res, next); +} + +export async function getUserInfo(req, res) { + try { + // This endpoint can be used to get current user info from token + const token = req.headers.authorization?.split(" ")[1]; + + if (!token) { + return res.status(401).json({ error: "No token provided" }); + } + + const decoded = jwt.verify(token, process.env.JWT_SECRET); + const client = await getClient(); + + const query = `SELECT id, username, email, picture, github_id, is_verified FROM users WHERE id = $1`; + const result = await client.query(query, [decoded.id]); + + if (!result.rows[0]) { + client.release(); + return res.status(404).json({ error: "User not found" }); + } + + client.release(); + res.status(200).json({ user: result.rows[0] }); + + } catch (error) { + console.error("Error getting user info:", error); + res.status(500).json({ error: "Internal server error" }); + } +} \ No newline at end of file diff --git a/backend/app/controllers/playlist.controller.js b/backend/app/controllers/playlist.controller.js index b300572..c85186a 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.release() res.status(200).json({ id: result.rows[0].id }); } catch (error) { logger.write("Error creating playlist: " + error.message, 500); + client.release(); 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.release(); res.status(200).json({id: result.rows[0].id}); } catch (error) { logger.write("Error adding video to playlist: " + error.message, 500); + client.release(); 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.release(); res.status(404).json({ error: "No playlists found" }); return; } logger.write("Playlists retrieved for user with id " + id, 200); + client.release(); res.status(200).json(result.rows); } catch (error) { logger.write("Error retrieving playlists: " + error.message, 500); + client.release(); res.status(500).json({ error: "Internal server error" }); } } @@ -76,19 +83,78 @@ export async function getById(req, res) { const logger = req.body.logger; const client = await getClient(); - const query = `SELECT * FROM playlists WHERE id = $1`; + const query = ` + SELECT + playlists.id, + playlists.name, + COALESCE( + JSON_AGG( + JSON_BUILD_OBJECT( + 'id', video_data.id, + 'title', video_data.title, + 'thumbnail', video_data.thumbnail, + 'video_description', video_data.description, + 'channel', video_data.channel, + 'visibility', video_data.visibility, + 'file', video_data.file, + 'slug', video_data.slug, + 'format', video_data.format, + 'release_date', video_data.release_date, + 'channel_id', video_data.channel, + 'owner', channels.owner, + 'views', CAST(video_data.views AS TEXT), + 'creator', JSON_BUILD_OBJECT( + 'name', channels.name, + 'profilePicture', users.picture, + 'description', channels.description + ), + 'type', 'video' + ) + ) FILTER (WHERE video_data.id IS NOT NULL), + '[]'::json + ) AS videos + FROM + playlists + LEFT JOIN playlist_elements ON playlists.id = playlist_elements.playlist + LEFT JOIN ( + SELECT + videos.id, + videos.title, + videos.description, + videos.thumbnail, + videos.release_date, + videos.visibility, + videos.file, + videos.slug, + videos.format, + videos.channel, + COUNT(history.id) AS views + FROM videos + LEFT JOIN history ON history.video = videos.id + GROUP BY videos.id, videos.title, videos.description, videos.thumbnail, videos.release_date, videos.visibility, videos.file, videos.slug, videos.format, videos.channel + ) video_data ON playlist_elements.video = video_data.id + LEFT JOIN channels ON video_data.channel = channels.id + LEFT JOIN users ON channels.owner = users.id + WHERE + playlists.id = $1 + GROUP BY + playlists.id; + `; try { const result = await client.query(query, [id]); if (result.rows.length === 0) { logger.write("No playlist found with id " + id, 404); + client.release(); res.status(404).json({ error: "Playlist not found" }); return; } logger.write("Playlist retrieved with id " + id, 200); + client.release(); res.status(200).json(result.rows[0]); } catch (error) { logger.write("Error retrieving playlist: " + error.message, 500); + client.release(); res.status(500).json({ error: "Internal server error" }); } } @@ -105,13 +171,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.release(); 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.release(); res.status(200).json({ id: result.rows[0].id }); } catch (error) { logger.write("Error updating playlist: " + error.message, 500); + client.release(); res.status(500).json({ error: "Internal server error" }); } } @@ -127,13 +196,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.release(); res.status(404).json({ error: "Video not found in playlist" }); return; } logger.write("Video deleted from playlist with id " + id, 200); + client.release(); res.status(200).json({ id: result.rows[0].id }); } catch (error) { logger.write("Error deleting video from playlist: " + error.message, 500); + client.release(); res.status(500).json({ error: "Internal server error" }); } } @@ -148,9 +220,86 @@ export async function del(req, res) { try { const result = await client.query(query, [id]); logger.write("Playlist deleted", 200); + client.release() res.status(200).json({ "message": "playlist deleted" }); } catch (error) { logger.write("Error deleting playlist: " + error.message, 500); + client.release(); + res.status(500).json({ error: "Internal server error" }); + } +} + +export async function getSeeLater(req, res) { + + const token = req.headers.authorization.split(' ')[1]; + const userId = jwt.decode(token)["id"]; + const logger = req.body.logger; + + const client = await getClient(); + const query = ` + SELECT + COALESCE( + JSON_AGG( + json_build_object( + 'video_id', videos.id, + 'title', videos.title, + 'thumbnail', videos.thumbnail, + 'video_decscription', videos.description, + 'channel', videos.channel, + 'visibility', videos.visibility, + 'file', videos.file, + 'format', videos.format, + 'release_date', videos.release_date, + 'channel_id', channels.id, + 'owner', channels.owner, + 'views', COALESCE(video_views.view_count, 0), + 'creator', json_build_object( + 'name', channels.name, + 'profilePicture', users.picture, + 'description', channels.description + ) + ) + ) FILTER (WHERE videos.id IS NOT NULL), + '[]'::json + ) AS videos + FROM + public.playlists + LEFT JOIN public.playlist_elements ON public.playlists.id = public.playlist_elements.playlist + LEFT JOIN ( + SELECT + * + FROM public.videos + LIMIT 10 + ) videos ON public.playlist_elements.video = videos.id + LEFT JOIN public.channels ON videos.channel = public.channels.id + LEFT JOIN public.users ON public.channels.owner = public.users.id + LEFT JOIN ( + SELECT video, COUNT(*) as view_count + FROM public.history + GROUP BY video + ) video_views ON videos.id = video_views.video + WHERE + playlists.owner = $1 + GROUP BY playlists.id, playlists.name + ORDER BY + playlists.id ASC + LIMIT 1; + `; + try { + const result = await client.query(query, [userId]); + if (result.rows.length === 0) { + logger.write("No 'See Later' playlist found for user with id " + userId, 200); + client.release(); + res.status(200).json([]); + return; + } + logger.write("'See Later' playlist retrieved for user with id " + userId, 200); + client.release(); + res.status(200).json(result.rows[0].videos || []); + } catch (error) { + logger.write("Error retrieving 'See Later' playlist: " + error.message, 500); + client.release(); 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..09adf9a 100644 --- a/backend/app/controllers/recommendation.controller.js +++ b/backend/app/controllers/recommendation.controller.js @@ -1,88 +1,277 @@ import {getClient} from "../utils/database.js"; - +import jwt from 'jsonwebtoken'; export async function getRecommendations(req, res) { const token = req.headers.authorization?.split(' ')[1]; - if (!token) { + if (!req.headers.authorization || !token) { - // GET MOST USED TOKEN + // GET MOST USED TAGS let client = await getClient(); - let queryMostUsedToken = `SELECT id, name FROM tags ORDER BY usage_count DESC LIMIT 3;`; - let result = await client.query(queryMostUsedToken); + let queryMostUsedTags = `SELECT id, name FROM tags ORDER BY usage_count DESC LIMIT 3;`; + let result = await client.query(queryMostUsedTags); + + // GET 10 VIDEOS WITH THE TAGS - const recommendations = result.rows; + let tagIds = result.rows.map(tag => tag.id); + let queryVideosWithTags = ` + + SELECT + v.id, + v.title, + v.thumbnail, + v.description AS video_description, + v.channel, + v.visibility, + v.file, + v.slug, + v.release_date, + v.channel AS channel_id, + c.owner, + COUNT(h.id) AS views, + json_build_object( + 'name', c.name, + 'profilePicture', u.picture, + 'description', c.description + ) AS creator, + 'video' AS type + FROM public.videos v + INNER JOIN public.video_tags vt ON v.id = vt.video + INNER JOIN public.tags t ON vt.tag = t.id + INNER JOIN public.channels c ON v.channel = c.id + INNER JOIN public.users u ON c.owner = u.id + LEFT JOIN public.history h ON h.video = v.id + WHERE t.id = ANY($1::int[]) + AND v.visibility = 'public' + GROUP BY + v.id, + v.title, + v.thumbnail, + v.description, + v.channel, + v.visibility, + v.file, + v.slug, + v.release_date, + c.owner, + c.name, + u.picture, + c.description + ORDER BY views DESC, v.release_date DESC + LIMIT 10; + + `; + let videoResult = await client.query(queryVideosWithTags, [tagIds]); + const recommendations = videoResult.rows; res.status(200).json(recommendations); } else { - // Recuperer les 20 derniere vu de l'historique let client = await getClient(); - let queryLastVideos = `SELECT video_id FROM history WHERE user_id = $1 ORDER BY viewed_at DESC LIMIT 20;`; - // TODO: Implement retrieval of recommendations based on user history and interactions - - // Recuperer les likes de l'utilisateur sur les 20 derniere videos recuperees - - // Recuperer les commentaires de l'utilisateur sur les 20 derniere videos recuperees + const claims = jwt.decode(token) + const query = ` + -- Recommandation de contenu similaire non vu basĂ©e sur les interactions utilisateur + -- ParamĂštre: $1 = user_id + WITH user_interactions AS ( + -- RĂ©cupĂ©rer tous les contenus avec lesquels l'utilisateur a interagi + SELECT DISTINCT v.id as video_id, v.channel, t.id as tag_id, t.name as tag_name + FROM videos v + JOIN video_tags vt ON v.id = vt.video + JOIN tags t ON vt.tag = t.id + WHERE v.id IN ( + -- VidĂ©os likĂ©es par l'utilisateur + SELECT DISTINCT l.video FROM likes l WHERE l.owner = $1 + UNION + -- VidĂ©os commentĂ©es par l'utilisateur + SELECT DISTINCT c.video FROM comments c WHERE c.author = $1 + UNION + -- VidĂ©os ajoutĂ©es aux playlists de l'utilisateur + SELECT DISTINCT pe.video + FROM playlist_elements pe + JOIN playlists p ON pe.playlist = p.id + WHERE p.owner = $1 + ) + ), + user_preferred_tags AS ( + -- Tags prĂ©fĂ©rĂ©s basĂ©s sur les interactions + SELECT tag_id, tag_name, COUNT(*) as interaction_count + FROM user_interactions + GROUP BY tag_id, tag_name + ), + user_preferred_channels AS ( + -- ChaĂźnes prĂ©fĂ©rĂ©es basĂ©es sur les interactions + SELECT channel, COUNT(*) as interaction_count + FROM user_interactions + GROUP BY channel + ), + unseen_videos AS ( + -- VidĂ©os que l'utilisateur n'a jamais vues + SELECT v.id, v.title, v.thumbnail, v.description, v.channel, v.visibility, + v.file, v.slug, v.format, v.release_date, ch.owner + FROM videos v + JOIN channels ch ON v.channel = ch.id + WHERE v.visibility = 'public' + AND v.id NOT IN ( + -- Exclure les vidĂ©os dĂ©jĂ  vues + SELECT DISTINCT h.video FROM history h WHERE h.user_id = $1 + UNION + -- Exclure les vidĂ©os dĂ©jĂ  likĂ©es + SELECT DISTINCT l.video FROM likes l WHERE l.owner = $1 + UNION + -- Exclure les vidĂ©os dĂ©jĂ  commentĂ©es + SELECT DISTINCT c.video FROM comments c WHERE c.author = $1 + UNION + -- Exclure les vidĂ©os dĂ©jĂ  ajoutĂ©es aux playlists + SELECT DISTINCT pe.video + FROM playlist_elements pe + JOIN playlists p ON pe.playlist = p.id + WHERE p.owner = $1 + ) + ) + -- RequĂȘte principale : recommander du contenu similaire + SELECT + uv.id, + uv.title, + uv.thumbnail, + uv.description as video_description, + uv.channel, + uv.visibility, + uv.file, + uv.slug, + uv.format, + uv.release_date, + uv.channel as channel_id, + uv.owner, + COALESCE(view_counts.views::text, '0') as views, + json_build_object( + 'name', u.username, + 'profilePicture', u.picture, + 'description', ch.description + ) as creator, + 'video' as type + FROM unseen_videos uv + JOIN channels ch ON uv.channel = ch.id + JOIN users u ON ch.owner = u.id + -- Compter les vues + LEFT JOIN ( + SELECT video, COUNT(*) as views + FROM history + GROUP BY video + ) view_counts ON uv.id = view_counts.video + -- Score basĂ© sur les tags similaires + LEFT JOIN ( + SELECT + vt.video, + SUM(upt.interaction_count * 0.7) as score + FROM video_tags vt + JOIN user_preferred_tags upt ON vt.tag = upt.tag_id + GROUP BY vt.video + ) tag_score ON uv.id = tag_score.video + -- Score basĂ© sur les chaĂźnes similaires + LEFT JOIN ( + SELECT + uv2.channel, + MAX(upc.interaction_count * 0.3) as score + FROM unseen_videos uv2 + JOIN user_preferred_channels upc ON uv2.channel = upc.channel + GROUP BY uv2.channel + ) channel_score ON uv.channel = channel_score.channel + WHERE (tag_score.score > 0 OR channel_score.score > 0) -- Au moins une similaritĂ© + GROUP BY uv.id, uv.title, uv.thumbnail, uv.description, uv.channel, uv.visibility, + uv.file, uv.slug, uv.format, uv.release_date, uv.owner, u.username, u.picture, + ch.description, view_counts.views, tag_score.score, channel_score.score + ORDER BY (COALESCE(tag_score.score, 0) + COALESCE(channel_score.score, 0)) DESC, uv.release_date DESC + LIMIT 20; - // Recuperer les 3 tags avec lesquels l'utilisateur a le plus interagi + `; + let result = await client.query(query, [claims.id]); - // Recuperer 10 videos avec les 3 tags ayant le plus d'interaction avec l'utilisateur - res.status(200).json({ - message: "Recommendations based on user history and interactions are not yet implemented." - }); + client.release() + res.status(200).json(result.rows); } } export async function getTrendingVideos(req, res) { + const client = await getClient(); try { - // GET 10 VIDEOS WITH THE MOST LIKES AND COMMENTS - let client = await getClient(); + // Optimized single query to get all trending video data let queryTrendingVideos = ` - SELECT v.id, v.title, v.description, v.release_date, v.thumbnail, - COUNT(DISTINCT l.id) AS like_count, COUNT(DISTINCT c.id) AS comment_count + SELECT + v.id, + v.title, + v.description, + v.release_date, + v.thumbnail, + v.visibility, + COUNT(DISTINCT l.id) AS like_count, + COUNT(DISTINCT c.id) AS comment_count, + COUNT(DISTINCT h.id) AS views, + ch.id AS creator_id, + ch.name AS creator_name, + u.picture AS creator_profile_picture FROM videos v LEFT JOIN likes l ON v.id = l.video LEFT JOIN comments c ON v.id = c.video - GROUP BY v.id - ORDER BY like_count DESC, comment_count DESC - LIMIT 10; - `; + LEFT JOIN history h ON v.id = h.video + LEFT JOIN channels ch ON v.channel = ch.id + LEFT JOIN users u ON ch.owner = u.id + WHERE v.visibility = 'public' + GROUP BY v.id, ch.id, ch.name, u.picture + ORDER BY like_count DESC, comment_count DESC, views DESC + LIMIT 10 + `; + let result = await client.query(queryTrendingVideos); - const trendingVideos = result.rows; - - for (let video of trendingVideos) { - // Get the number of views for each video - let viewsQuery = `SELECT COUNT(*) AS view_count FROM history WHERE video = $1;`; - let viewsResult = await client.query(viewsQuery, [video.id]); - video.views = viewsResult.rows[0].view_count; - - // Get the creator of each video - let creatorQuery = `SELECT c.id, c.name FROM channels c JOIN videos v ON c.id = v.channel WHERE v.id = $1;`; - let creatorResult = await client.query(creatorQuery, [video.id]); - if (creatorResult.rows.length > 0) { - video.creator = creatorResult.rows[0]; - } else { - video.creator = {id: null, name: "Unknown"}; - } - - // GET THE PROFILE PICTURE OF THE CREATOR - let profilePictureQuery = `SELECT u.picture FROM users u JOIN channels c ON u.id = c.owner WHERE c.id = $1;`; - let profilePictureResult = await client.query(profilePictureQuery, [video.creator.id]); - if (profilePictureResult.rows.length > 0) { - video.creator.profilePicture = profilePictureResult.rows[0].picture; - } else { - video.creator.profilePicture = null; // Default or placeholder image can be set here + const trendingVideos = result.rows.map(video => ({ + id: video.id, + title: video.title, + description: video.description, + release_date: video.release_date, + thumbnail: video.thumbnail, + visibility: video.visibility, + like_count: video.like_count, + comment_count: video.comment_count, + views: video.views, + creator: { + id: video.creator_id, + name: video.creator_name, + profilePicture: video.creator_profile_picture } - - } + })); res.status(200).json(trendingVideos); } catch (error) { console.error("Error fetching trending videos:", error); res.status(500).json({error: "Internal server error while fetching trending videos."}); + } finally { + client.release(); + } +} + +export async function getTopCreators(req, res) { + const client = await getClient(); + try { + // GET TOP 5 CREATORS BASED ON NUMBER OF SUBSCRIBERS + let queryTopCreators = ` + SELECT c.id, c.name, c.description, u.picture AS profilePicture, COUNT(s.id) AS subscriber_count + FROM channels c + JOIN users u ON c.owner = u.id + LEFT JOIN subscriptions s ON c.id = s.channel + GROUP BY c.id, u.picture + ORDER BY subscriber_count DESC + LIMIT 10; + `; + let result = await client.query(queryTopCreators); + const topCreators = result.rows; + + res.status(200).json(topCreators); + } catch (error) { + console.error("Error fetching top creators:", error); + res.status(500).json({error: "Internal server error while fetching top creators."}); + } finally { + client.release(); } } \ No newline at end of file diff --git a/backend/app/controllers/search.controller.js b/backend/app/controllers/search.controller.js index f937d99..9b3a947 100644 --- a/backend/app/controllers/search.controller.js +++ b/backend/app/controllers/search.controller.js @@ -5,8 +5,8 @@ export async function search(req, res) { console.log(req.query); const query = req.query.q; const type = req.query.type || 'all'; - const offset = req.query.offset || 0; - const limit = req.query.limit || 20; + const offset = parseInt(req.query.offset) || 0; + const limit = parseInt(req.query.limit) || 20; const client = await getClient(); @@ -15,71 +15,80 @@ export async function search(req, res) { } if (type === 'videos') { - // Search video in database based on the query, video title, tags and author - const videoNameQuery = `SELECT id FROM videos WHERE title ILIKE $1 OFFSET $3 LIMIT $2`; - const videoNameResult = await client.query(videoNameQuery, [`%${query}%`, limit, offset]); - - // Search video from tags - const tagQuery = `SELECT id FROM tags WHERE name ILIKE $1 OFFSET $3 LIMIT $2`; - const tagResult = await client.query(tagQuery, [`%${query}%`, limit, offset]); - const tags = tagResult.rows.map(tag => tag.name); - - for (const tag of tags) { - const videoTagQuery = `SELECT id FROM videos WHERE id IN (SELECT video FROM video_tags WHERE tag = (SELECT id FROM tags WHERE name = $1)) OFFSET $3 LIMIT $2`; - const videoTagResult = await client.query(videoTagQuery, [tag, limit, offset]); - videoNameResult.rows.push(...videoTagResult.rows); + let videoResults = []; + + // Search video in database based on the video title + const videoNameQuery = ` + SELECT + v.id, v.title, v.thumbnail, v.description as video_description, v.channel, v.visibility, v.file, v.slug, v.format, v.release_date, + c.id as channel_id, c.owner, c.description as channel_description, c.name, + u.picture as profilePicture, + COUNT(h.id) as views + FROM videos as v + JOIN public.channels c on v.channel = c.id + JOIN public.users u on c.owner = u.id + LEFT JOIN public.history h on h.video = v.id + WHERE v.title ILIKE $1 AND v.visibility = 'public' + GROUP BY v.id, v.title, v.thumbnail, v.description, v.channel, v.visibility, v.file, v.slug, v.format, v.release_date, + c.id, c.owner, c.description, c.name, u.picture + OFFSET $2 + LIMIT $3; + `; + + const videoNameResult = await client.query(videoNameQuery, [`%${query}%`, offset, limit]); + const videoNames = videoNameResult.rows; + + for (const video of videoNames) { + // Put all the creator's information in the creator sub-object + video.creator = { + name: video.name, + profilePicture: video.profilepicture, + description: video.channel_description + }; + // Remove the creator's information from the video object + delete video.name; + delete video.profilepicture; + delete video.channel_description; + + video.type = "video"; + videoResults.push(video); } - // Search video from author - const authorQuery = `SELECT videos.id FROM videos JOIN channels c ON videos.channel = c.id WHERE c.name ILIKE $1`; - const authorResult = await client.query(authorQuery, [`%${query}%`]); - - for (const author of authorResult.rows) { - if (!videoNameResult.rows.some(video => video.id === author.id)) { - videoNameResult.rows.push(author); - } - } - - const videos = []; - - for (let video of videoNameResult.rows) { - video = video.id; // Extracting the video ID - let videoDetails = {}; - - // Fetching video details - const videoDetailsQuery = `SELECT id, title, description, thumbnail, channel, release_date FROM videos WHERE id = $1`; - const videoDetailsResult = await client.query(videoDetailsQuery, [video]); - if (videoDetailsResult.rows.length === 0) { - continue; // Skip if no video details found - } - - videoDetails = videoDetailsResult.rows[0]; - // Setting the type - videoDetails.type = 'video'; - - // Fetching views and likes - const viewsQuery = `SELECT COUNT(*) AS view_count FROM history WHERE video = $1`; - const viewsResult = await client.query(viewsQuery, [video]); - videoDetails.views = viewsResult.rows[0].view_count; - - // GET CREATOR - const creatorQuery = `SELECT c.id, c.name, c.owner FROM channels c JOIN videos v ON c.id = v.channel WHERE v.id = $1`; - const creatorResult = await client.query(creatorQuery, [video]); - videoDetails.creator = creatorResult.rows[0]; - - // GET CREATOR PROFILE PICTURE - const profilePictureQuery = `SELECT picture FROM users WHERE id = $1`; - const profilePictureResult = await client.query(profilePictureQuery, [videoDetails.creator.owner]); - videoDetails.creator.profile_picture = profilePictureResult.rows[0].picture; - - videos.push(videoDetails); - + client.release() + + return res.status(200).json(videoResults); + + } else if (type === 'channel') { + let channelResults = []; + + // Search channel in database based on the channel name + const channelNameQuery = ` + SELECT c.id as channel_id, c.name, c.description as channel_description, c.owner, u.picture as profilePicture, COUNT(s.id) as subscribers + FROM public.channels c + JOIN public.users u on c.owner = u.id + LEFT JOIN public.subscriptions s ON s.channel = c.id + WHERE c.name ILIKE $1 + group by c.name, c.id, c.description, c.owner, u.picture + OFFSET $2 + LIMIT $3; + `; + + const channelNameResult = await client.query(channelNameQuery, [`%${query}%`, offset, limit]); + const channelNames = channelNameResult.rows; + + for (const channel of channelNames) { + channel.type = "channel"; + channel.profilePicture = channel.profilepicture; // Rename for consistency + delete channel.profilepicture; + channelResults.push(channel); } + client.release() + return res.status(200).json(channelResults); - return res.status(200).json(videos); - + } else { + return res.status(400).json({ message: "Invalid type parameter. Use 'videos' or 'channel'." }); } diff --git a/backend/app/controllers/user.controller.js b/backend/app/controllers/user.controller.js index a6d9300..79e30ad 100644 --- a/backend/app/controllers/user.controller.js +++ b/backend/app/controllers/user.controller.js @@ -1,9 +1,11 @@ import bcrypt from "bcrypt"; -import {getClient} from "../utils/database.js"; +import { getClient } from "../utils/database.js"; import jwt from "jsonwebtoken"; -import path, {dirname} from "path"; +import path, { dirname } from "path"; import fs from "fs"; -import {fileURLToPath} from "url"; +import { fileURLToPath } from "url"; +import crypto from "crypto"; +import { sendEmail } from "../utils/mail.js"; export async function register(req, res) { try { @@ -43,15 +45,128 @@ export async function register(req, res) { const playlistQuery = `INSERT INTO playlists (name, owner) VALUES ('A regarder plus tard', $1)`; await client.query(playlistQuery, [id]); + // GENERATE EMAIL HEXA VERIFICATION TOKEN + const token = crypto.randomBytes(32).toString("hex").slice(0, 5); + + const textMessage = "Merci de vous ĂȘtre inscrit. Veuillez vĂ©rifier votre e-mail. Code: " + token; + + const htmlMessage = ` + + + + + + Bienvenue sur Freetube + + +
+ +
+

+ 🎬 Bienvenue sur Freetube! +

+
+ + +
+

+ Bonjour ${user.username}! 👋 +

+ +

+ Merci de vous ĂȘtre inscrit sur Freetube! Nous sommes ravis de vous accueillir dans notre communautĂ©. +

+ +

+ Pour finaliser votre inscription, veuillez utiliser le code de vérification ci-dessous : +

+ + +
+

+ Code de vérification +

+
+ ${token} +
+
+ +

+ ⚠ Ce code expirera dans 1 heure. +

+ +

+ Si vous n'avez pas créé de compte, vous pouvez ignorer cet e-mail. +

+
+ + +
+

+ © 2025 Freetube. Tous droits réservés. +

+
+
+ + + `; + + console.log("Sending email to:", user.email); + + await sendEmail(user.email, "🎬 Bienvenue sur Freetube - VĂ©rifiez votre email", textMessage, htmlMessage); + + // Store the token in the database + const expirationDate = new Date(); + expirationDate.setHours(expirationDate.getHours() + 1); // Token expires in 1 hour + + const insertQuery = `INSERT INTO email_verification (email, token, expires_at) VALUES ($1, $2, $3)`; + await client.query(insertQuery, [user.email, token, expirationDate]); + console.log("Successfully registered"); - client.end(); logger.write("successfully registered", 200); - res.status(200).send({user: user}); + res.status(200).send({ user: user }); } catch (err) { console.log(err); - + logger?.write("failed to register user", 500); + res.status(500).json({ error: "Internal server error" }); + } finally { } +} + +export async function verifyEmail(req, res) { + const { email, token } = req.body; + + const logger = req.body.logger; + logger.action("try to verify email for " + email + " with token " + token); + + const client = await getClient(); + + try { + const query = `SELECT * FROM email_verification WHERE email = $1 AND token = $2`; + const result = await client.query(query, [email, token]); + + if (result.rows.length === 0) { + logger.write("failed to verify email for " + email, 404); + return res.status(404).json({ error: "Invalid token or email" }); + } + + // If we reach this point, the email is verified + + const queryDelete = `DELETE FROM email_verification WHERE email = $1`; + await client.query(queryDelete, [email]); + + const updateQuery = `UPDATE users SET is_verified = TRUE WHERE email = $1`; + await client.query(updateQuery, [email]); + logger.write("successfully verified email for " + email, 200); + res.status(200).json({ message: "Email verified successfully" }); + } catch (error) { + console.error("Error verifying email:", error); + logger.write("failed to verify email for " + email, 500); + res.status(500).json({ error: "Internal server error" }); + } finally { + client.release(); + } } export async function login(req, res) { @@ -65,42 +180,49 @@ export async function login(req, res) { const client = await getClient(); - let query = `SELECT id, username, email, picture, password FROM users WHERE username = $1`; - const result = await client.query(query, [user.username]); - - const userInBase = result.rows[0]; + try { + let query = `SELECT id, username, email, picture, password FROM users WHERE username = $1`; + const result = await client.query(query, [user.username]); - if (!userInBase) { - logger.write("failed to login", 401) - res.status(401).json({error: "Invalid credentials"}); - return - } + const userInBase = result.rows[0]; - const isPasswordValid = await bcrypt.compare(req.body.password, userInBase.password); + if (!userInBase) { + logger.write("failed to login", 401) + res.status(401).json({ error: "Invalid credentials" }); + return + } - if (!isPasswordValid) { - logger.write("failed to login", 401) - res.status(401).json({error: "Invalid credentials"}); - return - } + const isPasswordValid = await bcrypt.compare(req.body.password, userInBase.password); - const payload = { - id: userInBase.id, - username: userInBase.username, - } + if (!isPasswordValid) { + logger.write("failed to login", 401) + res.status(401).json({ error: "Invalid credentials" }); + return + } - const token = jwt.sign(payload, process.env.JWT_SECRET); + const payload = { + id: userInBase.id, + username: userInBase.username, + } - const userData = { - id: userInBase.id, - username: userInBase.username, - email: userInBase.email, - picture: userInBase.picture - } + const token = jwt.sign(payload, process.env.JWT_SECRET); - logger.write("Successfully logged in", 200); - res.status(200).json({token: token, user: userData}); + const userData = { + id: userInBase.id, + username: userInBase.username, + email: userInBase.email, + picture: userInBase.picture + } + logger.write("Successfully logged in", 200); + res.status(200).json({ token: token, user: userData }); + } catch (err) { + console.log(err); + logger?.write("failed to login", 500); + res.status(500).json({ error: "Internal server error" }); + } finally { + client.release(); + } } export async function getById(req, res) { @@ -108,15 +230,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); - res.status(404).json({error: "Not Found"}); + client.release() + 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,11 +255,13 @@ 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); - res.status(404).json({error: "Not Found"}); + client.release() + res.status(404).json({ error: "Not Found" }); return } logger.write("successfully retrieved user " + username, 200); - return res.status(200).json({user: result.rows[0]}); + client.release(); + return res.status(200).json({ user: result.rows[0] }); } export async function update(req, res) { @@ -159,7 +288,8 @@ 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) - res.status(400).json({error: "Email already exists"}); + client.release(); + res.status(400).json({ error: "Email already exists" }); } } @@ -168,7 +298,8 @@ 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) - res.status(400).json({error: "Username already exists"}); + client.release(); + res.status(400).json({ error: "Username already exists" }); } } @@ -184,13 +315,32 @@ export async function update(req, res) { user.password = userInBase.password; } + let __filename = fileURLToPath(import.meta.url); + let __dirname = dirname(__filename); + console.log(__dirname); + + let profilePicture = userInBase.picture.split("/").pop(); + fs.rename( + path.join(__dirname, "..", "uploads", "profiles", profilePicture), + path.join(__dirname, "..", "uploads", "profiles", user.username + "." + profilePicture.split(".").pop()), + (err) => { + if (err) { + logger.write("failed to update profile picture", 500); + console.error("Error renaming file:", err); + throw err; + } + }); + profilePicture = "/api/media/profile/" + user.username + "." + profilePicture.split(".").pop(); + 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, user.picture, id]); + const result = await client.query(updateQuery, [user.email, user.username, user.password, profilePicture, id]); logger.write("successfully updated user " + id, 200); - res.status(200).send({user: result.rows[0]}); + client.release(); + res.status(200).json(result.rows[0]); } catch (err) { console.log(err); - res.status(500).json({error: err}); + client.release() + res.status(500).json({ error: err }); } } @@ -203,7 +353,8 @@ 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); - res.status(200).json({message: 'User deleted'}); + client.release(); + res.status(200).json({ message: 'User deleted' }); } export async function getChannel(req, res) { @@ -217,12 +368,14 @@ 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); - res.status(404).json({error: "Channel Not Found"}); + client.release(); + res.status(404).json({ error: "Channel Not Found" }); return; } logger.write("successfully retrieved channel of user " + id, 200); - res.status(200).json({channel: result.rows[0]}); + client.release(); + res.status(200).json({ channel: result.rows[0] }); } export async function getHistory(req, res) { @@ -267,10 +420,141 @@ 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"}); + res.status(404).json({ error: "History Not Found" }); + client.release(); return; } logger.write("successfully retrieved history of user " + id, 200); + client.release(); res.status(200).json(videos); +} + +export async function isSubscribed(req, res) { + const token = req.headers.authorization.split(" ")[1]; + const tokenPayload = jwt.decode(token); + const userId = tokenPayload.id; + const channelId = req.params.id; + + const client = await getClient(); + const logger = req.body.logger; + logger.action(`check if user ${userId} is subscribed to channel ${channelId}`); + + const query = `SELECT * FROM subscriptions WHERE owner = $1 AND channel = $2`; + const result = await client.query(query, [userId, channelId]); + + if (result.rows[0]) { + logger.write(`user ${userId} is subscribed to channel ${channelId}`, 200); + client.release(); + return res.status(200).json({ subscribed: true }); + } else { + logger.write(`user ${userId} is not subscribed to channel ${channelId}`, 200); + client.release(); + return res.status(200).json({ subscribed: false }); + } +} + +export async function searchByUsername(req, res) { + const username = req.query.username; + const client = await getClient(); + const logger = req.body.logger; + logger.action("try to search user by username " + username); + + const query = `SELECT id, username, picture, email, is_verified FROM users WHERE username ILIKE $1`; + const result = await client.query(query, [`%${username}%`]); + + if (result.rows.length === 0) { + logger.write("no user found with username " + username, 404); + client.release(); + return res.status(404).json({ error: "User Not Found" }); + } + + logger.write("successfully found user with username " + username, 200); + client.release(); + res.status(200).json(result.rows); +} + +export async function getAllSubscriptions(req,res) { + const userId = req.params.id; + const client = await getClient(); + const logger = req.body.logger; + logger.action("try to retrieve all subscriptions of user " + userId); + + const query = ` + SELECT + subscriptions.id, + channels.id AS channel_id, + channels.name AS channel_name, + users.picture + + FROM + subscriptions + LEFT JOIN channels ON subscriptions.channel = channels.id + LEFT JOIN users ON channels.owner = users.id + WHERE + subscriptions.owner = $1 + `; + const result = await client.query(query, [userId]); + + if (result.rows.length === 0) { + logger.write("no subscriptions found for user " + userId, 404); + client.release(); + return res.status(404).json({ error: "No Subscriptions Found" }); + } + + logger.write("successfully retrieved all subscriptions of user " + userId, 200); + client.release(); + res.status(200).json(result.rows); +} + +export async function getAllSubscriptionVideos(req, res) { + const userId = req.params.id; + const client = await getClient(); + const logger = req.body.logger; + logger.action("try to retrieve all subscriptions of user " + userId); + + const query = ` + SELECT + videos.id, + videos.title, + videos.thumbnail, + channels.id AS channel, + videos.visibility, + videos.file, + videos.format, + videos.release_date, + channels.id AS channel_id, + channels.owner, + COUNT(history.id) AS views, + JSON_BUILD_OBJECT( + 'name', channels.name, + 'profilePicture', users.picture, + 'description', channels.description + ) AS creator + + FROM + subscriptions + LEFT JOIN channels ON subscriptions.channel = channels.id + LEFT JOIN users ON channels.owner = users.id + LEFT JOIN videos ON channels.id = videos.channel + LEFT JOIN history ON videos.id = history.video + + WHERE + subscriptions.owner = $1 + GROUP BY + videos.id, + channels.id, + users.id; + `; + const result = await client.query(query, [userId]); + + if (result.rows.length === 0) { + logger.write("no subscriptions found for user " + userId, 404); + client.release(); + return res.status(404).json({ error: "No Subscriptions Found" }); + } + + logger.write("successfully retrieved all subscriptions of user " + userId, 200); + client.release(); + res.status(200).json(result.rows); } \ No newline at end of file diff --git a/backend/app/controllers/video.controller.js b/backend/app/controllers/video.controller.js index 1e674cb..2c134d8 100644 --- a/backend/app/controllers/video.controller.js +++ b/backend/app/controllers/video.controller.js @@ -1,15 +1,16 @@ -import {getClient} from "../utils/database.js"; +import { getClient } from "../utils/database.js"; import * as path from "node:path"; import * as fs from "node:fs"; import { fileURLToPath } from 'url'; import { dirname } from 'path'; import jwt from "jsonwebtoken"; -import {query} from "express-validator"; +import { sendEmail } from "../utils/mail.js"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); export async function upload(req, res) { + // HANDLE VIDEO FILE const fileBuffer = req.file.buffer; let isGenerate = false; while (isGenerate === false) { @@ -22,7 +23,7 @@ export async function upload(req, res) { const query = `SELECT * FROM videos WHERE slug = $1`; const result = await client.query(query, [hex]); - client.end(); + client.release(); if (result.rows.length === 0) { isGenerate = true; req.body.slug = hex; @@ -45,14 +46,119 @@ export async function upload(req, res) { visibility: req.body.visibility, } + // HANDLE VIDEO DETAILS const logger = req.body.logger; logger.write("try to upload video"); const releaseDate = new Date(Date.now()).toISOString(); - 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]); + 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) RETURNING id`; + const idResult = await client.query(query, [video.title, 'null', video.description, video.channel, video.visibility, video.file, video.slug, video.format, releaseDate]); + const id = idResult.rows[0].id; + + console.log(req.body.visibility, req.body.authorizedUsers) + + // HANDLE AUTHORIZED USERS + if (req.body.visibility === "private" && req.body.authorizedUsers) { + let authorizedUsers = req.body.authorizedUsers; + + // Parse if still a string (safety check) + if (typeof authorizedUsers === 'string') { + try { + authorizedUsers = JSON.parse(authorizedUsers); + } catch (error) { + console.error("Failed to parse authorizedUsers:", error); + authorizedUsers = []; + } + } + + if (Array.isArray(authorizedUsers) && authorizedUsers.length > 0) { + for (let i = 0; i < authorizedUsers.length; i++) { + const user = authorizedUsers[i]; + console.log("authorized user", user); + const query = `INSERT INTO video_authorized_users (video_id, user_id) VALUES ($1, $2)`; + + // SEND EMAIL TO AUTHORIZED USER + const emailQuery = `SELECT email FROM users WHERE id = $1`; + const emailResult = await client.query(emailQuery, [user]); + const email = emailResult.rows[0].email; + + const textMessage = `Vous ĂȘtes autorisĂ© Ă  visionner une vidĂ©o privĂ©e. ${process.env.FRONTEND_URL}/videos/${id}`; + const htmlMessage = ` + + + + + + AccĂšs Ă  une vidĂ©o privĂ©e - Freetube + + +
+ +
+

+ 🔐 VidĂ©o privĂ©e partagĂ©e avec vous! +

+
+ + +
+

+ Bonjour! 👋 +

+ +

+ Vous avez été autorisé(e) à visionner une vidéo privée sur Freetube! +

+ +

+ On vous a partagé une vidéo privée avec vous. Cliquez sur le bouton ci-dessous pour la regarder : +

+ + +
+

+ ${video.title} +

+

+ ${video.description} +

+ +
+ +

+ 🔒 Cette vidĂ©o est privĂ©e et n'est accessible qu'aux personnes autorisĂ©es. +

+ +

+ Si vous pensez avoir reçu cet e-mail par erreur, vous pouvez l'ignorer. +

+
+ + +
+

+ © 2025 Freetube. Tous droits réservés. +

+
+
+ + + `; + + sendEmail(email, "Invitation à visionner une vidéo privée", textMessage, htmlMessage); + + await client.query(query, [id, user]); + } + } + } + logger.write("successfully uploaded video", 200); - res.status(200).json({"message": "Successfully uploaded video"}); + await client.release() + res.status(200).json({ "message": "Successfully uploaded video", "id": id }); } @@ -75,7 +181,8 @@ 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); - res.status(200).json({"message": "Successfully uploaded thumbnail"}); + await client.release(); + res.status(200).json({ "message": "Successfully uploaded thumbnail" }); } export async function getById(req, res) { @@ -97,7 +204,7 @@ export async function getById(req, res) { video.likes = likesResult.rows[0].like_count; // GET COMMENTS - const commentsQuery = `SELECT c.id, c.content, c.created_at, u.username, u.picture FROM comments c JOIN users u ON c.author = u.id WHERE c.video = $1`; + const commentsQuery = `SELECT c.id, c.content, c.created_at, u.username, u.picture FROM comments c JOIN users u ON c.author = u.id WHERE c.video = $1 ORDER BY c.created_at DESC`; const commentsResult = await client.query(commentsQuery, [id]); video.comments = commentsResult.rows; @@ -121,7 +228,13 @@ export async function getById(req, res) { const tagsResult = await client.query(tagsQuery, [id]); video.tags = tagsResult.rows.map(tag => tag.name); + // GET AUTHORIZED USERS + const authorizedUsersQuery = `SELECT u.id, u.username, u.picture FROM users u JOIN video_authorized_users vp ON u.id = vp.user_id WHERE vp.video_id = $1`; + const authorizedUsersResult = await client.query(authorizedUsersQuery, [id]); + video.authorizedUsers = authorizedUsersResult.rows; + logger.write("successfully get video " + id, 200); + client.release() res.status(200).json(video); } @@ -133,6 +246,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.release() res.status(200).json(result.rows); } @@ -143,8 +257,48 @@ export async function update(req, res) { const client = await getClient(); 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]); + + const resultQuery = ` + SELECT + videos.id, + videos.title, + videos.thumbnail, + videos.channel, + videos.file, + videos.description, + videos.visibility, + videos.release_date, + COUNT(DISTINCT l.id) AS likes_count, + COUNT(DISTINCT h.id) AS history_count, + JSON_AGG( + JSON_BUILD_OBJECT( + 'id', c.id, + 'content', c.content, + 'username', u.username, + 'video', c.video, + 'created_at', c.created_at, + 'picture', u.picture + ) + ) FILTER ( + WHERE + c.id IS NOT NULL + ) AS comments, + JSON_AGG(DISTINCT t.name) FILTER (WHERE t.name IS NOT NULL) AS tags + FROM public.videos + LEFT JOIN public.likes l ON l.video = videos.id + LEFT JOIN public.history h ON h.video = videos.id + LEFT JOIN public.comments c ON c.video = videos.id + LEFT JOIN public.video_tags vt ON vt.video = videos.id + LEFT JOIN public.tags t ON vt.tag = t.id + LEFT JOIN public.users u ON u.id = c.author + WHERE + videos.id = $1 + GROUP BY public.videos.id + `; + const result = await client.query(resultQuery, [id]); logger.write("successfully updated video", 200); - res.status(200).json({"message": "Successfully updated video"}); + client.release() + res.status(200).json(result.rows[0]); } export async function updateVideo(req, res) { @@ -157,14 +311,15 @@ export async function updateVideo(req, res) { const video = videoResult.rows[0]; const slug = video.slug; const format = video.format; - const pathToDelete = path.join(__dirname, "../uploads/videos/", slug + "." + format ); + const pathToDelete = path.join(__dirname, "../uploads/videos/", slug + "." + format); fs.unlink(pathToDelete, (error) => { if (error) { logger.write(error, 500); - res.status(500).json({"message": "Failed to delete video"}); + client.release() + res.status(500).json({ "message": "Failed to delete video" }); return } - logger.action("successfully deleted video " + slug + "." + format ); + logger.action("successfully deleted video " + slug + "." + format); const fileBuffer = req.file.buffer; const finalName = slug + "." + format; const destinationPath = path.join(__dirname, "../uploads/videos/" + finalName) @@ -172,7 +327,8 @@ export async function updateVideo(req, res) { fs.writeFileSync(destinationPath, fileBuffer); logger.write("successfully updated video", 200); - res.status(200).json({"message": "Successfully updated video"}); + client.release() + res.status(200).json({ "message": "Successfully updated video" }); }) @@ -193,7 +349,8 @@ export async function del(req, res) { fs.unlink(pathToDelete, (error) => { if (error) { logger.write(error, 500); - res.status(500).json({"message": "Failed to delete video"}); + client.release() + res.status(500).json({ "message": "Failed to delete video" }); return } @@ -201,13 +358,14 @@ export async function del(req, res) { fs.unlink(pathToDelete, async (error) => { if (error) { logger.write(error, 500); - res.status(500).json({"message": "Failed to delete video"}); + res.status(500).json({ "message": "Failed to delete video" }); return } const query = `DELETE FROM videos WHERE id = $1`; await client.query(query, [id]); logger.write("successfully deleted video", 200); - res.status(200).json({"message": "Successfully deleted video"}); + client.release() + res.status(200).json({ "message": "Successfully deleted video" }); }) }) @@ -237,7 +395,8 @@ export async function toggleLike(req, res) { const likesCount = likesCountResult.rows[0].like_count; logger.write("no likes found adding likes for video " + id, 200); - res.status(200).json({"message": "Successfully added like", "likes": likesCount}); + client.release(); + res.status(200).json({ "message": "Successfully added like", "likes": likesCount }); } else { const query = `DELETE FROM likes WHERE owner = $1 AND video = $2`; await client.query(query, [userId, id]); @@ -248,7 +407,8 @@ export async function toggleLike(req, res) { const likesCount = likesCountResult.rows[0].like_count; logger.write("likes found, removing like for video " + id, 200); - res.status(200).json({"message": "Successfully removed like", "likes": likesCount}); + client.release(); + res.status(200).json({ "message": "Successfully removed like", "likes": likesCount }); } @@ -295,9 +455,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"}); + await client.release(); + res.status(200).json({ "message": "Successfully added tags to video", "tags": updatedTags.map(tag => tag.name) }); } @@ -315,7 +481,7 @@ export async function getSimilarVideos(req, res) { if (tags.length === 0) { logger.write("No tags found for video " + id, 404); - res.status(404).json({"message": "No similar videos found"}); + res.status(404).json({ "message": "No similar videos found" }); return; } @@ -326,7 +492,7 @@ export async function getSimilarVideos(req, res) { JOIN video_tags vt ON v.id = vt.video JOIN tags t ON vt.tag = t.id JOIN channels c ON v.channel = c.id - WHERE t.name = ANY($1) AND v.id != $2 + WHERE t.name = ANY($1) AND v.id != $2 AND v.visibility = 'public' GROUP BY v.id, c.name, c.id LIMIT 10; `; @@ -355,10 +521,62 @@ export async function getSimilarVideos(req, res) { } - logger.write("successfully retrieved similar videos for video " + id, 200); + logger.write("successfully get similar videos for video " + id, 200); + await client.release(); res.status(200).json(result.rows); } +export async function getLikesPerDay(req, res) { + const id = req.params.id; + const logger = req.body.logger; + logger.action("try to get likes per day"); + + const client = await getClient(); + + try { + const response = {} + + const likeQuery = ` + SELECT + DATE(created_at) as date, + COUNT(*) as count + FROM likes + WHERE video = $1 + GROUP BY DATE(created_at) + ORDER BY date DESC + LIMIT 30 + `; + + const viewQuery = ` + SELECT + DATE(viewed_at) as date, + COUNT(*) as count + FROM history + WHERE video = $1 + GROUP BY DATE(viewed_at) + ORDER BY date DESC + LIMIT 30 + `; + + const resultViews = await client.query(viewQuery, [id]); + + response.views = resultViews.rows; + + const resultLikes = await client.query(likeQuery, [id]); + response.likes = resultLikes.rows; + + console.log(response); + + logger.write("successfully retrieved likes per day", 200); + res.status(200).json(response); + } catch (error) { + logger.write("Error retrieving likes per day: " + error.message, 500); + res.status(500).json({ error: "Internal server error" }); + } finally { + await client.release(); + } +} + export async function addViews(req, res) { const id = req.params.id; const logger = req.body.logger; @@ -378,5 +596,41 @@ export async function addViews(req, res) { } logger.write("successfully added views for video " + id, 200); - res.status(200).json({"message": "Successfully added views"}); + await client.release(); + res.status(200).json({ "message": "Successfully added views" }); +} + +export async function updateAuthorizedUsers(req, res) { + const id = req.params.id; + const logger = req.body.logger; + logger.action("try to update authorized users for video " + id); + + const { authorizedUsers } = req.body; + + console.log(authorizedUsers); + + const client = await getClient(); + + try { + // Remove all existing authorized users + const deleteQuery = `DELETE FROM video_authorized_users WHERE video_id = $1`; + console.log(`DELETE FROM video_authorized_users WHERE video_id = ${id}`); + await client.query(deleteQuery, [id]); + + // Add new authorized users + const insertQuery = `INSERT INTO video_authorized_users (video_id, user_id) VALUES ($1, $2)`; + for (let i = 0; i < authorizedUsers.length; i++) { + const user = authorizedUsers[i]; + console.log(`INSERT INTO video_authorized_users (video_id, user_id) VALUES (${id}, ${user})`) + await client.query(insertQuery, [id, user]); + } + + logger.write("successfully updated authorized users for video " + id, 200); + res.status(200).json({ "message": "Successfully updated authorized users" }); + } catch (error) { + logger.write("Error updating authorized users: " + error.message, 500); + res.status(500).json({ error: "Internal server error" }); + } finally { + await client.release(); + } } \ No newline at end of file diff --git a/backend/app/middlewares/channel.middleware.js b/backend/app/middlewares/channel.middleware.js index 7336681..8201e4e 100644 --- a/backend/app/middlewares/channel.middleware.js +++ b/backend/app/middlewares/channel.middleware.js @@ -7,7 +7,7 @@ export const Channel = { name: body("name").notEmpty().isAlphanumeric("fr-FR", { ignore: " _-" }).trim(), - description: body("description").optional({values: "falsy"}).isAlphanumeric().trim(), + description: body("description").optional({values: "falsy"}).isLength({ max: 500 }).trim(), owner: body("owner").notEmpty().isNumeric().trim().withMessage("bad owner"), } @@ -15,62 +15,77 @@ export const ChannelCreate = { name: body("name").notEmpty().isAlphanumeric("fr-FR", { ignore: " _-" }).trim(), - description: body("description").optional({values: "falsy"}).isAlphanumeric().trim(), + description: body("description").optional({values: "falsy"}).isLength({ max: 500 }).trim(), owner: body("owner").notEmpty().isNumeric().trim(), } export async function doUserHaveChannel(req, res, next) { const client = await getClient(); const logger = req.body.logger; - const query = `SELECT id FROM channels WHERE owner = ${req.body.owner}`; - const result = await client.query(query); + try { + const query = `SELECT id FROM channels WHERE owner = $1`; + const result = await client.query(query, [req.body.owner]); - if (result.rows[0]) { - logger.write("failed because user already has a channel", 400); - res.status(400).json({error: "User already own a channel"}) - } else { - next() + if (result.rows[0]) { + logger.write("failed because user already has a channel", 400); + res.status(400).json({error: "User already own a channel"}) + } else { + next() + } + } finally { + client.release(); } - } export async function doChannelNameExists(req, res, next) { const client = await getClient(); const logger = req.body.logger; - const query = `SELECT * FROM channels WHERE name = '${req.body.name}'`; - const result = await client.query(query); + try { + const query = `SELECT * FROM channels WHERE name = $1`; + const result = await client.query(query, [req.body.name]); - if (result.rows[0]) { - logger.write("failed because channel name already exist", 400) - res.status(400).json({error: "Channel name already used"}) - } else { - next() + if (result.rows[0]) { + logger.write("failed because channel name already exist", 400) + res.status(400).json({error: "Channel name already used"}) + } else { + next() + } + } finally { + client.release(); } } export async function doChannelExists(req, res, next) { const client = await getClient(); const logger = req.body.logger; - const query = `SELECT id FROM channels WHERE id = '${req.params.id}'`; - const result = await client.query(query); - if (result.rows[0]) { - next() - } else { - logger.write("failed to retrieve channel because it doesn't exist", 404); - res.status(404).json({error: "Not Found"}) + try { + const query = `SELECT id FROM channels WHERE id = $1`; + const result = await client.query(query, [req.params.id]); + if (result.rows[0]) { + next() + } else { + logger.write("failed to retrieve channel because it doesn't exist", 404); + res.status(404).json({error: "Not Found"}) + } + } finally { + client.release(); } } export async function doChannelExistBody(req, res, next) { const client = await getClient(); const logger = req.body.logger; - const query = `SELECT id FROM channels WHERE id = ${req.body.channel}`; - const result = await client.query(query); - if (result.rows[0]) { - next() - } else { - logger.write("failed to retrieve channel because it doesn't exist", 404); - res.status(404).json({error: "Not Found"}) + try { + const query = `SELECT id FROM channels WHERE id = $1`; + const result = await client.query(query, [req.body.channel]); + if (result.rows[0]) { + next() + } else { + logger.write("failed to retrieve channel because it doesn't exist", 404); + res.status(404).json({error: "Not Found"}) + } + } finally { + client.release(); } } @@ -83,14 +98,17 @@ export async function isOwner(req, res, next) { const logger = req.body.logger; const client = await getClient(); - - const query = `SELECT id, owner FROM channels WHERE id = ${id}`; - const result = await client.query(query); - const channel = result.rows[0]; - if (channel.owner != claims.id) { - logger.write("failed because user do not own the channel", 403); - res.status(403).json({error: "You're not the owner of the channel"}) - } else { - next() + try { + const query = `SELECT id, owner FROM channels WHERE id = $1`; + const result = await client.query(query, [id]); + const channel = result.rows[0]; + if (channel.owner != claims.id) { + logger.write("failed because user do not own the channel", 403); + res.status(403).json({error: "You're not the owner of the channel"}) + } else { + next() + } + } finally { + client.release(); } } \ No newline at end of file diff --git a/backend/app/middlewares/comment.middleware.js b/backend/app/middlewares/comment.middleware.js index a618bc3..9d888fb 100644 --- a/backend/app/middlewares/comment.middleware.js +++ b/backend/app/middlewares/comment.middleware.js @@ -20,14 +20,18 @@ export async function doCommentExists(req, res, next) { const logger = req.body.logger; const client = await getClient(); - const query = `SELECT * FROM comments WHERE id = ${id}`; - const result = await client.query(query); - if (result.rows.length === 0) { - logger.write("comment not found", 404); - res.status(404).json({error: "comment not found"}); - return + try { + const query = `SELECT * FROM comments WHERE id = $1`; + const result = await client.query(query, [id]); + if (result.rows.length === 0) { + logger.write("comment not found", 404); + res.status(404).json({error: "comment not found"}); + return + } + next() + } finally { + client.release(); } - next() } export async function isAuthor(req, res, next) { @@ -37,12 +41,16 @@ export async function isAuthor(req, res, next) { const userId = claims.id; const logger = req.body.logger; const client = await getClient(); - const query = `SELECT * FROM comments WHERE id = ${id}`; - const result = await client.query(query); - if (userId !== result.rows[0].author) { - logger.write("is not author of the comment", 403); - res.status(403).json({error: "You do not have permission"}); - return + try { + const query = `SELECT * FROM comments WHERE id = $1`; + const result = await client.query(query, [id]); + if (userId !== result.rows[0].author) { + logger.write("is not author of the comment", 403); + res.status(403).json({error: "You do not have permission"}); + return + } + next() + } finally { + client.release(); } - next() } \ No newline at end of file diff --git a/backend/app/middlewares/playlist.middleware.js b/backend/app/middlewares/playlist.middleware.js index d33e617..9146949 100644 --- a/backend/app/middlewares/playlist.middleware.js +++ b/backend/app/middlewares/playlist.middleware.js @@ -5,7 +5,7 @@ import jwt from "jsonwebtoken"; export const Playlist = { id: param("id").notEmpty().isNumeric().trim(), - name: body("name").notEmpty().isAlphanumeric("fr-FR", {ignore: " _-"}).trim(), + name: body("name").notEmpty().trim(), owner: body("owner").notEmpty().isNumeric().trim(), videoId: param("videoId").notEmpty().isNumeric().trim(), } @@ -16,20 +16,23 @@ export async function doPlaylistExists(req, res, next) { const logger = req.body.logger; const client = await getClient(); - const query = `SELECT id FROM playlists WHERE id = ${id}`; try { - var result = await client.query(query); + const query = `SELECT id FROM playlists WHERE id = $1`; + const result = await client.query(query, [id]); + + if (result.rows.length === 0) { + logger.write("No playlist with id " + id, 404); + res.status(404).json({error: "Playlist not found"}); + return; + } + next(); } catch (error) { logger.write("Error checking playlist existence: " + error.message, 500); res.status(500).json({error: error}); return; + } finally { + client.release(); } - if (result.rows.length === 0) { - logger.write("No playlist with id " + id, 404); - res.status(404).json({error: "Playlist not found"}); - return; - } - next(); } export async function isOwner(req, res, next) { @@ -41,18 +44,20 @@ export async function isOwner(req, res, next) { const logger = req.body.logger; const client = await getClient(); - const query = `SELECT owner FROM playlists WHERE id = ${id}`; - - const result = await client.query(query); - - if(result.rows[0].owner !== userId) { - logger.write("user not the owner of the playlist with id " + id, 403); - res.status(403).json({error: "You do not have permission"}); - return; + try { + const query = `SELECT owner FROM playlists WHERE id = $1`; + const result = await client.query(query, [id]); + + if(result.rows[0].owner !== userId) { + logger.write("user not the owner of the playlist with id " + id, 403); + res.status(403).json({error: "You do not have permission"}); + return; + } + + next(); + } finally { + client.release(); } - - next(); - } export async function isVideoInPlaylist(req, res, next) { @@ -61,22 +66,23 @@ export async function isVideoInPlaylist(req, res, next) { const videoId = req.params.videoId; const logger = req.body.logger; const client = await getClient(); - const query = `SELECT id FROM playlist_elements WHERE video = ${videoId} AND playlist = ${id}`; - + try { - var result = await client.query(query); + const query = `SELECT id FROM playlist_elements WHERE video = $1 AND playlist = $2`; + const result = await client.query(query, [videoId, id]); + + if(result.rows.length === 0) { + logger.write("video " + videoId + "not found in playlist with id " + id, 404 ); + res.status(404).json({error: "Video " + videoId + "not found"}); + return; + } + + next(); } catch (error) { - logger.write("Error checking video in playlist: " + query, 500); + logger.write("Error checking video in playlist: " + error.message, 500); res.status(500).json({error: error }); return; + } finally { + client.release(); } - - if(result.rows.length === 0) { - logger.write("video " + videoId + "not found in playlist with id " + id, 404 ); - res.status(404).json({error: "Video " + videoId + "not found"}); - return; - } - - next(); - } \ No newline at end of file diff --git a/backend/app/middlewares/user.middleware.js b/backend/app/middlewares/user.middleware.js index 908fc22..a5a5109 100644 --- a/backend/app/middlewares/user.middleware.js +++ b/backend/app/middlewares/user.middleware.js @@ -1,18 +1,18 @@ -import {body, param} from "express-validator"; +import {body, param, query} from "express-validator"; import {getClient} from "../utils/database.js"; import jwt from "jsonwebtoken"; export const User = { id: param("id").notEmpty().isNumeric().trim(), email: body("email").notEmpty().isEmail().trim(), - username: body("username").notEmpty().isAlphanumeric().trim(), - password: body("password").notEmpty().isAlphanumeric().trim(), + username: body("username").notEmpty().isAlphanumeric("fr-FR", {ignore: " _-"}).trim(), + password: body("password").notEmpty().trim(), picture: body("picture").notEmpty().isAlphanumeric().trim(), } export const UserRegister = { email: body("email").notEmpty().isEmail().trim(), - username: body("username").notEmpty().isAlphanumeric().trim(), + username: body("username").notEmpty().isAlphanumeric("fr-FR", {ignore: " _-"}).trim(), password: body("password").notEmpty().isStrongPassword({ minLength: 8, maxLength: 32, @@ -23,7 +23,7 @@ export const UserRegister = { } export const UserLogin = { - username: body("username").notEmpty().isAlphanumeric().trim(), + username: body("username").notEmpty().isAlphanumeric("fr-FR", {ignore: " _-"}).trim(), password: body("password").notEmpty().isStrongPassword({ minLength: 8, maxLength: 32, @@ -34,61 +34,79 @@ export const UserLogin = { } export const UserRequest = { - username: param("username").notEmpty().isAlphanumeric().trim(), + username: param("username").notEmpty().isAlphanumeric("fr-FR", {ignore: " _-"}).trim(), +} + +export const UserSearch = { + username: query("username").notEmpty().isAlphanumeric("fr-FR", {ignore: " _-"}).trim(), } export async function doEmailExists(req, res, next) { const client = await getClient(); const logger = req.body.logger; - const query = `SELECT * FROM users WHERE email = '${req.body.email}'`; - const result = await client.query(query); + try { + const query = `SELECT * FROM users WHERE email = $1`; + const result = await client.query(query, [req.body.email]); - if (result.rows.length > 0) { - logger.write("failed because email already exists", 400) - res.status(400).send({error: "Email already exists"}) - } else { - next() + if (result.rows.length > 0) { + logger.write("failed because email already exists", 400) + res.status(400).send({error: "Email already exists"}) + } else { + next() + } + } finally { + client.release(); } - } export async function doUsernameExists(req, res, next) { const client = await getClient(); const logger = req.body.logger; - const query = `SELECT * FROM users WHERE username = '${req.body.username}'`; - const result = await client.query(query); - if (result.rows.length > 0) { - logger.write("failed because username already exists", 400) - res.status(400).send({error: "Username already exists"}) - } else { - next() + try { + const query = `SELECT * FROM users WHERE username = $1`; + const result = await client.query(query, [req.body.username]); + if (result.rows.length > 0) { + logger.write("failed because username already exists", 400) + res.status(400).send({error: "Username already exists"}) + } else { + next() + } + } finally { + client.release(); } - } export async function doUserExists(req, res, next) { const client = await getClient(); const logger = req.body.logger; - const query = `SELECT id FROM users WHERE id = ${req.params.id}`; - const result = await client.query(query); - if (result.rows.length > 0) { - next() - }else{ - logger.write("failed because user doesn't exists", 404) - res.status(404).json({error: "Not Found"}) + try { + const query = `SELECT id FROM users WHERE id = $1`; + const result = await client.query(query, [req.params.id]); + if (result.rows.length > 0) { + next() + }else{ + logger.write("failed because user doesn't exists", 404) + res.status(404).json({error: "Not Found"}) + } + } finally { + client.release(); } } export async function doUserExistsBody(req, res, next) { const client = await getClient(); const logger = req.body.logger; - const query = `SELECT id FROM users WHERE id = ${req.body.owner}`; - const result = await client.query(query); - if (result.rows.length > 0) { - next() - }else{ - logger.write("failed because user doesn't exists", 404) - res.status(404).json({error: "Not Found"}) + try { + const query = `SELECT id FROM users WHERE id = $1`; + const result = await client.query(query, [req.body.owner]); + if (result.rows.length > 0) { + next() + }else{ + logger.write("failed because user doesn't exists", 404) + res.status(404).json({error: "Not Found"}) + } + } finally { + client.release(); } } diff --git a/backend/app/middlewares/video.middleware.js b/backend/app/middlewares/video.middleware.js index 5c33d76..120956e 100644 --- a/backend/app/middlewares/video.middleware.js +++ b/backend/app/middlewares/video.middleware.js @@ -5,8 +5,8 @@ import jwt from "jsonwebtoken"; export const Video = { id: param("id").notEmpty().isNumeric().trim(), - title: body("title").notEmpty().isAlphanumeric("fr-FR", {'ignore': " _-"}).trim(), - description: body("description").optional({values: "falsy"}).isAlphanumeric("fr-FR", {ignore: " -_"}).trim(), + title: body("title").notEmpty().trim(), + description: body("description").optional({values: "falsy"}).trim(), channel: body("channel").notEmpty().isNumeric().trim(), visibility: body("visibility").notEmpty().isAlpha().trim(), idBody: body("video").notEmpty().isNumeric().trim(), @@ -19,10 +19,25 @@ export const Video = { } export const VideoCreate = { - title: body("title").notEmpty().isAlphanumeric("fr-FR", {'ignore': " _-"}).trim(), - description: body("description").optional({values: "falsy"}).isAlphanumeric("fr-FR", {ignore: " -_"}).trim(), + title: body("title").notEmpty().trim(), + description: body("description").optional({values: "falsy"}).trim(), channel: body("channel").notEmpty().isNumeric().trim(), visibility: body("visibility").notEmpty().isAlpha().trim(), + authorizedUsers: body("authorizedUsers") + .optional({values: "falsy"}) + .customSanitizer((value) => { + // Parse JSON string back to array + if (typeof value === 'string') { + try { + return JSON.parse(value); + } catch (error) { + return []; + } + } + return value; + }) + .isArray() + .withMessage("Authorized users must be an array"), } export const VideoThumbnail = { @@ -35,15 +50,19 @@ export async function isOwner(req, res, next) { const token = req.headers.authorization.split(' ')[1]; const claims = jwt.decode(token); const client = await getClient(); - const channelQuery = `SELECT owner FROM channels WHERE id = '${channelId}'`; - const channelResult = await client.query(channelQuery); - const channelInBase = channelResult.rows[0]; - if (channelInBase.owner !== claims.id) { - logger.write("failed because user is not owner", 403); - res.status(403).json({error: "Not authorized"}); - return + try { + const channelQuery = `SELECT owner FROM channels WHERE id = $1`; + const channelResult = await client.query(channelQuery, [channelId]); + const channelInBase = channelResult.rows[0]; + if (channelInBase.owner !== claims.id) { + logger.write("failed because user is not owner", 403); + res.status(403).json({error: "Not authorized"}); + return + } + next() + } finally { + client.release(); } - next() } export async function doVideoExists(req, res, next) { @@ -51,16 +70,19 @@ export async function doVideoExists(req, res, next) { const videoId = req.body.video; const client = await getClient(); - const query = `SELECT * FROM videos WHERE id = ${videoId}`; - const result = await client.query(query); - const videos = result.rows; - if (videos.length === 0) { - logger.write("failed because video not found", 404); - res.status(404).json({error: "Not Found"}); - return + try { + const query = `SELECT * FROM videos WHERE id = $1`; + const result = await client.query(query, [videoId]); + const videos = result.rows; + if (videos.length === 0) { + logger.write("failed because video not found", 404); + res.status(404).json({error: "Not Found"}); + return + } + next() + } finally { + client.release(); } - next() - } export async function doVideoExistsParam(req, res, next) { @@ -68,14 +90,92 @@ export async function doVideoExistsParam(req, res, next) { const videoId = req.params.id; const client = await getClient(); - const query = `SELECT * FROM videos WHERE id = ${videoId}`; - const result = await client.query(query); - const video = result.rows[0]; - if (!video) { - logger.write("failed because video not found", 404); - res.status(404).json({error: "Not Found"}); - return + try { + const query = `SELECT * FROM videos WHERE id = $1`; + const result = await client.query(query, [videoId]); + const video = result.rows[0]; + if (!video) { + logger.write("failed because video not found", 404); + res.status(404).json({error: "Not Found"}); + return + } + next() + } finally { + client.release(); + } +} + +export async function doAuthorizedUserExists(req, res, next) { + const logger = req.body.logger; + let authorizedUsers = req.body.authorizedUsers; + + // Parse JSON string if needed + if (typeof authorizedUsers === 'string') { + try { + authorizedUsers = JSON.parse(authorizedUsers); + } catch (error) { + logger.write("failed because authorizedUsers is not valid JSON", 400); + res.status(400).json({error: "Invalid authorized users format"}); + return; + } + } + + if (authorizedUsers && Array.isArray(authorizedUsers) && authorizedUsers.length > 0) { + const client = await getClient(); + try { + for (const userId of authorizedUsers) { + const query = `SELECT id FROM users WHERE id = $1`; + const result = await client.query(query, [userId]); + const foundUser = result.rows[0]; + if (!foundUser) { + logger.write("failed because authorized user not found", 404); + res.status(404).json({error: "Not Found"}); + return + } + } + } finally { + client.release(); + } } next() +} + +export async function hasAccess(req, res, next) { + const logger = req.body.logger; + const videoId = req.params.id; + + const client = await getClient(); + try { + const videoQuery = "SELECT visibility FROM videos WHERE id = $1"; + const videoResult = await client.query(videoQuery, [videoId]); + const video = videoResult.rows[0]; + console.log(video); + + if (video.visibility === 'private') { + const token = req.headers.authorization?.split(" ")[1]; + + if (!req.headers.authorization || !token) { + logger.write("failed because no token provided", 401); + res.status(401).json({error: "Unauthorized"}); + return; + } + + const claims = jwt.decode(token); + const userId = claims.id; + const query = `SELECT * FROM video_authorized_users WHERE video_id = $1 AND user_id = $2`; + const result = await client.query(query, [videoId, userId]); + const isAuthorized = result.rows.length > 0; + + if (!isAuthorized) { + logger.write("failed because user is not authorized", 403); + res.status(403).json({error: "Not authorized"}); + return; + } + } + + next(); + } finally { + client.release(); + } } diff --git a/backend/app/routes/channel.route.js b/backend/app/routes/channel.route.js index 517c28f..063ce3b 100644 --- a/backend/app/routes/channel.route.js +++ b/backend/app/routes/channel.route.js @@ -1,5 +1,5 @@ import {Router} from "express"; -import {create, del, getAll, getById, toggleSubscription, update} from "../controllers/channel.controller.js"; +import {create, del, getAll, getById, getStats, toggleSubscription, update} from "../controllers/channel.controller.js"; import {isTokenValid} from "../middlewares/jwt.middleware.js"; import { Channel, @@ -14,11 +14,48 @@ import {addLogger} from "../middlewares/logger.middleware.js"; const router = Router(); -// CREATE CHANNEL +/** + * @swagger + * tags: + * name: Channels + * description: API for managing channels + * /: + * post: + * summary: Create a new channel + * requestBody: + * required: true +* content: +* application/json: +* schema: +* type: object +* properties: +* name: +* type: string +* description: +* type: string +* owner: +* type: string + * responses: + * 201: + * description: Channel created successfully + * content: + * application/json: + * schema: + * type: object + * properties: + * id: + * type: string + * name: + * type: string + * description: + * type: string + * owner: + * type: string + */ router.post("/", [addLogger, isTokenValid, ChannelCreate.name, ChannelCreate.description, ChannelCreate.owner, validator, doUserExistsBody, doUserHaveChannel, isOwnerBody, doChannelNameExists], create); // GET CHANNEL BY ID -router.get("/:id", [addLogger, isTokenValid, Channel.id, validator, doChannelExists], getById); +router.get("/:id", [addLogger, Channel.id, validator, doChannelExists], getById); // GET ALL CHANNEL router.get("/", [addLogger, isTokenValid], getAll); @@ -32,4 +69,8 @@ router.delete("/:id", [addLogger, isTokenValid, Channel.id, validator, doChannel // TOGGLE SUBSCRIPTION router.post("/:id/subscribe", [addLogger, isTokenValid, Channel.id, validator, doChannelExists], toggleSubscription); +// GET TOTAL VIEWS AND SUBSCRIBERS OF THE CHANNEL +router.get("/:id/stats", [addLogger, isTokenValid, Channel.id, validator, doChannelExists, isOwner], getStats); + + export default router; \ No newline at end of file diff --git a/backend/app/routes/oauth.route.js b/backend/app/routes/oauth.route.js new file mode 100644 index 0000000..2b2d2b3 --- /dev/null +++ b/backend/app/routes/oauth.route.js @@ -0,0 +1,15 @@ +import {Router} from 'express'; +import { callback, login, getUserInfo } from '../controllers/oauth.controller.js'; +import { isTokenValid } from '../middlewares/jwt.middleware.js'; +import { addLogger } from '../middlewares/logger.middleware.js'; + +const router = Router(); + +router.get('/github', login) + +router.get('/callback', callback) + +// Get current user info from token +router.get('/me', [addLogger, isTokenValid], getUserInfo) + +export default router; \ No newline at end of file diff --git a/backend/app/routes/playlist.route.js b/backend/app/routes/playlist.route.js index ee5c030..00b8cd0 100644 --- a/backend/app/routes/playlist.route.js +++ b/backend/app/routes/playlist.route.js @@ -3,7 +3,7 @@ import {addLogger} from "../middlewares/logger.middleware.js"; import {isTokenValid} from "../middlewares/jwt.middleware.js"; import {doPlaylistExists, Playlist, isOwner, isVideoInPlaylist} from "../middlewares/playlist.middleware.js"; import validator from "../middlewares/error.middleware.js"; -import {addVideo, create, del, deleteVideo, getById, getByUser, update} from "../controllers/playlist.controller.js"; +import {addVideo, create, del, deleteVideo, getById, getByUser, update, getSeeLater} from "../controllers/playlist.controller.js"; import {doVideoExists, Video} from "../middlewares/video.middleware.js"; import {doUserExists, User, isOwner as isOwnerUser} from "../middlewares/user.middleware.js"; @@ -12,6 +12,9 @@ const router = new Router(); // CREATE PLAYLIST router.post("/", [addLogger, isTokenValid, Playlist.name, validator], create); +// GET SEE LATER PLAYLIST +router.get("/see-later", [addLogger, isTokenValid], getSeeLater); + // ADD VIDEO TO PLAYLIST router.post("/:id", [addLogger, isTokenValid, Playlist.id, Video.idBody, validator, doPlaylistExists, isOwner, doVideoExists], addVideo); @@ -30,4 +33,5 @@ router.delete("/:id/video/:videoId", [addLogger, isTokenValid, Video.id, Playlis // DELETE PLAYLIST router.delete("/:id", [addLogger, isTokenValid, Playlist.id, validator, doPlaylistExists, isOwner], del); + export default router; \ No newline at end of file diff --git a/backend/app/routes/redommendation.route.js b/backend/app/routes/redommendation.route.js index dbb7f2c..4757b0f 100644 --- a/backend/app/routes/redommendation.route.js +++ b/backend/app/routes/redommendation.route.js @@ -1,5 +1,5 @@ import { Router } from 'express'; -import {getRecommendations, getTrendingVideos} from "../controllers/recommendation.controller.js"; +import {getRecommendations, getTrendingVideos, getTopCreators} from "../controllers/recommendation.controller.js"; const router = Router(); @@ -7,4 +7,6 @@ router.get('/', [], getRecommendations); router.get('/trending', [], getTrendingVideos); +router.get("/creators", [], getTopCreators) + export default router; \ No newline at end of file diff --git a/backend/app/routes/search.route.js b/backend/app/routes/search.route.js index ea24b0a..a359557 100644 --- a/backend/app/routes/search.route.js +++ b/backend/app/routes/search.route.js @@ -3,6 +3,11 @@ import {search} from "../controllers/search.controller.js"; const router = Router(); +// Handle OPTIONS preflight requests +router.options('/', (req, res) => { + res.status(200).end(); +}); + router.get('/', search) export default router; \ No newline at end of file diff --git a/backend/app/routes/user.route.js b/backend/app/routes/user.route.js index 75928f9..11e60b4 100644 --- a/backend/app/routes/user.route.js +++ b/backend/app/routes/user.route.js @@ -6,7 +6,12 @@ import { getByUsername, update, deleteUser, - getChannel, getHistory + getChannel, getHistory, + isSubscribed, + verifyEmail, + searchByUsername, + getAllSubscriptions, + getAllSubscriptionVideos } from "../controllers/user.controller.js"; import { UserRegister, @@ -16,12 +21,14 @@ import { isOwner, UserLogin, User, - UserRequest + UserRequest, + UserSearch } from "../middlewares/user.middleware.js"; import validator from "../middlewares/error.middleware.js"; import {isTokenValid} from "../middlewares/jwt.middleware.js"; import {addLogger} from "../middlewares/logger.middleware.js"; import {profileUpload} from "../middlewares/file.middleware.js"; +import {Channel} from "../middlewares/channel.middleware.js"; const router = Router(); @@ -31,6 +38,9 @@ router.post("/", [profileUpload.single("profile"), addLogger, UserRegister.email // LOGIN A USER router.post("/login", [addLogger, UserLogin.username, UserLogin.password, validator], login) +// SEARCH BY USERNAME +router.get("/search", [addLogger, isTokenValid, UserSearch.username, validator], searchByUsername); + // GET USER BY ID router.get("/:id", [addLogger, isTokenValid, User.id, validator], getById) @@ -38,7 +48,7 @@ router.get("/:id", [addLogger, isTokenValid, User.id, validator], getById) router.get("/username/:username", [addLogger, isTokenValid, UserRequest.username, validator], getByUsername); // UPDATE USER -router.put("/:id", [addLogger, isTokenValid, User.id, UserRegister.email, UserRegister.username, UserRegister.password, validator, doUserExists, isOwner], update); +router.put("/:id", [addLogger, isTokenValid, User.id, UserRegister.email, UserRegister.username, validator, doUserExists, isOwner], update); // DELETE USER router.delete("/:id", [addLogger, isTokenValid, User.id, validator, doUserExists, isOwner], deleteUser); @@ -49,4 +59,16 @@ router.get("/:id/channel", [addLogger, isTokenValid, User.id, validator], getCha // GET USER HISTORY router.get("/:id/history", [addLogger, isTokenValid, User.id, validator], getHistory); +// CHECK IF SUBSCRIBED TO CHANNEL +router.get("/:id/channel/subscribed", [addLogger, isTokenValid, User.id, Channel.id, validator], isSubscribed) + +// VERIFY EMAIL +router.post("/verify-email", [addLogger, validator], verifyEmail); + +// GET ALL SUBSCRIPTIONS +router.get("/:id/subscriptions", [addLogger, isTokenValid, User.id, validator, doUserExists], getAllSubscriptions); + +// GET ALL SUBSCRIPTIONS VIDEOS +router.get("/:id/subscriptions/videos", [addLogger, isTokenValid, User.id, validator, doUserExists], getAllSubscriptionVideos); + export default router; \ No newline at end of file diff --git a/backend/app/routes/video.route.js b/backend/app/routes/video.route.js index 60144f5..36d5a41 100644 --- a/backend/app/routes/video.route.js +++ b/backend/app/routes/video.route.js @@ -10,7 +10,7 @@ import { uploadThumbnail, updateVideo, toggleLike, - addTags, getSimilarVideos, addViews + addTags, getSimilarVideos, addViews, getLikesPerDay, updateAuthorizedUsers } from "../controllers/video.controller.js"; import { doVideoExists, @@ -18,7 +18,9 @@ import { isOwner, Video, VideoCreate, - VideoThumbnail + VideoThumbnail, + doAuthorizedUserExists, + hasAccess } from "../middlewares/video.middleware.js"; import {Channel, doChannelExistBody, doChannelExists} from "../middlewares/channel.middleware.js"; import {thumbnailUpload, videoUpload} from "../middlewares/file.middleware.js"; @@ -27,19 +29,20 @@ import validator from "../middlewares/error.middleware.js"; const router = Router(); // UPLOAD VIDEO -router.post("/", [videoUpload.single('file'), addLogger, isTokenValid, VideoCreate.title, VideoCreate.description, VideoCreate.visibility, VideoCreate.channel, validator, doChannelExistBody, isOwner], upload); +router.post("/", [videoUpload.single('file'), addLogger, isTokenValid, VideoCreate.title, VideoCreate.description, VideoCreate.visibility, VideoCreate.authorizedUsers, VideoCreate.channel, validator, doChannelExistBody, isOwner, doAuthorizedUserExists], upload); // UPLOAD/UPDATE THUMBNAIL router.post("/thumbnail", [thumbnailUpload.single('file'), addLogger, isTokenValid, VideoThumbnail.video, Video.channel, validator, doChannelExistBody, isOwner, doVideoExists], uploadThumbnail ) // GET BY ID -router.get("/:id", [addLogger, Video.id, validator, doVideoExistsParam], getById); +router.get("/:id", [addLogger, Video.id, validator, doVideoExistsParam, hasAccess], getById); // GET BY CHANNEL -router.get("/channel/:id", [addLogger, isTokenValid, Channel.id, validator, doChannelExists], getByChannel); +router.get("/channel/:id", [addLogger, isTokenValid, Channel.id, validator, doChannelExists, hasAccess], getByChannel); // UPDATE VIDEO DATA router.put("/:id", [addLogger, isTokenValid, Video.id, VideoCreate.title, VideoCreate.description, VideoCreate.visibility, VideoCreate.channel, validator, doVideoExistsParam, doChannelExistBody, isOwner], update); + // UPDATE VIDEO router.put("/:id/video", [videoUpload.single("file"), addLogger, isTokenValid, Video.id, Video.channel, validator, doVideoExistsParam, doChannelExistBody, isOwner ], updateVideo); @@ -53,10 +56,15 @@ router.get("/:id/like", [addLogger, isTokenValid, Video.id, validator, doVideoEx router.put("/:id/tags", [addLogger, isTokenValid, Video.id, Video.tags, validator, doVideoExistsParam, isOwner], addTags); // GET SIMILAR VIDEOS -router.get("/:id/similar", [addLogger, Video.id, validator, doVideoExistsParam], getSimilarVideos); +router.get("/:id/similar", [addLogger, Video.id, validator, doVideoExistsParam, hasAccess], getSimilarVideos); // ADD VIEWS -router.get("/:id/views", [addLogger, isTokenValid, Video.id, validator, doVideoExistsParam], addViews); +router.get("/:id/views", [addLogger, isTokenValid, Video.id, validator, doVideoExistsParam, hasAccess], addViews); + +// GET LIKE PER DAY +router.get("/:id/likes/day", [addLogger, isTokenValid, Video.id, validator, doVideoExistsParam], getLikesPerDay); +// UPDATE AUTHORIZED USERS +router.put("/:id/authorized-users", [addLogger, isTokenValid, Video.id, VideoCreate.authorizedUsers, validator, doVideoExistsParam, isOwner, doAuthorizedUserExists], updateAuthorizedUsers); export default router; \ No newline at end of file diff --git a/backend/app/uploads/profiles/astri6.jpg b/backend/app/uploads/profiles/astri6.jpg new file mode 100644 index 0000000..1dad29c Binary files /dev/null and b/backend/app/uploads/profiles/astri6.jpg differ diff --git a/backend/app/uploads/profiles/astri7.jpg b/backend/app/uploads/profiles/astri7.jpg new file mode 100644 index 0000000..1dad29c Binary files /dev/null and b/backend/app/uploads/profiles/astri7.jpg differ diff --git a/backend/app/uploads/profiles/astria.png b/backend/app/uploads/profiles/astria.png new file mode 100644 index 0000000..f1a0670 Binary files /dev/null and b/backend/app/uploads/profiles/astria.png differ diff --git a/backend/app/uploads/profiles/astria2.jpg b/backend/app/uploads/profiles/astria2.jpg new file mode 100644 index 0000000..d49bc22 Binary files /dev/null and b/backend/app/uploads/profiles/astria2.jpg differ diff --git a/backend/app/uploads/profiles/astria3.jpg b/backend/app/uploads/profiles/astria3.jpg new file mode 100644 index 0000000..d49bc22 Binary files /dev/null and b/backend/app/uploads/profiles/astria3.jpg differ diff --git a/backend/app/uploads/profiles/test.jpg b/backend/app/uploads/profiles/test.jpg deleted file mode 100644 index d8e9979..0000000 Binary files a/backend/app/uploads/profiles/test.jpg and /dev/null differ diff --git a/backend/app/uploads/videos/946FFC1D2D8C189D.mp4 b/backend/app/uploads/videos/946FFC1D2D8C189D.mp4 deleted file mode 100644 index 3fc3c16..0000000 Binary files a/backend/app/uploads/videos/946FFC1D2D8C189D.mp4 and /dev/null differ diff --git a/backend/app/utils/database.js b/backend/app/utils/database.js index f2610d4..9e66295 100644 --- a/backend/app/utils/database.js +++ b/backend/app/utils/database.js @@ -1,18 +1,31 @@ import pg from "pg"; +// Create a connection pool instead of individual connections +const pool = new pg.Pool({ + user: process.env.POSTGRES_USER, + password: process.env.POSTGRES_PASSWORD, + host: process.env.POSTGRES_HOST, + database: process.env.POSTGRES_DB, + port: 5432, + max: 30, // Increased maximum number of connections in the pool + idleTimeoutMillis: 30000, // Close idle connections after 30 seconds + connectionTimeoutMillis: 10000, // Increased timeout to 10 seconds + acquireTimeoutMillis: 10000, // Wait up to 10 seconds for a connection +}); + export async function getClient() { - const client = new pg.Client({ - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - host: process.env.DB_HOST, - database: process.env.DB_NAME, - port: 5432 - }) - - await client.connect(); - return client; + // Use pool.connect() instead of creating new clients + return await pool.connect(); } +// Graceful shutdown +process.on('SIGINT', () => { + pool.end(() => { + console.log('Pool has ended'); + process.exit(0); + }); +}); + export async function initDb() { const client = await getClient(); @@ -20,10 +33,14 @@ export async function initDb() { try { let query = `CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, - email VARCHAR(255) NOT NULL, + email VARCHAR(255), username VARCHAR(255) NOT NULL, - password VARCHAR(255) NOT NULL, - picture VARCHAR(255) + password VARCHAR(255), + picture VARCHAR(255), + is_verified BOOLEAN NOT NULL DEFAULT FALSE, + github_id VARCHAR(255) UNIQUE, + created_at TIMESTAMP NOT NULL DEFAULT NOW(), + updated_at TIMESTAMP NOT NULL DEFAULT NOW() );`; await client.query(query); @@ -31,7 +48,7 @@ export async function initDb() { id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT NOT NULL, - owner INTEGER NOT NULL REFERENCES users(id) + owner INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE )` await client.query(query); @@ -40,7 +57,7 @@ export async function initDb() { title VARCHAR(255) NOT NULL, thumbnail VARCHAR(255) NOT NULL, description TEXT NOT NULL, - channel INTEGER NOT NULL REFERENCES channels(id), + channel INTEGER NOT NULL REFERENCES channels(id) ON DELETE CASCADE, visibility VARCHAR(50) NOT NULL DEFAULT 'public', file VARCHAR(255) NOT NULL, slug VARCHAR(255) NOT NULL, @@ -53,37 +70,38 @@ export async function initDb() { ( id SERIAL PRIMARY KEY, content TEXT NOT NULL, - author INTEGER NOT NULL REFERENCES users(id), - video INTEGER NOT NULL REFERENCES videos(id), + author INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + video INTEGER NOT NULL REFERENCES videos(id) ON DELETE CASCADE, created_at TIMESTAMP NOT NULL DEFAULT NOW() )`; await client.query(query); query = `CREATE TABLE IF NOT EXISTS likes ( id SERIAL PRIMARY KEY, - owner INTEGER NOT NULL REFERENCES users(id), - video INTEGER NOT NULL REFERENCES videos(id) + owner INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + video INTEGER NOT NULL REFERENCES videos(id) ON DELETE CASCADE, + created_at TIMESTAMP NOT NULL DEFAULT NOW() );`; await client.query(query); query = `CREATE TABLE IF NOT EXISTS playlists ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, - owner INTEGER NOT NULL REFERENCES users(id) + owner INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE )`; await client.query(query); query = `CREATE TABLE IF NOT EXISTS playlist_elements ( id SERIAL PRIMARY KEY, - video INTEGER NOT NULL REFERENCES videos(id), - playlist INTEGER NOT NULL REFERENCES playlists(id) + video INTEGER NOT NULL REFERENCES videos(id) ON DELETE CASCADE, + playlist INTEGER NOT NULL REFERENCES playlists(id) ON DELETE CASCADE )`; await client.query(query); query = `CREATE TABLE IF NOT EXISTS subscriptions ( id SERIAL PRIMARY KEY, - channel INTEGER NOT NULL REFERENCES channels(id), - owner INTEGER NOT NULL REFERENCES users(id) + channel INTEGER NOT NULL REFERENCES channels(id) ON DELETE CASCADE, + owner INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE )`; await client.query(query); @@ -95,21 +113,50 @@ export async function initDb() { await client.query(query); query = `CREATE TABLE IF NOT EXISTS video_tags ( - video INTEGER NOT NULL REFERENCES videos(id), - tag INTEGER NOT NULL REFERENCES tags(id) + video INTEGER NOT NULL REFERENCES videos(id) ON DELETE CASCADE, + tag INTEGER NOT NULL REFERENCES tags(id) ON DELETE CASCADE )` await client.query(query); query = `CREATE TABLE IF NOT EXISTS history ( id SERIAL PRIMARY KEY, - user_id INTEGER NOT NULL REFERENCES users(id), - video INTEGER NOT NULL REFERENCES videos(id), + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + video INTEGER NOT NULL REFERENCES videos(id) ON DELETE CASCADE, viewed_at TIMESTAMP NOT NULL DEFAULT NOW() )`; await client.query(query); + query = `CREATE TABLE IF NOT EXISTS email_verification ( + id SERIAL PRIMARY KEY, + email VARCHAR(255) NOT NULL, + token VARCHAR(255) NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT NOW(), + expires_at TIMESTAMP NOT NULL + )`; + await client.query(query); + + query = `CREATE TABLE IF NOT EXISTS video_authorized_users ( + id SERIAL PRIMARY KEY, + video_id INTEGER NOT NULL REFERENCES videos(id) ON DELETE CASCADE, + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE + )`; + await client.query(query); + + // Add GitHub OAuth columns if they don't exist + try { + await client.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS github_id VARCHAR(255) UNIQUE`); + await client.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS created_at TIMESTAMP DEFAULT NOW()`); + await client.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP DEFAULT NOW()`); + await client.query(`ALTER TABLE users ALTER COLUMN email DROP NOT NULL`); + await client.query(`ALTER TABLE users ALTER COLUMN password DROP NOT NULL`); + } catch (e) { + console.log("OAuth columns already exist or error adding them:", e.message); + } + } catch (e) { console.error("Error initializing database:", e); + } finally { + client.release(); } } \ No newline at end of file diff --git a/backend/app/utils/mail.js b/backend/app/utils/mail.js new file mode 100644 index 0000000..0197e21 --- /dev/null +++ b/backend/app/utils/mail.js @@ -0,0 +1,38 @@ +import nodemailer from "nodemailer"; + +function getTransporter() { + return nodemailer.createTransport({ + host: "smtp.gmail.com", + port: 587, + secure: false, + auth: { + user: process.env.GMAIL_USER, + pass: "yuuu kvoi ytrf blla", + }, + }); +}; + +/** + * Send an email + * @param {string} to + * @param {string} subject + * @param {string} text + * @param {string} html + * @return {Promise} + */ +export function sendEmail(to, subject, text, html = null) { + const transporter = getTransporter(); + const mailOptions = { + from: process.env.GMAIL_USER, + to, + subject, + text, + }; + + // Add HTML if provided + if (html) { + mailOptions.html = html; + } + + return transporter.sendMail(mailOptions); +} diff --git a/backend/logs/access.log b/backend/logs/access.log index 9feeea6..3ab8444 100644 --- a/backend/logs/access.log +++ b/backend/logs/access.log @@ -1218,3 +1218,10857 @@ [2025-07-20 20:51:37.656] [undefined] GET(/:id/channel): failed due to invalid values with status 400 [2025-07-20 20:51:37.660] [undefined] GET(/:id/history): failed due to invalid values with status 400 [2025-07-20 20:51:37.662] [undefined] GET(/user/:id): failed due to invalid values with status 400 +[2025-07-21 08:25:33.854] [undefined] POST(/): try to register a user with username: sacha and email: test@test.test +[2025-07-21 08:25:33.934] [undefined] POST(/): successfully registered with status 200 +[2025-07-21 08:25:33.956] [undefined] POST(/login): try to login with username 'sacha' +[2025-07-21 08:25:34.017] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 08:25:43.729] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 08:25:43.731] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 08:25:43.733] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-07-21 08:25:43.735] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-07-21 08:25:43.748] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 08:27:05.391] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 08:27:05.396] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 08:27:05.400] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-07-21 08:27:05.406] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-07-21 08:27:05.424] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 13:26:38.560] [undefined] GET(/:id/channel): Invalid token with status 401 +[2025-07-21 13:26:38.574] [undefined] GET(/user/:id): Invalid token with status 401 +[2025-07-21 13:26:38.578] [undefined] GET(/:id/history): Invalid token with status 401 +[2025-07-21 13:26:47.958] [undefined] PUT(/:id): Invalid token with status 401 +[2025-07-21 13:27:15.056] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-07-21 13:27:15.159] [undefined] POST(/): successfully registered with status 200 +[2025-07-21 13:27:15.182] [undefined] POST(/login): try to login with username 'astria' +[2025-07-21 13:27:15.275] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 13:27:21.989] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-07-21 13:27:21.997] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-07-21 13:27:22.001] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-07-21 13:27:22.004] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-07-21 13:27:22.023] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-07-21 13:31:48.331] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-07-21 13:31:48.335] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-07-21 13:31:48.347] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-07-21 13:31:48.351] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-07-21 13:31:48.367] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-07-21 13:43:14.509] [undefined] POST(/login): try to login with username 'astria' +[2025-07-21 13:43:14.642] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 13:44:06.419] [undefined] POST(/login): try to login with username 'astria' +[2025-07-21 13:44:06.535] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 13:46:40.594] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-07-21 13:46:40.596] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-07-21 13:46:40.603] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-07-21 13:46:40.607] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-07-21 13:46:40.628] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-07-21 13:49:14.141] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-07-21 13:49:14.147] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-07-21 13:49:14.158] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-07-21 13:49:14.164] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-07-21 13:49:14.176] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-07-21 13:49:27.835] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-07-21 13:53:11.927] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-07-21 13:53:11.928] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-07-21 13:53:11.934] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-07-21 13:53:11.939] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-07-21 13:53:11.961] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-07-21 13:53:26.486] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-07-21 13:55:33.519] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-07-21 13:55:33.528] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-07-21 13:55:33.532] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-07-21 13:55:33.542] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-07-21 13:55:33.562] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-07-21 13:55:44.670] [undefined] PUT(/:id): try to update user 2 +[2025-07-21 13:55:44.684] [undefined] PUT(/:id): successfully updated user 2 with status 200 +[2025-07-21 13:55:48.794] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-07-21 13:55:48.797] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-07-21 13:55:48.799] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-07-21 13:55:48.803] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-07-21 13:55:48.822] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-07-21 13:56:33.755] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-07-21 13:56:33.763] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-07-21 13:56:33.771] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-07-21 13:56:33.782] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-07-21 13:56:33.804] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-07-21 13:56:43.181] [undefined] POST(/login): try to login with username 'astria' +[2025-07-21 13:56:43.306] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 13:56:56.291] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-07-21 13:56:56.313] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-07-21 13:56:56.344] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-07-21 13:56:56.354] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-07-21 13:56:56.363] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-07-21 15:07:33.098] [undefined] POST(/): try to register a user with username: astria2 and email: kjhkjhdf@sdfsdf.fr +[2025-07-21 15:07:33.203] [undefined] POST(/): successfully registered with status 200 +[2025-07-21 15:07:33.257] [undefined] POST(/login): try to login with username 'astria2' +[2025-07-21 15:07:33.337] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 15:07:39.330] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-07-21 15:07:39.333] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-07-21 15:07:39.336] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-07-21 15:07:39.343] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-07-21 15:07:39.361] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-07-21 15:07:44.508] [undefined] PUT(/:id): try to update user 3 +[2025-07-21 15:07:44.521] [undefined] PUT(/:id): successfully updated user 3 with status 200 +[2025-07-21 15:12:03.740] [undefined] POST(/): try to register a user with username: astria3 and email: jndsjdsjdsjlk@qsd.fr +[2025-07-21 15:12:03.837] [undefined] POST(/): successfully registered with status 200 +[2025-07-21 15:12:03.892] [undefined] POST(/login): try to login with username 'astria3' +[2025-07-21 15:12:03.972] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 15:12:16.800] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-07-21 15:12:16.805] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-07-21 15:12:16.812] [undefined] GET(/:id/channel): failed to retrieve channel of user 4 because it doesn't exist with status 404 +[2025-07-21 15:12:16.823] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-07-21 15:12:16.838] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-07-21 15:12:22.148] [undefined] PUT(/:id): try to update user 4 +[2025-07-21 15:12:22.154] [undefined] PUT(/:id): failed to update profile picture with status 500 +[2025-07-21 15:12:22.156] [undefined] PUT(/:id): successfully updated user 4 with status 200 +[2025-07-21 15:12:26.728] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-07-21 15:12:26.730] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-07-21 15:12:26.732] [undefined] GET(/:id/channel): failed to retrieve channel of user 4 because it doesn't exist with status 404 +[2025-07-21 15:12:26.740] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-07-21 15:12:26.751] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-07-21 15:12:30.959] [undefined] PUT(/:id): try to update user 4 +[2025-07-21 15:12:30.969] [undefined] PUT(/:id): failed to update profile picture with status 500 +[2025-07-21 15:12:30.980] [undefined] PUT(/:id): successfully updated user 4 with status 200 +[2025-07-21 15:12:34.141] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-07-21 15:12:34.144] [undefined] GET(/:id/channel): failed to retrieve channel of user 4 because it doesn't exist with status 404 +[2025-07-21 15:12:34.171] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-07-21 15:12:34.177] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-07-21 15:12:34.188] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-07-21 15:13:02.119] [undefined] PUT(/:id): try to update user 4 +[2025-07-21 15:13:02.121] [undefined] PUT(/:id): failed to update profile picture with status 500 +[2025-07-21 15:13:02.131] [undefined] PUT(/:id): successfully updated user 4 with status 200 +[2025-07-21 15:13:19.979] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-07-21 15:13:19.981] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-07-21 15:13:19.988] [undefined] GET(/:id/channel): failed to retrieve channel of user 4 because it doesn't exist with status 404 +[2025-07-21 15:13:20.013] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-07-21 15:13:20.020] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-07-21 15:13:23.974] [undefined] PUT(/:id): try to update user 4 +[2025-07-21 15:13:23.988] [undefined] PUT(/:id): failed to update profile picture with status 500 +[2025-07-21 15:13:24.017] [undefined] PUT(/:id): successfully updated user 4 with status 200 +[2025-07-21 15:14:38.178] [undefined] PUT(/:id): try to update user 4 +[2025-07-21 15:14:38.185] [undefined] PUT(/:id): successfully updated user 4 with status 200 +[2025-07-21 15:14:41.114] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-07-21 15:14:41.121] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-07-21 15:14:41.122] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-07-21 15:14:41.125] [undefined] GET(/:id/channel): failed to retrieve channel of user 4 because it doesn't exist with status 404 +[2025-07-21 15:14:41.136] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-07-21 15:17:30.716] [undefined] POST(/): try to register a user with username: astri5 and email: sachaguerin@gmail.com +[2025-07-21 15:17:30.803] [undefined] POST(/): successfully registered with status 200 +[2025-07-21 15:17:30.844] [undefined] POST(/login): try to login with username 'astri5' +[2025-07-21 15:17:30.911] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 15:17:37.485] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-07-21 15:17:37.487] [undefined] GET(/:id/channel): failed to retrieve channel of user 5 because it doesn't exist with status 404 +[2025-07-21 15:17:37.489] [undefined] GET(/:id/history): try to retrieve history of user 5 +[2025-07-21 15:17:37.492] [undefined] GET(/:id/history): failed to retrieve history of user 5 because it doesn't exist with status 404 +[2025-07-21 15:17:37.511] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-07-21 15:17:46.134] [undefined] PUT(/:id): try to update user 5 +[2025-07-21 15:17:46.139] [undefined] PUT(/:id): failed to update profile picture with status 500 +[2025-07-21 15:19:54.389] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-07-21 15:19:54.392] [undefined] GET(/:id/history): try to retrieve history of user 5 +[2025-07-21 15:19:54.402] [undefined] GET(/:id/channel): failed to retrieve channel of user 5 because it doesn't exist with status 404 +[2025-07-21 15:19:54.411] [undefined] GET(/:id/history): failed to retrieve history of user 5 because it doesn't exist with status 404 +[2025-07-21 15:19:54.429] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-07-21 15:20:01.308] [undefined] PUT(/:id): try to update user 5 +[2025-07-21 15:20:01.316] [undefined] PUT(/:id): successfully updated user 5 with status 200 +[2025-07-21 15:22:58.198] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-07-21 15:22:58.245] [undefined] GET(/:id/channel): failed to retrieve channel of user 5 because it doesn't exist with status 404 +[2025-07-21 15:22:58.258] [undefined] GET(/:id/history): try to retrieve history of user 5 +[2025-07-21 15:22:58.296] [undefined] GET(/:id/history): failed to retrieve history of user 5 because it doesn't exist with status 404 +[2025-07-21 15:22:58.336] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-07-21 15:23:13.591] [undefined] GET(/:id/history): try to retrieve history of user 5 +[2025-07-21 15:23:13.596] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-07-21 15:23:13.602] [undefined] GET(/:id/history): failed to retrieve history of user 5 because it doesn't exist with status 404 +[2025-07-21 15:23:13.611] [undefined] GET(/:id/channel): failed to retrieve channel of user 5 because it doesn't exist with status 404 +[2025-07-21 15:23:13.636] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-07-21 15:23:16.400] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-07-21 15:23:16.405] [undefined] GET(/:id/history): try to retrieve history of user 5 +[2025-07-21 15:23:16.409] [undefined] GET(/:id/channel): failed to retrieve channel of user 5 because it doesn't exist with status 404 +[2025-07-21 15:23:16.413] [undefined] GET(/:id/history): failed to retrieve history of user 5 because it doesn't exist with status 404 +[2025-07-21 15:23:16.442] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-07-21 15:23:38.610] [undefined] POST(/): try to register a user with username: astri7 and email: erjfhiurfhiu@sdf.sdf +[2025-07-21 15:23:38.701] [undefined] POST(/): successfully registered with status 200 +[2025-07-21 15:23:38.734] [undefined] POST(/login): try to login with username 'astri7' +[2025-07-21 15:23:38.800] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 15:23:44.502] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-07-21 15:23:44.507] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-07-21 15:23:44.518] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-07-21 15:23:44.527] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-07-21 15:23:44.537] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-07-21 15:23:49.626] [undefined] PUT(/:id): try to update user 6 +[2025-07-21 15:23:49.633] [undefined] PUT(/:id): failed to update profile picture with status 500 +[2025-07-21 18:55:14.850] [undefined] POST(/login): try to login with username 'astria' +[2025-07-21 18:55:14.865] [undefined] POST(/login): failed to login with status 401 +[2025-07-21 18:55:26.093] [undefined] POST(/login): try to login with username 'sacha' +[2025-07-21 18:55:26.145] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 18:56:09.969] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 18:56:09.970] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 18:56:09.971] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 18:56:09.973] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 18:56:09.983] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 18:56:30.328] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 18:56:30.331] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 18:56:30.332] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 18:56:30.335] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 18:56:30.340] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 18:56:37.069] [undefined] POST(/login): try to login with username 'sacha' +[2025-07-21 18:56:37.118] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 18:56:51.114] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 18:56:51.115] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 18:56:51.116] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 18:56:51.118] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 18:56:51.126] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 18:57:46.290] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 18:57:46.293] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 18:57:46.295] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 18:57:46.299] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 18:57:46.303] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 18:57:52.156] [undefined] PUT(/:id): try to update user 1 +[2025-07-21 18:57:52.158] [undefined] PUT(/:id): successfully updated user 1 with status 200 +[2025-07-21 18:58:05.603] [undefined] GET(/:id/channel): failed due to invalid values with status 400 +[2025-07-21 18:58:05.608] [undefined] GET(/:id/history): failed due to invalid values with status 400 +[2025-07-21 18:58:05.610] [undefined] GET(/user/:id): failed due to invalid values with status 400 +[2025-07-21 18:58:52.332] [undefined] GET(/:id/channel): failed due to invalid values with status 400 +[2025-07-21 18:58:52.339] [undefined] GET(/:id/history): failed due to invalid values with status 400 +[2025-07-21 18:58:52.341] [undefined] GET(/user/:id): failed due to invalid values with status 400 +[2025-07-21 18:58:57.222] [undefined] GET(/:id/channel): failed due to invalid values with status 400 +[2025-07-21 18:58:57.225] [undefined] GET(/:id/history): failed due to invalid values with status 400 +[2025-07-21 18:58:57.228] [undefined] GET(/user/:id): failed due to invalid values with status 400 +[2025-07-21 19:00:00.868] [undefined] GET(/:id/channel): failed due to invalid values with status 400 +[2025-07-21 19:00:00.875] [undefined] GET(/:id/history): failed due to invalid values with status 400 +[2025-07-21 19:00:00.878] [undefined] GET(/user/:id): failed due to invalid values with status 400 +[2025-07-21 19:00:07.728] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-07-21 19:00:22.072] [undefined] POST(/login): try to login with username 'astria' +[2025-07-21 19:00:22.123] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 19:00:31.149] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 19:00:31.150] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 19:00:31.151] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 19:00:31.154] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 19:00:31.161] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 19:00:37.082] [undefined] PUT(/:id): try to update user 1 +[2025-07-21 19:00:37.085] [undefined] PUT(/:id): successfully updated user 1 with status 200 +[2025-07-21 19:00:41.130] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 19:00:41.131] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 19:00:41.132] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 19:00:41.134] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 19:00:41.142] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 19:01:27.664] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 19:01:27.665] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 19:01:27.672] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 19:01:27.674] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 19:01:27.682] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 19:03:09.269] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 19:03:09.269] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 19:03:09.271] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 19:03:09.274] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 19:03:09.282] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 19:03:11.312] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 19:03:11.314] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 19:03:11.316] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 19:03:11.318] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 19:03:11.323] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 19:19:15.258] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 19:19:15.261] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 19:19:15.263] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 19:19:15.268] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 19:19:15.272] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 19:19:19.428] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 19:19:19.429] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 19:19:19.431] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 19:19:19.434] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 19:19:19.440] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 19:19:24.221] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 19:19:24.223] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 19:19:24.225] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 19:19:24.228] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 19:19:24.234] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 19:20:39.780] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 19:20:39.781] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 19:20:39.785] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 19:20:39.786] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 19:20:39.800] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 19:25:44.379] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 19:25:44.380] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 19:25:44.381] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 19:25:44.382] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 19:25:44.389] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 19:31:53.819] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 19:31:53.825] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 19:32:30.436] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 19:32:30.444] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 19:59:26.602] [undefined] GET(/:id): try to get video 1 +[2025-07-21 19:59:26.612] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-21 19:59:26.623] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-07-21 19:59:26.634] [undefined] GET(/:id/similar): No tags found for video 1 with status 404 +[2025-07-21 19:59:26.647] [undefined] GET(/:id/views): try to add views for video 1 +[2025-07-21 19:59:26.655] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-07-21 19:59:41.085] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 19:59:41.086] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 19:59:41.087] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 19:59:41.090] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 19:59:41.098] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 19:59:51.789] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 19:59:51.795] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:14:14.201] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:14:14.206] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:14:18.696] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:14:18.702] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:15:10.246] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:15:10.252] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:15:43.827] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:15:43.833] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:18:01.362] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:18:01.368] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:18:03.002] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:18:03.010] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:18:03.626] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:18:03.633] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:18:04.284] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:18:04.290] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:18:12.698] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:18:12.704] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:19:31.307] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:19:31.313] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:20:04.286] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:20:04.293] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:21:09.351] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:21:09.357] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:21:58.235] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:21:58.243] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:22:29.658] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:22:29.665] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:22:35.734] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:22:35.740] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:23:03.808] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:23:03.815] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:23:55.396] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:23:55.402] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:24:23.905] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:24:23.911] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:24:46.937] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:24:46.943] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:25:45.198] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:25:45.206] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:27:28.321] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:27:28.327] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:27:41.458] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:27:41.464] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:28:10.249] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:28:10.255] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:29:14.356] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:29:14.364] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:29:21.986] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:29:21.993] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:29:27.635] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:29:27.641] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:29:28.745] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:29:28.752] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:30:05.524] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:30:05.530] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:30:17.367] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:30:17.373] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:30:28.264] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:30:28.270] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:30:48.458] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 20:30:48.459] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 20:30:48.460] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 20:30:48.462] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 20:30:48.468] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 20:30:51.208] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:30:51.214] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:31:03.767] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:31:03.775] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:32:20.977] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:32:20.984] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:32:35.582] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:32:35.588] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:32:47.976] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:32:47.982] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:32:55.140] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:32:55.146] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:33:16.205] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:33:16.211] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:33:30.951] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:33:30.957] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:33:42.394] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:34:09.793] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:34:09.800] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:37:17.708] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:37:17.714] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:37:29.461] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:37:29.467] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:37:35.661] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:37:35.667] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:37:44.011] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:37:44.018] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:37:52.702] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:37:52.709] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:46:17.200] [undefined] GET(/:id): try to get video 1 +[2025-07-21 20:46:17.208] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-21 20:46:17.218] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-07-21 20:46:17.229] [undefined] GET(/:id/similar): No tags found for video 1 with status 404 +[2025-07-21 20:46:17.241] [undefined] GET(/:id/views): try to add views for video 1 +[2025-07-21 20:46:17.249] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-07-21 20:46:18.397] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-07-21 20:46:18.410] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-07-21 20:47:07.908] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 20:47:07.910] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 20:47:07.911] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 20:47:07.913] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 20:47:07.921] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 20:47:08.769] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:47:08.776] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:52:55.243] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:52:55.252] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:52:55.255] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:53:31.341] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:53:31.349] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:53:31.352] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:53:31.359] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:53:54.157] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:53:54.166] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:53:54.167] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:53:54.176] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:54:27.105] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:54:27.115] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:54:27.117] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:54:27.124] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:55:10.279] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:55:10.287] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:55:10.288] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:55:10.294] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:55:18.042] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:55:18.050] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:55:18.051] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:55:18.058] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:55:56.629] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:55:56.638] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:55:56.639] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:55:56.646] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:56:14.738] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:56:14.747] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:56:14.749] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:56:14.756] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:56:24.537] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:56:24.546] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:56:24.547] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:56:24.553] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:56:47.291] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:56:47.300] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:56:47.301] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:56:47.308] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:57:00.345] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:57:00.353] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:57:00.355] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:57:00.362] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:57:10.945] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:57:10.954] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:57:10.955] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:57:10.962] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:58:04.767] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:58:04.775] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:58:04.776] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:58:04.783] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:58:10.452] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:58:10.461] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:58:10.463] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:58:10.471] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 20:58:21.280] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 20:58:21.290] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 20:58:21.291] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 20:58:21.297] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:01:19.881] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:01:19.891] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:01:19.893] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:01:19.902] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:02:30.037] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:02:30.048] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:02:30.050] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:02:30.059] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:04:09.412] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:04:09.420] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:04:09.422] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:04:09.429] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:04:22.514] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:04:22.523] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:04:22.524] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:04:22.530] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:04:45.081] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:04:45.089] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:04:45.090] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:04:45.100] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:05:18.620] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:05:18.627] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:05:18.629] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:05:18.638] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:09:03.213] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:09:03.222] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:09:03.224] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:09:03.230] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:09:12.057] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:09:12.066] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:09:12.070] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:09:12.076] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:09:15.276] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:09:15.285] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:09:15.287] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:09:15.293] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:09:38.508] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:09:38.515] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:09:38.518] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:09:38.524] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:10:05.727] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:10:05.736] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:10:05.737] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:10:05.742] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:10:11.175] [undefined] GET(/:id): try to get video 1 +[2025-07-21 21:10:11.183] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-21 21:10:11.193] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-07-21 21:10:11.204] [undefined] GET(/:id/similar): No tags found for video 1 with status 404 +[2025-07-21 21:10:11.217] [undefined] GET(/:id/views): try to add views for video 1 +[2025-07-21 21:10:11.224] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-07-21 21:10:19.413] [undefined] POST(/): try to post comment +[2025-07-21 21:10:19.420] [undefined] POST(/): successfully post comment with status 200 +[2025-07-21 21:10:21.844] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 21:10:21.845] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 21:10:21.848] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 21:10:21.850] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 21:10:21.858] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 21:10:23.870] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:10:23.878] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:10:23.881] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:10:23.886] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:11:01.966] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 21:11:01.968] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 21:11:01.975] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 21:11:01.978] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 21:11:01.986] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 21:11:06.061] [undefined] PUT(/:id): try to update user 1 +[2025-07-21 21:11:06.070] [undefined] PUT(/:id): successfully updated user 1 with status 200 +[2025-07-21 21:11:42.403] [undefined] POST(/login): try to login with username 'astria' +[2025-07-21 21:11:42.454] [undefined] POST(/login): Successfully logged in with status 200 +[2025-07-21 21:11:48.848] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 21:11:48.850] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 21:11:48.851] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 21:11:48.854] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 21:11:48.863] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 21:11:50.371] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:11:50.380] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:11:50.381] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:11:50.388] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:12:18.324] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:12:18.333] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:12:18.334] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:12:18.341] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:12:44.758] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:12:44.766] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:12:44.768] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:12:44.775] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:12:58.746] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:12:58.754] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:12:58.757] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:12:58.761] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:13:06.729] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:13:06.737] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:13:06.739] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:13:06.746] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:13:18.575] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:13:18.584] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:13:18.587] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:13:18.594] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:13:24.618] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:13:24.627] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:13:24.628] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:13:24.636] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:14:03.638] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:14:03.646] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:14:03.647] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:14:03.656] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:14:29.560] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:14:29.568] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:14:29.570] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:14:29.577] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:15:16.154] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:15:16.164] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:15:16.168] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:15:16.175] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:15:23.551] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:15:23.561] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:15:23.562] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:15:23.571] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:16:20.926] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:16:20.934] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:16:20.936] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:16:20.942] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:17:22.302] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:17:22.310] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:17:22.311] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:17:22.318] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:17:31.534] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:17:31.543] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:17:31.545] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:17:31.551] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:17:43.018] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:17:43.026] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:17:43.028] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:17:43.035] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:17:54.055] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:17:54.063] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:17:54.065] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:17:54.072] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:18:00.691] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:18:00.701] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:18:00.705] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:18:00.711] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:18:10.209] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:18:10.218] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:18:10.221] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:18:10.228] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:20:55.081] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:20:55.091] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:20:55.092] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:20:55.101] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:21:11.321] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:21:11.330] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:21:11.332] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:21:11.338] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:21:13.706] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:21:13.714] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:21:13.716] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:21:13.722] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:21:14.695] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:21:14.704] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:21:14.705] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:21:14.713] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:21:23.256] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:21:23.264] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:21:23.267] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:21:23.273] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:21:36.663] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:21:36.674] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:21:36.677] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:21:36.686] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:23:18.012] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:23:18.020] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:23:18.023] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:23:18.029] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:23:39.046] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:23:39.055] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:23:39.056] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:23:39.063] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 21:24:01.549] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 21:24:01.557] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 21:24:01.559] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 21:24:01.566] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 22:09:05.554] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:09:05.562] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 22:09:05.568] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:09:05.574] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 22:09:22.406] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:09:22.416] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 22:09:22.417] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:09:22.425] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 22:09:26.086] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-07-21 22:09:34.169] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-07-21 22:09:39.872] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-07-21 22:10:27.086] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:10:27.095] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 22:10:27.096] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:10:27.104] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 22:10:32.179] [undefined] PUT(/:id): try to update channel with id 1 +[2025-07-21 22:10:32.181] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-07-21 22:10:32.192] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:10:32.199] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:10:33.864] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:10:33.873] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 22:10:33.875] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:10:33.882] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 22:10:34.455] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:10:34.464] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 22:10:34.466] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:10:34.472] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 22:10:34.943] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:10:34.951] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 22:10:34.954] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:10:34.960] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 22:10:41.192] [undefined] PUT(/:id): try to update channel with id 1 +[2025-07-21 22:10:41.201] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-07-21 22:10:41.210] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:10:41.217] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:10:42.177] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:10:42.186] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 22:10:42.187] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:10:42.195] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 22:10:45.345] [undefined] GET(/:id): try to get video 1 +[2025-07-21 22:10:45.354] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-21 22:10:45.363] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-07-21 22:10:45.372] [undefined] GET(/:id/similar): No tags found for video 1 with status 404 +[2025-07-21 22:10:45.387] [undefined] GET(/:id/views): try to add views for video 1 +[2025-07-21 22:10:45.394] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-07-21 22:10:50.080] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-21 22:10:50.081] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-21 22:10:50.082] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-21 22:10:50.085] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-21 22:10:50.090] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-21 22:10:53.388] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:10:53.396] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 22:10:53.399] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:10:53.404] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 22:11:01.752] [undefined] PUT(/:id): try to update channel with id 1 +[2025-07-21 22:11:01.776] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-07-21 22:11:01.787] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:11:01.794] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:11:05.090] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:11:05.099] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 22:11:05.102] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:11:05.107] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-21 22:26:03.358] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-21 22:26:03.367] [undefined] GET(/:id/stats): try to get stats +[2025-07-21 22:26:03.368] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-21 22:26:03.374] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 17:44:32.343] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 17:44:32.353] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 17:44:32.359] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 17:44:32.363] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 17:44:37.180] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 17:44:37.189] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 17:44:37.191] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 17:44:37.198] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 17:46:03.473] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-22 17:46:03.476] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-22 17:46:03.477] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-22 17:46:03.479] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-22 17:46:03.486] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-22 17:46:04.475] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 17:46:04.483] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 17:46:04.485] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 17:46:04.492] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:04:32.813] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:04:32.828] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:10:38.978] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-22 20:10:38.980] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-22 20:10:38.983] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-22 20:10:38.987] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-22 20:10:38.994] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-22 20:10:41.864] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:10:41.872] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:10:41.885] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-07-22 20:10:41.893] [undefined] GET(/:id/similar): No tags found for video 1 with status 404 +[2025-07-22 20:10:41.942] [undefined] GET(/:id/views): try to add views for video 1 +[2025-07-22 20:10:41.948] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-07-22 20:10:44.089] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-07-22 20:10:44.097] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-07-22 20:12:26.290] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-22 20:12:26.294] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-22 20:12:26.301] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-22 20:12:26.306] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-22 20:12:26.311] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-22 20:12:27.061] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 20:12:27.071] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 20:12:27.072] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 20:12:27.079] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:13:06.694] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 20:13:06.703] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 20:13:06.704] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 20:13:06.711] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:13:11.144] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:13:11.146] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:13:11.154] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:13:11.159] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:13:29.571] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:13:29.573] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:13:29.580] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:13:29.582] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:25:49.482] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:25:49.484] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:25:49.490] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:25:49.492] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:26:59.398] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:26:59.400] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:26:59.409] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:26:59.412] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:27:23.656] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:27:23.658] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:27:23.665] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:27:23.666] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:29:10.929] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:29:10.931] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:29:10.940] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:29:10.945] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:30:12.970] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:30:12.973] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:30:12.981] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:30:12.984] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:30:35.757] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:30:35.758] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:30:35.766] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:30:35.770] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:30:51.953] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:30:51.955] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:30:51.977] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:30:51.981] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:30:59.782] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:30:59.783] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:30:59.793] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:30:59.797] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:31:16.303] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:31:16.304] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:31:16.314] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:31:16.317] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:31:30.019] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:31:30.020] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:31:30.027] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:31:30.029] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:31:40.467] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:31:40.468] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:31:40.476] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:31:40.480] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:32:01.447] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:32:01.449] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:32:01.457] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:32:01.461] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:32:18.802] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:32:18.804] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:32:18.811] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:32:18.814] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:33:01.432] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:33:01.433] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:33:01.443] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:33:01.446] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:33:25.633] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:33:25.634] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:33:25.643] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:33:25.646] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:34:07.615] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:34:07.616] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:34:07.626] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:34:07.630] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:34:20.128] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:34:20.129] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:34:20.138] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:34:20.142] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:37:03.149] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:37:03.151] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:37:03.161] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:37:03.167] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:37:05.009] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 20:37:05.018] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 20:37:05.021] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 20:37:05.030] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:37:08.249] [undefined] GET(/:id): try to get video 2 +[2025-07-22 20:37:08.250] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:37:08.260] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:37:08.263] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-07-22 20:37:09.900] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 20:37:09.909] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 20:37:09.912] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 20:37:09.918] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:37:14.947] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:37:14.949] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:37:14.958] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:37:14.963] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:37:15.739] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 20:37:15.749] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 20:37:15.750] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 20:37:15.757] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:37:18.999] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:37:19.008] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:37:19.018] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-07-22 20:37:19.029] [undefined] GET(/:id/similar): No tags found for video 1 with status 404 +[2025-07-22 20:37:19.042] [undefined] GET(/:id/views): try to add views for video 1 +[2025-07-22 20:37:19.049] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-07-22 20:37:23.832] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-22 20:37:23.833] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-22 20:37:23.852] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-22 20:37:23.855] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-22 20:37:23.863] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-22 20:37:26.649] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:37:26.658] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:37:26.679] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-07-22 20:37:26.689] [undefined] GET(/:id/similar): No tags found for video 1 with status 404 +[2025-07-22 20:37:26.702] [undefined] GET(/:id/views): try to add views for video 1 +[2025-07-22 20:37:26.712] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-07-22 20:37:27.886] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-22 20:37:27.887] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-22 20:37:27.889] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-22 20:37:27.892] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-22 20:37:27.898] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-22 20:37:29.768] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 20:37:29.777] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 20:37:29.779] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 20:37:29.786] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:37:31.551] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:37:31.552] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:37:31.561] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:37:31.565] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:42:14.240] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:42:14.242] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:42:14.253] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:42:14.260] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:42:17.612] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:42:17.614] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:42:17.623] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:42:17.626] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:43:07.742] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:43:07.743] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:43:07.754] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:43:07.759] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:43:08.436] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:43:08.438] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:43:08.448] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:43:08.452] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:44:06.249] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:44:06.251] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:44:06.262] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:44:06.268] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:44:12.143] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-22 20:44:12.144] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-22 20:44:12.146] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-22 20:44:12.148] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-22 20:44:12.158] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-22 20:44:13.498] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 20:44:13.507] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 20:44:13.508] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 20:44:13.517] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:44:14.653] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:44:14.655] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:44:14.663] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:44:14.665] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:44:28.296] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 20:44:28.305] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 20:44:28.307] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 20:44:28.313] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:44:29.256] [undefined] GET(/:id): try to get video 2 +[2025-07-22 20:44:29.258] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:44:29.268] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:44:29.271] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-07-22 20:45:54.236] [undefined] GET(/:id): try to get video 2 +[2025-07-22 20:45:54.237] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:45:54.249] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:45:54.255] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-07-22 20:46:52.152] [undefined] GET(/:id): try to get video 2 +[2025-07-22 20:46:52.154] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:46:52.166] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:46:52.171] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-07-22 20:47:43.022] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:47:43.023] [undefined] GET(/:id): try to get video 2 +[2025-07-22 20:47:43.054] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:47:43.058] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-07-22 20:47:49.701] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 20:47:49.711] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 20:47:49.713] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 20:47:49.723] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:47:50.903] [undefined] GET(/:id): try to get video 2 +[2025-07-22 20:47:50.904] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:47:50.915] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:47:50.918] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-07-22 20:47:51.540] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 20:47:51.549] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 20:47:51.552] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 20:47:51.559] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:47:52.136] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:47:52.137] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:47:52.147] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:47:52.151] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:48:10.861] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 20:48:10.868] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 20:48:10.871] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 20:48:10.878] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 20:48:12.272] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:48:12.274] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:48:12.284] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:48:12.288] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:48:19.549] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:48:19.551] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:48:19.562] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:48:19.566] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:48:58.136] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:48:58.137] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:48:58.148] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:48:58.151] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:49:26.900] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:49:26.901] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:49:26.911] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:49:26.915] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:50:49.085] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:50:49.099] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:50:49.109] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:50:49.113] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:50:50.298] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:50:50.300] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:50:50.332] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:50:50.335] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:52:50.414] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:52:50.416] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:52:50.428] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:52:50.432] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:52:56.186] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:52:56.189] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:52:56.196] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:52:56.198] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:53:21.862] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:53:21.863] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:53:21.873] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:53:21.878] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:54:47.148] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:54:47.150] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:54:47.159] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:54:47.163] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:55:09.757] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:55:09.758] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:55:09.768] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:55:09.772] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:55:34.776] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:55:34.778] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:55:34.789] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:55:34.793] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:55:46.011] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:55:46.012] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:55:46.021] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:55:46.025] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:55:47.091] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:55:47.092] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:55:47.102] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:55:47.106] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:57:49.922] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:57:49.923] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:57:49.933] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:57:49.936] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:57:56.667] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:57:56.668] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:57:56.677] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:57:56.680] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:58:05.582] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:58:05.584] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:58:05.594] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:58:05.597] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:58:44.248] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:58:44.251] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:58:44.258] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:58:44.260] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 20:59:31.186] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 20:59:31.188] [undefined] GET(/:id): try to get video 1 +[2025-07-22 20:59:31.198] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 20:59:31.201] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:00:01.982] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:00:01.994] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:00:02.006] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:00:02.009] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:00:07.429] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:00:07.430] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:00:07.441] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:00:07.444] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:00:12.139] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:00:12.141] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:00:12.151] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:00:12.155] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:00:19.533] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:00:19.534] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:00:19.546] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:00:19.549] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:00:20.744] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:00:20.745] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:00:20.756] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:00:20.759] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:00:21.239] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:00:21.241] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:00:21.272] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:00:21.275] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:01:23.136] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:01:23.137] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:01:23.147] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:01:23.151] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:01:30.326] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:01:30.328] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:01:30.338] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:01:30.341] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:01:35.955] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:01:35.957] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:01:35.966] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:01:35.970] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:01:41.623] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:01:41.624] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:01:41.633] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:01:41.636] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:01:47.045] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:01:47.046] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:01:47.055] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:01:47.059] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:02:33.506] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:02:33.508] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:02:33.518] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:02:33.522] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:03:01.405] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:03:01.407] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:03:01.415] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:03:01.417] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:03:18.619] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:03:18.621] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:03:18.631] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:03:18.634] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:03:24.166] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:03:24.167] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:03:24.177] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:03:24.180] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:03:57.108] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:03:57.112] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:03:57.122] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:03:57.126] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:07:48.043] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:07:48.044] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:07:48.054] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:07:48.057] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:08:14.066] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:08:14.068] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:08:14.078] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:08:14.081] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:08:42.508] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:08:42.510] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:08:42.519] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:08:42.523] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:08:49.875] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:08:49.876] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:08:49.887] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:09:09.605] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:09:09.606] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:09:09.617] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:09:09.621] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:09:28.999] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:09:29.000] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:09:29.011] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:09:29.015] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:09:42.133] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:09:42.134] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:09:42.145] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:09:42.149] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:09:46.728] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:09:46.729] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:09:46.740] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:09:46.744] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:09:53.658] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:09:53.659] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:09:53.670] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:09:53.673] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:10:07.560] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:10:07.562] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:10:07.572] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:10:07.575] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:11:48.063] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:11:48.064] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:11:48.075] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:11:48.078] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:12:02.595] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:12:02.596] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:12:02.608] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:12:02.611] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:12:35.182] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:12:35.184] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:12:35.195] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:12:35.198] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:13:05.022] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:13:05.024] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:13:05.032] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:13:05.034] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:13:24.283] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:13:24.285] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:13:24.293] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:13:24.298] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:16:05.260] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-22 21:16:05.262] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-22 21:16:05.264] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-22 21:16:05.268] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-22 21:16:05.275] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-22 21:16:05.995] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-22 21:16:06.004] [undefined] GET(/:id/stats): try to get stats +[2025-07-22 21:16:06.007] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-22 21:16:06.013] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-22 21:16:10.169] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:16:10.171] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:16:10.187] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:16:10.192] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-22 21:16:22.566] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-22 21:16:22.568] [undefined] GET(/:id): try to get video 1 +[2025-07-22 21:16:22.578] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-22 21:16:22.583] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-23 17:27:15.487] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-23 17:27:15.489] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-23 17:27:15.491] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-23 17:27:15.496] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-23 17:27:15.502] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-23 17:27:16.444] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-23 17:27:16.454] [undefined] GET(/:id/stats): try to get stats +[2025-07-23 17:27:16.455] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-23 17:27:16.463] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-23 17:27:17.336] [undefined] GET(/:id): try to get video 1 +[2025-07-23 17:27:17.337] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:27:17.347] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:27:17.349] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-07-23 17:43:14.759] [undefined] GET(/:id): failed because video not found with status 404 +[2025-07-23 17:43:14.760] [undefined] GET(/:id/likes/day): failed because video not found with status 404 +[2025-07-23 17:43:17.769] [undefined] GET(/:id): failed because video not found with status 404 +[2025-07-23 17:43:17.777] [undefined] GET(/:id/likes/day): failed because video not found with status 404 +[2025-07-23 17:43:21.811] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-23 17:43:21.813] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-23 17:43:21.814] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-07-23 17:43:21.816] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-23 17:43:21.823] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-23 17:43:23.480] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-23 17:43:23.489] [undefined] GET(/:id/stats): try to get stats +[2025-07-23 17:43:23.490] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-23 17:43:23.498] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-23 17:43:43.892] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-23 17:43:43.900] [undefined] GET(/:id/stats): try to get stats +[2025-07-23 17:43:43.901] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-23 17:43:43.908] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-23 17:45:17.573] [undefined] POST(/): failed due to invalid values with status 400 +[2025-07-23 17:45:27.151] [undefined] POST(/): try to upload video with status undefined +[2025-07-23 17:45:27.155] [undefined] POST(/): successfully uploaded video with status 200 +[2025-07-23 17:45:38.691] [undefined] POST(/thumbnail): failed because video not found with status 404 +[2025-07-23 17:45:50.889] [undefined] POST(/thumbnail): try to add thumbnail to video 3 +[2025-07-23 17:45:50.891] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-07-23 17:45:56.250] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-23 17:45:56.258] [undefined] GET(/:id/stats): try to get stats +[2025-07-23 17:45:56.262] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-23 17:45:56.268] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-23 17:45:58.865] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:45:58.866] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:45:58.876] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:45:58.878] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:46:04.384] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:46:04.392] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:46:04.401] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-23 17:46:04.407] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-23 17:46:04.418] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-23 17:46:04.427] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-23 17:46:05.192] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-07-23 17:46:05.199] [undefined] GET(/:id/like): no likes found adding likes for video 3 with status 200 +[2025-07-23 17:46:11.770] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-23 17:46:11.771] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-23 17:46:11.774] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-23 17:46:11.776] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-23 17:46:11.783] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-23 17:46:13.087] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-23 17:46:13.095] [undefined] GET(/:id/stats): try to get stats +[2025-07-23 17:46:13.096] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-23 17:46:13.104] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-23 17:46:14.017] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:46:14.018] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:46:14.027] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:46:14.030] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:50:24.486] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:50:24.487] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:50:24.497] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:50:24.500] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:50:42.277] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:50:42.279] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:50:42.289] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:50:42.293] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:50:56.594] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:50:56.595] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:50:56.603] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:50:56.608] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:51:06.324] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:51:06.329] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:51:06.334] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:51:06.337] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:51:13.986] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:51:13.987] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:51:13.996] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:51:13.999] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:51:24.938] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:51:24.940] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:51:24.948] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:51:24.952] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:51:32.502] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:51:32.503] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:51:32.513] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:51:32.516] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:51:43.998] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:51:58.860] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:51:58.862] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:51:58.873] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:51:58.879] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:52:08.066] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:52:08.066] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:52:08.078] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:52:08.086] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:52:32.593] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:52:32.595] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:52:32.606] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:52:32.608] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:52:41.657] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:52:41.659] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:52:41.668] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:52:41.672] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:52:49.574] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:52:49.576] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:52:49.583] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:52:49.585] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:53:13.035] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:53:13.036] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:53:13.047] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:53:13.049] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:53:51.083] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:53:51.092] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:53:51.102] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-23 17:53:51.113] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-23 17:53:51.125] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-23 17:53:51.133] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-23 17:55:32.973] [undefined] POST(/): try to post comment +[2025-07-23 17:55:32.980] [undefined] POST(/): successfully post comment with status 200 +[2025-07-23 17:55:35.982] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-23 17:55:35.984] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-23 17:55:35.987] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-23 17:55:35.990] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-23 17:55:35.997] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-23 17:55:37.078] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-23 17:55:37.087] [undefined] GET(/:id/stats): try to get stats +[2025-07-23 17:55:37.089] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-23 17:55:37.095] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-23 17:55:37.878] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:55:37.879] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:55:37.888] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:55:37.893] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:55:43.020] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:55:43.022] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:55:43.031] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:55:43.034] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:56:03.692] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:56:03.694] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:56:03.703] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:56:03.706] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:56:40.826] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:56:40.827] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:56:40.837] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:56:40.840] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:56:50.963] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:56:50.964] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:56:50.973] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:56:50.976] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:57:16.454] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:57:16.456] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:57:16.465] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:57:16.467] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:57:28.435] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:57:28.445] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:57:28.454] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-23 17:57:28.462] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-23 17:57:28.476] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-23 17:57:28.486] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-23 17:58:22.552] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-23 17:58:22.555] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-23 17:58:22.556] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-23 17:58:22.560] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-23 17:58:22.567] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-23 17:58:23.318] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-23 17:58:23.326] [undefined] GET(/:id/stats): try to get stats +[2025-07-23 17:58:23.329] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-23 17:58:23.335] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-23 17:58:24.206] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:58:24.207] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:58:24.218] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:58:24.220] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:59:09.194] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 17:59:09.196] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:59:09.208] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 17:59:09.212] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:59:14.461] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:59:14.471] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:59:14.481] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-23 17:59:14.492] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-23 17:59:14.504] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-23 17:59:14.512] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-23 17:59:20.094] [undefined] POST(/): try to post comment +[2025-07-23 17:59:20.101] [undefined] POST(/): successfully post comment with status 200 +[2025-07-23 17:59:22.477] [undefined] GET(/:id): try to get video 3 +[2025-07-23 17:59:22.486] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 17:59:22.496] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-23 17:59:22.505] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-23 17:59:22.520] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-23 17:59:22.530] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-23 18:00:31.255] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-23 18:00:31.257] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-23 18:00:31.267] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-23 18:00:31.270] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-23 18:00:31.276] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-23 18:00:31.765] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-23 18:00:31.773] [undefined] GET(/:id/stats): try to get stats +[2025-07-23 18:00:31.776] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-23 18:00:31.783] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-23 18:00:32.215] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:00:32.217] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:00:32.224] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:00:32.227] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:00:33.841] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-23 18:00:33.850] [undefined] GET(/:id/stats): try to get stats +[2025-07-23 18:00:33.853] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-23 18:00:33.859] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-23 18:01:04.460] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:01:04.461] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:01:04.470] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:01:04.473] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:01:09.757] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-23 18:01:09.760] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-23 18:01:09.762] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-23 18:01:09.765] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-23 18:01:09.772] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-23 18:01:13.324] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:01:13.333] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:01:13.343] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-23 18:01:13.351] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-23 18:01:13.367] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-23 18:01:13.378] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-23 18:01:15.606] [undefined] POST(/): try to post comment +[2025-07-23 18:01:15.614] [undefined] POST(/): successfully post comment with status 200 +[2025-07-23 18:01:17.419] [undefined] POST(/): try to post comment +[2025-07-23 18:01:17.425] [undefined] POST(/): successfully post comment with status 200 +[2025-07-23 18:01:18.402] [undefined] POST(/): try to post comment +[2025-07-23 18:01:18.409] [undefined] POST(/): successfully post comment with status 200 +[2025-07-23 18:01:19.513] [undefined] POST(/): try to post comment +[2025-07-23 18:01:19.522] [undefined] POST(/): successfully post comment with status 200 +[2025-07-23 18:01:20.831] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-23 18:01:20.832] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-23 18:01:20.856] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-23 18:01:20.858] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-23 18:01:20.866] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-23 18:01:21.709] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-23 18:01:21.718] [undefined] GET(/:id/stats): try to get stats +[2025-07-23 18:01:21.720] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-23 18:01:21.726] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-23 18:01:22.203] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:01:22.205] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:01:22.214] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:01:22.217] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:48:57.722] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:48:57.731] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:48:57.741] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-07-23 18:48:57.749] [undefined] GET(/:id/similar): No tags found for video 3 with status 404 +[2025-07-23 18:48:57.763] [undefined] GET(/:id/views): try to add views for video 3 +[2025-07-23 18:48:57.774] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-07-23 18:49:00.301] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-23 18:49:00.304] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-23 18:49:00.306] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-23 18:49:00.308] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-23 18:49:00.315] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-23 18:49:01.835] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-23 18:49:01.844] [undefined] GET(/:id/stats): try to get stats +[2025-07-23 18:49:01.847] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-23 18:49:01.853] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-23 18:49:02.497] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:49:02.498] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:49:02.507] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:49:02.509] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:50:39.302] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:50:39.304] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:50:39.311] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:50:39.316] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:50:45.538] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:50:45.542] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:50:45.553] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:50:45.556] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:51:02.344] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:51:02.346] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:52:29.834] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:52:29.836] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:52:29.846] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:52:29.851] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:55:11.811] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:55:11.812] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:55:11.822] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:55:11.825] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:55:26.539] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:55:26.540] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:55:26.551] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:55:26.554] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:55:34.638] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:55:34.639] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:55:34.651] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:55:34.655] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:55:44.674] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:55:44.675] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:55:44.685] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:55:44.688] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:55:58.251] [undefined] GET(/:id): try to get video 3 +[2025-07-23 18:55:58.252] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-23 18:55:58.262] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-23 18:55:58.265] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-07-23 18:59:15.159] [undefined] GET(/:id): try to get video 3 +[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 +[2025-07-25 19:54:37.439] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-25 19:54:37.449] [undefined] GET(/:id/stats): try to get stats +[2025-07-25 19:54:37.452] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-25 19:54:37.458] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-26 08:12:37.895] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 08:12:37.896] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-26 08:12:37.898] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 08:12:37.901] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-26 08:12:37.908] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-26 08:12:38.691] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-26 08:12:38.701] [undefined] GET(/:id/stats): try to get stats +[2025-07-26 08:12:38.702] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-26 08:12:38.711] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-26 08:45:16.047] [undefined] POST(/): failed due to invalid values with status 400 +[2025-07-26 08:48:28.235] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 08:48:28.237] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 08:48:31.269] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 08:48:31.272] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 08:49:37.594] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 08:49:37.596] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 08:49:56.943] [undefined] POST(/): failed due to invalid values with status 400 +[2025-07-26 08:50:18.564] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 08:50:18.567] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 08:50:32.509] [undefined] POST(/): failed due to invalid values with status 400 +[2025-07-26 08:53:06.249] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 08:53:06.251] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 08:53:22.601] [undefined] POST(/): failed due to invalid values with status 400 +[2025-07-26 08:55:33.886] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 08:55:33.888] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 08:55:42.316] [undefined] POST(/): try to upload video with status undefined +[2025-07-26 08:55:42.320] [undefined] POST(/): successfully uploaded video with status 200 +[2025-07-26 08:55:52.499] [undefined] GET(/:id): try to get video 4 +[2025-07-26 08:55:52.508] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-07-26 08:55:52.520] [undefined] GET(/:id/similar): try to get similar videos for video 4 +[2025-07-26 08:55:52.527] [undefined] GET(/:id/similar): No tags found for video 4 with status 404 +[2025-07-26 08:55:52.562] [undefined] GET(/:id/views): try to add views for video 4 +[2025-07-26 08:55:52.576] [undefined] GET(/:id/views): successfully added views for video 4 with status 200 +[2025-07-26 08:56:02.055] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 08:56:02.057] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 08:56:02.060] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-26 08:56:02.063] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-26 08:56:02.069] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-26 08:56:02.787] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-26 08:56:02.796] [undefined] GET(/:id/stats): try to get stats +[2025-07-26 08:56:02.799] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-26 08:56:02.805] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-26 08:56:03.535] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 08:56:03.537] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 08:57:44.716] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 08:57:44.719] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 08:57:54.363] [undefined] POST(/): try to upload video with status undefined +[2025-07-26 08:57:54.366] [undefined] POST(/): successfully uploaded video with status 200 +[2025-07-26 08:58:08.735] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 08:58:08.739] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 08:58:18.190] [undefined] POST(/): try to upload video with status undefined +[2025-07-26 08:58:18.194] [undefined] POST(/): successfully uploaded video with status 200 +[2025-07-26 09:00:32.892] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 09:00:32.894] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 09:00:45.499] [undefined] POST(/): try to upload video with status undefined +[2025-07-26 09:00:45.503] [undefined] POST(/): successfully uploaded video with status 200 +[2025-07-26 09:00:45.551] [undefined] POST(/thumbnail): failed due to invalid values with status 400 +[2025-07-26 09:01:41.512] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 09:01:41.514] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 09:01:56.701] [undefined] POST(/): try to upload video with status undefined +[2025-07-26 09:01:56.704] [undefined] POST(/): successfully uploaded video with status 200 +[2025-07-26 09:01:56.793] [undefined] POST(/thumbnail): try to add thumbnail to video 8 +[2025-07-26 09:01:56.798] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-07-26 09:02:29.458] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 09:02:29.460] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 09:02:45.369] [undefined] POST(/): try to upload video with status undefined +[2025-07-26 09:02:45.372] [undefined] POST(/): successfully uploaded video with status 200 +[2025-07-26 09:02:45.443] [undefined] POST(/thumbnail): try to add thumbnail to video 9 +[2025-07-26 09:02:45.446] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-07-26 09:03:38.478] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 09:03:38.479] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 09:03:54.208] [undefined] POST(/): failed due to invalid values with status 400 +[2025-07-26 09:04:01.982] [undefined] POST(/): try to upload video with status undefined +[2025-07-26 09:04:01.985] [undefined] POST(/): successfully uploaded video with status 200 +[2025-07-26 09:04:02.052] [undefined] POST(/thumbnail): try to add thumbnail to video 10 +[2025-07-26 09:04:02.055] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-07-26 09:04:02.074] [undefined] PUT(/:id/tags): try to add tags to video 10 +[2025-07-26 09:04:02.084] [undefined] PUT(/:id/tags): successfully added tags to video 10 with status 200 +[2025-07-26 09:04:08.248] [undefined] GET(/:id): try to get video 10 +[2025-07-26 09:04:08.257] [undefined] GET(/:id): successfully get video 10 with status 200 +[2025-07-26 09:04:08.270] [undefined] GET(/:id/similar): try to get similar videos for video 10 +[2025-07-26 09:04:08.279] [undefined] GET(/:id/similar): successfully get similar videos for video 10 with status 200 +[2025-07-26 09:04:08.339] [undefined] GET(/:id/views): try to add views for video 10 +[2025-07-26 09:04:08.347] [undefined] GET(/:id/views): successfully added views for video 10 with status 200 +[2025-07-26 09:04:12.622] [undefined] GET(/:id): try to get video 10 +[2025-07-26 09:04:12.632] [undefined] GET(/:id): successfully get video 10 with status 200 +[2025-07-26 09:04:12.648] [undefined] GET(/:id/similar): try to get similar videos for video 10 +[2025-07-26 09:04:12.657] [undefined] GET(/:id/similar): successfully get similar videos for video 10 with status 200 +[2025-07-26 09:04:12.701] [undefined] GET(/:id/views): try to add views for video 10 +[2025-07-26 09:04:12.709] [undefined] GET(/:id/views): successfully added views for video 10 with status 200 +[2025-07-26 09:04:23.159] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 09:04:23.161] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-26 09:04:23.163] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 09:04:23.166] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-26 09:04:23.172] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-26 09:04:25.131] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-07-26 09:04:25.133] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-07-26 09:04:25.134] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-07-26 09:04:25.137] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-07-26 09:04:25.144] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-07-26 09:04:26.249] [undefined] GET(/:id): try to get channel with id 1 +[2025-07-26 09:04:26.258] [undefined] GET(/:id/stats): try to get stats +[2025-07-26 09:04:26.260] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-07-26 09:04:26.268] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-07-26 09:04:34.109] [undefined] GET(/:id): try to get video 4 +[2025-07-26 09:04:34.112] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-26 09:04:34.122] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-26 09:04:34.126] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-07-26 09:04:41.682] [undefined] GET(/:id): try to get video 4 +[2025-07-26 09:04:41.684] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-07-26 09:04:41.705] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-07-26 09:04:41.709] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-07-26 09:04:51.790] [undefined] POST(/thumbnail): try to add thumbnail to video 4 +[2025-07-26 09:04:51.795] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-07-26 09:05:01.430] [undefined] PUT(/:id/tags): try to add tags to video 4 +[2025-07-26 09:05:01.440] [undefined] PUT(/:id/tags): successfully added tags to video 4 with status 200 +[2025-07-26 09:05:09.306] [undefined] GET(/:id): try to get video 8 +[2025-07-26 09:05:09.314] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-07-26 09:05:09.339] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-07-26 09:05:09.348] [undefined] GET(/:id/similar): No tags found for video 8 with status 404 +[2025-07-26 09:05:09.363] [undefined] GET(/:id/views): try to add views for video 8 +[2025-07-26 09:05:09.374] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-07-26 09:05:11.418] [undefined] GET(/:id): try to get video 8 +[2025-07-26 09:05:11.428] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-07-26 09:05:11.439] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-07-26 09:05:11.448] [undefined] GET(/:id/similar): No tags found for video 8 with status 404 +[2025-07-26 09:05:11.474] [undefined] GET(/:id/views): try to add views for video 8 +[2025-07-26 09:05:11.481] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-11 11:11:21.571] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-11 11:11:21.575] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-11 11:11:21.577] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-08-11 11:11:21.580] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-08-11 11:11:21.589] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-11 11:11:37.891] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-11 11:11:37.893] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-08-11 11:11:37.896] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-11 11:11:37.898] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-08-11 11:11:37.904] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-11 11:11:47.642] [undefined] POST(/): try to create new channel with owner 2 and name astria +[2025-08-11 11:11:47.644] [undefined] POST(/): Successfully created new channel with name astria with status 200 +[2025-08-11 11:11:51.909] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-11 11:11:51.912] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-08-11 11:11:51.914] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-11 11:11:51.916] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-11 11:11:51.922] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-11 11:11:53.197] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-11 11:11:53.206] [undefined] GET(/:id/stats): try to get stats +[2025-08-11 11:11:53.209] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-11 11:11:53.216] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-11 11:12:01.877] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-11 11:12:01.880] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-11 11:12:45.598] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-11 11:12:56.047] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-11 11:13:02.078] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-11 11:14:01.356] [undefined] POST(/): try to upload video with status undefined +[2025-08-11 11:14:01.359] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-11 11:14:01.426] [undefined] POST(/thumbnail): try to add thumbnail to video 1 +[2025-08-11 11:14:01.428] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-11 11:14:01.449] [undefined] PUT(/:id/tags): try to add tags to video 1 +[2025-08-11 11:14:01.464] [undefined] PUT(/:id/tags): successfully added tags to video 1 with status 200 +[2025-08-11 11:14:08.592] [undefined] GET(/:id): try to get video 1 +[2025-08-11 11:14:08.601] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-11 11:14:08.612] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-11 11:14:08.623] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-11 11:14:08.687] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-11 11:14:08.695] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-11 13:18:23.053] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-11 13:18:23.055] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-11 13:18:23.065] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-11 13:18:23.069] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-11 13:18:23.076] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-11 13:18:25.052] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-11 13:18:25.061] [undefined] GET(/:id/stats): try to get stats +[2025-08-11 13:18:25.063] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-11 13:18:25.072] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-11 13:18:25.688] [undefined] GET(/:id): try to get video 1 +[2025-08-11 13:18:25.690] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-11 13:18:25.699] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-11 13:18:25.703] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-11 13:18:31.902] [undefined] PUT(/:id): try to update video 1 +[2025-08-11 13:18:31.927] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-11 13:41:12.278] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-11 13:41:12.282] [undefined] GET(/:id/stats): failed due to invalid values with status 400 +[2025-08-11 13:41:16.105] [undefined] GET(/:id): try to get video 1 +[2025-08-11 13:41:16.115] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-11 13:41:16.126] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-11 13:41:16.139] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-11 13:41:16.175] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-11 13:41:16.183] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-11 13:41:17.093] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-11 13:41:17.101] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-11 13:41:21.195] [undefined] GET(/:id): try to get video 1 +[2025-08-11 13:41:21.206] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-11 13:41:21.221] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-11 13:41:21.233] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-11 13:41:21.271] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-11 13:41:21.279] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-11 13:41:21.710] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-11 13:41:21.714] [undefined] GET(/:id/stats): failed due to invalid values with status 400 +[2025-08-11 13:45:04.724] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-11 13:45:04.730] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-11 13:45:04.735] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-11 13:46:05.149] [undefined] GET(/:id): try to get video 1 +[2025-08-11 13:46:05.160] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-11 13:46:05.174] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-11 13:46:05.183] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-11 13:46:05.247] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-11 13:46:05.254] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-11 13:47:58.621] [undefined] GET(/:id): try to get video 1 +[2025-08-11 13:47:58.630] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-11 13:47:58.642] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-11 13:47:58.651] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-11 13:47:58.670] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-11 13:47:58.679] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-11 13:48:04.381] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-11 13:48:04.389] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-11 13:48:05.683] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-11 13:48:05.685] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-11 13:48:05.687] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-11 13:48:05.691] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-11 13:48:05.697] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-11 13:48:07.023] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-11 13:48:07.032] [undefined] GET(/:id/stats): try to get stats +[2025-08-11 13:48:07.034] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-11 13:48:07.042] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-11 13:48:08.705] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-11 13:48:08.707] [undefined] GET(/:id): try to get video 1 +[2025-08-11 13:48:08.716] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-11 13:48:08.720] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-11 13:48:15.706] [undefined] PUT(/:id/tags): try to add tags to video 1 +[2025-08-11 13:48:15.715] [undefined] PUT(/:id/tags): Tag minecraft already exists for video 1 with status 200 +[2025-08-11 13:48:15.718] [undefined] PUT(/:id/tags): Tag survie already exists for video 1 with status 200 +[2025-08-11 13:48:15.721] [undefined] PUT(/:id/tags): Tag moddée already exists for video 1 with status 200 +[2025-08-11 13:48:15.724] [undefined] PUT(/:id/tags): Tag create mod already exists for video 1 with status 200 +[2025-08-11 13:48:15.729] [undefined] PUT(/:id/tags): successfully added tags to video 1 with status 200 +[2025-08-11 13:48:18.023] [undefined] PUT(/:id/tags): try to add tags to video 1 +[2025-08-11 13:48:18.032] [undefined] PUT(/:id/tags): Tag minecraft already exists for video 1 with status 200 +[2025-08-11 13:48:18.035] [undefined] PUT(/:id/tags): Tag survie already exists for video 1 with status 200 +[2025-08-11 13:48:18.038] [undefined] PUT(/:id/tags): Tag moddée already exists for video 1 with status 200 +[2025-08-11 13:48:18.041] [undefined] PUT(/:id/tags): Tag create mod already exists for video 1 with status 200 +[2025-08-11 13:48:18.044] [undefined] PUT(/:id/tags): successfully added tags to video 1 with status 200 +[2025-08-11 13:48:27.781] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-11 13:48:27.783] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-11 13:48:27.786] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-11 13:48:27.789] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-11 13:48:27.796] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-11 13:53:54.947] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-11 13:53:54.949] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-11 13:53:54.951] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-11 13:53:54.953] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-11 13:53:54.961] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-11 13:56:27.148] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-11 13:56:27.151] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-11 13:56:27.153] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-11 13:56:27.156] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-11 13:56:27.162] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-12 08:01:10.302] [undefined] GET(/:id): try to get video 1 +[2025-08-12 08:01:10.312] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-12 08:01:10.324] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-12 08:01:10.334] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-12 08:01:10.356] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-12 08:01:10.366] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-12 08:02:05.673] [undefined] GET(/:id/stats): failed due to invalid values with status 400 +[2025-08-12 08:02:05.677] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-12 09:58:17.398] [undefined] GET(/:id): try to get video 1 +[2025-08-12 09:58:17.407] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-12 09:58:17.420] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-12 09:58:17.431] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-12 09:58:17.492] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-12 09:58:17.499] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-12 15:37:24.916] [undefined] POST(/login): try to login with username 'astria' +[2025-08-12 15:37:24.969] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-12 16:06:07.030] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-12 16:06:20.090] [undefined] POST(/login): try to login with username 'astria' +[2025-08-12 16:06:20.140] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-13 07:54:19.889] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-13 07:54:19.892] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-13 07:54:19.896] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-13 07:54:19.899] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-13 07:54:19.907] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-13 07:55:50.168] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-13 07:55:50.171] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-13 07:55:50.173] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-13 07:55:50.176] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-13 07:55:50.183] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-13 07:58:02.863] [undefined] GET(/:id): try to get video 1 +[2025-08-13 07:58:02.874] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-13 07:58:02.886] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-13 07:58:02.895] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-13 07:58:02.914] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-13 07:58:02.926] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-13 07:58:07.598] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-13 07:58:07.600] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-13 07:58:07.609] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-13 07:58:07.613] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-13 07:58:07.620] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-13 07:58:19.231] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-13 07:58:19.234] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-13 07:58:19.236] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-13 07:58:19.238] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-13 07:58:19.247] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-13 07:58:26.874] [undefined] POST(/login): try to login with username 'sacha' +[2025-08-13 07:58:26.925] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-13 07:58:33.080] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 07:58:33.082] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 07:58:33.084] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 07:58:33.087] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 07:58:33.093] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 07:58:34.762] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 07:58:34.771] [undefined] GET(/:id/stats): try to get stats +[2025-08-13 07:58:34.773] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 07:58:34.781] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-13 08:01:18.744] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-08-13 08:01:40.135] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:01:40.144] [undefined] GET(/:id/stats): try to get stats +[2025-08-13 08:01:40.147] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:01:40.154] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-13 08:01:45.190] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-08-13 08:02:08.907] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:02:08.916] [undefined] GET(/:id/stats): try to get stats +[2025-08-13 08:02:08.919] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:02:08.927] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-13 08:02:14.295] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-08-13 08:02:32.447] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:02:32.456] [undefined] GET(/:id/stats): try to get stats +[2025-08-13 08:02:32.459] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:02:32.467] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-13 08:02:37.213] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-13 08:02:37.223] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-13 08:02:37.235] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:02:37.242] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:04:41.723] [undefined] GET(/:id): try to get video 1 +[2025-08-13 08:04:41.733] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-13 08:04:41.744] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-13 08:04:41.756] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-13 08:04:41.780] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-13 08:04:41.790] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-13 08:04:50.802] [undefined] POST(/): try to post comment +[2025-08-13 08:04:50.812] [undefined] POST(/): successfully post comment with status 200 +[2025-08-13 08:04:54.530] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:04:54.532] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:04:54.534] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:04:54.537] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:04:54.543] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:04:56.638] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:04:56.648] [undefined] GET(/:id/stats): try to get stats +[2025-08-13 08:04:56.650] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:04:56.659] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-13 08:04:58.247] [undefined] GET(/:id): try to get video 1 +[2025-08-13 08:04:58.250] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-13 08:04:58.260] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-13 08:04:58.264] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-13 08:05:21.729] [undefined] GET(/:id): try to get video 1 +[2025-08-13 08:05:21.738] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-13 08:05:21.750] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-13 08:05:21.760] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-13 08:05:21.779] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-13 08:05:21.791] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-13 08:05:23.178] [undefined] DELETE(/:id): try to delete comment 1 +[2025-08-13 08:05:23.185] [undefined] DELETE(/:id): successfully deleted comment with status 200 +[2025-08-13 08:05:23.450] [undefined] GET(/:id): try to get video 1 +[2025-08-13 08:05:23.459] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-13 08:05:23.479] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-13 08:05:23.506] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-13 08:05:23.521] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-13 08:05:23.529] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-13 08:07:08.206] [undefined] GET(/:id): try to get video 1 +[2025-08-13 08:07:08.215] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-13 08:07:08.241] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-13 08:07:08.253] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-13 08:07:08.281] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-13 08:07:08.287] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-13 08:07:09.259] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:07:09.261] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:07:09.263] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:07:09.267] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:07:09.273] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:07:11.274] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:07:11.283] [undefined] GET(/:id/stats): try to get stats +[2025-08-13 08:07:11.287] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:07:11.294] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-13 08:07:14.428] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-13 08:07:14.438] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-13 08:07:14.449] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:07:14.457] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:09:19.413] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-13 08:09:19.418] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-13 08:09:19.432] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:09:19.441] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:13:02.276] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:13:02.284] [undefined] GET(/:id/stats): try to get stats +[2025-08-13 08:13:02.288] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:13:02.294] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-13 08:13:05.983] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:13:05.985] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:13:05.988] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:13:05.991] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:13:05.997] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:13:32.065] [undefined] PUT(/:id): try to update user 2 +[2025-08-13 08:13:32.067] [undefined] PUT(/:id): failed to update because username is already used with status 400 +[2025-08-13 08:13:43.652] [undefined] PUT(/:id): try to update user 2 +[2025-08-13 08:13:43.654] [undefined] PUT(/:id): failed to update because username is already used with status 400 +[2025-08-13 08:13:43.702] [undefined] PUT(/:id): failed to update profile picture with status 500 +[2025-08-13 08:15:55.326] [undefined] PUT(/:id): try to update user 2 +[2025-08-13 08:15:55.329] [undefined] PUT(/:id): failed to update because username is already used with status 400 +[2025-08-13 08:15:55.377] [undefined] PUT(/:id): failed to update profile picture with status 500 +[2025-08-13 08:16:22.726] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:16:22.729] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:16:22.733] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:16:22.739] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:16:22.750] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:17:26.321] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:17:26.324] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:17:26.327] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:17:26.330] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:17:26.341] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:17:53.837] [undefined] PUT(/:id): try to update user 2 +[2025-08-13 08:17:53.882] [undefined] PUT(/:id): successfully updated user 2 with status 200 +[2025-08-13 08:18:53.327] [undefined] POST(/login): try to login with username 'chien' +[2025-08-13 08:18:53.377] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-13 08:18:58.149] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:18:58.151] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:18:58.155] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:18:58.158] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:18:58.166] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:19:31.958] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:19:31.960] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:19:31.970] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:19:31.974] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:19:31.979] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:19:50.162] [undefined] PUT(/:id): try to update user 2 +[2025-08-13 08:19:50.205] [undefined] PUT(/:id): successfully updated user 2 with status 200 +[2025-08-13 08:20:21.321] [undefined] POST(/login): try to login with username 'chienne' +[2025-08-13 08:20:21.374] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-13 08:20:30.730] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:20:30.733] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:20:30.735] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:20:30.739] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:20:30.745] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:20:47.202] [undefined] PUT(/:id): try to update user 2 +[2025-08-13 08:20:47.247] [undefined] PUT(/:id): successfully updated user 2 with status 200 +[2025-08-13 08:20:57.402] [undefined] PUT(/:id): try to update user 2 +[2025-08-13 08:20:57.444] [undefined] PUT(/:id): successfully updated user 2 with status 200 +[2025-08-13 08:24:14.507] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:24:14.517] [undefined] GET(/:id/stats): try to get stats +[2025-08-13 08:24:14.519] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:24:14.527] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-13 08:24:18.228] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:24:18.230] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:26:51.461] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:26:51.464] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:27:19.201] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:27:19.204] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:27:19.206] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:27:19.209] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:27:19.217] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:32:59.197] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:32:59.199] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:32:59.201] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:32:59.203] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:32:59.209] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:33:01.805] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:33:01.826] [undefined] GET(/:id/stats): try to get stats +[2025-08-13 08:33:01.838] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:33:01.850] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-13 08:33:25.114] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:33:25.116] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:33:25.118] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:33:25.121] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:33:25.127] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:33:25.756] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:33:25.765] [undefined] GET(/:id/stats): try to get stats +[2025-08-13 08:33:25.767] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:33:25.776] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-13 08:34:28.854] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-13 08:34:28.856] [undefined] GET(/:id): try to get video 1 +[2025-08-13 08:34:28.888] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-13 08:34:28.893] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-13 08:34:33.937] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-13 08:34:33.939] [undefined] GET(/:id): try to get video 1 +[2025-08-13 08:34:33.950] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-13 08:34:33.954] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-13 08:34:42.356] [undefined] PUT(/:id): try to update video 1 +[2025-08-13 08:34:42.364] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-13 08:35:02.613] [undefined] GET(/:id): try to get video 1 +[2025-08-13 08:35:02.616] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-13 08:35:02.626] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-13 08:35:02.630] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-13 08:35:20.147] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:35:20.150] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 08:35:20.154] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-13 08:35:20.158] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-13 08:35:20.164] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-13 08:35:20.898] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-13 08:35:20.908] [undefined] GET(/:id/stats): try to get stats +[2025-08-13 08:35:20.912] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-13 08:35:20.917] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-13 08:35:26.515] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-13 08:35:26.517] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-13 09:11:32.832] [undefined] POST(/login): try to login with username 'sacha' +[2025-08-13 09:11:32.881] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 07:15:10.827] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 07:15:10.831] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 07:15:10.834] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 07:15:10.837] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 07:15:10.847] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 07:15:12.615] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 07:15:12.626] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 07:15:12.628] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 07:15:12.637] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 07:15:17.519] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 07:15:17.523] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 07:15:18.162] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 07:15:18.172] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 07:15:18.174] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 07:15:18.182] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 07:15:18.766] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 07:15:18.768] [undefined] GET(/:id): try to get video 1 +[2025-08-14 07:15:18.778] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 07:15:18.784] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-14 07:15:20.133] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 07:15:20.143] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 07:15:20.146] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 07:15:20.154] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 07:16:56.508] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 07:16:56.513] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 07:17:33.024] [undefined] POST(/): try to upload video with status undefined +[2025-08-14 07:17:33.030] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-14 07:17:33.217] [undefined] POST(/thumbnail): try to add thumbnail to video 3 +[2025-08-14 07:17:33.222] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 07:17:33.249] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-08-14 07:17:33.260] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-08-14 07:18:03.803] [undefined] POST(/login): try to login with username 'sacha' +[2025-08-14 07:18:03.853] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 07:21:31.736] [undefined] POST(/login): try to login with username 'sacha' +[2025-08-14 07:21:31.787] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 07:27:20.113] [undefined] GET(/:id): try to get video 3 +[2025-08-14 07:27:20.122] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 07:27:20.134] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 07:27:20.145] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 07:27:20.203] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 07:27:20.211] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 07:27:21.854] [undefined] GET(/:id): try to get video 2 +[2025-08-14 07:27:21.864] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 07:27:21.880] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 07:27:21.890] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-14 07:27:21.911] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 07:27:21.922] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 07:27:31.005] [undefined] POST(/login): try to login with username 'sacha' +[2025-08-14 07:27:31.054] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 07:27:35.549] [undefined] GET(/:id): try to get video 3 +[2025-08-14 07:27:35.559] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 07:27:35.570] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 07:27:35.583] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 07:27:46.794] [undefined] POST(/login): try to login with username 'sacha' +[2025-08-14 07:27:46.845] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 08:50:09.067] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 08:50:09.077] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 08:50:09.092] [undefined] GET(/:id/channel/subscribed): check if user 2 is subscribed to channel 1 +[2025-08-14 08:50:09.095] [undefined] GET(/:id/channel/subscribed): user 2 is subscribed to channel 1 with status 200 +[2025-08-14 08:57:38.102] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 08:57:38.107] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 08:57:38.114] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 08:57:46.615] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 08:57:46.619] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 08:57:46.626] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 08:58:13.003] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 08:58:13.007] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 08:58:13.009] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 08:58:13.011] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 08:58:13.019] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 08:59:50.647] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 08:59:50.650] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 08:59:50.660] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 08:59:51.555] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 08:59:51.557] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 08:59:51.566] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 08:59:55.746] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 08:59:55.749] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 08:59:55.758] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:00:11.066] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:00:11.069] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:00:11.077] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:00:13.671] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:00:13.673] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:00:13.682] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:00:23.431] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:00:23.433] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:00:23.435] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:00:23.439] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:00:23.446] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:02:15.763] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:02:15.765] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:02:15.767] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:02:15.770] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:02:16.719] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:02:16.721] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:02:16.723] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:02:16.725] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:02:22.351] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:02:22.354] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:02:22.356] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:02:22.360] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:02:38.904] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:02:38.907] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:02:38.909] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:02:38.913] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:02:38.920] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:03:54.680] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:03:54.683] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:03:54.687] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:03:54.691] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:03:54.698] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:04:14.513] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:04:14.516] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:04:14.518] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:04:14.523] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:04:14.530] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:04:17.776] [undefined] PUT(/:id): try to update user 2 +[2025-08-14 09:04:17.781] [undefined] PUT(/:id): successfully updated user 2 with status 200 +[2025-08-14 09:04:20.637] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:04:20.639] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:04:20.647] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:04:20.651] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:04:20.659] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:04:20.971] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:04:20.973] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:04:20.975] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:04:20.978] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:04:20.984] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:04:21.152] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:04:21.154] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:04:21.156] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:04:21.159] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:04:21.167] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:04:21.307] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:04:21.311] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:04:21.313] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:04:21.318] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:04:21.324] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:04:21.471] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:04:21.473] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:04:21.476] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:04:21.480] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:04:21.489] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:04:21.624] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:04:21.626] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:04:21.628] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:04:21.632] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:04:21.638] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:06:36.577] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:06:36.586] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:06:36.589] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:06:36.595] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:06:38.766] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:06:38.769] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:07:08.435] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:07:08.438] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:07:11.735] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:07:11.737] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:11:10.062] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:11:10.065] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:11:37.761] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:11:37.764] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:14:06.160] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:14:06.162] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:14:26.867] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:14:26.870] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:15:14.249] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:15:14.252] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:15:52.065] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:15:52.068] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:16:04.933] [undefined] POST(/): try to upload video with status undefined +[2025-08-14 09:16:04.937] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-14 09:16:23.841] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:16:23.844] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:16:34.962] [undefined] POST(/): try to upload video with status undefined +[2025-08-14 09:16:34.966] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-14 09:16:45.544] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:16:45.547] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:16:58.151] [undefined] POST(/): try to upload video with status undefined +[2025-08-14 09:16:58.156] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-14 09:17:21.354] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:17:21.357] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:17:30.631] [undefined] POST(/): try to upload video with status undefined +[2025-08-14 09:17:30.637] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-14 09:17:30.706] [undefined] POST(/thumbnail): try to add thumbnail to video 7 +[2025-08-14 09:17:30.711] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 09:17:30.731] [undefined] PUT(/:id/tags): try to add tags to video 7 +[2025-08-14 09:17:30.743] [undefined] PUT(/:id/tags): successfully added tags to video 7 with status 200 +[2025-08-14 09:17:42.040] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:17:42.042] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:17:42.065] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:17:42.069] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:17:42.074] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:17:43.166] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:17:43.176] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:17:43.179] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:17:43.187] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:17:51.833] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:17:51.836] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:20:14.268] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:20:14.270] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:20:23.122] [undefined] POST(/): try to upload video with status undefined +[2025-08-14 09:20:23.126] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-14 09:20:31.995] [undefined] POST(/): try to upload video with status undefined +[2025-08-14 09:20:32.005] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-14 09:21:37.073] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:21:37.076] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:21:47.365] [undefined] POST(/): try to upload video with status undefined +[2025-08-14 09:21:47.369] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-14 09:21:47.437] [undefined] POST(/thumbnail): try to add thumbnail to video 10 +[2025-08-14 09:21:47.441] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 09:21:47.461] [undefined] PUT(/:id/tags): try to add tags to video 10 +[2025-08-14 09:21:47.471] [undefined] PUT(/:id/tags): successfully added tags to video 10 with status 200 +[2025-08-14 09:24:03.986] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:24:03.989] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:24:14.935] [undefined] POST(/): try to upload video with status undefined +[2025-08-14 09:24:14.939] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-14 09:24:15.007] [undefined] POST(/thumbnail): try to add thumbnail to video 11 +[2025-08-14 09:24:15.010] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 09:24:15.029] [undefined] PUT(/:id/tags): try to add tags to video 11 +[2025-08-14 09:24:15.038] [undefined] PUT(/:id/tags): successfully added tags to video 11 with status 200 +[2025-08-14 09:41:32.581] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:41:32.584] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:41:32.586] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:41:32.589] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:41:32.598] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:42:38.064] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:42:38.074] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:42:38.077] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:42:38.085] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:43:15.412] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:43:15.421] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:43:15.423] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:43:15.433] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:43:50.865] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:43:50.868] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:43:50.871] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:43:50.876] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:43:50.883] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:43:51.540] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:43:51.549] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:43:51.552] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:43:51.561] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:46:16.293] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:46:16.303] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:46:16.305] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:46:16.312] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:46:16.480] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:46:16.490] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:46:16.493] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:46:16.500] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:46:37.855] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:46:37.864] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:46:37.882] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:46:37.890] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:47:45.879] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:47:45.888] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:48:09.671] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:48:09.679] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:48:31.123] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:48:31.133] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:48:31.136] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:48:31.143] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:49:57.452] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:49:57.462] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:50:25.170] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:50:25.179] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:50:40.001] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:50:40.004] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:50:40.006] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:50:40.009] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:50:40.017] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:50:40.659] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:50:40.669] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:50:48.631] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:50:48.640] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:51:30.022] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:51:30.031] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:51:49.074] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:51:49.083] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:51:49.086] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:51:49.095] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:52:03.749] [undefined] GET(/:id): try to get video 9 +[2025-08-14 09:52:03.751] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 09:52:03.772] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 09:52:03.775] [undefined] GET(/:id): successfully get video 9 with status 200 +[2025-08-14 09:52:05.074] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:52:05.084] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:52:05.087] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:52:05.094] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:52:05.900] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 09:52:05.903] [undefined] GET(/:id): try to get video 3 +[2025-08-14 09:52:05.913] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 09:52:05.917] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 09:52:06.512] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:52:06.521] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:52:06.524] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:52:06.531] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:52:24.484] [undefined] POST(/login): try to login with username 'sacha2' +[2025-08-14 09:52:24.535] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 09:52:43.615] [undefined] GET(/:id): try to get video 2 +[2025-08-14 09:52:43.626] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 09:52:43.638] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 09:52:43.651] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-14 09:52:49.618] [undefined] GET(/:id): try to get video 3 +[2025-08-14 09:52:49.628] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 09:52:49.656] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 09:52:49.668] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 09:52:54.224] [undefined] GET(/:id): try to get video 3 +[2025-08-14 09:52:54.234] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 09:52:54.248] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 09:52:54.260] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 09:54:26.465] [undefined] POST(/login): try to login with username 'sacha2' +[2025-08-14 09:54:26.515] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 09:54:27.736] [undefined] GET(/:id): try to get video 2 +[2025-08-14 09:54:27.746] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 09:54:27.757] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 09:54:27.768] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-14 09:54:27.793] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 09:54:27.804] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 09:54:30.556] [undefined] GET(/:id): try to get video 3 +[2025-08-14 09:54:30.566] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 09:54:30.578] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 09:54:30.590] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 09:54:30.619] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 09:54:30.627] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 09:54:31.642] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-08-14 09:54:31.651] [undefined] GET(/:id/like): no likes found adding likes for video 3 with status 200 +[2025-08-14 09:54:36.146] [undefined] POST(/): try to post comment +[2025-08-14 09:54:36.155] [undefined] POST(/): successfully post comment with status 200 +[2025-08-14 09:54:39.223] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 09:54:39.226] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 09:54:39.229] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 09:54:39.233] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 09:54:39.240] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 09:54:40.000] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:54:40.008] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:54:40.013] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:54:40.020] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 09:54:42.199] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 09:54:42.202] [undefined] GET(/:id): try to get video 3 +[2025-08-14 09:54:42.212] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 09:54:42.217] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 09:55:00.200] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 09:55:00.212] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 09:55:00.215] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 09:55:00.222] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:23:18.930] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:23:18.940] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:23:18.943] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:23:18.950] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:33:37.823] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:33:37.833] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:33:37.836] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:33:37.843] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:33:39.614] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:33:39.623] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:33:39.627] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:33:39.635] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:33:45.990] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:33:45.999] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:33:46.002] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:34:06.394] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:34:06.403] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:34:06.409] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:34:06.415] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:36:39.509] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:36:39.519] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:36:39.523] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:36:39.532] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:36:52.157] [undefined] GET(/:id): try to get video 3 +[2025-08-14 10:36:52.167] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 10:36:52.180] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 10:36:52.194] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 10:36:52.232] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 10:36:52.241] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 10:36:54.291] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-08-14 10:36:54.299] [undefined] GET(/:id/like): likes found, removing like for video 3 with status 200 +[2025-08-14 10:36:55.593] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 10:36:55.596] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 10:36:55.599] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 10:36:55.603] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 10:36:55.610] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 10:36:57.008] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:36:57.017] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:36:57.021] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:36:57.029] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:37:00.362] [undefined] GET(/:id): try to get video 3 +[2025-08-14 10:37:00.365] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 10:37:00.375] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 10:37:00.379] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 10:37:01.575] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:37:01.584] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:37:01.588] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:37:01.596] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:37:38.318] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:37:38.328] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:37:38.332] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:37:38.341] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:37:39.033] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:37:39.042] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:37:39.046] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:37:39.054] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:38:00.552] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:38:00.563] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:38:00.566] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:38:00.574] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:40:16.495] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:40:16.505] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:40:16.509] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:40:16.518] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:40:23.501] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:40:23.510] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:40:23.513] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:40:23.521] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:40:33.046] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:40:33.055] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:40:33.059] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:40:33.067] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:40:49.285] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:40:49.294] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:40:49.299] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:40:49.307] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:41:01.916] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:41:01.940] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:41:01.944] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:41:01.952] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:41:05.082] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:41:05.086] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:41:06.943] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:41:06.947] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:41:09.059] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:41:09.069] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:41:09.074] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:41:09.083] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:41:22.315] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:41:22.325] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:41:22.328] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:41:22.335] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:41:24.953] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:41:24.957] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:42:19.994] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:42:20.003] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:42:20.005] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:42:20.014] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:42:23.541] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:42:23.551] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:42:54.247] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:42:54.257] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:42:54.260] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:42:54.269] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:42:58.515] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:42:58.518] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:43:01.600] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:43:01.609] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:43:01.613] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:43:01.621] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:43:10.977] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:43:10.986] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:43:10.990] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:43:10.997] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:43:14.883] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:43:14.908] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:43:57.229] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:43:57.239] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:43:57.243] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:43:57.251] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:43:59.949] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:43:59.954] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:44:13.839] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:44:13.848] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:44:13.866] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:44:13.873] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:44:16.611] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:44:16.616] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:44:53.689] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:44:53.715] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:45:59.386] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:45:59.396] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:45:59.400] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:45:59.410] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:46:03.914] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:46:03.924] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:46:23.903] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:46:23.914] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:46:23.918] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:46:23.925] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:46:26.052] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:46:26.058] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:46:31.809] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:46:31.835] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 10:46:40.187] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:46:40.198] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:46:40.203] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:46:52.930] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 10:46:52.940] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 10:46:52.944] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 10:46:52.954] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 10:46:54.961] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-14 10:46:54.966] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 11:08:56.806] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 11:08:56.817] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 11:08:56.820] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 11:08:56.828] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 11:08:57.886] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:08:57.889] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:08:57.900] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:08:57.903] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:10:10.097] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:10:10.105] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:10:11.141] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:10:11.150] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:10:18.893] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:10:18.901] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:10:21.976] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:10:21.985] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:10:32.447] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:10:32.450] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:10:32.458] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:10:32.462] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:10:38.874] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:10:38.884] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:10:38.898] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 11:10:38.910] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-14 11:10:38.931] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 11:10:38.942] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 11:10:41.994] [undefined] POST(/): try to post comment +[2025-08-14 11:10:42.020] [undefined] POST(/): successfully post comment with status 200 +[2025-08-14 11:10:44.656] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:10:44.658] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:10:44.668] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:10:44.673] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:10:50.106] [undefined] GET(/:id/like): try to toggle like on video 2 +[2025-08-14 11:10:50.114] [undefined] GET(/:id/like): no likes found adding likes for video 2 with status 200 +[2025-08-14 11:10:50.714] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:10:50.723] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:10:50.737] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 11:10:50.747] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-14 11:10:50.774] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 11:10:50.785] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 11:10:52.361] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:10:52.364] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:10:52.374] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:10:52.378] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:33:55.182] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:33:55.193] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:33:56.151] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:33:56.162] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:34:23.507] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:34:23.511] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:34:23.520] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:34:23.525] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:34:26.218] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:34:26.221] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:34:26.231] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:34:26.235] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:34:26.870] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:34:26.873] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:34:26.884] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:34:26.889] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:34:39.518] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:34:39.520] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:34:39.530] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:34:39.536] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:34:46.394] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:34:46.397] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:34:46.415] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:34:46.421] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:39:09.755] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:39:09.758] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:39:09.770] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:39:09.774] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:39:25.896] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:39:25.899] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:39:25.909] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:39:25.913] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:39:29.813] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 11:39:29.821] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 11:39:51.316] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:39:51.320] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:39:51.328] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:39:51.332] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:39:56.476] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 11:39:56.502] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 11:40:11.654] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:40:11.656] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:40:11.668] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:40:11.672] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:45:07.788] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:45:07.791] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:45:07.801] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:45:07.805] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:45:12.172] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 11:45:12.183] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 11:45:25.685] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:45:25.688] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:45:25.698] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:45:25.703] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:45:30.477] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 11:45:30.485] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 11:46:34.147] [undefined] PUT(/:id): failed due to invalid values with status 400 +[2025-08-14 11:46:41.179] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:46:41.183] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:46:41.196] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:46:41.201] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:46:46.274] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 11:46:46.282] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 11:46:59.148] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 11:46:59.174] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 11:53:44.217] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:53:44.220] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:53:44.234] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:53:44.241] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:53:49.499] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 11:53:49.510] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 11:55:09.222] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:55:09.225] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:55:09.238] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:55:09.244] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:55:16.163] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 11:55:16.173] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 11:55:24.594] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:55:24.604] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:55:24.618] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 11:55:24.631] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-14 11:55:24.663] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 11:55:24.672] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 11:56:01.283] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:56:01.297] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:56:01.318] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 11:56:01.330] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-14 11:56:01.389] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 11:56:01.397] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 11:56:03.278] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 11:56:03.281] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 11:56:03.285] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 11:56:03.293] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 11:56:03.302] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 11:56:04.070] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 11:56:04.080] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 11:56:04.084] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 11:56:04.092] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 11:56:06.055] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:56:06.057] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:56:06.067] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:56:06.071] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:56:09.525] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 11:56:09.534] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 11:56:21.216] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 11:56:21.225] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 11:57:15.584] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:57:15.587] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:57:15.598] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:57:15.604] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:57:18.904] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 11:59:35.276] [undefined] GET(/:id): try to get video 2 +[2025-08-14 11:59:35.278] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 11:59:35.291] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 11:59:35.297] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 11:59:37.943] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 12:00:48.679] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:00:48.681] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:00:48.693] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:00:48.699] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:00:51.614] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 12:00:51.624] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 12:02:00.772] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:02:00.775] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:02:00.784] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:02:00.788] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:02:36.978] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:02:36.981] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:02:36.993] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:02:36.999] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:02:39.857] [undefined] PUT(/:id): try to update video 2 +[2025-08-14 12:02:39.869] [undefined] PUT(/:id): successfully updated video with status 200 +[2025-08-14 12:02:44.944] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:02:44.953] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:20:03.405] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:20:03.409] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:20:03.418] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:20:03.421] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:20:10.325] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-14 12:20:10.328] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 12:20:18.374] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-14 12:20:18.377] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 12:20:22.987] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-14 12:20:22.993] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 12:20:28.283] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 12:20:28.287] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 12:20:28.294] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 12:20:28.299] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 12:20:28.305] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 12:20:28.916] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 12:20:28.927] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 12:20:28.930] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 12:20:28.937] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 12:20:30.335] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:20:30.337] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:20:30.347] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:20:30.351] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:20:32.702] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-14 12:20:32.706] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 12:20:43.168] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-14 12:20:43.171] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 12:20:58.988] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:20:58.991] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:20:59.002] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:20:59.007] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:21:01.051] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-14 12:21:01.054] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 12:21:54.778] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:21:54.781] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:21:54.793] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:21:54.797] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:21:56.828] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-14 12:21:56.853] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 12:22:03.157] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-14 12:22:03.160] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 12:22:19.177] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:22:19.182] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:22:19.189] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:22:19.192] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:22:20.940] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-14 12:22:20.942] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-14 12:25:01.156] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:25:01.158] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:25:01.190] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:25:01.195] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:25:05.246] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:25:05.258] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:25:29.950] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:25:29.953] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:25:29.964] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:25:29.969] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:25:32.325] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:25:32.335] [undefined] PUT(/:id/tags): Tag dzqdzq already exists for video 2 with status 200 +[2025-08-14 12:25:32.341] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:26:20.072] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:26:20.075] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:26:20.085] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:26:20.090] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:26:22.839] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:26:22.851] [undefined] PUT(/:id/tags): Tag dzqdzq already exists for video 2 with status 200 +[2025-08-14 12:26:22.855] [undefined] PUT(/:id/tags): Tag dzdzq already exists for video 2 with status 200 +[2025-08-14 12:26:22.858] [undefined] PUT(/:id/tags): Tag dzqdzq already exists for video 2 with status 200 +[2025-08-14 12:26:22.862] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:26:51.858] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:26:51.861] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:26:51.869] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:26:51.872] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:26:52.796] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:26:52.806] [undefined] PUT(/:id/tags): Tag dzdzq already exists for video 2 with status 200 +[2025-08-14 12:26:52.810] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:26:54.399] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:26:54.408] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:26:56.931] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:26:56.941] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:26:58.742] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:26:58.750] [undefined] PUT(/:id/tags): Tag dzqdqzdzq already exists for video 2 with status 200 +[2025-08-14 12:26:58.754] [undefined] PUT(/:id/tags): Tag dzqdzq already exists for video 2 with status 200 +[2025-08-14 12:26:58.758] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:27:02.277] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:27:02.286] [undefined] PUT(/:id/tags): Tag dzqdqzdzq already exists for video 2 with status 200 +[2025-08-14 12:27:02.290] [undefined] PUT(/:id/tags): Tag dzqdzq already exists for video 2 with status 200 +[2025-08-14 12:27:02.295] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:27:03.403] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:27:03.412] [undefined] PUT(/:id/tags): Tag dzqdqzdzq already exists for video 2 with status 200 +[2025-08-14 12:27:03.416] [undefined] PUT(/:id/tags): Tag dzqdzqdzqzdzqzdzd already exists for video 2 with status 200 +[2025-08-14 12:27:03.420] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:27:04.462] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:27:04.471] [undefined] PUT(/:id/tags): Tag dzqdzqdzqzdzqzdzd already exists for video 2 with status 200 +[2025-08-14 12:27:04.475] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:27:05.607] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:27:05.615] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:27:10.270] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:27:10.278] [undefined] PUT(/:id/tags): Tag dzq already exists for video 2 with status 200 +[2025-08-14 12:27:10.282] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:27:11.329] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:27:11.340] [undefined] PUT(/:id/tags): Tag dzq already exists for video 2 with status 200 +[2025-08-14 12:27:11.344] [undefined] PUT(/:id/tags): Tag dzq already exists for video 2 with status 200 +[2025-08-14 12:27:11.348] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:27:12.696] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:27:12.705] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:27:30.056] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:27:30.064] [undefined] PUT(/:id/tags): Tag dzq already exists for video 2 with status 200 +[2025-08-14 12:27:30.068] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:27:30.895] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:27:30.904] [undefined] PUT(/:id/tags): Tag dzq already exists for video 2 with status 200 +[2025-08-14 12:27:30.908] [undefined] PUT(/:id/tags): Tag dzq already exists for video 2 with status 200 +[2025-08-14 12:27:30.912] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:27:31.488] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:27:31.492] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:27:31.501] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:27:31.504] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:27:32.727] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:27:32.737] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:31:17.253] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:31:17.255] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:31:17.267] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:31:17.270] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:31:30.573] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:31:30.584] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:31:30.605] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 12:31:30.615] [undefined] GET(/:id/similar): No tags found for video 2 with status 404 +[2025-08-14 12:32:28.088] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:32:28.100] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:32:28.120] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 12:32:28.131] [undefined] GET(/:id/similar): No tags found for video 2 with status 404 +[2025-08-14 12:32:28.187] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 12:32:28.195] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 12:32:37.740] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:32:37.752] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:32:37.765] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 12:32:37.775] [undefined] GET(/:id/similar): No tags found for video 2 with status 404 +[2025-08-14 12:32:37.800] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 12:32:37.813] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 12:32:54.881] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 12:32:54.884] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 12:32:54.887] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 12:32:54.891] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 12:32:54.898] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 12:32:56.237] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 12:32:56.246] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 12:32:56.251] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 12:32:56.259] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 12:32:56.867] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:32:56.869] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:32:56.880] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:32:56.884] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:33:00.303] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-14 12:33:00.311] [undefined] PUT(/:id/tags): Tag dzq already exists for video 2 with status 200 +[2025-08-14 12:33:00.315] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-14 12:33:01.379] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 12:33:01.389] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 12:33:01.392] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 12:33:01.400] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 12:33:02.181] [undefined] GET(/:id): try to get video 8 +[2025-08-14 12:33:02.184] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:33:02.195] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:33:02.200] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-14 12:33:04.752] [undefined] PUT(/:id/tags): try to add tags to video 8 +[2025-08-14 12:33:04.761] [undefined] PUT(/:id/tags): Tag dzq already exists for video 8 with status 200 +[2025-08-14 12:33:04.766] [undefined] PUT(/:id/tags): successfully added tags to video 8 with status 200 +[2025-08-14 12:33:05.305] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 12:33:05.315] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 12:33:05.320] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 12:33:05.328] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 12:33:06.375] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:33:06.378] [undefined] GET(/:id): try to get video 8 +[2025-08-14 12:33:06.386] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:33:06.393] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-14 12:33:07.822] [undefined] PUT(/:id/tags): try to add tags to video 8 +[2025-08-14 12:33:07.832] [undefined] PUT(/:id/tags): successfully added tags to video 8 with status 200 +[2025-08-14 12:33:08.214] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 12:33:08.224] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 12:33:08.228] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 12:33:08.236] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 12:33:09.278] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:33:09.281] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:33:09.292] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:33:09.298] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:33:10.961] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-08-14 12:33:10.970] [undefined] PUT(/:id/tags): Tag video already exists for video 3 with status 200 +[2025-08-14 12:33:10.976] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-08-14 12:33:12.680] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-08-14 12:33:12.690] [undefined] PUT(/:id/tags): Tag video already exists for video 3 with status 200 +[2025-08-14 12:33:12.694] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-08-14 12:33:14.401] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-08-14 12:33:14.410] [undefined] PUT(/:id/tags): Tag video already exists for video 3 with status 200 +[2025-08-14 12:33:14.414] [undefined] PUT(/:id/tags): Tag dzq already exists for video 3 with status 200 +[2025-08-14 12:33:14.418] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-08-14 12:33:15.139] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 12:33:15.153] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 12:33:15.160] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 12:33:15.169] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 12:33:17.088] [undefined] GET(/:id): try to get video 10 +[2025-08-14 12:33:17.090] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:33:17.101] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:33:17.105] [undefined] GET(/:id): successfully get video 10 with status 200 +[2025-08-14 12:33:21.579] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 12:33:21.589] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 12:33:21.593] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 12:33:21.600] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 12:33:23.814] [undefined] GET(/:id): try to get video 11 +[2025-08-14 12:33:23.817] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:33:23.828] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:33:23.831] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-14 12:33:28.259] [undefined] PUT(/:id/tags): try to add tags to video 11 +[2025-08-14 12:33:28.270] [undefined] PUT(/:id/tags): successfully added tags to video 11 with status 200 +[2025-08-14 12:33:29.545] [undefined] PUT(/:id/tags): try to add tags to video 11 +[2025-08-14 12:33:29.554] [undefined] PUT(/:id/tags): Tag dzq already exists for video 11 with status 200 +[2025-08-14 12:33:29.558] [undefined] PUT(/:id/tags): successfully added tags to video 11 with status 200 +[2025-08-14 12:33:30.089] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 12:33:30.099] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 12:33:30.103] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 12:33:30.110] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 12:33:31.362] [undefined] GET(/:id): try to get video 7 +[2025-08-14 12:33:31.364] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:33:31.374] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:33:31.378] [undefined] GET(/:id): successfully get video 7 with status 200 +[2025-08-14 12:33:34.312] [undefined] PUT(/:id/tags): try to add tags to video 7 +[2025-08-14 12:33:34.324] [undefined] PUT(/:id/tags): successfully added tags to video 7 with status 200 +[2025-08-14 12:33:35.299] [undefined] PUT(/:id/tags): try to add tags to video 7 +[2025-08-14 12:33:35.307] [undefined] PUT(/:id/tags): Tag dzq already exists for video 7 with status 200 +[2025-08-14 12:33:35.311] [undefined] PUT(/:id/tags): successfully added tags to video 7 with status 200 +[2025-08-14 12:33:36.059] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 12:33:36.069] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 12:33:36.071] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 12:33:36.080] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 12:33:38.141] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-14 12:33:38.143] [undefined] GET(/:id): try to get video 1 +[2025-08-14 12:33:38.154] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-14 12:33:38.158] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-14 12:33:40.312] [undefined] PUT(/:id/tags): try to add tags to video 1 +[2025-08-14 12:33:40.321] [undefined] PUT(/:id/tags): Tag minecraft already exists for video 1 with status 200 +[2025-08-14 12:33:40.325] [undefined] PUT(/:id/tags): Tag survie already exists for video 1 with status 200 +[2025-08-14 12:33:40.328] [undefined] PUT(/:id/tags): Tag moddée already exists for video 1 with status 200 +[2025-08-14 12:33:40.332] [undefined] PUT(/:id/tags): Tag create mod already exists for video 1 with status 200 +[2025-08-14 12:33:40.335] [undefined] PUT(/:id/tags): Tag dzq already exists for video 1 with status 200 +[2025-08-14 12:33:40.339] [undefined] PUT(/:id/tags): successfully added tags to video 1 with status 200 +[2025-08-14 12:33:41.447] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 12:33:41.457] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 12:33:41.459] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 12:33:41.468] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 12:33:43.866] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:33:43.876] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:33:43.890] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 12:33:43.905] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-14 12:33:43.950] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 12:33:43.960] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 12:34:57.369] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:34:57.379] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:34:57.395] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 12:34:57.411] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-14 12:34:57.447] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 12:34:57.455] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 12:34:58.556] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:34:58.565] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:34:58.579] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 12:34:58.594] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-14 12:34:58.625] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 12:34:58.635] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 12:35:52.370] [undefined] GET(/:id): try to get video 2 +[2025-08-14 12:35:52.381] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-14 12:35:52.398] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-14 12:35:52.412] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-14 12:35:52.480] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-14 12:35:52.488] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-14 12:35:53.455] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:35:53.465] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:35:53.476] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:35:53.486] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:35:53.501] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:35:53.509] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:35:55.142] [undefined] GET(/:id): try to get video 7 +[2025-08-14 12:35:55.151] [undefined] GET(/:id): successfully get video 7 with status 200 +[2025-08-14 12:35:55.163] [undefined] GET(/:id/similar): try to get similar videos for video 7 +[2025-08-14 12:35:55.173] [undefined] GET(/:id/similar): successfully get similar videos for video 7 with status 200 +[2025-08-14 12:35:55.187] [undefined] GET(/:id/views): try to add views for video 7 +[2025-08-14 12:35:55.196] [undefined] GET(/:id/views): successfully added views for video 7 with status 200 +[2025-08-14 12:35:57.132] [undefined] GET(/:id): try to get video 7 +[2025-08-14 12:35:57.141] [undefined] GET(/:id): successfully get video 7 with status 200 +[2025-08-14 12:35:57.154] [undefined] GET(/:id/similar): try to get similar videos for video 7 +[2025-08-14 12:35:57.167] [undefined] GET(/:id/similar): successfully get similar videos for video 7 with status 200 +[2025-08-14 12:35:57.215] [undefined] GET(/:id/views): try to add views for video 7 +[2025-08-14 12:35:57.223] [undefined] GET(/:id/views): successfully added views for video 7 with status 200 +[2025-08-14 12:36:03.171] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:36:03.181] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:36:03.194] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:36:03.205] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:36:03.219] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:38:59.466] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:38:59.479] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:38:59.496] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:38:59.512] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:38:59.563] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:38:59.572] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:39:22.705] [undefined] GET(/:id): try to get video 6 +[2025-08-14 12:39:22.715] [undefined] GET(/:id): successfully get video 6 with status 200 +[2025-08-14 12:39:22.727] [undefined] GET(/:id/similar): try to get similar videos for video 6 +[2025-08-14 12:39:22.738] [undefined] GET(/:id/similar): No tags found for video 6 with status 404 +[2025-08-14 12:39:22.766] [undefined] GET(/:id/views): try to add views for video 6 +[2025-08-14 12:39:22.776] [undefined] GET(/:id/views): successfully added views for video 6 with status 200 +[2025-08-14 12:39:27.311] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:39:27.322] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:39:27.336] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:39:27.353] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:39:27.371] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:39:27.379] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:39:34.149] [undefined] POST(/): try to post comment +[2025-08-14 12:39:34.158] [undefined] POST(/): successfully post comment with status 200 +[2025-08-14 12:39:36.311] [undefined] POST(/): try to post comment +[2025-08-14 12:39:36.319] [undefined] POST(/): successfully post comment with status 200 +[2025-08-14 12:39:40.149] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:39:40.160] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:39:40.172] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:39:40.187] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:39:40.227] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:39:40.235] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:39:48.338] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-08-14 12:39:48.347] [undefined] GET(/:id/like): no likes found adding likes for video 3 with status 200 +[2025-08-14 12:39:51.456] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:39:51.466] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:39:51.479] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:39:51.493] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:39:51.517] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:39:51.525] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:39:56.141] [undefined] DELETE(/:id): try to delete comment 4 +[2025-08-14 12:39:56.149] [undefined] DELETE(/:id): successfully deleted comment with status 200 +[2025-08-14 12:39:56.159] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:39:56.169] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:39:56.181] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:39:56.192] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:39:56.206] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:39:56.214] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:39:56.715] [undefined] DELETE(/:id): try to delete comment 2 +[2025-08-14 12:39:56.723] [undefined] DELETE(/:id): successfully deleted comment with status 200 +[2025-08-14 12:39:56.733] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:39:56.742] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:39:56.754] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:39:56.765] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:39:56.778] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:39:56.785] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:39:58.295] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:39:58.307] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:39:58.320] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:39:58.336] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:39:58.356] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:39:58.364] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:50:01.395] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:50:01.405] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:50:01.418] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:50:01.431] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:50:01.478] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:50:01.487] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:50:05.123] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:50:05.134] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:50:05.147] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:50:05.175] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:50:05.190] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:50:05.201] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:50:08.753] [undefined] POST(/): try to post comment +[2025-08-14 12:50:08.762] [undefined] POST(/): successfully post comment with status 200 +[2025-08-14 12:50:09.847] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:50:09.857] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:50:09.883] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:50:09.898] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:50:09.928] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:50:09.936] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:52:04.715] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:52:04.725] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:52:04.738] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:52:04.753] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:52:04.802] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:52:04.811] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:52:06.541] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-14 12:52:06.557] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-14 12:52:12.551] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:52:12.562] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:52:12.577] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:52:12.589] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:52:12.623] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:52:12.632] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:52:13.340] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-14 12:52:13.348] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-14 12:52:14.202] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:52:14.212] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:52:14.224] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:52:14.238] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:52:14.266] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:52:14.273] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:52:25.529] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-14 12:52:25.538] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-14 12:52:51.437] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:52:51.448] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:52:51.464] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:52:51.478] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:52:51.544] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:52:51.554] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:52:52.981] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-14 12:52:52.989] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-14 12:52:56.492] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-14 12:52:56.500] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-14 12:54:53.160] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:54:53.171] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:54:53.194] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:54:53.209] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:54:53.238] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:54:53.246] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:55:13.752] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:55:13.762] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:55:13.786] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:55:13.801] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:55:13.864] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:55:13.873] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:55:46.426] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:55:46.436] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:55:46.471] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:55:46.484] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:55:46.512] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:55:46.521] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:55:48.398] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-08-14 12:55:48.407] [undefined] GET(/:id/like): likes found, removing like for video 3 with status 200 +[2025-08-14 12:56:14.257] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-08-14 12:56:14.267] [undefined] GET(/:id/like): no likes found adding likes for video 3 with status 200 +[2025-08-14 12:56:18.282] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-08-14 12:56:18.291] [undefined] GET(/:id/like): likes found, removing like for video 3 with status 200 +[2025-08-14 12:56:33.480] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:56:33.491] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:56:33.514] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:56:33.528] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:56:33.594] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:56:33.603] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:56:35.346] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-08-14 12:56:35.355] [undefined] GET(/:id/like): no likes found adding likes for video 3 with status 200 +[2025-08-14 12:56:53.967] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:56:53.977] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:56:53.996] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:56:54.010] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:56:54.059] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:56:54.069] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:56:55.613] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-08-14 12:56:55.621] [undefined] GET(/:id/like): likes found, removing like for video 3 with status 200 +[2025-08-14 12:56:56.513] [undefined] GET(/:id/like): try to toggle like on video 3 +[2025-08-14 12:56:56.522] [undefined] GET(/:id/like): no likes found adding likes for video 3 with status 200 +[2025-08-14 12:59:21.229] [undefined] GET(/:id): try to get video 3 +[2025-08-14 12:59:21.240] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 12:59:21.254] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 12:59:21.269] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 12:59:21.311] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 12:59:21.320] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 12:59:23.581] [undefined] POST(/): try to post comment +[2025-08-14 12:59:23.590] [undefined] POST(/): successfully post comment with status 200 +[2025-08-14 12:59:26.482] [undefined] POST(/): try to post comment +[2025-08-14 12:59:26.493] [undefined] POST(/): successfully post comment with status 200 +[2025-08-14 13:03:00.902] [undefined] POST(/): try to register a user with username: test1 and email: test1@gmail.com +[2025-08-14 13:03:00.954] [undefined] POST(/): successfully registered with status 200 +[2025-08-14 13:03:00.960] [undefined] POST(/login): try to login with username 'test1' +[2025-08-14 13:03:01.011] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 13:03:02.685] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-08-14 13:03:02.689] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:03:02.692] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-08-14 13:03:02.695] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-08-14 13:03:02.703] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-08-14 13:03:11.325] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:03:11.328] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-08-14 13:03:11.352] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-08-14 13:03:11.356] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-08-14 13:03:11.363] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-08-14 13:03:12.975] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:03:12.978] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-08-14 13:03:23.243] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:03:23.246] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-08-14 13:03:34.890] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:03:34.894] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-08-14 13:03:34.899] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-08-14 13:03:34.903] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-08-14 13:03:34.913] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-08-14 13:05:03.204] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:05:03.207] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-08-14 13:05:03.210] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-08-14 13:05:03.214] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-08-14 13:05:03.223] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-08-14 13:05:10.894] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:05:10.898] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-08-14 13:05:10.901] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-08-14 13:05:10.905] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-08-14 13:05:10.913] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-08-14 13:05:29.014] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:05:29.017] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-08-14 13:05:29.022] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-08-14 13:05:29.026] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-08-14 13:05:29.035] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-08-14 13:05:52.641] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:05:52.643] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-08-14 13:05:52.647] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-08-14 13:05:52.650] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-08-14 13:05:52.657] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-08-14 13:07:57.035] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:07:57.038] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-08-14 13:07:57.041] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-08-14 13:07:57.045] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-08-14 13:07:57.054] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-08-14 13:08:23.710] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:08:23.712] [undefined] GET(/:id/channel): failed to retrieve channel of user 3 because it doesn't exist with status 404 +[2025-08-14 13:08:23.716] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-08-14 13:08:23.720] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-08-14 13:08:23.729] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-08-14 13:08:28.555] [undefined] POST(/): try to create new channel with owner 3 and name test1 +[2025-08-14 13:08:28.557] [undefined] POST(/): Successfully created new channel with name test1 with status 200 +[2025-08-14 13:08:30.961] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:08:30.965] [undefined] GET(/:id/channel): successfully retrieved channel of user 3 with status 200 +[2025-08-14 13:08:30.968] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-08-14 13:08:30.972] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-08-14 13:08:30.980] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-08-14 13:08:47.670] [undefined] GET(/:id/channel): try to retrieve channel of user 3 +[2025-08-14 13:08:47.673] [undefined] GET(/:id/channel): successfully retrieved channel of user 3 with status 200 +[2025-08-14 13:08:47.676] [undefined] GET(/:id/history): try to retrieve history of user 3 +[2025-08-14 13:08:47.679] [undefined] GET(/:id/history): failed to retrieve history of user 3 because it doesn't exist with status 404 +[2025-08-14 13:08:47.687] [undefined] GET(/user/:id): Playlists retrieved for user with id 3 with status 200 +[2025-08-14 13:09:09.402] [undefined] POST(/): try to register a user with username: test2 and email: test2@gmail.com +[2025-08-14 13:09:09.451] [undefined] POST(/): successfully registered with status 200 +[2025-08-14 13:09:09.458] [undefined] POST(/login): try to login with username 'test2' +[2025-08-14 13:09:09.508] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 13:09:11.134] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-14 13:09:11.136] [undefined] GET(/:id/channel): failed to retrieve channel of user 4 because it doesn't exist with status 404 +[2025-08-14 13:09:11.141] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-14 13:09:11.144] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-08-14 13:09:11.150] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-14 13:09:16.803] [undefined] POST(/): try to create new channel with owner 4 and name test2 +[2025-08-14 13:09:16.806] [undefined] POST(/): Successfully created new channel with name test2 with status 200 +[2025-08-14 13:33:25.288] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-14 13:33:25.291] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-14 13:33:25.294] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-14 13:33:25.298] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-08-14 13:33:25.306] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-14 13:33:49.619] [undefined] POST(/): try to register a user with username: test3 and email: test3@gmail.com +[2025-08-14 13:33:49.668] [undefined] POST(/): successfully registered with status 200 +[2025-08-14 13:33:49.674] [undefined] POST(/login): try to login with username 'test3' +[2025-08-14 13:33:49.725] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 13:33:52.225] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-08-14 13:33:52.229] [undefined] GET(/:id/channel): failed to retrieve channel of user 5 because it doesn't exist with status 404 +[2025-08-14 13:33:52.231] [undefined] GET(/:id/history): try to retrieve history of user 5 +[2025-08-14 13:33:52.235] [undefined] GET(/:id/history): failed to retrieve history of user 5 because it doesn't exist with status 404 +[2025-08-14 13:33:52.243] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-08-14 13:33:57.691] [undefined] POST(/): try to create new channel with owner 5 and name test3 +[2025-08-14 13:33:57.694] [undefined] POST(/): Successfully created new channel with name test3 with status 200 +[2025-08-14 13:33:57.707] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-08-14 13:33:57.711] [undefined] GET(/:id/channel): successfully retrieved channel of user 5 with status 200 +[2025-08-14 13:34:15.105] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-08-14 13:34:15.109] [undefined] GET(/:id/channel): successfully retrieved channel of user 5 with status 200 +[2025-08-14 13:34:15.112] [undefined] GET(/:id/history): try to retrieve history of user 5 +[2025-08-14 13:34:15.115] [undefined] GET(/:id/history): failed to retrieve history of user 5 because it doesn't exist with status 404 +[2025-08-14 13:34:15.123] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-08-14 13:37:01.584] [undefined] GET(/:id): try to get video 3 +[2025-08-14 13:37:01.595] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 13:37:01.607] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 13:37:01.622] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 13:37:01.653] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 13:37:01.665] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 13:37:07.528] [undefined] POST(/): try to post comment +[2025-08-14 13:37:07.538] [undefined] POST(/): successfully post comment with status 200 +[2025-08-14 13:40:41.292] [undefined] GET(/:id): try to get video 3 +[2025-08-14 13:40:41.302] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 13:40:41.315] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 13:40:41.329] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 13:40:41.358] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 13:40:41.367] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 13:40:46.013] [undefined] PUT(/:id): try to update comment 9 +[2025-08-14 13:40:46.023] [undefined] PUT(/:id): successfully update comment with status 200 +[2025-08-14 13:40:47.327] [undefined] GET(/:id): try to get video 3 +[2025-08-14 13:40:47.337] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 13:40:47.354] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 13:40:47.372] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 13:40:47.391] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 13:40:47.399] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 13:42:08.300] [undefined] GET(/:id): try to get video 3 +[2025-08-14 13:42:08.311] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 13:42:08.328] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 13:42:08.341] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 13:42:08.391] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 13:42:08.401] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 13:42:19.528] [undefined] GET(/:id): try to get video 3 +[2025-08-14 13:42:19.539] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 13:42:19.562] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 13:42:19.575] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 13:42:19.607] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 13:42:19.617] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 13:42:21.343] [undefined] DELETE(/:id): try to delete comment 9 +[2025-08-14 13:42:21.351] [undefined] DELETE(/:id): successfully deleted comment with status 200 +[2025-08-14 13:42:28.765] [undefined] GET(/:id): try to get video 3 +[2025-08-14 13:42:28.775] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 13:42:28.790] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 13:42:28.804] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 13:42:28.872] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 13:42:28.882] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 13:42:42.291] [undefined] GET(/:id): try to get video 3 +[2025-08-14 13:42:42.302] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 13:42:42.319] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 13:42:42.335] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 13:42:42.363] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 13:42:42.371] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 13:42:43.983] [undefined] POST(/): try to post comment +[2025-08-14 13:42:43.991] [undefined] POST(/): successfully post comment with status 200 +[2025-08-14 13:42:45.756] [undefined] DELETE(/:id): try to delete comment 10 +[2025-08-14 13:42:45.765] [undefined] DELETE(/:id): successfully deleted comment with status 200 +[2025-08-14 13:42:45.776] [undefined] GET(/:id): try to get video 3 +[2025-08-14 13:42:45.786] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 13:42:45.798] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 13:42:45.808] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 13:42:45.822] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 13:42:45.830] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 20:15:10.659] [undefined] GET(/:id): try to get video 3 +[2025-08-14 20:15:10.669] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 20:15:10.682] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 20:15:10.697] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 20:15:10.720] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 20:15:10.731] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 20:15:13.199] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-08-14 20:15:13.203] [undefined] GET(/:id/channel): successfully retrieved channel of user 5 with status 200 +[2025-08-14 20:15:13.207] [undefined] GET(/:id/history): try to retrieve history of user 5 +[2025-08-14 20:15:13.210] [undefined] GET(/:id/history): successfully retrieved history of user 5 with status 200 +[2025-08-14 20:15:13.218] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-08-14 20:15:14.337] [undefined] GET(/:id): try to get channel with id 4 +[2025-08-14 20:15:14.346] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 20:15:14.350] [undefined] GET(/:id): Successfully get channel with id 4 with status 200 +[2025-08-14 20:15:14.357] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 20:15:19.739] [undefined] GET(/:id): try to get channel with id 4 +[2025-08-14 20:15:19.749] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 20:15:19.752] [undefined] GET(/:id): Successfully get channel with id 4 with status 200 +[2025-08-14 20:15:19.759] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 20:15:21.113] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-08-14 20:15:21.116] [undefined] GET(/:id/channel): successfully retrieved channel of user 5 with status 200 +[2025-08-14 20:15:22.600] [undefined] PUT(/:id): try to update channel with id 4 +[2025-08-14 20:15:22.605] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 20:15:26.948] [undefined] GET(/:id): try to get video 1 +[2025-08-14 20:15:26.959] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-14 20:15:26.970] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-14 20:15:26.984] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-14 20:15:27.021] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-14 20:15:27.031] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-14 20:16:02.804] [undefined] GET(/:id): try to get video 3 +[2025-08-14 20:16:02.814] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-14 20:16:02.840] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-14 20:16:02.857] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-14 20:16:02.890] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-14 20:16:02.897] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-14 20:16:04.968] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-08-14 20:16:04.971] [undefined] GET(/:id/channel): successfully retrieved channel of user 5 with status 200 +[2025-08-14 20:16:04.974] [undefined] GET(/:id/history): try to retrieve history of user 5 +[2025-08-14 20:16:04.978] [undefined] GET(/:id/history): successfully retrieved history of user 5 with status 200 +[2025-08-14 20:16:04.984] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-08-14 20:16:05.581] [undefined] GET(/:id): try to get channel with id 4 +[2025-08-14 20:16:05.590] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 20:16:05.593] [undefined] GET(/:id): Successfully get channel with id 4 with status 200 +[2025-08-14 20:16:05.601] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 20:16:09.229] [undefined] PUT(/:id): try to update channel with id 4 +[2025-08-14 20:16:09.234] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-14 20:19:48.593] [undefined] POST(/login): try to login with username 'sacha2' +[2025-08-14 20:19:48.645] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 20:19:50.397] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 20:19:50.401] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 20:19:50.404] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 20:19:50.409] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 20:19:50.416] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 20:19:52.573] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 20:19:52.582] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 20:19:52.586] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 20:19:52.596] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 20:19:57.515] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 20:19:57.518] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 20:19:59.762] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 20:19:59.773] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 20:19:59.777] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 20:19:59.785] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 20:20:00.371] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 20:20:00.375] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 20:20:00.377] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 20:20:00.382] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 20:20:00.389] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 20:23:01.532] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 20:23:01.536] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 20:23:01.538] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 20:23:01.544] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 20:23:01.551] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 20:31:39.192] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 20:31:39.195] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 20:31:39.198] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 20:31:39.204] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 20:31:39.211] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 20:31:53.915] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 20:31:53.918] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 20:31:53.942] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 20:31:53.947] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 20:31:53.956] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 20:31:56.423] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 20:31:56.426] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 20:31:56.428] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 20:31:56.434] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 20:31:56.442] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 20:32:02.387] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 20:32:02.390] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 20:32:02.393] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 20:32:02.399] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 20:32:02.406] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 20:32:11.988] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 20:32:11.992] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 20:32:11.994] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 20:32:11.999] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 20:32:12.007] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 20:32:12.840] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-14 20:32:12.850] [undefined] GET(/:id/stats): try to get stats +[2025-08-14 20:32:12.854] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-14 20:32:12.862] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-14 20:32:13.944] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-14 20:32:13.947] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-14 20:32:13.950] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-14 20:32:13.953] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-14 20:32:13.961] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-14 20:32:50.173] [undefined] POST(/): try to register a user with username: test4 and email: test4@gmail.com +[2025-08-14 20:32:50.223] [undefined] POST(/): successfully registered with status 200 +[2025-08-14 20:32:50.230] [undefined] POST(/login): try to login with username 'test4' +[2025-08-14 20:32:50.281] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-14 20:32:51.673] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-14 20:32:51.677] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-14 20:32:51.679] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-14 20:32:51.682] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-14 20:32:51.691] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-14 20:33:07.906] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-14 20:33:07.909] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-14 20:33:07.911] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-14 20:33:07.914] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-14 20:33:07.924] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-14 20:33:16.345] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-14 20:33:16.348] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-14 20:33:16.351] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-14 20:33:16.354] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-14 20:33:16.363] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-14 20:34:21.620] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-14 20:34:21.624] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-14 20:34:21.627] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-14 20:34:21.631] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-14 20:34:21.639] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-14 20:34:36.364] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-14 20:34:36.367] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-14 20:34:36.369] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-14 20:34:36.372] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-14 20:34:36.381] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-14 20:34:55.418] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-14 20:34:55.422] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-14 20:34:55.425] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-14 20:34:55.428] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-14 20:34:55.436] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-14 20:35:04.997] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-14 20:35:05.000] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-14 20:35:05.004] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-14 20:35:05.008] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-14 20:35:05.015] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-14 20:36:01.767] [undefined] PUT(/:id): try to update user 6 +[2025-08-14 20:36:01.772] [undefined] PUT(/:id): successfully updated user 6 with status 200 +[2025-08-14 20:36:03.230] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-14 20:36:03.233] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-14 20:36:03.236] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-14 20:36:03.239] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-14 20:36:03.248] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-14 20:41:31.791] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-14 20:41:31.794] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-14 20:41:31.797] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-14 20:41:31.800] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-14 20:41:31.808] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-14 20:41:50.529] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-14 20:41:50.532] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-14 20:41:50.535] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-14 20:41:50.539] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-14 20:41:50.550] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-14 20:41:53.692] [undefined] POST(/): Playlist created with id 7 with status 200 +[2025-08-15 07:15:46.354] [undefined] POST(/login): try to login with username 'sacha2' +[2025-08-15 07:15:46.413] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-15 07:16:04.703] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 07:16:04.706] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 07:16:04.709] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 07:16:04.714] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 07:16:04.722] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:16:25.767] [undefined] POST(/): Playlist created with id 8 with status 200 +[2025-08-15 07:16:26.987] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 07:16:26.989] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 07:16:26.991] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 07:16:26.995] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 07:16:27.006] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:17:15.294] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 07:17:15.298] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 07:17:15.322] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 07:17:15.327] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 07:17:15.333] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:17:22.303] [undefined] POST(/): Playlist created with id 9 with status 200 +[2025-08-15 07:17:22.321] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:17:41.905] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 07:17:41.908] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 07:17:41.916] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 07:17:41.921] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 07:17:41.927] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:17:43.230] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 07:17:43.233] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 07:17:43.258] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 07:17:43.261] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 07:17:43.269] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:17:44.606] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 07:17:44.609] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 07:17:44.612] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 07:17:44.616] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 07:17:44.623] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:17:45.539] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 07:17:45.543] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 07:17:45.545] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 07:17:45.549] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 07:17:45.556] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:18:53.759] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:18:53.769] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:18:53.782] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:18:53.794] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:18:53.821] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:18:53.832] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:19:35.214] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:19:35.225] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:19:35.238] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:19:35.251] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:19:35.273] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:19:35.284] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:19:46.027] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:19:46.037] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:19:46.050] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:19:46.068] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:19:46.093] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:19:46.101] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:21:30.310] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:21:30.320] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:21:30.333] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:21:30.348] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:21:30.386] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:21:30.395] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:21:32.380] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:21:32.390] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:21:32.403] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:21:32.418] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:21:32.441] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:21:32.449] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:21:43.838] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:21:43.848] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:21:43.860] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:21:43.876] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:21:43.916] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:21:43.925] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:22:08.679] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:22:08.689] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:22:08.701] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:22:08.716] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:22:08.747] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:22:08.757] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:22:21.736] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:22:21.747] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:22:21.762] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:22:21.777] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:22:21.802] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:22:21.811] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:22:43.624] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:22:43.634] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:22:43.647] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:22:43.662] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:22:43.692] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:22:43.703] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:23:56.553] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:23:56.564] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:23:56.577] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:23:56.591] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:23:56.613] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:23:56.622] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:26:28.747] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:26:28.757] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:26:28.770] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:26:28.798] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:26:28.834] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:26:28.843] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:26:36.036] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:26:36.047] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:26:36.063] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:26:36.075] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:26:36.122] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:26:36.132] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:27:02.346] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:27:02.357] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:27:02.360] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:27:02.374] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:27:02.385] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:27:02.417] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:27:02.428] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:28:53.335] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:28:53.346] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:28:53.351] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:28:53.366] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:28:53.382] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:28:53.407] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:28:53.415] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:29:06.301] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:29:06.311] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:29:06.315] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:29:06.327] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:29:06.341] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:29:06.370] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:29:06.380] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:29:14.077] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:29:14.088] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:29:14.092] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:29:14.109] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:29:14.124] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:29:14.156] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:29:14.165] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:29:23.599] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:29:23.610] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:29:23.614] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:29:23.630] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:29:23.643] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:29:23.669] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:29:23.677] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:29:34.032] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:29:34.042] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:29:34.047] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:29:34.061] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:29:34.075] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:29:34.117] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:29:34.127] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:29:46.216] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:29:46.227] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:29:46.232] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:29:46.251] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:29:46.265] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:29:46.287] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:29:46.297] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:30:08.411] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:30:08.421] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:30:08.425] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:30:08.438] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:30:08.451] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:30:08.495] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:30:08.504] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:30:17.869] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:30:17.880] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:30:17.899] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:30:17.911] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:30:17.926] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:30:17.956] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:30:17.966] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:30:49.412] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:30:49.422] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:30:49.427] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:30:49.438] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:30:49.453] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:30:49.477] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:30:49.493] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:31:32.628] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:31:32.640] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:31:32.645] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:31:32.659] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:31:32.674] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:31:32.704] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:31:32.713] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:32:10.030] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:32:10.041] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:32:10.045] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:32:10.057] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:32:10.070] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:32:10.105] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:32:10.115] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:32:30.091] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:32:30.102] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:32:30.927] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:32:39.410] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:32:39.424] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:32:39.432] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:32:39.447] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:32:39.465] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:32:39.492] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:32:39.502] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:33:07.385] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:33:07.396] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:33:07.401] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:33:07.417] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:33:07.431] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:33:07.470] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:33:07.480] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:33:20.298] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:33:20.309] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:33:20.315] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:33:20.332] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:33:20.350] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:33:20.373] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:33:20.383] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:33:27.995] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:33:28.007] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:33:28.012] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:33:28.026] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:33:28.042] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:33:28.076] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:33:28.086] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:33:33.605] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:33:33.615] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:33:33.620] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:33:33.631] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:33:33.646] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:33:33.677] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:33:33.689] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:33:47.482] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:33:47.493] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:33:47.497] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:33:47.511] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:33:47.527] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:33:47.551] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:33:47.559] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:33:53.695] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:33:53.707] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:33:53.724] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:33:53.737] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:33:53.751] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:33:53.780] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:33:53.791] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:33:57.653] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:33:57.665] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:33:57.670] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:33:57.683] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:33:57.700] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:33:57.725] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:33:57.733] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:34:08.528] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:34:08.538] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:34:08.543] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:34:08.556] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:34:08.569] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:34:08.616] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:34:08.625] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:35:58.474] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:35:58.485] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:35:58.490] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:35:58.504] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:35:58.522] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:35:58.544] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:35:58.553] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:36:12.736] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:36:12.747] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:36:12.752] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:36:12.764] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:36:12.778] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:36:12.799] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:36:12.809] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:36:23.117] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:36:23.128] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:36:23.133] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:36:23.145] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:36:23.160] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:36:23.192] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:36:23.202] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:36:35.456] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:36:35.467] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:36:35.472] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:36:35.486] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:36:35.501] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:36:35.545] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:36:35.554] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:38:52.975] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:38:52.987] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:38:52.993] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:38:53.007] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:38:53.022] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:38:53.053] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:38:53.066] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:39:16.059] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:39:16.071] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:39:16.077] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:39:16.091] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:39:16.105] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:39:16.149] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:39:16.160] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:39:34.058] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:39:34.069] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:39:34.073] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:39:34.088] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:39:34.105] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:39:34.130] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:39:34.141] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:40:05.198] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:40:05.209] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:40:05.213] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:40:05.227] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:40:05.244] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:40:05.279] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:40:05.289] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:40:22.330] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:40:22.342] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:40:22.347] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:40:22.361] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:40:22.376] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:40:22.400] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:40:22.409] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:43:58.684] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:43:58.695] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:43:58.699] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:43:58.713] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:43:58.728] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:43:58.771] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:43:58.781] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:44:11.725] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:44:11.737] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:44:11.742] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:44:11.762] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:44:11.775] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:44:11.810] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:44:11.819] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:44:33.503] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:44:33.515] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:44:33.520] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:44:33.542] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:44:33.557] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:44:33.628] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:44:33.640] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:45:01.108] [undefined] GET(/:id): try to get video 3 +[2025-08-15 07:45:01.118] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:45:01.123] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-15 07:45:01.140] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-15 07:45:01.153] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-15 07:45:01.185] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-15 07:45:01.194] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-15 07:45:03.398] [undefined] POST(/:id): Video added to playlist with id 2 with status 200 +[2025-08-15 07:45:12.544] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 07:45:12.548] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 07:45:12.551] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 07:45:12.554] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 07:45:12.561] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:45:18.685] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 07:45:18.688] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 07:45:18.691] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 07:45:18.695] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 07:45:18.703] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:46:57.187] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 07:46:57.191] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 07:46:57.195] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 07:46:57.201] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 07:46:57.207] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:53:09.712] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 07:57:29.629] [undefined] GET(/:id): try to get video 10 +[2025-08-15 07:57:29.640] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 07:57:29.645] [undefined] GET(/:id): successfully get video 10 with status 200 +[2025-08-15 07:57:29.661] [undefined] GET(/:id/similar): try to get similar videos for video 10 +[2025-08-15 07:57:29.673] [undefined] GET(/:id/similar): successfully get similar videos for video 10 with status 200 +[2025-08-15 07:57:29.702] [undefined] GET(/:id/views): try to add views for video 10 +[2025-08-15 07:57:29.714] [undefined] GET(/:id/views): successfully added views for video 10 with status 200 +[2025-08-15 07:57:31.756] [undefined] POST(/:id): Video added to playlist with id 2 with status 200 +[2025-08-15 08:01:04.884] [undefined] GET(/:id): try to get video 10 +[2025-08-15 08:01:04.895] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 08:01:04.902] [undefined] GET(/:id): successfully get video 10 with status 200 +[2025-08-15 08:01:04.924] [undefined] GET(/:id/similar): try to get similar videos for video 10 +[2025-08-15 08:01:04.942] [undefined] GET(/:id/similar): successfully get similar videos for video 10 with status 200 +[2025-08-15 08:01:04.989] [undefined] GET(/:id/views): try to add views for video 10 +[2025-08-15 08:01:04.998] [undefined] GET(/:id/views): successfully added views for video 10 with status 200 +[2025-08-15 08:01:08.034] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 08:01:08.037] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 08:01:08.041] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 08:01:08.046] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 08:01:08.053] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 08:01:09.580] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 08:09:51.858] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 08:10:08.586] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 08:10:21.732] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 08:10:21.736] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 08:10:21.739] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 08:10:21.746] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 08:10:21.753] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 08:11:01.489] [undefined] GET(/:id): Error retrieving playlist: missing FROM-clause entry for table "channel" with status 500 +[2025-08-15 08:11:36.075] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:34:51.115] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:34:51.118] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:34:51.126] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:34:51.132] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:34:51.141] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:34:52.476] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:36:02.596] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:36:12.642] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:36:12.646] [undefined] GET(/:id): try to get video 7 +[2025-08-15 11:36:12.657] [undefined] GET(/:id): successfully get video 7 with status 200 +[2025-08-15 11:36:12.669] [undefined] GET(/:id/similar): try to get similar videos for video 7 +[2025-08-15 11:36:12.685] [undefined] GET(/:id/similar): successfully get similar videos for video 7 with status 200 +[2025-08-15 11:36:12.709] [undefined] GET(/:id/views): try to add views for video 7 +[2025-08-15 11:36:12.721] [undefined] GET(/:id/views): successfully added views for video 7 with status 200 +[2025-08-15 11:36:15.330] [undefined] POST(/:id): Video added to playlist with id 9 with status 200 +[2025-08-15 11:36:16.992] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:36:16.996] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:36:16.999] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:36:17.004] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:36:17.010] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:36:19.673] [undefined] GET(/:id): Playlist retrieved with id 9 with status 200 +[2025-08-15 11:36:21.015] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:36:21.017] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:36:21.020] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:36:21.024] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:36:21.031] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:37:36.685] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:37:36.688] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:37:36.691] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:37:36.697] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:37:36.704] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:37:37.540] [undefined] GET(/:id): Playlist retrieved with id 9 with status 200 +[2025-08-15 11:37:46.171] [undefined] GET(/:id): try to get video 7 +[2025-08-15 11:37:46.181] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:37:46.186] [undefined] GET(/:id): successfully get video 7 with status 200 +[2025-08-15 11:37:46.197] [undefined] GET(/:id/similar): try to get similar videos for video 7 +[2025-08-15 11:37:46.211] [undefined] GET(/:id/similar): successfully get similar videos for video 7 with status 200 +[2025-08-15 11:37:46.241] [undefined] GET(/:id/views): try to add views for video 7 +[2025-08-15 11:37:46.251] [undefined] GET(/:id/views): successfully added views for video 7 with status 200 +[2025-08-15 11:37:46.753] [undefined] GET(/:id): Playlist retrieved with id 9 with status 200 +[2025-08-15 11:37:48.179] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:37:48.182] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:37:48.184] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:37:48.189] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:37:48.197] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:38:45.205] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:38:45.208] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:38:45.217] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:38:45.221] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:38:45.228] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:39:25.429] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:39:25.432] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:39:25.436] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:39:25.441] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:39:25.447] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:39:33.775] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:39:33.780] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:39:33.783] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:39:33.788] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:39:33.796] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:39:42.483] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:39:42.487] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:39:42.492] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:39:42.499] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:39:42.506] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:39:54.583] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:39:54.587] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:39:54.590] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:39:54.597] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:39:54.604] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:40:01.578] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:40:02.989] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:40:02.992] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:40:02.996] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:40:03.001] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:40:03.006] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:40:03.583] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:40:04.040] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:40:04.044] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:40:04.047] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:40:04.050] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:40:04.058] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:40:04.695] [undefined] GET(/:id): Playlist retrieved with id 9 with status 200 +[2025-08-15 11:40:05.139] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:40:05.142] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:40:05.145] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:40:05.149] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:40:05.156] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:40:05.674] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:40:06.063] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:40:06.067] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:40:06.070] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:40:06.074] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:40:06.082] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:40:06.616] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:40:32.573] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:40:33.203] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:40:33.945] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:40:45.160] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:40:45.922] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:40:51.863] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:41:01.257] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:41:01.260] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:41:01.264] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:41:01.269] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:41:01.277] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:42:23.314] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:42:23.319] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:42:23.344] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:42:23.351] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:42:23.358] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:42:24.351] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:42:27.415] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:42:27.419] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:42:27.427] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:42:27.432] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:42:27.439] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:42:28.016] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:42:28.584] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:42:28.587] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:42:28.591] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:42:28.595] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:42:28.600] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:42:29.091] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:42:30.125] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:42:30.129] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:42:30.131] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:42:30.136] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:42:30.144] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:42:55.444] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:42:55.447] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:42:55.450] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:42:55.454] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:42:55.462] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:42:55.946] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:43:04.667] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:43:25.896] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:44:01.336] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:44:08.744] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:44:40.681] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:44:51.683] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:45:09.918] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:45:17.445] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:45:23.115] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:46:00.470] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:46:03.102] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:46:03.105] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:46:03.107] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:46:03.113] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:46:03.121] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:46:06.450] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:46:07.270] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:51:55.980] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:52:34.410] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:52:49.764] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:52:59.942] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:53:14.793] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:53:23.643] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:53:42.731] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:54:00.339] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:54:35.499] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:54:53.925] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:55:09.339] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:55:22.887] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 11:56:17.396] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:56:17.401] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:56:17.407] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:56:17.411] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:56:17.418] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:56:18.071] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:56:43.895] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:57:03.654] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-15 11:57:05.682] [undefined] DELETE(/:id): Playlist deleted with status 200 +[2025-08-15 11:57:07.595] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:57:07.598] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:57:07.601] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:57:07.606] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:57:07.614] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:57:27.626] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:57:27.630] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:57:27.634] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:57:27.641] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:57:27.650] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:57:31.598] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:57:31.602] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:57:31.605] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:57:31.611] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:57:31.616] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:57:45.169] [undefined] GET(/:id): Playlist retrieved with id 9 with status 200 +[2025-08-15 11:57:49.098] [undefined] DELETE(/:id): Error deleting playlist: update or delete on table "playlists" violates foreign key constraint "playlist_elements_playlist_fkey" on table "playlist_elements" with status 500 +[2025-08-15 11:57:49.135] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:57:49.139] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:57:49.141] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:57:49.147] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:57:49.156] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:57:50.662] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:57:50.665] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:57:50.668] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:57:50.674] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:57:50.680] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:57:51.421] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:57:51.424] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:57:51.427] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:57:51.431] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:57:51.439] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:57:52.853] [undefined] GET(/:id): Playlist retrieved with id 9 with status 200 +[2025-08-15 11:57:53.587] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:57:53.591] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:57:53.595] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:57:53.599] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:57:53.605] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 11:57:54.570] [undefined] GET(/:id): Playlist retrieved with id 9 with status 200 +[2025-08-15 11:57:59.003] [undefined] DELETE(/:id): Error deleting playlist: update or delete on table "playlists" violates foreign key constraint "playlist_elements_playlist_fkey" on table "playlist_elements" with status 500 +[2025-08-15 11:57:59.062] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-15 11:57:59.065] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-15 11:57:59.069] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-15 11:57:59.074] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-15 11:57:59.082] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-15 12:02:47.596] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-15 12:02:47.647] [undefined] POST(/): successfully registered with status 200 +[2025-08-15 12:02:47.659] [undefined] POST(/login): try to login with username 'astria' +[2025-08-15 12:02:47.710] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-15 12:02:49.622] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-15 12:02:49.625] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-15 12:02:49.630] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-15 12:02:49.634] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-15 12:02:49.642] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:02:56.061] [undefined] POST(/): try to create new channel with owner 1 and name astria +[2025-08-15 12:02:56.063] [undefined] POST(/): Successfully created new channel with name astria with status 200 +[2025-08-15 12:02:56.078] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-15 12:02:56.082] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-15 12:02:57.508] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-15 12:02:57.519] [undefined] GET(/:id/stats): try to get stats +[2025-08-15 12:02:57.522] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-15 12:02:57.531] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-15 12:02:58.751] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-15 12:02:58.754] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-15 12:03:17.807] [undefined] POST(/): try to upload video with status undefined +[2025-08-15 12:03:17.812] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-15 12:03:17.878] [undefined] POST(/thumbnail): try to add thumbnail to video 1 +[2025-08-15 12:03:17.881] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-15 12:03:17.900] [undefined] PUT(/:id/tags): try to add tags to video 1 +[2025-08-15 12:03:17.910] [undefined] PUT(/:id/tags): successfully added tags to video 1 with status 200 +[2025-08-15 12:03:21.191] [undefined] GET(/:id): try to get video 1 +[2025-08-15 12:03:21.201] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:03:21.206] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-15 12:03:21.218] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-15 12:03:21.229] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-15 12:03:21.250] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-15 12:03:21.265] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-15 12:03:25.914] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-15 12:03:25.917] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-15 12:03:25.919] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-15 12:03:25.925] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-15 12:03:25.934] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:03:30.209] [undefined] POST(/): Playlist created with id 2 with status 200 +[2025-08-15 12:03:30.227] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:03:34.208] [undefined] GET(/:id): try to get video 1 +[2025-08-15 12:03:34.219] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:03:34.223] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-15 12:03:34.236] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-15 12:03:34.248] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-15 12:03:34.273] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-15 12:03:34.281] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-15 12:03:36.394] [undefined] POST(/:id): Video added to playlist with id 2 with status 200 +[2025-08-15 12:03:38.143] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-15 12:03:38.145] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-15 12:03:38.148] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-15 12:03:38.151] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-15 12:03:38.161] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:03:38.653] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 +[2025-08-15 12:03:40.880] [undefined] DELETE(/:id): Playlist deleted with status 200 +[2025-08-15 12:03:40.925] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-15 12:03:40.928] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-15 12:03:40.931] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-15 12:03:40.933] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-15 12:03:40.942] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:03:52.229] [undefined] POST(/): Playlist created with id 3 with status 200 +[2025-08-15 12:03:52.247] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:03:53.608] [undefined] GET(/:id): try to get video 1 +[2025-08-15 12:03:53.619] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:03:53.624] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-15 12:03:53.635] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-15 12:03:53.648] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-15 12:03:53.675] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-15 12:03:53.685] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-15 12:03:55.180] [undefined] POST(/:id): Video added to playlist with id 3 with status 200 +[2025-08-15 12:03:56.494] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-15 12:03:56.497] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-15 12:03:56.500] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-15 12:03:56.504] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-15 12:03:56.511] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:03:57.117] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:06:09.157] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:06:13.801] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-15 12:06:13.805] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-15 12:06:13.808] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-15 12:06:13.812] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-15 12:06:13.820] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:06:15.043] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:07:33.375] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:07:46.081] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:07:54.278] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:08:25.981] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:08:48.330] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:09:05.838] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:09:20.029] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:09:31.979] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:10:11.328] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:10:17.318] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:11:07.347] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:11:08.287] [undefined] GET(/:id): try to get video 1 +[2025-08-15 12:11:08.297] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:11:08.302] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-15 12:11:08.314] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-15 12:11:08.327] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-15 12:11:08.348] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-15 12:11:08.359] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-15 12:11:09.147] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:11:43.722] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:12:10.236] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:12:22.230] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:12:36.945] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:12:38.251] [undefined] GET(/:id): try to get video 1 +[2025-08-15 12:12:38.262] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:12:38.266] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-15 12:12:38.278] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-15 12:12:38.291] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-15 12:12:38.315] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-15 12:12:38.327] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-15 12:12:39.300] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:13:16.106] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:13:17.470] [undefined] GET(/:id): try to get video 1 +[2025-08-15 12:13:17.481] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:13:17.487] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-15 12:13:17.499] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-15 12:13:17.513] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-15 12:13:17.565] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-15 12:13:17.574] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-15 12:13:18.292] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:13:19.374] [undefined] GET(/:id): try to get video 1 +[2025-08-15 12:13:19.384] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:13:19.389] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-15 12:13:19.402] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-15 12:13:19.414] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-15 12:13:19.438] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-15 12:13:19.446] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-15 12:13:19.797] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:13:50.493] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:13:52.628] [undefined] GET(/:id): try to get video 1 +[2025-08-15 12:13:52.639] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:13:52.644] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-15 12:13:52.657] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-15 12:13:52.670] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-15 12:13:52.693] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-15 12:13:52.705] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-15 12:13:53.217] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:16:32.830] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:16:33.842] [undefined] GET(/:id): try to get video 1 +[2025-08-15 12:16:33.853] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 12:16:33.859] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-15 12:16:33.871] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-15 12:16:33.884] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-15 12:16:33.909] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-15 12:16:33.917] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-15 12:16:34.233] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:18:40.492] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:18:51.040] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:19:00.143] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:19:03.469] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:19:55.046] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:19:57.124] [undefined] DELETE(/:id/video/:videoId): Video deleted from playlist with id 3 with status 200 +[2025-08-15 12:19:57.149] [undefined] GET(/:id): Playlist retrieved with id 3 with status 200 +[2025-08-15 12:20:03.498] [undefined] DELETE(/:id): Playlist deleted with status 200 +[2025-08-15 12:20:03.611] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-15 12:20:03.614] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-15 12:20:03.617] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-15 12:20:03.621] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-15 12:20:03.630] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 18:12:13.369] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-15 18:12:17.242] [undefined] GET(/:id): try to get video 1 +[2025-08-15 18:12:17.253] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 18:12:17.258] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-15 18:12:17.269] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-15 18:12:17.284] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-15 18:12:17.306] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-15 18:12:17.317] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-15 18:12:18.568] [undefined] POST(/:id): Video added to playlist with id 1 with status 200 +[2025-08-15 18:12:21.672] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-15 18:12:21.676] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-15 18:12:21.678] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-15 18:12:21.682] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-15 18:12:21.691] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 18:12:22.806] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-15 18:12:23.969] [undefined] GET(/:id): try to get video 1 +[2025-08-15 18:12:23.980] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-15 18:12:23.985] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-15 18:12:23.997] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-15 18:12:24.010] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-15 18:12:24.033] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-15 18:12:24.042] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:40:29.247] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-16 07:40:29.250] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-16 07:40:29.253] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-16 07:40:29.257] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-16 07:40:29.270] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:40:30.139] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:40:33.468] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:40:33.478] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:40:33.485] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:40:33.496] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:40:33.507] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:40:33.524] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:40:33.534] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:40:47.086] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-16 07:40:47.090] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-16 07:40:47.095] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-16 07:40:47.100] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-16 07:40:47.109] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:40:48.448] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-16 07:40:48.459] [undefined] GET(/:id/stats): try to get stats +[2025-08-16 07:40:48.463] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-16 07:40:48.471] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-16 07:40:49.626] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:40:49.629] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-16 07:40:49.640] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-16 07:40:49.645] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:40:54.460] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-16 07:40:54.470] [undefined] GET(/:id/stats): try to get stats +[2025-08-16 07:40:54.474] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-16 07:40:54.482] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-16 07:40:58.675] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-16 07:40:58.679] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-16 07:41:20.113] [undefined] POST(/): try to upload video with status undefined +[2025-08-16 07:41:20.120] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-16 07:41:20.184] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-16 07:41:20.188] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-16 07:41:20.213] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-16 07:41:20.222] [undefined] PUT(/:id/tags): Tag video already exists for video 2 with status 200 +[2025-08-16 07:41:20.227] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-16 07:41:24.595] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:41:24.606] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:41:24.611] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:41:24.624] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:41:24.636] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:41:24.663] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:41:24.672] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:43:21.171] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:43:21.180] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:43:21.185] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:43:22.503] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:43:22.514] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:43:22.856] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:43:22.867] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:43:47.345] [undefined] GET(/:id): try to get video 2 +[2025-08-16 07:43:47.357] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:43:47.361] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 07:43:47.423] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 07:43:47.435] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 07:43:47.496] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 07:43:47.507] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 07:43:52.404] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-16 07:43:52.407] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-16 07:43:52.411] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-16 07:43:52.416] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-16 07:43:52.424] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:43:53.196] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:43:54.347] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:43:54.358] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:43:54.364] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:43:54.377] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:43:54.390] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:43:54.421] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:43:54.429] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:44:30.592] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:44:30.603] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:44:30.606] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:44:30.646] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:44:30.659] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:44:30.704] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:44:30.713] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:46:22.913] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:46:22.925] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:46:22.930] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:46:22.963] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:46:22.976] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:46:23.027] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:46:23.037] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:47:17.266] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:47:17.277] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:47:17.281] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:47:17.298] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:47:17.312] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:47:17.334] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:47:17.343] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:47:22.197] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:47:22.208] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:47:22.214] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:47:22.228] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:47:22.242] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:47:22.264] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:47:22.271] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:47:24.059] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:47:24.070] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:47:24.074] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:47:24.090] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:47:24.104] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:47:24.124] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:47:24.133] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:47:52.488] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:47:52.500] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:47:52.505] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:47:52.519] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:47:52.531] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:47:52.558] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:47:52.570] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:48:11.211] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:48:11.222] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:48:11.227] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:48:11.241] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:48:11.254] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:48:11.279] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:48:11.288] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:49:14.026] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:49:14.039] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:49:14.044] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:49:14.059] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:49:14.074] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:49:14.105] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:49:14.113] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:49:21.355] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:49:21.368] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:49:21.372] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:49:21.388] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:49:21.401] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:49:21.424] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:49:21.433] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:49:49.303] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:49:49.315] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:49:49.318] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:49:49.331] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:49:49.344] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:49:49.369] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:49:49.379] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:51:23.803] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:51:23.814] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:51:23.818] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:51:23.828] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:51:23.839] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:51:23.853] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:51:23.881] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:51:23.889] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:52:02.095] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:52:02.109] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:52:02.114] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:52:02.123] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:52:02.132] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:52:02.143] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:52:02.194] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:54:38.628] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:54:38.642] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:54:38.647] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:54:38.657] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:54:38.671] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:54:38.683] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:54:38.743] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:54:38.757] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:55:08.863] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:55:08.879] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:55:08.883] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:55:08.891] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:55:08.914] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:55:08.927] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:55:08.957] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:55:08.966] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:55:35.764] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:55:35.777] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:55:35.783] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:55:35.793] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:55:35.810] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:55:35.822] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:55:35.876] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:55:35.885] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:55:49.814] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:55:49.828] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:55:49.834] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:55:49.841] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:55:49.861] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:55:49.876] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:55:49.921] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:55:49.931] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:57:02.764] [undefined] GET(/:id): try to get video 2 +[2025-08-16 07:57:02.775] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:57:02.779] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 07:57:02.792] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 07:57:02.805] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 07:57:02.832] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 07:57:02.841] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 07:57:04.973] [undefined] POST(/:id): Video added to playlist with id 1 with status 200 +[2025-08-16 07:57:08.427] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-16 07:57:08.432] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-16 07:57:08.435] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-16 07:57:08.440] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-16 07:57:08.450] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:57:10.201] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:57:11.517] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:57:11.525] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:57:11.533] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:57:11.542] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:57:11.551] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:57:11.563] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:57:11.585] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:57:11.595] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:58:14.258] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:58:14.269] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:58:14.275] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:58:14.284] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:58:14.288] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:58:14.301] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:58:14.320] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:58:14.329] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:58:32.008] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:58:32.022] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:58:32.026] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:58:32.033] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:58:32.044] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:58:32.058] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:58:32.091] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:58:32.099] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:58:39.414] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:58:39.429] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:58:39.434] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:58:39.441] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:58:39.451] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:58:39.465] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:58:39.488] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:58:39.497] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:58:50.565] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:58:50.576] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:58:50.582] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:58:50.592] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:58:50.597] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:58:50.609] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:58:50.640] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:58:50.648] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:58:58.868] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:58:58.881] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:58:58.884] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:58:58.896] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:58:58.899] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:58:58.913] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:58:58.939] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:58:58.949] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:59:05.950] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:59:05.965] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:59:05.969] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:59:05.976] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:59:05.985] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:59:06.001] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:59:06.021] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:59:06.029] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:59:16.318] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:59:16.333] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:59:16.339] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:59:16.346] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:59:16.358] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:59:16.372] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:59:16.411] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:59:16.420] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:59:24.935] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:59:24.951] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:59:24.956] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:59:24.963] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:59:24.977] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:59:24.991] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:59:25.008] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:59:25.016] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 07:59:32.661] [undefined] GET(/:id): try to get video 1 +[2025-08-16 07:59:32.676] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 07:59:32.681] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 07:59:32.689] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 07:59:32.698] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 07:59:32.719] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 07:59:32.747] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 07:59:32.757] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:00:06.773] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:00:13.132] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:00:13.146] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:00:13.150] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:00:13.165] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:00:13.169] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:00:13.184] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:00:13.205] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:00:13.214] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:00:23.385] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:00:23.396] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:00:23.403] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:00:23.416] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:00:23.420] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:00:23.434] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:00:23.461] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:00:23.470] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:00:34.140] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:00:34.156] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:00:34.161] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:00:34.167] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:00:34.179] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:00:34.194] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:00:34.216] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:00:34.225] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:00:50.188] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:00:50.202] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:00:50.206] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:00:50.215] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:00:50.227] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:00:50.244] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:00:50.272] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:00:50.281] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:01:44.683] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:01:44.696] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:01:44.699] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:01:44.708] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:01:44.720] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:01:44.734] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:01:44.758] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:01:44.767] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:01:47.667] [undefined] GET(/:id): try to get video 2 +[2025-08-16 08:01:47.682] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:01:47.687] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 08:01:47.695] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:01:47.703] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 08:01:47.713] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 08:01:47.728] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 08:01:47.738] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 08:01:48.827] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:01:48.862] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:01:48.868] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:01:48.875] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:01:48.881] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:01:48.893] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:01:48.906] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:01:48.914] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:01:49.238] [undefined] GET(/:id): try to get video 2 +[2025-08-16 08:01:49.253] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:01:49.257] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 08:01:49.263] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:01:49.270] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 08:01:49.279] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 08:01:49.294] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 08:01:49.302] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 08:01:49.597] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:01:49.612] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:01:49.617] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:01:49.623] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:01:49.631] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:01:49.642] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:01:49.656] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:01:49.664] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:02:41.666] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:02:41.679] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:02:41.684] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:02:41.692] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:02:41.702] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:02:41.715] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:02:41.745] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:02:41.753] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:02:52.418] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:02:52.433] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:02:52.439] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:02:52.446] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:02:52.458] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:02:52.474] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:02:52.495] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:02:52.503] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:02:59.962] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:02:59.975] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:02:59.980] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:02:59.989] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:02:59.997] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:03:00.011] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:03:00.046] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:03:00.055] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:03:16.204] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-16 08:03:16.215] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-16 08:05:32.953] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:05:32.965] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:05:32.971] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:05:32.982] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:05:32.988] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:05:33.003] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:05:33.021] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:05:33.030] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:06:16.148] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:06:16.159] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:06:16.166] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:06:16.174] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:06:16.178] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:06:16.190] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:06:16.217] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:06:16.227] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:06:28.982] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:06:28.993] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:06:29.000] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:06:29.013] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:06:29.017] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:06:29.031] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:06:29.049] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:06:29.058] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:06:32.423] [undefined] GET(/:id): try to get video 2 +[2025-08-16 08:06:32.437] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:06:32.442] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 08:06:32.449] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:06:32.455] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 08:06:32.464] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 08:06:32.478] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 08:06:32.487] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 08:06:33.211] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:06:45.853] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:06:45.869] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:06:45.875] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:06:45.882] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:06:45.897] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:06:45.911] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:06:45.933] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:06:45.947] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:06:47.110] [undefined] GET(/:id): try to get video 2 +[2025-08-16 08:06:47.119] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:06:47.127] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 08:06:47.135] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:06:47.143] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 08:06:47.152] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 08:06:47.166] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 08:06:47.173] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 08:06:47.603] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:06:47.614] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:06:47.621] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:06:47.627] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:06:47.635] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:06:47.645] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:06:47.659] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:06:47.667] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:07:19.486] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:07:19.501] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:07:19.505] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:07:19.512] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:07:19.539] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:07:19.555] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:07:19.606] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:07:19.616] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:07:56.143] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:07:56.153] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:07:56.161] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:07:56.170] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:07:56.175] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:07:56.187] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:07:56.271] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:07:56.279] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:08:19.655] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:08:19.672] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:08:19.677] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:08:19.685] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:08:19.697] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:08:19.711] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:08:19.767] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:08:19.778] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:08:40.999] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:08:41.016] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:08:41.022] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:08:41.036] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:08:41.047] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:08:41.062] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:08:41.126] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:08:41.137] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:09:01.536] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:09:01.552] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:09:01.557] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:09:01.565] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:09:01.589] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:09:01.604] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:09:01.655] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:09:01.666] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:09:04.562] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:09:04.578] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:09:04.582] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:09:04.589] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:09:04.599] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:09:04.612] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:09:04.645] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:09:04.653] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:09:19.860] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:09:19.875] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:09:19.880] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:09:19.890] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:09:19.914] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:09:19.929] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:09:19.993] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:09:20.001] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:10:04.584] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:10:04.599] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:10:04.604] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:10:04.612] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:10:04.633] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:10:04.648] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:10:04.681] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:10:04.691] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:10:16.082] [undefined] GET(/:id): try to get video 2 +[2025-08-16 08:10:16.097] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:10:16.101] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 08:10:16.110] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:10:16.115] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 08:10:16.125] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 08:10:16.140] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 08:10:16.148] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 08:10:17.714] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:10:17.729] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:10:17.734] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:10:17.740] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:10:17.747] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:10:17.757] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:10:17.771] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:10:17.781] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:10:29.787] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:10:29.798] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:10:29.804] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:10:29.814] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:10:29.820] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:10:29.834] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:10:29.875] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:10:29.886] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:10:31.874] [undefined] GET(/:id): try to get video 2 +[2025-08-16 08:10:31.884] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:10:31.891] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 08:10:31.899] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:10:31.906] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 08:10:31.916] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 08:10:31.932] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 08:10:31.939] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 08:10:32.618] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:10:32.633] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:10:32.636] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:10:32.644] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:10:32.649] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:10:32.659] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:10:32.672] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:10:32.681] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:11:44.265] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-16 08:11:44.269] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-16 08:11:45.948] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-16 08:11:53.933] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-16 08:11:53.944] [undefined] GET(/:id/stats): try to get stats +[2025-08-16 08:11:53.949] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-16 08:11:53.958] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-16 08:11:58.519] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:11:58.522] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-16 08:11:58.536] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-16 08:11:58.541] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:12:10.925] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-16 08:12:10.935] [undefined] GET(/:id/stats): try to get stats +[2025-08-16 08:12:10.940] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-16 08:12:10.950] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-16 08:12:17.818] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:12:17.829] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:12:17.835] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:12:17.848] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:12:17.863] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:12:17.883] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:12:17.892] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:12:20.826] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-16 08:12:20.829] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-16 08:12:20.834] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-16 08:12:20.839] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-16 08:12:20.846] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:12:21.667] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:12:28.790] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:12:28.798] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:12:28.806] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:12:28.813] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:12:28.820] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:12:28.835] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:12:28.861] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:12:28.870] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 08:12:36.261] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:12:36.971] [undefined] GET(/:id): try to get video 2 +[2025-08-16 08:12:36.982] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 08:12:36.987] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:12:36.998] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:12:37.002] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 08:12:37.016] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 08:12:37.049] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 08:12:37.058] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 08:41:18.105] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-16 08:41:18.109] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-16 08:41:18.113] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-16 08:41:18.118] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-16 08:41:18.126] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:41:21.696] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:41:24.102] [undefined] DELETE(/:id/video/:videoId): Video deleted from playlist with id 1 with status 200 +[2025-08-16 08:41:24.125] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 08:41:34.167] [undefined] GET(/:id): try to get video 1 +[2025-08-16 08:41:34.179] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 08:41:34.185] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 08:41:34.197] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 08:41:34.210] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 08:41:34.231] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 08:41:34.243] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:07:56.380] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-16 10:07:56.384] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-16 10:07:56.392] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-16 10:07:56.398] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-16 10:07:56.406] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:07:57.219] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:08:00.077] [undefined] GET(/:id): try to get video 2 +[2025-08-16 10:08:00.088] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:08:00.092] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 10:08:00.107] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 10:08:00.120] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 10:08:00.152] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 10:08:00.161] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 10:08:02.315] [undefined] POST(/:id): Video added to playlist with id 1 with status 200 +[2025-08-16 10:08:08.051] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-16 10:08:08.055] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-16 10:08:08.059] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-16 10:08:08.064] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-16 10:08:08.072] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:08:08.888] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:08:09.577] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:08:09.590] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:08:09.595] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:08:09.602] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:08:09.612] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:08:09.624] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:08:09.653] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:08:09.661] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:13:50.098] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:13:50.109] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:13:50.115] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:13:50.126] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:13:50.130] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:13:50.144] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:13:50.166] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:13:50.175] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:17:16.300] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:17:16.316] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:17:16.321] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:17:16.327] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:17:16.357] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:17:16.372] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:17:16.428] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:17:16.438] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:18:16.745] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:18:16.757] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:18:16.764] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:18:16.773] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:18:16.777] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:18:16.789] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:18:16.815] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:18:16.823] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:18:44.111] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:18:44.125] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:18:44.131] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:18:44.140] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:18:44.168] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:18:44.184] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:18:44.238] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:18:44.248] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:18:50.434] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:18:50.449] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:18:50.454] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:18:50.461] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:18:50.477] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:18:50.492] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:18:50.519] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:18:50.529] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:20:32.933] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:20:32.948] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:20:32.979] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:20:40.646] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:20:40.663] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:20:40.668] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:20:40.676] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:20:40.687] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:20:40.706] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:20:40.734] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:20:40.743] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:20:50.052] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:20:50.067] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:20:50.073] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:20:50.080] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:20:50.091] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:20:50.106] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:20:50.157] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:20:50.166] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:21:36.064] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:21:36.081] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:21:36.086] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:21:36.095] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:21:36.105] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:21:36.116] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:21:36.154] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:21:36.163] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:21:48.869] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:21:48.887] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:21:48.899] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:21:48.906] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:21:48.924] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:21:48.937] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:21:48.994] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:21:49.002] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:22:22.723] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:22:22.738] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:22:22.745] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:22:22.752] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:22:22.763] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:22:22.775] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:22:22.807] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:22:22.817] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:22:39.024] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:22:39.039] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:22:39.044] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:22:39.052] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:22:39.063] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:22:39.074] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:22:39.107] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:22:39.118] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:22:55.496] [undefined] GET(/:id): try to get video 2 +[2025-08-16 10:22:55.529] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:22:55.539] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 10:22:55.546] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:22:55.555] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 10:22:55.565] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 10:22:55.582] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 10:22:55.590] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 10:23:49.484] [undefined] GET(/:id): try to get video 2 +[2025-08-16 10:23:49.499] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:23:49.503] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 10:23:49.511] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:23:49.526] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 10:23:49.541] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 10:23:49.602] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 10:23:49.611] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 10:25:00.146] [undefined] GET(/:id): try to get video 2 +[2025-08-16 10:25:00.161] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:25:00.164] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 10:25:00.173] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:25:00.182] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 10:25:00.196] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 10:25:00.224] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 10:25:00.232] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 10:25:15.511] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:25:15.523] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:25:15.530] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:25:15.538] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:25:15.547] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:25:15.559] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:25:15.575] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:25:15.583] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:25:32.513] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:25:32.529] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:25:32.534] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:25:32.543] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:25:32.551] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:25:32.563] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:25:32.697] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:25:32.708] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:26:49.745] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:26:49.760] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:26:49.766] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:26:49.774] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:26:49.784] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:26:49.797] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:26:49.827] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:26:49.837] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:26:57.644] [undefined] GET(/:id): try to get video 2 +[2025-08-16 10:26:57.659] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:26:57.666] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 10:26:57.673] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:26:57.692] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 10:26:57.703] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 10:26:57.719] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 10:26:57.727] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 10:27:16.484] [undefined] POST(/): try to post comment +[2025-08-16 10:27:16.497] [undefined] POST(/): successfully post comment with status 200 +[2025-08-16 10:27:19.129] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:27:19.136] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:27:19.144] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:27:19.151] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:27:19.161] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:27:19.171] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:27:19.186] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:27:19.194] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:27:22.188] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:27:22.203] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:27:22.209] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:27:22.218] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:27:22.229] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:27:22.241] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:27:22.277] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:27:22.285] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:28:10.735] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:28:10.749] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:28:10.754] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:28:10.763] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:28:10.774] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:28:10.788] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:28:10.806] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:28:10.815] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:28:39.169] [undefined] GET(/:id): try to get video 2 +[2025-08-16 10:28:39.185] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:28:39.199] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 10:28:39.207] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:28:39.217] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 10:28:39.234] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 10:28:39.271] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 10:28:39.282] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 10:28:43.413] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:28:43.425] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:28:43.431] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:28:43.438] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:28:43.449] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:28:43.461] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:28:43.558] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:28:43.566] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:28:44.891] [undefined] GET(/:id): try to get video 2 +[2025-08-16 10:28:44.904] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:28:44.909] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 10:28:44.920] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:28:44.932] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 10:28:44.945] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 10:28:44.965] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 10:28:44.973] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 10:28:45.681] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:28:45.696] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:28:45.701] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:28:45.710] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:28:45.715] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:28:45.726] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:28:45.754] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:28:45.762] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:28:56.073] [undefined] GET(/:id): try to get video 2 +[2025-08-16 10:28:56.090] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:28:56.095] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 10:28:56.102] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:28:56.112] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 10:28:56.123] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 10:28:56.149] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 10:28:56.156] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 10:29:02.728] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:29:02.758] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:29:02.764] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:29:02.774] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:29:02.780] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:29:02.791] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:29:02.821] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:29:02.828] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:29:12.843] [undefined] GET(/:id): try to get video 2 +[2025-08-16 10:29:12.858] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:29:12.864] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 10:29:12.871] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:29:12.881] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 10:29:12.893] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 10:29:12.915] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 10:29:12.923] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 10:33:13.987] [undefined] GET(/:id): try to get video 1 +[2025-08-16 10:33:14.001] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:33:14.005] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-16 10:33:14.015] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:33:14.022] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-16 10:33:14.037] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-16 10:33:14.057] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-16 10:33:14.069] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-16 10:33:22.654] [undefined] GET(/:id): try to get video 2 +[2025-08-16 10:33:22.668] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-16 10:33:22.674] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-16 10:33:22.681] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-16 10:33:22.689] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-16 10:33:22.703] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-16 10:33:22.718] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-16 10:33:22.727] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-16 16:10:03.689] [undefined] POST(/login): try to login with username 'astria' +[2025-08-16 16:10:03.742] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-17 08:50:14.128] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 08:50:14.181] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 08:50:14.195] [undefined] POST(/login): try to login with username 'astria' +[2025-08-17 08:50:14.248] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-17 08:51:42.597] [undefined] POST(/): try to register a user with username: test1 and email: thelolshow974@gmail.com +[2025-08-17 09:11:03.106] [undefined] POST(/): try to register a user with username: test1 and email: sachaguerin.sg@gmail.com +[2025-08-17 09:11:39.729] [undefined] POST(/): failed because email already exists with status 400 +[2025-08-17 09:11:59.416] [undefined] POST(/): try to register a user with username: test2 and email: thelolshow974@gmail.com +[2025-08-17 09:14:31.308] [undefined] POST(/): try to register a user with username: test2 and email: thelolshow974@gmail.com +[2025-08-17 09:16:05.463] [undefined] POST(/): try to register a user with username: test1 and email: sachaguerin.sg@gmail.com +[2025-08-17 09:16:10.314] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:16:10.328] [undefined] POST(/login): try to login with username 'test1' +[2025-08-17 09:16:10.380] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-17 09:17:17.542] [undefined] POST(/): try to register a user with username: test1 and email: sachaguerin.sg@gmail.com +[2025-08-17 09:17:22.394] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:17:22.406] [undefined] POST(/login): try to login with username 'test1' +[2025-08-17 09:17:22.457] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-17 09:19:43.340] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-17 09:19:43.345] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-17 09:19:43.350] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-17 09:19:43.354] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-17 09:19:43.363] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-17 09:20:05.669] [undefined] POST(/): try to register a user with username: test2 and email: thelolshow974@gmail.com +[2025-08-17 09:20:10.512] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:20:10.525] [undefined] POST(/login): try to login with username 'test2' +[2025-08-17 09:20:10.576] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-17 09:21:15.604] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-17 09:21:15.608] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-17 09:21:15.611] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-08-17 09:21:15.615] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-08-17 09:21:15.627] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-17 09:25:52.056] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-17 09:30:07.808] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:30:13.318] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:30:13.333] [undefined] POST(/login): try to login with username 'astria' +[2025-08-17 09:30:13.342] [undefined] POST(/login): failed to login with status 401 +[2025-08-17 09:31:15.336] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:31:16.156] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:31:16.165] [undefined] POST(/login): try to login with username 'astria' +[2025-08-17 09:31:16.175] [undefined] POST(/login): failed to login with status 401 +[2025-08-17 09:32:08.935] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:32:09.739] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:32:09.746] [undefined] POST(/login): try to login with username 'astria' +[2025-08-17 09:32:09.755] [undefined] POST(/login): failed to login with status 401 +[2025-08-17 09:33:37.507] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:33:38.302] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:35:22.955] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:35:27.758] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:36:56.856] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:36:57.653] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:40:35.290] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:40:40.072] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:43:01.395] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:43:02.183] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:43:14.728] [undefined] POST(/verify-email): try to verify email for sachaguerin.sg@gmail.com +[2025-08-17 09:43:14.737] [undefined] POST(/verify-email): failed to verify email for sachaguerin.sg@gmail.com with status 404 +[2025-08-17 09:43:23.307] [undefined] POST(/verify-email): try to verify email for sachaguerin.sg@gmail.com +[2025-08-17 09:43:23.316] [undefined] POST(/verify-email): failed to verify email for sachaguerin.sg@gmail.com with status 404 +[2025-08-17 09:43:51.630] [undefined] POST(/verify-email): try to verify email for sachaguerin.sg@gmail.com +[2025-08-17 09:43:51.639] [undefined] POST(/verify-email): failed to verify email for sachaguerin.sg@gmail.com with status 404 +[2025-08-17 09:46:34.186] [undefined] POST(/verify-email): try to verify email for sachaguerin.sg@gmail.com with token undefined +[2025-08-17 09:46:34.196] [undefined] POST(/verify-email): failed to verify email for sachaguerin.sg@gmail.com with status 404 +[2025-08-17 09:47:04.196] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:47:09.664] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:48:48.612] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:48:50.099] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:49:00.678] [undefined] POST(/verify-email): try to verify email for sachaguerin.sg@gmail.com with token undefined +[2025-08-17 09:49:00.687] [undefined] POST(/verify-email): failed to verify email for sachaguerin.sg@gmail.com with status 404 +[2025-08-17 09:50:09.224] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:50:10.001] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 09:50:22.079] [undefined] POST(/verify-email): try to verify email for sachaguerin.sg@gmail.com with token undefined +[2025-08-17 09:50:22.089] [undefined] POST(/verify-email): failed to verify email for sachaguerin.sg@gmail.com with status 404 +[2025-08-17 09:59:51.783] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 09:59:56.691] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 10:00:23.412] [undefined] POST(/verify-email): try to verify email for sachaguerin.sg@gmail.com with token 08185 +[2025-08-17 10:00:23.422] [undefined] POST(/verify-email): successfully verified email for sachaguerin.sg@gmail.com with status 200 +[2025-08-17 10:03:07.906] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-17 10:03:12.799] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 10:03:28.573] [undefined] POST(/verify-email): try to verify email for sachaguerin.sg@gmail.com with token da3cb +[2025-08-17 10:03:28.585] [undefined] POST(/verify-email): failed to verify email for sachaguerin.sg@gmail.com with status 500 +[2025-08-17 10:04:05.961] [undefined] POST(/verify-email): try to verify email for sachaguerin.sg@gmail.com with token da3cb +[2025-08-17 10:04:05.972] [undefined] POST(/verify-email): failed to verify email for sachaguerin.sg@gmail.com with status 404 +[2025-08-17 10:05:00.597] [undefined] POST(/): try to register a user with username: test1 and email: thelolshow974@gmail.com +[2025-08-17 10:05:05.427] [undefined] POST(/): successfully registered with status 200 +[2025-08-17 10:05:18.158] [undefined] POST(/verify-email): try to verify email for thelolshow974@gmail.com with token 6e57b +[2025-08-17 10:05:18.170] [undefined] POST(/verify-email): successfully verified email for thelolshow974@gmail.com with status 200 +[2025-08-17 10:06:16.785] [undefined] POST(/login): try to login with username 'test1' +[2025-08-17 10:06:16.839] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-17 10:06:21.123] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-17 10:06:21.127] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-08-17 10:06:21.133] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-17 10:06:21.138] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-08-17 10:06:21.148] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-17 10:24:55.268] [undefined] POST(/): try to create new channel with owner 2 and name astria +[2025-08-17 10:24:55.271] [undefined] POST(/): Successfully created new channel with name astria with status 200 +[2025-08-17 10:24:55.288] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-17 10:24:55.292] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-17 10:24:56.366] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-17 10:24:56.380] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-17 10:24:56.386] [undefined] GET(/:id/stats): try to get stats +[2025-08-17 10:24:56.395] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-17 10:25:00.825] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-17 10:25:00.830] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-17 10:28:34.803] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-17 10:28:34.807] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-17 10:29:51.209] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-17 10:29:51.214] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-17 10:32:59.876] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-17 10:32:59.880] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-17 10:33:09.144] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-17 10:33:09.148] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-17 10:43:59.502] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-17 10:43:59.507] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-17 10:45:08.860] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-17 10:45:08.863] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-17 10:45:12.454] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-17 10:46:31.555] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-17 10:53:32.094] [undefined] POST(/): Invalid token with status 401 +[2025-08-17 10:53:43.691] [undefined] POST(/): Invalid token with status 401 +[2025-08-17 10:54:16.538] [undefined] POST(/): Invalid token with status 401 +[2025-08-17 10:55:19.631] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-17 10:55:19.636] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-17 10:55:19.640] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-17 10:55:19.645] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-08-17 10:55:19.656] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-17 10:55:25.476] [undefined] POST(/): Playlist created with id 3 with status 200 +[2025-08-17 10:55:25.497] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-17 10:55:57.559] [undefined] GET(/:id): Invalid token with status 401 +[2025-08-17 10:59:30.938] [undefined] GET(/:id): Invalid token with status 401 +[2025-08-17 11:04:33.569] [undefined] GET(/:id): Invalid token with status 401 +[2025-08-17 11:07:46.550] [undefined] POST(/): Invalid token with status 401 +[2025-08-18 16:43:00.578] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-18 16:43:05.605] [undefined] POST(/): successfully registered with status 200 +[2025-08-18 16:43:20.564] [undefined] POST(/verify-email): try to verify email for sachaguerin.sg@gmail.com with token 4563d +[2025-08-18 16:43:20.576] [undefined] POST(/verify-email): successfully verified email for sachaguerin.sg@gmail.com with status 200 +[2025-08-18 16:55:58.836] [undefined] POST(/login): try to login with username 'astria' +[2025-08-18 16:55:58.891] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-18 16:56:01.446] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 16:56:01.449] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-18 16:56:01.453] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-18 16:56:01.458] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-18 16:56:01.467] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-18 16:56:13.681] [undefined] POST(/): try to create new channel with owner 1 and name astria +[2025-08-18 16:56:13.684] [undefined] POST(/): Successfully created new channel with name astria with status 200 +[2025-08-18 16:56:13.698] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 16:56:13.701] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 16:56:15.038] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-18 16:56:15.049] [undefined] GET(/:id/stats): try to get stats +[2025-08-18 16:56:15.053] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-18 16:56:15.063] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-18 16:57:54.267] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 16:57:54.270] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 16:58:07.426] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-18 16:58:17.830] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-18 16:59:16.058] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-18 17:02:02.699] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:02:02.704] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:02:14.301] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-18 17:04:10.822] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:04:10.825] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:04:18.423] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-18 17:17:56.386] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:17:56.389] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:17:59.561] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-18 17:19:04.710] [undefined] GET(/search): try to search user by username as +[2025-08-18 17:19:04.715] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-08-18 17:37:33.042] [undefined] GET(/search): try to search user by username as +[2025-08-18 17:37:33.048] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-08-18 17:39:59.796] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:39:59.800] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:40:00.890] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:40:00.893] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:40:01.717] [undefined] GET(/search): try to search user by username as +[2025-08-18 17:40:01.721] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-08-18 17:40:02.564] [undefined] GET(/search): try to search user by username ast +[2025-08-18 17:40:02.567] [undefined] GET(/search): successfully found user with username ast with status 200 +[2025-08-18 17:40:02.713] [undefined] GET(/search): try to search user by username astr +[2025-08-18 17:40:02.717] [undefined] GET(/search): successfully found user with username astr with status 200 +[2025-08-18 17:40:03.133] [undefined] GET(/search): try to search user by username astri +[2025-08-18 17:40:03.137] [undefined] GET(/search): successfully found user with username astri with status 200 +[2025-08-18 17:44:43.499] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:44:43.502] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:44:46.281] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:44:46.285] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:44:50.193] [undefined] GET(/search): try to search user by username as +[2025-08-18 17:44:50.196] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-08-18 17:44:50.396] [undefined] GET(/search): try to search user by username ast +[2025-08-18 17:44:50.400] [undefined] GET(/search): successfully found user with username ast with status 200 +[2025-08-18 17:44:50.485] [undefined] GET(/search): try to search user by username astr +[2025-08-18 17:44:50.489] [undefined] GET(/search): successfully found user with username astr with status 200 +[2025-08-18 17:44:50.666] [undefined] GET(/search): try to search user by username astri +[2025-08-18 17:44:50.671] [undefined] GET(/search): successfully found user with username astri with status 200 +[2025-08-18 17:45:11.427] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:45:11.431] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:45:12.426] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:45:12.429] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:46:02.236] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:46:02.239] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:46:04.407] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:46:04.411] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:46:06.643] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:46:06.646] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:46:10.552] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:46:10.557] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:46:32.809] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:46:32.813] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:46:34.704] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:46:34.708] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:48:10.395] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:48:10.399] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:48:12.431] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:48:12.434] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:48:15.528] [undefined] GET(/search): try to search user by username as +[2025-08-18 17:48:15.532] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-08-18 17:48:15.707] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:48:15.710] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:48:47.100] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:48:47.104] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:48:48.333] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:48:48.337] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:49:01.390] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:49:01.394] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:49:04.296] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:49:04.300] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:49:37.858] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:49:37.862] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:49:38.853] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:49:38.857] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:49:57.908] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:49:57.912] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:49:59.214] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:49:59.218] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:50:47.064] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:50:47.068] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:50:48.062] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:50:48.065] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:50:57.499] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:50:57.503] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:50:58.394] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:50:58.398] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:51:33.403] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:51:33.407] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:51:34.352] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:51:34.356] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:51:41.430] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:51:41.433] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:51:42.519] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:51:42.523] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:51:51.265] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:51:51.268] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:51:53.003] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:51:53.006] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:52:09.869] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:52:09.872] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:52:11.174] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:52:11.178] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:52:18.702] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:52:18.706] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:52:19.655] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:52:19.659] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:53:23.241] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:53:23.245] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:53:24.233] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:53:24.236] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:53:40.448] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:53:40.452] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:53:42.339] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:53:42.343] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:56:02.368] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:56:02.371] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:56:04.593] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:56:04.596] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:56:25.107] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:56:25.110] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:56:52.324] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:56:52.328] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:56:53.719] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:56:53.723] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:57:15.686] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:57:15.690] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:57:16.727] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:57:16.730] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:58:20.073] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:58:20.077] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:58:20.844] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:58:20.848] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-18 17:59:00.905] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-18 17:59:00.909] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-18 17:59:02.119] [undefined] GET(/search): try to search user by username a +[2025-08-18 17:59:02.123] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 16:50:31.703] [undefined] POST(/): try to register a user with username: astria and email: sachaguerin.sg@gmail.com +[2025-08-19 16:50:32.709] [undefined] POST(/): successfully registered with status 200 +[2025-08-19 16:50:44.851] [undefined] POST(/verify-email): try to verify email for sachaguerin.sg@gmail.com with token 8f9c5 +[2025-08-19 16:50:44.861] [undefined] POST(/verify-email): successfully verified email for sachaguerin.sg@gmail.com with status 200 +[2025-08-19 16:50:53.604] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-19 16:51:09.256] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-19 16:51:19.455] [undefined] POST(/login): try to login with username 'astria' +[2025-08-19 16:51:19.508] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-19 16:51:23.577] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 16:51:23.581] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-19 16:51:23.584] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-19 16:51:23.588] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-19 16:51:23.598] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-19 16:51:27.795] [undefined] POST(/): try to create new channel with owner 1 and name astria +[2025-08-19 16:51:27.798] [undefined] POST(/): Successfully created new channel with name astria with status 200 +[2025-08-19 16:51:27.811] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 16:51:27.814] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 16:51:30.510] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-19 16:51:30.526] [undefined] GET(/:id/stats): try to get stats +[2025-08-19 16:51:30.531] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-19 16:51:30.539] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-19 16:51:33.254] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 16:51:33.258] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 16:51:40.046] [undefined] GET(/search): try to search user by username a +[2025-08-19 16:51:40.050] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 16:51:40.285] [undefined] GET(/search): try to search user by username as +[2025-08-19 16:51:40.289] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-08-19 16:51:40.470] [undefined] GET(/search): try to search user by username ast +[2025-08-19 16:51:40.474] [undefined] GET(/search): successfully found user with username ast with status 200 +[2025-08-19 16:51:40.573] [undefined] GET(/search): try to search user by username astr +[2025-08-19 16:51:40.577] [undefined] GET(/search): successfully found user with username astr with status 200 +[2025-08-19 16:51:40.705] [undefined] GET(/search): try to search user by username astri +[2025-08-19 16:51:40.708] [undefined] GET(/search): successfully found user with username astri with status 200 +[2025-08-19 17:46:55.010] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 17:46:55.015] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 17:47:00.226] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:47:00.229] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:47:00.465] [undefined] GET(/search): try to search user by username as +[2025-08-19 17:47:00.469] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-08-19 17:47:00.646] [undefined] GET(/search): try to search user by username ast +[2025-08-19 17:47:00.649] [undefined] GET(/search): successfully found user with username ast with status 200 +[2025-08-19 17:47:00.741] [undefined] GET(/search): try to search user by username astr +[2025-08-19 17:47:00.744] [undefined] GET(/search): successfully found user with username astr with status 200 +[2025-08-19 17:47:00.880] [undefined] GET(/search): try to search user by username astri +[2025-08-19 17:47:00.883] [undefined] GET(/search): successfully found user with username astri with status 200 +[2025-08-19 17:47:31.274] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 17:47:31.277] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 17:47:32.638] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:47:32.642] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:47:59.477] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 17:47:59.480] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 17:48:00.360] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:48:00.363] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:48:10.809] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 17:48:10.813] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 17:48:11.729] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:48:11.732] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:48:28.248] [undefined] GET(/search): try to search user by username as +[2025-08-19 17:48:28.252] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-08-19 17:48:50.152] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 17:48:50.156] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 17:48:51.115] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:48:51.119] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:48:55.267] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:48:55.270] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:51:38.016] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 17:51:38.020] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 17:51:39.279] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:51:39.282] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:51:40.911] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:51:40.915] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:51:53.055] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 17:51:53.059] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 17:51:53.750] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:51:53.754] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:51:54.033] [undefined] GET(/search): try to search user by username as +[2025-08-19 17:51:54.036] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-08-19 17:51:56.357] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:51:56.360] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:52:06.577] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 17:52:06.582] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 17:52:07.598] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:52:07.602] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:52:09.890] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:52:09.893] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 17:52:50.407] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 17:52:50.411] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 17:52:52.482] [undefined] GET(/search): try to search user by username a +[2025-08-19 17:52:52.486] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 18:09:16.637] [undefined] GET(/search): try to search user by username a +[2025-08-19 18:09:16.640] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 18:09:52.553] [undefined] POST(/): try to upload video with status undefined +[2025-08-19 18:09:52.559] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-19 18:09:52.636] [undefined] POST(/thumbnail): try to add thumbnail to video 1 +[2025-08-19 18:09:52.640] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-19 18:09:52.656] [undefined] PUT(/:id/tags): try to add tags to video 1 +[2025-08-19 18:09:52.666] [undefined] PUT(/:id/tags): successfully added tags to video 1 with status 200 +[2025-08-19 18:10:20.468] [undefined] POST(/): try to upload video with status undefined +[2025-08-19 18:10:20.473] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-19 18:10:20.560] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-19 18:10:20.563] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-19 18:10:20.582] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-19 18:10:20.590] [undefined] PUT(/:id/tags): Tag sa already exists for video 2 with status 200 +[2025-08-19 18:10:20.594] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-19 18:10:34.430] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 18:10:34.434] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 18:10:39.472] [undefined] GET(/search): try to search user by username a +[2025-08-19 18:10:39.475] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 18:10:48.026] [undefined] POST(/): try to upload video with status undefined +[2025-08-19 18:10:48.036] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-19 18:10:48.238] [undefined] POST(/thumbnail): try to add thumbnail to video 3 +[2025-08-19 18:10:48.243] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-19 18:10:48.260] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-08-19 18:10:48.268] [undefined] PUT(/:id/tags): Tag sa already exists for video 3 with status 200 +[2025-08-19 18:10:48.272] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-08-19 18:11:37.923] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-19 18:11:49.155] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-19 18:13:15.887] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-19 18:15:41.313] [undefined] POST(/): try to upload video with status undefined +[2025-08-19 18:15:41.318] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-19 18:15:41.402] [undefined] POST(/thumbnail): try to add thumbnail to video 4 +[2025-08-19 18:15:41.405] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-19 18:15:41.429] [undefined] PUT(/:id/tags): try to add tags to video 4 +[2025-08-19 18:15:41.437] [undefined] PUT(/:id/tags): Tag sa already exists for video 4 with status 200 +[2025-08-19 18:15:41.441] [undefined] PUT(/:id/tags): successfully added tags to video 4 with status 200 +[2025-08-19 18:16:20.905] [undefined] POST(/): try to upload video with status undefined +[2025-08-19 18:16:20.933] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-19 18:16:21.025] [undefined] POST(/thumbnail): try to add thumbnail to video 5 +[2025-08-19 18:16:21.029] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-19 18:16:21.054] [undefined] PUT(/:id/tags): try to add tags to video 5 +[2025-08-19 18:16:21.063] [undefined] PUT(/:id/tags): Tag sa already exists for video 5 with status 200 +[2025-08-19 18:16:21.068] [undefined] PUT(/:id/tags): successfully added tags to video 5 with status 200 +[2025-08-19 18:17:10.822] [undefined] POST(/): try to upload video with status undefined +[2025-08-19 18:17:10.834] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-19 18:17:10.916] [undefined] POST(/thumbnail): try to add thumbnail to video 6 +[2025-08-19 18:17:10.920] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-19 18:17:10.943] [undefined] PUT(/:id/tags): try to add tags to video 6 +[2025-08-19 18:17:10.951] [undefined] PUT(/:id/tags): Tag sa already exists for video 6 with status 200 +[2025-08-19 18:17:10.955] [undefined] PUT(/:id/tags): successfully added tags to video 6 with status 200 +[2025-08-19 18:18:05.738] [undefined] POST(/): try to upload video with status undefined +[2025-08-19 18:18:05.744] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-19 18:18:05.824] [undefined] POST(/thumbnail): try to add thumbnail to video 7 +[2025-08-19 18:18:05.827] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-19 18:18:05.850] [undefined] PUT(/:id/tags): try to add tags to video 7 +[2025-08-19 18:18:05.858] [undefined] PUT(/:id/tags): Tag sa already exists for video 7 with status 200 +[2025-08-19 18:18:05.863] [undefined] PUT(/:id/tags): successfully added tags to video 7 with status 200 +[2025-08-19 18:18:48.664] [undefined] POST(/): try to upload video with status undefined +[2025-08-19 18:18:48.671] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-19 18:18:48.756] [undefined] POST(/thumbnail): try to add thumbnail to video 8 +[2025-08-19 18:18:48.759] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-19 18:18:48.785] [undefined] PUT(/:id/tags): try to add tags to video 8 +[2025-08-19 18:18:48.793] [undefined] PUT(/:id/tags): Tag sa already exists for video 8 with status 200 +[2025-08-19 18:18:48.798] [undefined] PUT(/:id/tags): successfully added tags to video 8 with status 200 +[2025-08-19 18:20:25.872] [undefined] POST(/): try to upload video with status undefined +[2025-08-19 18:20:25.877] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-19 18:20:25.959] [undefined] POST(/thumbnail): try to add thumbnail to video 9 +[2025-08-19 18:20:25.962] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-19 18:20:25.984] [undefined] PUT(/:id/tags): try to add tags to video 9 +[2025-08-19 18:20:25.992] [undefined] PUT(/:id/tags): Tag sa already exists for video 9 with status 200 +[2025-08-19 18:20:25.996] [undefined] PUT(/:id/tags): successfully added tags to video 9 with status 200 +[2025-08-19 18:21:11.157] [undefined] POST(/): try to upload video with status undefined +[2025-08-19 18:21:11.164] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-19 18:21:11.249] [undefined] POST(/thumbnail): try to add thumbnail to video 10 +[2025-08-19 18:21:11.252] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-19 18:21:11.280] [undefined] PUT(/:id/tags): try to add tags to video 10 +[2025-08-19 18:21:11.288] [undefined] PUT(/:id/tags): Tag sa already exists for video 10 with status 200 +[2025-08-19 18:21:11.292] [undefined] PUT(/:id/tags): successfully added tags to video 10 with status 200 +[2025-08-19 18:30:49.537] [undefined] GET(/:id): try to get video 1 +[2025-08-19 18:30:49.547] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-19 18:30:49.565] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-19 18:30:49.575] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-19 18:30:49.591] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-19 18:30:49.610] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-19 18:30:49.625] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-19 18:31:42.637] [undefined] GET(/:id): failed because video not found with status 404 +[2025-08-19 18:31:42.648] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-19 18:31:42.653] [undefined] GET(/:id/similar): failed because video not found with status 404 +[2025-08-19 18:31:42.664] [undefined] GET(/:id/views): failed because video not found with status 404 +[2025-08-19 18:31:47.656] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 18:31:47.660] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 18:31:47.664] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-19 18:31:47.669] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-19 18:31:47.679] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-19 18:32:24.652] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-19 18:32:24.662] [undefined] GET(/:id/stats): try to get stats +[2025-08-19 18:32:24.667] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-19 18:32:24.675] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-19 18:32:25.767] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 18:32:25.771] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 18:33:12.054] [undefined] GET(/search): try to search user by username a +[2025-08-19 18:33:12.058] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-19 18:33:25.364] [undefined] POST(/): try to upload video with status undefined +[2025-08-19 18:33:25.372] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-19 18:33:25.453] [undefined] POST(/thumbnail): try to add thumbnail to video 11 +[2025-08-19 18:33:25.456] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-19 18:33:25.474] [undefined] PUT(/:id/tags): try to add tags to video 11 +[2025-08-19 18:33:25.488] [undefined] PUT(/:id/tags): successfully added tags to video 11 with status 200 +[2025-08-19 18:33:30.850] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:33:30.860] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-19 18:33:30.867] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-19 18:33:30.876] [undefined] GET(/:id/similar): try to get similar videos for video 11 +[2025-08-19 18:33:30.888] [undefined] GET(/:id/similar): successfully get similar videos for video 11 with status 200 +[2025-08-19 18:33:30.904] [undefined] GET(/:id/views): try to add views for video 11 +[2025-08-19 18:33:30.918] [undefined] GET(/:id/views): successfully added views for video 11 with status 200 +[2025-08-19 18:33:38.304] [undefined] GET(/:id/like): try to toggle like on video 11 +[2025-08-19 18:33:38.312] [undefined] GET(/:id/like): no likes found adding likes for video 11 with status 200 +[2025-08-19 18:33:39.877] [undefined] POST(/:id): Video added to playlist with id 1 with status 200 +[2025-08-19 18:33:41.409] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-19 18:33:41.417] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-19 18:33:46.037] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-19 18:33:46.041] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-19 18:33:46.048] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-19 18:33:46.052] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-19 18:33:46.056] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-19 18:33:46.647] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-19 18:33:46.657] [undefined] GET(/:id/stats): try to get stats +[2025-08-19 18:33:46.662] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-19 18:33:46.672] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-19 18:33:47.714] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:33:47.717] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-19 18:33:47.729] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-19 18:33:47.734] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-19 18:35:42.063] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:35:42.068] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-19 18:35:42.079] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-19 18:35:42.084] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-19 18:36:03.707] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-19 18:36:03.710] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:36:03.721] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-19 18:36:03.727] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-19 18:37:10.825] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:37:10.829] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-19 18:37:10.839] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-19 18:37:14.577] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-19 18:37:14.580] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:37:14.592] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-19 18:38:02.999] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-19 18:38:03.002] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:38:03.034] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-19 18:38:03.041] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-19 18:38:21.751] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-19 18:38:21.754] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:38:21.766] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-19 18:38:21.773] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-19 18:39:10.233] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:39:10.236] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-19 18:39:10.247] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-19 18:39:10.253] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-19 18:39:21.826] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:39:21.829] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-19 18:39:21.841] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-19 18:39:21.847] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-19 18:41:07.602] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:41:07.606] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-19 18:41:07.618] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-19 18:41:07.624] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-19 18:41:28.238] [undefined] GET(/:id): try to get video 11 +[2025-08-19 18:41:28.242] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-19 18:41:28.253] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-19 18:41:28.259] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 17:38:45.740] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-20 17:38:45.743] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-20 17:38:45.749] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-20 17:38:45.755] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-20 17:38:45.764] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-20 17:38:49.831] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-20 17:38:49.843] [undefined] GET(/:id/stats): try to get stats +[2025-08-20 17:38:49.847] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-20 17:38:49.855] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-20 17:38:51.435] [undefined] GET(/:id): try to get video 11 +[2025-08-20 17:38:51.437] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 17:38:51.448] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 17:38:51.454] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 17:45:30.859] [undefined] GET(/:id): try to get video 11 +[2025-08-20 17:45:30.865] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 17:45:30.874] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 17:45:30.878] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 17:46:49.844] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 17:46:49.847] [undefined] GET(/:id): try to get video 11 +[2025-08-20 17:46:49.858] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 17:46:49.865] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 17:46:51.040] [undefined] GET(/search): try to search user by username a +[2025-08-20 17:46:51.044] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 17:47:56.099] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 17:47:56.103] [undefined] GET(/:id): try to get video 11 +[2025-08-20 17:47:56.114] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 17:47:56.119] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 17:47:58.471] [undefined] GET(/search): try to search user by username a +[2025-08-20 17:47:58.475] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 17:48:02.406] [undefined] GET(/search): try to search user by username as +[2025-08-20 17:48:02.409] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-08-20 17:48:02.648] [undefined] GET(/search): try to search user by username a +[2025-08-20 17:48:02.651] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:02:01.655] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:02:01.658] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:02:01.669] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:02:01.676] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:02:03.971] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:02:03.977] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:02:09.242] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:02:09.255] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:02:09.261] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:02:09.275] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:02:40.257] [undefined] PUT(/:id/tags): try to add tags to video 11 +[2025-08-20 18:02:40.268] [undefined] PUT(/:id/tags): Tag CS2 already exists for video 11 with status 200 +[2025-08-20 18:02:40.272] [undefined] PUT(/:id/tags): Tag CSGO already exists for video 11 with status 200 +[2025-08-20 18:02:40.277] [undefined] PUT(/:id/tags): Tag Squeezie already exists for video 11 with status 200 +[2025-08-20 18:02:40.281] [undefined] PUT(/:id/tags): successfully added tags to video 11 with status 200 +[2025-08-20 18:02:44.040] [undefined] PUT(/:id/tags): try to add tags to video 11 +[2025-08-20 18:02:44.049] [undefined] PUT(/:id/tags): Tag CS2 already exists for video 11 with status 200 +[2025-08-20 18:02:44.054] [undefined] PUT(/:id/tags): Tag CSGO already exists for video 11 with status 200 +[2025-08-20 18:02:44.059] [undefined] PUT(/:id/tags): Tag Squeezie already exists for video 11 with status 200 +[2025-08-20 18:02:44.066] [undefined] PUT(/:id/tags): successfully added tags to video 11 with status 200 +[2025-08-20 18:35:54.696] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:35:54.699] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:35:54.710] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:35:54.716] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:36:12.459] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:36:12.472] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:36:12.479] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:36:12.486] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:36:18.031] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:36:18.036] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:36:18.048] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:36:18.055] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:37:05.587] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:37:05.590] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:37:05.602] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:37:05.608] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:37:22.780] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:37:22.784] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:37:22.795] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:37:22.800] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:37:42.008] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:37:42.021] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:37:42.028] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:37:42.035] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:37:59.051] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:37:59.058] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:37:59.067] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:37:59.072] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:38:20.881] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:38:20.894] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:38:20.899] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:38:20.907] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:38:24.327] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:38:24.338] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:38:24.341] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-20 18:38:24.351] [undefined] GET(/:id/similar): try to get similar videos for video 11 +[2025-08-20 18:38:24.364] [undefined] GET(/:id/similar): successfully get similar videos for video 11 with status 200 +[2025-08-20 18:38:24.391] [undefined] GET(/:id/views): try to add views for video 11 +[2025-08-20 18:38:24.400] [undefined] GET(/:id/views): successfully added views for video 11 with status 200 +[2025-08-20 18:38:31.467] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:38:31.471] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:38:31.483] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:38:31.489] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:38:52.804] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:38:52.808] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:38:52.820] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:38:52.826] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:38:53.675] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:38:53.680] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:39:14.264] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:39:14.267] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:39:14.279] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:39:14.285] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:39:34.063] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:39:34.074] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:39:34.081] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:39:34.088] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:39:44.733] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:39:44.737] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:39:44.749] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:39:44.756] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:40:25.085] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:40:25.090] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:40:25.099] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:40:25.103] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:41:11.226] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:41:11.230] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:41:11.242] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:41:11.247] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:41:23.586] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:41:23.589] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:41:23.601] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:41:23.607] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:41:49.036] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:41:49.040] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:41:49.053] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:41:49.059] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:41:57.988] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:41:57.991] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:41:58.002] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:41:58.009] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:42:16.719] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:42:16.722] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:42:16.734] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:42:16.740] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:42:28.808] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:42:28.813] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:42:28.823] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:42:28.827] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:43:05.588] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:43:05.591] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:43:05.609] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:43:05.616] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:43:59.851] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:43:59.862] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:43:59.870] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:43:59.877] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:44:01.475] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:44:01.484] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 18:44:03.494] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:44:03.498] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:44:03.508] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:44:03.512] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:44:05.260] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:44:05.264] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:44:26.525] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:44:26.529] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:44:26.541] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:44:26.547] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:44:28.395] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:44:28.401] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:44:42.183] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:44:42.189] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:44:42.199] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:44:42.205] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:44:44.521] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:44:44.526] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:45:18.672] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:45:18.677] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:45:18.707] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:45:18.713] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:45:19.810] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:45:19.816] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:45:21.387] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:45:21.396] [undefined] PUT(/:id/authorized-users): Error updating authorized users: null value in column "user_id" of relation "video_authorized_users" violates not-null constraint with status 500 +[2025-08-20 18:47:45.836] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:47:45.842] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:47:49.720] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:47:49.729] [undefined] PUT(/:id/authorized-users): Error updating authorized users: null value in column "user_id" of relation "video_authorized_users" violates not-null constraint with status 500 +[2025-08-20 18:48:11.345] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:48:11.348] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:48:11.361] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:48:11.367] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:48:12.079] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:48:12.083] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:48:13.768] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:48:13.776] [undefined] PUT(/:id/authorized-users): Error updating authorized users: null value in column "user_id" of relation "video_authorized_users" violates not-null constraint with status 500 +[2025-08-20 18:49:02.787] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:49:02.797] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 18:49:05.674] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:49:05.678] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:49:10.645] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:49:10.657] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 18:49:13.914] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:49:13.918] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:49:13.930] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:49:13.936] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:49:18.941] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:49:18.949] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 18:49:19.663] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:49:19.667] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:49:24.635] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:49:24.650] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 18:49:37.611] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:49:37.614] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:49:37.627] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:49:37.634] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:49:39.397] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:49:39.405] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 18:49:40.021] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:49:40.025] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:49:41.573] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:49:41.582] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 18:49:58.339] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:49:58.346] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:49:58.355] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:49:58.361] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:49:59.991] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:49:59.999] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 18:50:00.647] [undefined] GET(/search): try to search user by username a +[2025-08-20 18:50:00.650] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 18:50:02.527] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 18:50:02.554] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 18:51:15.624] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:51:15.628] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:51:15.640] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:51:15.645] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:51:17.660] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-20 18:51:17.664] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-20 18:51:17.668] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-20 18:51:17.673] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-20 18:51:17.684] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-20 18:51:18.298] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-20 18:51:18.309] [undefined] GET(/:id/stats): try to get stats +[2025-08-20 18:51:18.314] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-20 18:51:18.321] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-20 18:51:19.216] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-20 18:51:19.219] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-20 18:51:29.478] [undefined] POST(/): try to upload video with status undefined +[2025-08-20 18:51:29.485] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-20 18:51:29.566] [undefined] POST(/thumbnail): try to add thumbnail to video 12 +[2025-08-20 18:51:29.573] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-20 18:51:29.594] [undefined] PUT(/:id/tags): try to add tags to video 12 +[2025-08-20 18:51:29.604] [undefined] PUT(/:id/tags): successfully added tags to video 12 with status 200 +[2025-08-20 18:51:30.916] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-20 18:51:30.920] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-20 18:51:30.922] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-20 18:51:30.926] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-20 18:51:30.934] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-20 18:51:32.526] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-20 18:51:32.537] [undefined] GET(/:id/stats): try to get stats +[2025-08-20 18:51:32.541] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-20 18:51:32.550] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-20 18:51:33.588] [undefined] GET(/:id): try to get video 12 +[2025-08-20 18:51:33.592] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 18:51:33.603] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 18:51:33.608] [undefined] GET(/:id): successfully get video 12 with status 200 +[2025-08-20 18:51:40.247] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:51:40.259] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-20 18:51:40.263] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:51:40.277] [undefined] GET(/:id/similar): try to get similar videos for video 11 +[2025-08-20 18:51:40.289] [undefined] GET(/:id/similar): successfully get similar videos for video 11 with status 200 +[2025-08-20 18:51:40.315] [undefined] GET(/:id/views): try to add views for video 11 +[2025-08-20 18:51:40.325] [undefined] GET(/:id/views): successfully added views for video 11 with status 200 +[2025-08-20 18:51:44.448] [undefined] GET(/:id/like): try to toggle like on video 11 +[2025-08-20 18:51:44.458] [undefined] GET(/:id/like): likes found, removing like for video 11 with status 200 +[2025-08-20 18:51:44.912] [undefined] GET(/:id/like): try to toggle like on video 11 +[2025-08-20 18:51:44.921] [undefined] GET(/:id/like): no likes found adding likes for video 11 with status 200 +[2025-08-20 18:53:00.124] [undefined] POST(/): try to register a user with username: sacha and email: thelolshow974@gmail.com +[2025-08-20 18:53:01.068] [undefined] POST(/): successfully registered with status 200 +[2025-08-20 18:53:27.277] [undefined] POST(/verify-email): try to verify email for thelolshow974@gmail.com with token 44046 +[2025-08-20 18:53:27.287] [undefined] POST(/verify-email): successfully verified email for thelolshow974@gmail.com with status 200 +[2025-08-20 18:53:37.170] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-20 18:54:00.492] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-20 18:54:05.877] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-20 18:54:12.816] [undefined] POST(/login): try to login with username 'sacha' +[2025-08-20 18:54:12.866] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-20 18:54:22.722] [undefined] GET(/:id): try to get video 11 +[2025-08-20 18:54:22.734] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 18:54:22.740] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 18:54:22.751] [undefined] GET(/:id/similar): try to get similar videos for video 11 +[2025-08-20 18:54:22.765] [undefined] GET(/:id/similar): successfully get similar videos for video 11 with status 200 +[2025-08-20 18:54:22.783] [undefined] GET(/:id/views): try to add views for video 11 +[2025-08-20 18:54:22.796] [undefined] GET(/:id/views): successfully added views for video 11 with status 200 +[2025-08-20 18:59:18.332] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 18:59:23.959] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:00:08.055] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:00:43.038] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:03:20.114] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:03:30.944] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:03:46.729] [undefined] GET(/:id): failed because user is not authorized with status 403 +[2025-08-20 19:03:46.733] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:03:46.776] [undefined] GET(/:id/views): failed because user is not authorized with status 403 +[2025-08-20 19:04:41.036] [undefined] GET(/:id): failed because user is not authorized with status 403 +[2025-08-20 19:04:41.040] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:05:00.712] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:05:00.716] [undefined] GET(/:id): failed because user is not authorized with status 403 +[2025-08-20 19:05:00.763] [undefined] GET(/:id/views): failed because user is not authorized with status 403 +[2025-08-20 19:05:06.854] [undefined] GET(/:id): failed because user is not authorized with status 403 +[2025-08-20 19:05:06.858] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:05:06.889] [undefined] GET(/:id/views): failed because user is not authorized with status 403 +[2025-08-20 19:05:08.248] [undefined] GET(/:id): try to get video 12 +[2025-08-20 19:05:08.251] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:05:08.262] [undefined] GET(/:id): successfully get video 12 with status 200 +[2025-08-20 19:05:08.279] [undefined] GET(/:id/similar): try to get similar videos for video 12 +[2025-08-20 19:05:08.292] [undefined] GET(/:id/similar): successfully get similar videos for video 12 with status 200 +[2025-08-20 19:05:08.314] [undefined] GET(/:id/views): try to add views for video 12 +[2025-08-20 19:05:08.328] [undefined] GET(/:id/views): successfully added views for video 12 with status 200 +[2025-08-20 19:05:10.522] [undefined] GET(/:id): failed because user is not authorized with status 403 +[2025-08-20 19:05:10.526] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:05:10.557] [undefined] GET(/:id/views): failed because user is not authorized with status 403 +[2025-08-20 19:05:21.932] [undefined] POST(/login): try to login with username 'astria' +[2025-08-20 19:05:21.984] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-20 19:05:23.932] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-20 19:05:23.936] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-20 19:05:23.941] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-20 19:05:23.946] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-20 19:05:23.956] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-20 19:05:24.823] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-20 19:05:24.835] [undefined] GET(/:id/stats): try to get stats +[2025-08-20 19:05:24.840] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-20 19:05:24.849] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-20 19:05:26.215] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 19:05:26.227] [undefined] GET(/:id): try to get video 11 +[2025-08-20 19:05:26.230] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 19:05:26.240] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 19:05:28.154] [undefined] GET(/search): try to search user by username s +[2025-08-20 19:05:28.160] [undefined] GET(/search): successfully found user with username s with status 200 +[2025-08-20 19:05:28.330] [undefined] GET(/search): try to search user by username sa +[2025-08-20 19:05:28.335] [undefined] GET(/search): successfully found user with username sa with status 200 +[2025-08-20 19:05:38.951] [undefined] POST(/login): try to login with username 'sacha' +[2025-08-20 19:05:39.003] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-20 19:05:40.150] [undefined] GET(/:id): failed because user is not authorized with status 403 +[2025-08-20 19:05:40.154] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:05:40.190] [undefined] GET(/:id/views): failed because user is not authorized with status 403 +[2025-08-20 19:05:52.482] [undefined] GET(/:id): failed because user is not authorized with status 403 +[2025-08-20 19:05:52.486] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:05:52.522] [undefined] GET(/:id/views): failed because user is not authorized with status 403 +[2025-08-20 19:06:24.972] [undefined] GET(/:id): failed because user is not authorized with status 403 +[2025-08-20 19:06:24.975] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:06:25.009] [undefined] GET(/:id/views): failed because user is not authorized with status 403 +[2025-08-20 19:06:45.416] [undefined] POST(/login): try to login with username 'astria' +[2025-08-20 19:06:45.467] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-20 19:06:46.977] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-20 19:06:46.980] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-20 19:06:46.983] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-20 19:06:46.988] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-20 19:06:47.004] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-20 19:06:48.280] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-20 19:06:48.293] [undefined] GET(/:id/stats): try to get stats +[2025-08-20 19:06:48.298] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-20 19:06:48.306] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-20 19:06:49.874] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 19:06:49.889] [undefined] GET(/:id): try to get video 11 +[2025-08-20 19:06:49.893] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 19:06:49.904] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 19:06:51.790] [undefined] GET(/search): try to search user by username s +[2025-08-20 19:06:51.793] [undefined] GET(/search): successfully found user with username s with status 200 +[2025-08-20 19:08:02.813] [undefined] GET(/search): try to search user by username sacha +[2025-08-20 19:08:02.817] [undefined] GET(/search): successfully found user with username sacha with status 200 +[2025-08-20 19:09:14.120] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 19:09:14.132] [undefined] GET(/:id): try to get video 11 +[2025-08-20 19:09:14.135] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 19:09:14.147] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 19:09:15.375] [undefined] GET(/search): try to search user by username s +[2025-08-20 19:09:15.379] [undefined] GET(/search): successfully found user with username s with status 200 +[2025-08-20 19:09:17.129] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 19:09:17.139] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 19:09:19.758] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 19:09:19.768] [undefined] GET(/:id): try to get video 11 +[2025-08-20 19:09:19.772] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 19:09:19.782] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 19:09:27.005] [undefined] GET(/search): try to search user by username s +[2025-08-20 19:09:27.009] [undefined] GET(/search): successfully found user with username s with status 200 +[2025-08-20 19:09:28.823] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 19:09:28.831] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 19:09:51.055] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 19:09:51.067] [undefined] GET(/:id): try to get video 11 +[2025-08-20 19:09:51.071] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 19:09:51.083] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 19:11:19.136] [undefined] GET(/search): try to search user by username s +[2025-08-20 19:11:19.140] [undefined] GET(/search): successfully found user with username s with status 200 +[2025-08-20 19:11:21.265] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 19:11:21.275] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 19:13:19.229] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-20 19:13:19.241] [undefined] GET(/:id): try to get video 11 +[2025-08-20 19:13:19.244] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-20 19:13:19.255] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 19:13:20.095] [undefined] GET(/search): try to search user by username s +[2025-08-20 19:13:20.100] [undefined] GET(/search): successfully found user with username s with status 200 +[2025-08-20 19:13:20.110] [undefined] GET(/search): try to search user by username sq +[2025-08-20 19:13:20.116] [undefined] GET(/search): no user found with username sq with status 404 +[2025-08-20 19:13:21.488] [undefined] GET(/search): try to search user by username s +[2025-08-20 19:13:21.491] [undefined] GET(/search): successfully found user with username s with status 200 +[2025-08-20 19:13:21.707] [undefined] GET(/search): try to search user by username sa +[2025-08-20 19:13:21.711] [undefined] GET(/search): successfully found user with username sa with status 200 +[2025-08-20 19:13:22.932] [undefined] PUT(/:id/authorized-users): try to update authorized users for video 11 +[2025-08-20 19:13:22.942] [undefined] PUT(/:id/authorized-users): successfully updated authorized users for video 11 with status 200 +[2025-08-20 19:13:37.018] [undefined] POST(/login): try to login with username 'sacha' +[2025-08-20 19:13:37.069] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-20 19:13:38.705] [undefined] GET(/:id): try to get video 11 +[2025-08-20 19:13:38.709] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:13:38.719] [undefined] GET(/:id): successfully get video 11 with status 200 +[2025-08-20 19:13:38.738] [undefined] GET(/:id/similar): failed because no token provided with status 401 +[2025-08-20 19:13:38.762] [undefined] GET(/:id/views): try to add views for video 11 +[2025-08-20 19:13:38.772] [undefined] GET(/:id/views): successfully added views for video 11 with status 200 +[2025-08-20 19:19:28.651] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-20 19:19:28.663] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-20 19:19:28.681] [undefined] GET(/:id/channel/subscribed): check if user 2 is subscribed to channel 1 +[2025-08-20 19:19:28.688] [undefined] GET(/:id/channel/subscribed): user 2 is not subscribed to channel 1 with status 200 +[2025-08-20 19:25:39.807] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-20 19:25:39.813] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-08-20 19:25:39.818] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-20 19:25:39.824] [undefined] GET(/:id/history): successfully retrieved history of user 2 with status 200 +[2025-08-20 19:25:39.834] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-20 19:25:44.286] [undefined] POST(/): try to create new channel with owner 2 and name sacha +[2025-08-20 19:25:44.289] [undefined] POST(/): Successfully created new channel with name sacha with status 200 +[2025-08-20 19:25:44.300] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-20 19:25:44.304] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-20 19:25:45.115] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-20 19:25:45.127] [undefined] GET(/:id/stats): try to get stats +[2025-08-20 19:25:45.131] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-20 19:25:45.139] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-20 19:25:46.051] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-20 19:25:46.055] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-20 19:25:58.216] [undefined] GET(/search): try to search user by username a +[2025-08-20 19:25:58.220] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-20 19:26:10.194] [undefined] POST(/): try to upload video with status undefined +[2025-08-20 19:26:51.145] [undefined] POST(/): try to upload video with status undefined +[2025-08-20 19:26:51.163] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-20 19:26:51.250] [undefined] POST(/thumbnail): try to add thumbnail to video 14 +[2025-08-20 19:26:51.254] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-20 19:26:51.304] [undefined] PUT(/:id/tags): try to add tags to video 14 +[2025-08-20 19:26:51.315] [undefined] PUT(/:id/tags): successfully added tags to video 14 with status 200 +[2025-08-20 19:27:28.048] [undefined] POST(/): try to upload video with status undefined +[2025-08-20 19:27:28.081] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-20 19:27:28.191] [undefined] POST(/thumbnail): try to add thumbnail to video 15 +[2025-08-20 19:27:28.197] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-20 19:27:28.222] [undefined] PUT(/:id/tags): try to add tags to video 15 +[2025-08-20 19:27:28.231] [undefined] PUT(/:id/tags): Tag csgo already exists for video 15 with status 200 +[2025-08-20 19:27:28.236] [undefined] PUT(/:id/tags): successfully added tags to video 15 with status 200 +[2025-08-20 19:29:54.451] [undefined] POST(/): try to upload video with status undefined +[2025-08-20 19:29:54.468] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-20 19:29:54.576] [undefined] POST(/thumbnail): try to add thumbnail to video 16 +[2025-08-20 19:29:54.581] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-20 19:29:54.606] [undefined] PUT(/:id/tags): try to add tags to video 16 +[2025-08-20 19:29:54.615] [undefined] PUT(/:id/tags): Tag csgo already exists for video 16 with status 200 +[2025-08-20 19:29:54.620] [undefined] PUT(/:id/tags): successfully added tags to video 16 with status 200 +[2025-08-20 19:30:18.925] [undefined] POST(/): try to upload video with status undefined +[2025-08-20 19:30:18.938] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-20 19:30:19.056] [undefined] POST(/thumbnail): try to add thumbnail to video 17 +[2025-08-20 19:30:19.061] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-20 19:30:19.086] [undefined] PUT(/:id/tags): try to add tags to video 17 +[2025-08-20 19:30:19.095] [undefined] PUT(/:id/tags): Tag csgo already exists for video 17 with status 200 +[2025-08-20 19:30:19.100] [undefined] PUT(/:id/tags): successfully added tags to video 17 with status 200 +[2025-08-20 19:31:31.875] [undefined] POST(/): try to upload video with status undefined +[2025-08-20 19:31:31.885] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-20 19:31:31.987] [undefined] POST(/thumbnail): try to add thumbnail to video 18 +[2025-08-20 19:31:31.990] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-20 19:31:32.014] [undefined] PUT(/:id/tags): try to add tags to video 18 +[2025-08-20 19:31:32.022] [undefined] PUT(/:id/tags): Tag csgo already exists for video 18 with status 200 +[2025-08-20 19:31:32.026] [undefined] PUT(/:id/tags): successfully added tags to video 18 with status 200 +[2025-08-20 19:34:17.736] [undefined] POST(/): try to upload video with status undefined +[2025-08-20 19:34:42.939] [undefined] POST(/): try to upload video with status undefined +[2025-08-20 19:34:42.956] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-20 19:34:43.059] [undefined] POST(/thumbnail): try to add thumbnail to video 20 +[2025-08-20 19:34:43.063] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-20 19:34:43.088] [undefined] PUT(/:id/tags): try to add tags to video 20 +[2025-08-20 19:34:43.096] [undefined] PUT(/:id/tags): Tag csgo already exists for video 20 with status 200 +[2025-08-20 19:34:43.100] [undefined] PUT(/:id/tags): successfully added tags to video 20 with status 200 +[2025-08-22 11:41:01.973] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-22 11:41:01.980] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-22 11:41:01.985] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-22 11:41:01.991] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-22 11:41:02.003] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-22 11:41:04.343] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-22 11:41:04.355] [undefined] GET(/:id/stats): try to get stats +[2025-08-22 11:41:04.361] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-22 11:41:04.371] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-22 11:41:12.948] [undefined] POST(/login): try to login with username 'astria' +[2025-08-22 11:41:13.006] [undefined] POST(/login): failed to login with status 401 +[2025-08-22 11:41:19.893] [undefined] POST(/login): try to login with username 'astria' +[2025-08-22 11:41:19.950] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-22 16:21:17.273] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-22 16:21:17.277] [undefined] GET(/:id/channel): failed to retrieve channel of user 4 because it doesn't exist with status 404 +[2025-08-22 16:21:17.282] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-22 16:21:17.286] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-08-22 16:21:17.294] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-22 16:23:00.680] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-22 16:23:08.955] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-22 16:24:16.438] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-22 16:33:03.791] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-22 16:33:18.532] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-22 16:33:23.707] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-22 16:33:23.712] [undefined] GET(/:id/channel): failed to retrieve channel of user 4 because it doesn't exist with status 404 +[2025-08-22 16:33:23.718] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-22 16:33:23.722] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-08-22 16:33:23.735] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-22 16:33:44.131] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-22 16:34:21.678] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-22 16:34:50.238] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-22 16:35:02.341] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-22 16:35:02.345] [undefined] GET(/:id/channel): failed to retrieve channel of user 4 because it doesn't exist with status 404 +[2025-08-22 16:35:02.353] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-22 16:35:02.357] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-08-22 16:35:02.368] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-22 16:35:08.368] [undefined] POST(/): try to create new channel with owner 4 and name github +[2025-08-22 16:35:08.371] [undefined] POST(/): Successfully created new channel with name github with status 200 +[2025-08-22 16:35:08.389] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-22 16:35:08.393] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-22 16:35:09.953] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-22 16:35:09.966] [undefined] GET(/:id/stats): try to get stats +[2025-08-22 16:35:09.970] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-22 16:35:09.977] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-22 16:35:14.046] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-22 16:35:14.049] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-22 16:35:14.057] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-08-22 16:35:14.061] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-22 16:35:14.066] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-22 16:35:49.944] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-22 16:35:49.948] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-22 16:35:49.951] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-22 16:35:49.955] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-08-22 16:35:49.964] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-22 16:38:32.507] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-22 16:38:32.511] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-22 16:38:32.519] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-22 16:38:32.525] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-08-22 16:38:32.535] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-22 16:38:34.090] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-22 16:38:34.101] [undefined] GET(/:id/stats): try to get stats +[2025-08-22 16:38:34.104] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-22 16:38:34.111] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-22 16:38:35.245] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-22 16:38:35.248] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-22 16:38:39.372] [undefined] GET(/search): try to search user by username a +[2025-08-22 16:38:39.376] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-22 16:38:43.731] [undefined] GET(/search): try to search user by username as +[2025-08-22 16:38:43.738] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-08-22 16:38:44.209] [undefined] GET(/search): try to search user by username a +[2025-08-22 16:38:44.212] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-22 16:38:45.263] [undefined] GET(/search): try to search user by username s +[2025-08-22 16:38:45.267] [undefined] GET(/search): successfully found user with username s with status 200 +[2025-08-22 17:16:45.647] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-22 17:16:45.652] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-22 17:16:45.657] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-22 17:16:45.662] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-22 17:16:45.673] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-22 17:20:25.391] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-22 17:20:25.395] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-22 17:20:25.400] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-22 17:20:25.407] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-22 17:20:25.418] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-22 17:45:26.016] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-22 17:45:26.020] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-22 17:45:26.024] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-22 17:45:26.028] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-22 17:45:26.038] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-22 17:45:31.307] [undefined] POST(/): try to create new channel with owner 1 and name Astri4 +[2025-08-22 17:45:31.311] [undefined] POST(/): Successfully created new channel with name Astri4 with status 200 +[2025-08-22 17:45:31.326] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-22 17:45:31.329] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-22 17:45:32.380] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-22 17:45:32.390] [undefined] GET(/:id/stats): try to get stats +[2025-08-22 17:45:32.396] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-22 17:45:32.405] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-22 17:45:33.382] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-22 17:45:33.387] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-22 17:48:00.202] [undefined] POST(/): try to upload video with status undefined +[2025-08-22 17:48:00.209] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-22 17:48:00.320] [undefined] POST(/thumbnail): try to add thumbnail to video 1 +[2025-08-22 17:48:00.326] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-22 17:48:00.348] [undefined] PUT(/:id/tags): try to add tags to video 1 +[2025-08-22 17:48:00.363] [undefined] PUT(/:id/tags): successfully added tags to video 1 with status 200 +[2025-08-22 17:52:47.227] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-22 17:52:47.232] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-22 17:52:47.237] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-22 17:52:47.242] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-22 17:52:47.251] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-22 17:52:48.223] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-22 17:52:48.233] [undefined] GET(/:id/stats): try to get stats +[2025-08-22 17:52:48.237] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-22 17:52:48.247] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-22 17:52:49.012] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-22 17:52:49.016] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-22 17:53:03.301] [undefined] POST(/): try to upload video with status undefined +[2025-08-22 17:53:03.307] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-22 17:53:03.417] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-22 17:53:03.423] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-22 17:53:03.445] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-22 17:53:03.458] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-22 17:53:12.167] [undefined] GET(/:id): try to get video 1 +[2025-08-22 17:53:12.171] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-22 17:53:12.184] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-22 17:53:12.201] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-22 17:53:12.228] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-22 17:53:12.255] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-22 17:53:12.300] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-22 17:53:14.457] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-22 17:53:14.462] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-22 17:53:14.466] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-22 17:53:14.471] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-22 17:53:14.482] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-22 17:53:15.772] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-22 17:53:15.783] [undefined] GET(/:id/stats): try to get stats +[2025-08-22 17:53:15.789] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-22 17:53:15.800] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-22 17:53:16.871] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-22 17:53:16.882] [undefined] GET(/:id): try to get video 2 +[2025-08-22 17:53:16.886] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-22 17:53:16.897] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-22 17:53:19.714] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-22 17:53:19.724] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-22 17:53:23.383] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-22 17:53:23.393] [undefined] PUT(/:id/tags): Tag wankil studio already exists for video 2 with status 200 +[2025-08-22 17:53:23.400] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-22 20:37:48.060] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-22 20:37:48.067] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-22 20:37:48.072] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-22 20:37:48.077] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-22 20:37:48.087] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-22 20:37:52.902] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-22 20:37:52.914] [undefined] GET(/:id/stats): try to get stats +[2025-08-22 20:37:52.919] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-22 20:37:52.928] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-22 20:37:58.472] [undefined] PUT(/:id): try to update channel with id 1 +[2025-08-22 20:37:58.478] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-22 20:40:57.463] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-22 20:40:57.475] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-22 20:40:57.491] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-22 20:40:57.495] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 1 with status 200 +[2025-08-22 20:41:04.433] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-22 20:41:04.446] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-22 20:42:05.622] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-22 20:42:05.633] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-22 20:42:05.685] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-22 20:42:05.690] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-23 10:58:17.412] [undefined] GET(/:id): try to get video 1 +[2025-08-23 10:58:17.417] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-23 10:58:17.430] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-23 10:58:17.449] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-23 10:58:17.462] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-23 10:58:17.490] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-23 10:58:17.503] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-23 10:58:36.017] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-23 10:58:36.027] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-23 10:58:41.944] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-23 10:58:41.949] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-23 10:58:41.953] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-23 10:58:41.958] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-23 10:58:41.967] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-23 10:58:47.879] [undefined] PUT(/:id): try to update user 1 +[2025-08-23 10:58:47.883] [undefined] PUT(/:id): failed to update profile picture with status 500 +[2025-08-23 11:11:35.296] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-23 11:11:35.302] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-23 11:11:35.306] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-23 11:11:35.311] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-23 11:11:35.323] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-23 11:11:38.491] [undefined] GET(/:id): try to get video 1 +[2025-08-23 11:11:38.519] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-23 11:11:38.531] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-23 11:11:38.551] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-23 11:11:38.568] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-23 11:11:38.606] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-23 11:11:38.623] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-23 11:11:42.769] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-23 11:11:42.773] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-23 11:11:42.824] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-23 11:11:42.829] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-23 11:11:42.837] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 08:39:21.217] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 08:39:21.222] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-24 08:39:21.226] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-24 08:39:21.231] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-24 08:39:21.239] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 08:39:33.320] [undefined] POST(/): try to create new channel with owner 1 and name Astri4-4 +[2025-08-24 08:39:33.324] [undefined] POST(/): Successfully created new channel with name Astri4-4 with status 200 +[2025-08-24 08:39:33.422] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 08:39:33.427] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 08:39:34.528] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-24 08:39:34.541] [undefined] GET(/:id/stats): try to get stats +[2025-08-24 08:39:34.548] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-24 08:39:34.558] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-24 08:39:44.708] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 08:39:44.712] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 08:40:20.863] [undefined] POST(/): try to upload video with status undefined +[2025-08-24 08:40:20.868] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-24 08:40:20.975] [undefined] POST(/thumbnail): try to add thumbnail to video 1 +[2025-08-24 08:40:20.980] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-24 08:40:21.090] [undefined] PUT(/:id/tags): try to add tags to video 1 +[2025-08-24 08:40:21.098] [undefined] PUT(/:id/tags): successfully added tags to video 1 with status 200 +[2025-08-24 08:42:13.079] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-24 08:42:13.084] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-24 08:42:13.088] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 08:42:13.092] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 08:42:13.102] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 08:42:14.233] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-24 08:42:14.243] [undefined] GET(/:id/stats): try to get stats +[2025-08-24 08:42:14.248] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-24 08:42:14.256] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-24 08:42:15.169] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-24 08:42:15.181] [undefined] GET(/:id): try to get video 1 +[2025-08-24 08:42:15.186] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-24 08:42:15.199] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-24 08:42:18.349] [undefined] PUT(/:id/tags): try to add tags to video 1 +[2025-08-24 08:42:18.359] [undefined] PUT(/:id/tags): successfully added tags to video 1 with status 200 +[2025-08-24 09:09:41.627] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-24 09:09:41.632] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 09:09:41.636] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-08-24 09:09:41.641] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 09:09:41.650] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 09:09:46.047] [undefined] POST(/): Playlist created with id 2 with status 200 +[2025-08-24 09:09:46.102] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 09:09:49.883] [undefined] POST(/): Playlist created with id 3 with status 200 +[2025-08-24 09:09:49.901] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 09:11:01.101] [undefined] GET(/:id): try to get video 1 +[2025-08-24 09:11:01.106] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 09:11:01.117] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-24 09:11:01.135] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-24 09:11:01.150] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-24 09:11:01.215] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-24 09:11:01.227] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-24 09:11:03.606] [undefined] POST(/:id): Video added to playlist with id 1 with status 200 +[2025-08-24 09:34:20.753] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 09:34:20.757] [undefined] GET(/:id): try to get video 1 +[2025-08-24 09:34:20.769] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-24 09:34:20.794] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-24 09:34:20.808] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-24 09:34:20.863] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-24 09:34:20.874] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-24 09:54:38.736] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-24 09:54:44.233] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-24 09:55:34.639] [undefined] GET(/see-later): Error retrieving 'See Later' playlist: bind message supplies 1 parameters, but prepared statement "" requires 0 with status 500 +[2025-08-24 09:56:07.897] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 09:57:45.228] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 09:58:20.325] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 09:59:01.147] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 09:59:13.221] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 09:59:23.788] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 10:26:50.298] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 10:26:50.302] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 10:26:50.308] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-24 10:26:50.315] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-24 10:26:50.324] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 10:26:52.180] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-24 10:26:52.191] [undefined] GET(/:id/stats): try to get stats +[2025-08-24 10:26:52.196] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-24 10:26:52.204] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-24 10:26:54.334] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 10:26:54.338] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 10:27:16.503] [undefined] POST(/): try to upload video with status undefined +[2025-08-24 10:27:16.534] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-24 10:27:16.645] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-24 10:27:16.650] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-24 10:27:16.675] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-24 10:27:16.685] [undefined] PUT(/:id/tags): Tag wankil already exists for video 2 with status 200 +[2025-08-24 10:27:16.691] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-24 10:27:19.733] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 10:56:34.988] [undefined] GET(/:id): try to get video 2 +[2025-08-24 10:56:34.991] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 10:56:35.003] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-24 10:56:35.025] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-24 10:56:35.042] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-24 10:56:35.146] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-24 10:56:35.187] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-24 10:56:41.980] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 12:42:15.221] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 12:42:18.258] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 12:42:18.262] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-24 12:42:18.266] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 12:42:18.271] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-24 12:42:18.279] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 12:42:18.806] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-24 12:42:19.274] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-24 12:42:19.278] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 12:42:19.282] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 12:42:19.287] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-24 12:42:19.296] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 12:42:19.928] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 12:48:46.238] [undefined] GET(/:id): try to get video 2 +[2025-08-24 12:48:46.242] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 12:48:46.254] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-24 12:48:46.271] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-24 12:48:46.283] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-24 12:48:46.326] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-24 12:48:46.337] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-24 12:48:47.143] [undefined] GET(/:id/like): try to toggle like on video 2 +[2025-08-24 12:48:47.153] [undefined] GET(/:id/like): no likes found adding likes for video 2 with status 200 +[2025-08-24 12:48:48.072] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 12:48:48.816] [undefined] GET(/:id): try to get video 2 +[2025-08-24 12:48:48.819] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 12:48:48.830] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-24 12:48:48.851] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-24 12:48:48.865] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-24 12:48:48.898] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-24 12:48:48.907] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-24 12:48:49.852] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 12:48:50.610] [undefined] GET(/:id): try to get video 1 +[2025-08-24 12:48:50.613] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 12:48:50.624] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-24 12:48:50.644] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-24 12:48:50.658] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-24 12:48:50.704] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-24 12:48:50.713] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-24 12:48:51.443] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-24 12:48:51.452] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-24 12:48:51.747] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 12:52:54.497] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-24 12:52:54.503] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 12:52:54.507] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-24 12:52:54.512] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 12:52:54.523] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 12:52:56.045] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-24 12:52:56.055] [undefined] GET(/:id/stats): try to get stats +[2025-08-24 12:52:56.060] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-24 12:52:56.067] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-24 12:52:56.859] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 12:52:56.864] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 12:53:15.671] [undefined] POST(/): try to upload video with status undefined +[2025-08-24 12:53:15.678] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-24 12:53:15.783] [undefined] POST(/thumbnail): try to add thumbnail to video 3 +[2025-08-24 12:53:15.789] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-24 12:53:15.816] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-08-24 12:53:15.837] [undefined] PUT(/:id/tags): Tag wankil already exists for video 3 with status 200 +[2025-08-24 12:53:15.842] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-08-24 12:53:18.269] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 14:31:53.485] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 14:33:34.728] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 14:34:06.863] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 14:56:14.294] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 14:56:45.221] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 14:56:52.544] [undefined] GET(/:id): try to get video 3 +[2025-08-24 14:56:52.548] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 14:56:52.607] [undefined] GET(/:id): successfully get video 3 with status 200 +[2025-08-24 14:56:52.625] [undefined] GET(/:id/similar): try to get similar videos for video 3 +[2025-08-24 14:56:52.640] [undefined] GET(/:id/similar): successfully get similar videos for video 3 with status 200 +[2025-08-24 14:56:52.708] [undefined] GET(/:id/views): try to add views for video 3 +[2025-08-24 14:56:52.719] [undefined] GET(/:id/views): successfully added views for video 3 with status 200 +[2025-08-24 14:56:53.526] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 15:00:04.764] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-24 15:00:04.774] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-24 15:00:04.783] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-24 15:00:04.792] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 15:00:07.941] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 15:00:09.836] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-24 15:00:09.848] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-24 15:00:09.858] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-24 15:00:09.869] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 15:00:13.276] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 15:00:14.341] [undefined] GET(/:id): try to get video 1 +[2025-08-24 15:00:14.345] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 15:00:14.356] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-24 15:00:14.379] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-24 15:00:14.396] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-24 15:00:14.443] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-24 15:00:14.452] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-24 15:00:15.454] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 15:00:17.865] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 15:00:17.868] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-24 15:00:17.872] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 15:00:17.877] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-24 15:00:17.886] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 15:00:18.411] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-24 15:00:19.030] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 15:00:19.036] [undefined] GET(/:id): try to get video 1 +[2025-08-24 15:00:19.047] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-24 15:00:19.052] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-24 15:00:19.072] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-24 15:00:19.086] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-24 15:00:19.122] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-24 15:00:19.131] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-24 15:00:21.743] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-24 15:00:22.774] [undefined] DELETE(/:id/video/:videoId): Video deleted from playlist with id 1 with status 200 +[2025-08-24 15:00:22.844] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-24 15:00:24.102] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 15:00:26.909] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 15:00:35.516] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 15:19:55.359] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-24 15:19:55.364] [undefined] GET(/:id/stats): failed due to invalid values with status 400 +[2025-08-24 15:20:00.400] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:16:06.897] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:30:27.130] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:30:53.040] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:31:03.350] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:31:40.409] [undefined] GET(/:id): try to get video 1 +[2025-08-24 18:31:40.421] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-24 18:31:40.483] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-24 18:31:40.493] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-24 18:32:05.446] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 18:32:05.450] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-24 18:32:05.454] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 18:32:05.462] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-24 18:32:05.474] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 18:32:06.968] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 18:32:06.972] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 18:32:06.976] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-24 18:32:06.981] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-24 18:32:06.990] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 18:32:07.865] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-24 18:32:07.869] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-24 18:32:07.873] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-24 18:32:07.880] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-24 18:32:07.888] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-24 18:32:10.777] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:32:16.357] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:32:17.190] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:32:17.648] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:32:25.811] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:32:39.691] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:32:49.962] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:33:46.919] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:34:01.427] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:34:25.992] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:34:42.706] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:34:43.614] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:34:44.171] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:34:48.277] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:34:54.944] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-24 18:35:28.834] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 11:49:58.042] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 11:50:25.801] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 11:55:58.582] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-25 11:55:58.586] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-08-25 11:55:58.590] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-25 11:55:58.593] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-25 11:55:58.603] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 11:56:01.644] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-25 11:56:01.655] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 11:56:01.659] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-25 11:56:01.667] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 11:56:02.870] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-25 11:56:02.874] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-25 12:01:30.651] [undefined] POST(/): try to upload video with status undefined +[2025-08-25 12:01:30.656] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-25 12:01:30.775] [undefined] POST(/thumbnail): try to add thumbnail to video 1 +[2025-08-25 12:01:30.788] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-25 12:01:30.822] [undefined] PUT(/:id/tags): try to add tags to video 1 +[2025-08-25 12:01:30.833] [undefined] PUT(/:id/tags): successfully added tags to video 1 with status 200 +[2025-08-25 12:01:33.645] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 12:01:45.682] [undefined] GET(/:id): try to get video 1 +[2025-08-25 12:01:45.685] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 12:01:45.694] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 12:01:45.713] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 12:01:45.725] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 12:01:45.795] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 12:01:45.805] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 12:01:50.581] [undefined] POST(/:id): Video added to playlist with id 4 with status 200 +[2025-08-25 12:01:52.771] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 12:03:18.248] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 12:03:20.853] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 12:03:47.849] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 12:03:59.663] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-25 12:03:59.672] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-25 12:03:59.686] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-25 12:03:59.691] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 12:04:03.364] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 12:04:20.414] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 12:04:20.423] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 12:04:20.450] [undefined] GET(/:id/channel/subscribed): check if user 4 is subscribed to channel 1 +[2025-08-25 12:04:20.454] [undefined] GET(/:id/channel/subscribed): user 4 is not subscribed to channel 1 with status 200 +[2025-08-25 12:04:23.685] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-25 12:04:23.706] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 12:04:25.207] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 12:04:41.386] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 12:05:02.094] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 12:07:50.763] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-25 12:07:50.776] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-25 14:11:32.226] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-25 14:11:32.239] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-25 14:11:32.250] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 14:11:32.259] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-25 14:11:45.224] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-25 14:11:45.242] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-25 14:11:45.250] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 14:11:45.256] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-25 14:12:37.526] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-25 14:12:37.540] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-25 14:12:37.551] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 14:12:37.556] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-25 14:12:41.058] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 14:12:43.020] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-25 14:12:43.031] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-25 14:12:43.043] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-25 14:12:43.049] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 14:12:49.717] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-25 14:12:49.732] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-25 14:12:49.738] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 14:12:49.768] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-25 14:13:02.733] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 14:13:02.737] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:13:02.751] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:13:02.780] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:13:02.793] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:13:02.881] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 14:13:02.890] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 14:16:03.407] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:16:03.426] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:16:03.452] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:16:03.461] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:16:08.740] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:16:08.755] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:16:08.786] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:16:08.800] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:16:17.336] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:16:17.349] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:16:17.383] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:16:17.393] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:16:20.252] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:16:20.266] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:16:20.325] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:16:20.337] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:17:11.314] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:17:11.328] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:17:11.350] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:17:11.359] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:17:18.836] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:17:18.847] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:17:18.904] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:17:18.918] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:17:46.226] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:17:46.240] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:17:46.278] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:17:46.289] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:17:47.910] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:17:47.920] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:17:47.969] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:17:47.977] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:19:09.711] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:19:09.726] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:19:09.765] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:19:09.778] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:19:48.887] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:19:48.896] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:19:48.935] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:19:48.945] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:20:46.502] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:20:46.519] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:20:46.549] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:20:46.566] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:20:52.104] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:20:52.125] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:20:52.150] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:20:52.161] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:21:58.815] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:21:58.832] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:21:58.893] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:21:58.910] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:22:45.138] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:22:45.157] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:22:45.187] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:22:45.197] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:22:46.482] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:22:46.495] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:22:46.528] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:22:46.545] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:23:22.459] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:23:22.485] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:23:22.520] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:23:22.532] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:23:27.373] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 14:23:27.376] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:23:27.396] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:23:27.414] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:23:27.427] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:23:27.466] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 14:23:27.474] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 14:23:32.866] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:23:32.880] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:23:32.917] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:23:32.926] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:26:16.081] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 14:27:10.510] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-25 14:27:10.515] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-25 14:27:10.521] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-08-25 14:27:10.525] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-25 14:27:10.533] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 14:27:21.864] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-25 14:27:21.875] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 14:27:21.881] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-25 14:27:21.887] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 14:27:23.087] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 14:27:23.099] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 14:27:23.102] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:27:23.112] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:27:28.813] [undefined] POST(/thumbnail): try to add thumbnail to video 1 +[2025-08-25 14:27:28.826] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-25 14:27:32.796] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 14:27:43.061] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 14:28:06.971] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:28:06.983] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:28:07.033] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:28:07.043] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:31:32.600] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:31:32.614] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:31:32.643] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:31:32.652] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:31:52.322] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:31:52.334] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:31:52.365] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:31:52.376] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:32:23.148] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:32:23.162] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:32:23.216] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:32:23.233] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:33:34.255] [undefined] POST(/): try to register a user with username: PR and email: p.rassant@axelerance.fr +[2025-08-25 14:34:17.138] [undefined] POST(/): try to register a user with username: PR and email: p.rassant@axelerance.fr +[2025-08-25 14:34:18.629] [undefined] POST(/): successfully registered with status 200 +[2025-08-25 14:34:26.245] [undefined] POST(/verify-email): try to verify email for p.rassant@axelerance.fr with token 7a70f +[2025-08-25 14:34:26.262] [undefined] POST(/verify-email): successfully verified email for p.rassant@axelerance.fr with status 200 +[2025-08-25 14:34:34.941] [undefined] POST(/login): try to login with username 'PR' +[2025-08-25 14:34:34.998] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-25 14:34:35.208] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 5 with status 200 +[2025-08-25 14:34:39.094] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 5 with status 200 +[2025-08-25 14:34:42.343] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:34:42.346] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-08-25 14:34:42.367] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:34:42.390] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:34:42.406] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:34:42.449] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 14:34:42.462] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 14:34:54.112] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:54.127] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:34:56.565] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:56.588] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:34:56.871] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:56.894] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:34:57.179] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:57.199] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:34:57.486] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:57.501] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:34:57.607] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:57.625] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:34:57.800] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:57.817] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:34:57.969] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:57.987] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:34:58.120] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:58.141] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:34:58.284] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:58.304] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:34:58.447] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:58.464] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:34:58.616] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:58.637] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:34:58.774] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:58.795] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:34:58.925] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:58.940] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:34:59.079] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:59.096] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:34:59.248] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:59.266] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:34:59.406] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:59.422] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:34:59.556] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:59.574] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:34:59.717] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:59.732] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:34:59.870] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:34:59.885] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:35:00.049] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:35:00.071] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:35:00.224] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:35:00.238] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:35:00.383] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:35:00.399] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:35:00.561] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:35:00.580] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:35:00.728] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:35:00.743] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:35:00.881] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:35:00.897] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 14:35:01.051] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:36:14.266] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:14.289] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-25 14:36:15.897] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:36:15.916] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:36:16.017] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-08-25 14:36:16.166] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:36:16.176] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:36:16.294] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 14:36:16.304] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 14:36:17.807] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:17.822] [undefined] GET(/:id/like): likes found, removing like for video 1 with status 200 +[2025-08-25 14:36:18.386] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:18.401] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-25 14:36:18.795] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:18.815] [undefined] GET(/:id/like): likes found, removing like for video 1 with status 200 +[2025-08-25 14:36:19.205] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:19.225] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-25 14:36:19.248] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:19.264] [undefined] GET(/:id/like): likes found, removing like for video 1 with status 200 +[2025-08-25 14:36:19.380] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:19.401] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-25 14:36:19.530] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:19.548] [undefined] GET(/:id/like): likes found, removing like for video 1 with status 200 +[2025-08-25 14:36:19.684] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:19.702] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-25 14:36:19.833] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:19.850] [undefined] GET(/:id/like): likes found, removing like for video 1 with status 200 +[2025-08-25 14:36:19.987] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:20.000] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-25 14:36:20.136] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:20.158] [undefined] GET(/:id/like): likes found, removing like for video 1 with status 200 +[2025-08-25 14:36:20.289] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:20.307] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-25 14:36:20.454] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:20.474] [undefined] GET(/:id/like): likes found, removing like for video 1 with status 200 +[2025-08-25 14:36:20.609] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:20.626] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-25 14:36:20.759] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:20.773] [undefined] GET(/:id/like): likes found, removing like for video 1 with status 200 +[2025-08-25 14:36:20.928] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-08-25 14:36:20.943] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-08-25 14:36:23.296] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-08-25 14:36:23.312] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 14:36:25.616] [undefined] GET(/:id/channel): try to retrieve channel of user 5 +[2025-08-25 14:36:25.619] [undefined] GET(/:id/channel): failed to retrieve channel of user 5 because it doesn't exist with status 404 +[2025-08-25 14:36:25.634] [undefined] GET(/:id/history): try to retrieve history of user 5 +[2025-08-25 14:36:25.638] [undefined] GET(/:id/history): successfully retrieved history of user 5 with status 200 +[2025-08-25 14:36:25.694] [undefined] GET(/user/:id): Playlists retrieved for user with id 5 with status 200 +[2025-08-25 14:37:29.596] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 14:37:30.983] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-25 14:37:30.993] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-25 14:37:31.003] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 14:37:31.009] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-25 14:37:54.637] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:37:54.640] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 14:37:54.661] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:37:54.690] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:37:54.704] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:37:54.768] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 14:37:54.778] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 14:38:20.313] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:38:20.332] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:38:20.375] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:38:20.387] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:38:38.939] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:38:38.950] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:38:38.999] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:38:39.011] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:39:08.001] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:39:08.020] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:39:08.098] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:39:08.111] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:39:22.000] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:39:22.015] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:39:22.046] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:39:22.057] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:40:07.692] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:40:07.713] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:40:07.749] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:40:07.763] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 14:42:09.207] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 14:42:09.222] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 14:42:13.626] [undefined] GET(/:id): try to get video 1 +[2025-08-25 14:42:13.643] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 14:42:13.678] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 14:42:13.692] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:39:19.567] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:39:19.570] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 15:39:19.586] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:39:19.612] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:39:19.624] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:39:19.686] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 15:39:19.696] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 15:39:38.990] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:39:39.011] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:39:39.041] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:39:39.051] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:39:57.292] [undefined] POST(/:id): Video added to playlist with id 4 with status 200 +[2025-08-25 15:41:31.783] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:41:31.794] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:41:31.854] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:41:31.872] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:41:42.221] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:41:42.234] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:41:42.290] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:41:42.309] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:42:06.926] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:42:06.939] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:42:06.974] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:42:06.987] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:42:19.666] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:42:19.678] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:42:19.736] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:42:19.745] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:42:33.318] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:42:33.335] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:42:33.390] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:42:33.410] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:44:38.232] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:44:38.247] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:44:38.291] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:44:38.309] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:45:50.155] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:45:50.166] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:45:50.202] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:45:50.212] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:46:03.710] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:46:03.723] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:46:03.806] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:46:03.818] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:46:19.158] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:46:19.172] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:46:19.252] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:46:19.265] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:46:28.850] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:46:28.868] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:46:28.941] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:46:28.952] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:46:43.073] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:46:43.094] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:46:43.129] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:46:43.141] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:46:51.682] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:46:51.685] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 15:46:51.702] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:46:51.729] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:46:51.741] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:46:51.807] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 15:47:23.039] [undefined] POST(/): try to post comment +[2025-08-25 15:47:23.061] [undefined] POST(/): successfully post comment with status 200 +[2025-08-25 15:47:25.427] [undefined] GET(/:id): try to get video 1 +[2025-08-25 15:47:25.431] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 15:47:25.443] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 15:47:25.471] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 15:47:25.485] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 15:47:25.528] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 15:47:25.535] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:21:47.859] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-25 16:21:47.863] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-25 16:21:47.872] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-25 16:21:47.876] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-08-25 16:21:47.884] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:21:48.737] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-25 16:21:48.749] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:21:48.753] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-25 16:21:48.762] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:21:51.344] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-25 16:21:51.347] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-25 16:22:22.598] [undefined] POST(/): try to upload video with status undefined +[2025-08-25 16:22:22.603] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-25 16:22:22.827] [undefined] POST(/thumbnail): try to add thumbnail to video 2 +[2025-08-25 16:22:22.831] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-25 16:22:22.856] [undefined] PUT(/:id/tags): try to add tags to video 2 +[2025-08-25 16:22:22.867] [undefined] PUT(/:id/tags): Tag sasa already exists for video 2 with status 200 +[2025-08-25 16:22:22.870] [undefined] PUT(/:id/tags): successfully added tags to video 2 with status 200 +[2025-08-25 16:22:24.909] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 16:22:27.807] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:22:27.811] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:22:27.825] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:22:27.849] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:22:27.866] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:22:27.917] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:22:27.925] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:22:36.853] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:22:36.858] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:22:36.870] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:22:36.904] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:22:36.919] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:22:36.958] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:22:36.966] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:23:15.258] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:23:15.262] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:23:15.273] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:23:15.298] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:23:15.314] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:23:15.389] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:23:15.398] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:23:25.239] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:23:25.253] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:23:25.261] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:23:25.286] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:23:25.304] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:23:25.349] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:23:25.358] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:23:34.064] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:23:34.067] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:23:34.084] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:23:34.111] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:23:34.126] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:23:34.221] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:23:34.231] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:23:58.139] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:23:58.142] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:23:58.160] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:23:58.184] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:23:58.199] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:23:58.239] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:23:58.252] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:24:05.426] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:24:05.429] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:24:05.448] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:24:05.471] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:24:05.492] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:24:05.544] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:24:05.553] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:24:19.268] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:24:19.272] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:24:19.290] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:24:19.314] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:24:19.328] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:24:19.409] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:24:19.421] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:24:39.501] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:24:39.504] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:24:39.520] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:24:39.542] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:24:39.556] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:24:39.603] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:24:39.612] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:25:12.031] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:25:12.033] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:25:12.049] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:25:12.079] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:25:12.095] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:25:12.176] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:25:12.184] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:25:18.037] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:25:18.041] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:25:18.059] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:25:18.086] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:25:18.103] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:25:18.147] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:25:18.156] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:25:28.240] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 16:25:38.420] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-25 16:25:38.423] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-25 16:25:38.426] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-25 16:25:38.429] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-08-25 16:25:38.434] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:25:39.878] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-25 16:25:42.592] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:25:51.763] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:25:51.766] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:25:51.784] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:25:51.805] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:25:51.821] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:25:51.919] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:25:51.927] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:26:02.445] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:26:02.458] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:26:02.503] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:26:02.514] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:28:25.948] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:28:25.961] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:28:26.022] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:28:26.032] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:28:44.701] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-25 16:28:44.916] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:28:44.934] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:28:44.972] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:28:44.988] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:28:54.587] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-25 16:29:10.555] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-25 16:30:30.645] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:30:30.658] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:30:30.681] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:30:30.692] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:31:12.859] [undefined] POST(/login): try to login with username 'astria' +[2025-08-25 16:31:12.915] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-25 16:31:13.146] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 16:31:19.325] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:31:19.328] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:31:19.342] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:31:19.428] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:31:19.443] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:31:19.476] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:31:19.484] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:31:21.685] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:31:21.696] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:31:21.706] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:31:21.736] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:31:21.745] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:31:21.796] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:31:21.804] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:31:35.595] [undefined] POST(/): try to post comment +[2025-08-25 16:31:35.613] [undefined] POST(/): successfully post comment with status 200 +[2025-08-25 16:31:43.544] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 16:33:03.444] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:33:03.450] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:33:03.518] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:33:03.521] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:33:03.531] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:33:12.849] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:33:12.854] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:33:12.858] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:33:12.864] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:33:12.872] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:33:20.914] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:33:20.920] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:33:20.923] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:33:20.926] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:33:20.935] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:33:44.580] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:33:44.584] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:33:44.587] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:33:44.591] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:33:44.604] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:34:12.270] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:34:12.275] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:34:12.277] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:34:12.281] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:34:12.289] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:34:20.285] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:34:20.288] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:34:20.291] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:34:20.297] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:34:20.304] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:34:43.954] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:34:43.957] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:34:43.965] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:34:43.968] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:34:43.974] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:34:57.459] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:34:57.464] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:34:57.473] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:34:57.484] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:34:57.492] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:35:10.632] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:35:10.636] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:35:10.641] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:35:10.645] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:35:10.652] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:35:24.943] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:35:24.946] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:35:24.955] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:35:24.961] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:35:24.971] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:35:31.244] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:35:31.247] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:35:31.256] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:35:31.259] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:35:31.264] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:35:36.240] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:35:54.271] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:35:54.276] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:35:54.285] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:35:54.290] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:35:54.298] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:36:05.609] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:36:05.613] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:36:05.622] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:36:05.625] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:36:05.634] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:36:25.106] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:36:25.110] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:36:25.117] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:36:25.121] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:36:25.128] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:36:45.734] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:36:45.737] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:36:45.745] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:36:45.750] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:36:45.763] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:37:01.446] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:37:01.450] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:37:01.456] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:37:01.460] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:37:01.466] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:37:19.303] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:37:19.306] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:37:19.315] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:37:19.321] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:37:19.331] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:37:47.523] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:37:47.527] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:37:47.535] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:37:47.539] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:37:47.546] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:37:54.710] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:37:54.715] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:37:54.722] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:37:54.730] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:37:54.741] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:38:10.787] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:38:10.791] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:38:10.798] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:38:10.801] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:38:10.809] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:38:31.050] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:38:31.056] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:38:31.064] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:38:31.071] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:38:31.079] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:38:39.658] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:38:39.662] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:38:39.671] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:38:39.675] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:38:39.682] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:38:43.858] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-25 16:38:44.656] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:38:44.661] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:38:44.671] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:38:44.675] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:38:44.681] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:38:48.152] [undefined] GET(/:id): try to get video 1 +[2025-08-25 16:38:48.157] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:38:48.173] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 16:38:48.241] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 16:38:48.260] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 16:38:48.293] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 16:38:48.304] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 16:38:49.367] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:38:49.370] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:38:49.379] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:38:49.382] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:38:49.422] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:39:23.469] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:39:23.483] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:39:23.487] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:39:23.495] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:39:25.617] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 16:39:28.220] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:39:28.225] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:39:28.240] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:39:28.244] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:39:28.252] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:39:32.978] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:39:32.992] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:39:32.996] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:39:33.004] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:39:45.904] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:39:45.917] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:39:45.921] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:39:45.929] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:40:06.768] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:40:06.779] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:40:06.784] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:40:06.791] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:40:13.557] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:40:13.567] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:40:13.575] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:40:13.584] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:40:29.060] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-25 16:40:29.064] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-25 16:40:29.072] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-25 16:40:29.077] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-08-25 16:40:29.085] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-25 16:40:32.688] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-25 16:40:32.702] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:40:32.708] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-25 16:40:32.715] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:41:27.451] [undefined] POST(/login): try to login with username 'astria' +[2025-08-25 16:41:27.507] [undefined] POST(/login): failed to login with status 401 +[2025-08-25 16:41:37.435] [undefined] POST(/login): try to login with username 'astria' +[2025-08-25 16:41:37.492] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-25 16:41:37.585] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 16:41:43.718] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:41:43.725] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:41:43.731] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:41:43.734] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:41:43.746] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:41:45.005] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:41:45.014] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:41:45.019] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:41:45.028] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:41:46.835] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:41:46.839] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:42:36.602] [undefined] POST(/): try to upload video with status undefined +[2025-08-25 16:42:36.607] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-25 16:42:36.679] [undefined] POST(/thumbnail): try to add thumbnail to video 3 +[2025-08-25 16:42:36.682] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-25 16:42:36.712] [undefined] PUT(/:id/tags): try to add tags to video 3 +[2025-08-25 16:42:36.722] [undefined] PUT(/:id/tags): successfully added tags to video 3 with status 200 +[2025-08-25 16:42:41.695] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 16:42:43.533] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:42:43.544] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:42:43.550] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:42:43.561] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:43:04.795] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:43:04.809] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:43:04.814] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:43:04.823] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:43:10.183] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:43:10.194] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:43:10.197] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:43:10.207] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:43:22.033] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:43:22.045] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:43:22.050] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:43:22.058] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:44:17.503] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:44:17.509] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:45:35.382] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:45:35.389] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:45:54.242] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:45:54.246] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:47:17.367] [undefined] POST(/): try to upload video with status undefined +[2025-08-25 16:47:17.381] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-25 16:47:17.512] [undefined] POST(/thumbnail): try to add thumbnail to video 4 +[2025-08-25 16:47:17.528] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-25 16:47:17.570] [undefined] PUT(/:id/tags): try to add tags to video 4 +[2025-08-25 16:47:17.583] [undefined] PUT(/:id/tags): successfully added tags to video 4 with status 200 +[2025-08-25 16:47:21.242] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 16:47:32.449] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:47:32.453] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:47:32.467] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:47:32.477] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:47:32.487] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:47:34.033] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:47:34.040] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:47:34.050] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:47:34.056] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:47:40.111] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 16:47:40.130] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:47:40.135] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 16:47:40.144] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:48:26.272] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:48:26.290] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:48:26.314] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 16:48:26.322] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 16:48:40.434] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 16:48:40.450] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:48:40.454] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 16:48:40.466] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:49:01.678] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:49:01.691] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:49:01.715] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 16:49:01.726] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 16:49:06.991] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 16:49:10.198] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:49:10.201] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:49:10.217] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:49:10.241] [undefined] GET(/:id/similar): try to get similar videos for video 4 +[2025-08-25 16:49:10.251] [undefined] GET(/:id/similar): successfully get similar videos for video 4 with status 200 +[2025-08-25 16:49:10.275] [undefined] GET(/:id/views): try to add views for video 4 +[2025-08-25 16:49:10.286] [undefined] GET(/:id/views): successfully added views for video 4 with status 200 +[2025-08-25 16:49:11.248] [undefined] GET(/:id/like): try to toggle like on video 4 +[2025-08-25 16:49:11.267] [undefined] GET(/:id/like): no likes found adding likes for video 4 with status 200 +[2025-08-25 16:49:12.722] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 16:49:17.282] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:49:17.286] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:49:17.299] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 16:49:17.303] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 16:49:17.310] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 16:49:19.130] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:49:19.138] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:49:19.145] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:49:19.151] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:49:21.908] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 16:49:21.921] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:49:21.925] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 16:49:21.933] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:49:35.567] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 16:49:35.580] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:49:35.583] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 16:49:35.591] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:49:40.942] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 16:49:40.960] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 16:49:40.968] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:49:40.985] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:49:54.302] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 16:49:54.315] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:49:54.318] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 16:49:54.328] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:50:03.719] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 16:50:03.726] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:50:03.732] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 16:50:03.740] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:50:27.029] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 16:50:27.042] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:50:27.044] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 16:50:27.053] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:50:45.764] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:50:45.777] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:50:45.782] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:50:45.789] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:50:46.889] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 16:50:46.893] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 16:50:49.653] [undefined] GET(/search): try to search user by username A +[2025-08-25 16:50:49.661] [undefined] GET(/search): successfully found user with username A with status 200 +[2025-08-25 16:50:49.667] [undefined] GET(/search): try to search user by username As +[2025-08-25 16:50:49.674] [undefined] GET(/search): successfully found user with username As with status 200 +[2025-08-25 16:50:49.822] [undefined] GET(/search): try to search user by username Ast +[2025-08-25 16:50:49.828] [undefined] GET(/search): successfully found user with username Ast with status 200 +[2025-08-25 16:50:50.056] [undefined] GET(/search): try to search user by username Astr +[2025-08-25 16:50:50.061] [undefined] GET(/search): successfully found user with username Astr with status 200 +[2025-08-25 16:50:50.249] [undefined] GET(/search): try to search user by username Astri +[2025-08-25 16:50:50.252] [undefined] GET(/search): successfully found user with username Astri with status 200 +[2025-08-25 16:50:56.824] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 16:50:56.837] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 16:50:56.842] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 16:50:56.849] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 16:50:57.946] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 16:50:57.959] [undefined] GET(/:id): try to get video 4 +[2025-08-25 16:50:57.963] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 16:50:57.971] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-25 16:58:58.430] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-25 16:59:05.144] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-25 17:09:10.630] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 18:22:19.895] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:22:19.907] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:22:29.780] [undefined] POST(/login): try to login with username 'astria' +[2025-08-25 18:22:29.790] [undefined] POST(/login): failed to login with status 401 +[2025-08-25 18:22:31.958] [undefined] POST(/login): try to login with username 'astria' +[2025-08-25 18:22:31.967] [undefined] POST(/login): failed to login with status 401 +[2025-08-25 18:22:33.297] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 18:22:38.558] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 18:22:38.563] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 18:22:38.568] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 18:22:38.574] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 18:22:38.582] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 18:24:46.650] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:24:46.659] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:24:46.665] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:24:46.673] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:25:59.068] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:25:59.079] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:25:59.084] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:25:59.094] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:26:12.014] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:26:12.024] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:26:12.030] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:26:12.038] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:26:17.427] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:26:17.438] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:26:17.443] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:26:17.453] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:26:48.205] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:26:48.217] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:26:48.222] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:26:48.231] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:26:49.668] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:26:49.680] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:26:49.686] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:26:49.695] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:27:22.959] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:27:22.971] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:27:22.977] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:27:22.986] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:27:28.948] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:27:28.956] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:27:28.963] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:27:28.973] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:28:06.521] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:28:06.533] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:28:06.538] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:28:06.547] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:28:15.964] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:28:15.977] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:28:15.986] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:28:15.999] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:28:24.624] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:28:24.636] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:28:24.642] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:28:24.651] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:28:46.895] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:28:46.915] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:28:46.920] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:28:46.929] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:28:58.305] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:28:58.317] [undefined] GET(/:id/stats): try to get stats +[2025-08-25 18:28:58.322] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:28:58.332] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-25 18:28:59.376] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-25 18:28:59.388] [undefined] GET(/:id): try to get video 1 +[2025-08-25 18:28:59.393] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-25 18:28:59.405] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 18:29:19.132] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 18:37:02.981] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 18:37:34.554] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:37:34.564] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:37:34.584] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:37:34.589] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 1 with status 200 +[2025-08-25 18:38:03.708] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:38:03.719] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:38:03.737] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:38:03.742] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 1 with status 200 +[2025-08-25 18:38:12.531] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:38:12.542] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:38:12.565] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:38:12.569] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 1 with status 200 +[2025-08-25 18:38:45.424] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:38:45.435] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:38:45.455] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:38:45.461] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 1 with status 200 +[2025-08-25 18:38:51.373] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:38:51.383] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:38:51.400] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:38:51.404] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 1 with status 200 +[2025-08-25 18:39:08.866] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:39:08.877] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:39:08.894] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:39:08.899] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 1 with status 200 +[2025-08-25 18:39:15.758] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:39:15.770] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:39:15.788] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:39:15.794] [undefined] GET(/:id/channel/subscribed): user 1 is not subscribed to channel 1 with status 200 +[2025-08-25 18:39:26.630] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-25 18:39:26.640] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 18:39:40.692] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:39:40.704] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:39:40.728] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:39:40.733] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-25 18:39:53.975] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:39:53.986] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:39:54.009] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:39:54.014] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-25 18:40:18.210] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:40:18.221] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:40:18.242] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:40:18.248] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-25 18:40:37.777] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:40:37.788] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:40:37.809] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:40:37.815] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-25 18:41:01.406] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:41:01.417] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:41:01.442] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:41:01.447] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-25 18:41:11.804] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:41:11.815] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:41:11.872] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:41:11.877] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-25 18:41:22.616] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:41:22.628] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:41:22.646] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:41:22.651] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-25 18:41:54.710] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:41:54.722] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:41:54.810] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:41:54.815] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-25 18:42:05.744] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:42:05.754] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:42:05.792] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:42:05.797] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-25 18:42:15.211] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:42:15.222] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:42:15.269] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:42:15.274] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-25 18:42:16.393] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-25 18:42:16.405] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 18:42:17.007] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-25 18:42:17.017] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 18:43:59.798] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-25 18:43:59.808] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-25 18:43:59.825] [undefined] GET(/:id/channel/subscribed): check if user 1 is subscribed to channel 1 +[2025-08-25 18:43:59.831] [undefined] GET(/:id/channel/subscribed): user 1 is subscribed to channel 1 with status 200 +[2025-08-25 18:44:21.538] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 18:44:24.056] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 18:44:24.061] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 18:44:24.065] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 18:44:24.071] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 18:44:24.080] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 18:44:26.208] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-25 18:44:28.595] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 18:44:28.600] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 18:44:28.650] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 18:44:28.656] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 18:44:28.665] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 18:44:30.040] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 18:44:32.641] [undefined] GET(/:id): try to get video 1 +[2025-08-25 18:44:32.645] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 18:44:32.656] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 18:44:32.675] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 18:44:32.688] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 18:44:32.775] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 18:44:32.784] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 18:44:34.748] [undefined] POST(/:id): Video added to playlist with id 1 with status 200 +[2025-08-25 18:44:35.763] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 18:44:41.776] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-25 18:44:41.782] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-25 18:44:41.786] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-25 18:44:41.791] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-25 18:44:41.802] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 18:44:46.676] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-25 18:48:05.590] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-25 18:48:20.667] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-25 18:48:29.790] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-25 18:50:10.568] [undefined] GET(/:id): try to get video 1 +[2025-08-25 18:50:10.573] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 18:50:10.584] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 18:50:10.602] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 18:50:10.613] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 18:50:10.709] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 18:50:10.718] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 18:50:18.485] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-25 18:50:18.495] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-25 18:50:19.134] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-25 18:50:31.012] [undefined] GET(/:id): try to get video 1 +[2025-08-25 18:50:31.016] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-25 18:50:31.031] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-25 18:50:31.062] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-08-25 18:50:31.078] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-08-25 18:50:31.131] [undefined] GET(/:id/views): try to add views for video 1 +[2025-08-25 18:50:31.140] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-08-25 18:50:31.676] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-25 18:50:31.686] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-25 18:50:39.047] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-26 10:02:45.244] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-26 10:03:38.650] [undefined] POST(/): failed because email already exists with status 400 +[2025-08-26 10:04:04.335] [undefined] POST(/): failed because email already exists with status 400 +[2025-08-26 10:04:04.507] [undefined] POST(/): failed because email already exists with status 400 +[2025-08-26 10:04:16.443] [undefined] POST(/): try to register a user with username: lol and email: s.guerin@axelerance.fr +[2025-08-26 10:04:19.035] [undefined] POST(/): successfully registered with status 200 +[2025-08-26 10:04:37.223] [undefined] POST(/verify-email): try to verify email for s.guerin@axelerance.fr with token cfcad +[2025-08-26 10:04:37.239] [undefined] POST(/verify-email): successfully verified email for s.guerin@axelerance.fr with status 200 +[2025-08-26 10:04:47.505] [undefined] POST(/login): try to login with username 'lol' +[2025-08-26 10:04:47.564] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-26 10:04:47.735] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 10:05:41.211] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 10:05:41.214] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 10:05:41.222] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 10:05:41.226] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 10:05:41.238] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:06:21.942] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 10:06:21.945] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 10:06:21.956] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 10:06:21.960] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 10:06:21.970] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:07:09.042] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 10:07:09.046] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 10:07:09.055] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 10:07:09.059] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 10:07:09.072] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:07:28.263] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 10:07:28.267] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 10:07:28.275] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 10:07:28.279] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 10:07:28.290] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:07:38.771] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 10:07:38.775] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 10:08:05.608] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 10:08:05.611] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 10:08:05.621] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 10:08:05.624] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 10:08:05.634] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:08:10.306] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:09:13.255] [undefined] POST(/): Playlist created with id 7 with status 200 +[2025-08-26 10:09:13.275] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:09:14.747] [undefined] GET(/:id): Playlist retrieved with id 7 with status 200 +[2025-08-26 10:09:36.224] [undefined] GET(/:id): Playlist retrieved with id 7 with status 200 +[2025-08-26 10:09:46.405] [undefined] GET(/:id): Playlist retrieved with id 7 with status 200 +[2025-08-26 10:10:00.502] [undefined] GET(/:id): Playlist retrieved with id 7 with status 200 +[2025-08-26 10:10:06.692] [undefined] DELETE(/:id): Playlist deleted with status 200 +[2025-08-26 10:10:06.734] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 10:10:06.737] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 10:10:06.740] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 10:10:06.744] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 10:10:06.757] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:10:11.206] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 10:10:59.669] [undefined] POST(/login): try to login with username 'lol' +[2025-08-26 10:10:59.730] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-26 10:10:59.989] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 10:11:07.572] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 10:11:07.577] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 10:11:07.585] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 10:11:07.589] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 10:11:07.597] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:11:14.635] [undefined] POST(/): Playlist created with id 8 with status 200 +[2025-08-26 10:11:14.752] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:11:22.448] [undefined] GET(/:id): Playlist retrieved with id 8 with status 200 +[2025-08-26 10:11:24.732] [undefined] DELETE(/:id): Playlist deleted with status 200 +[2025-08-26 10:11:24.794] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 10:11:24.797] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 10:11:24.801] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 10:11:24.806] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 10:11:24.815] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:11:26.703] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 10:12:18.270] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 10:12:22.183] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 10:12:24.713] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 10:12:24.716] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 10:12:24.725] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 10:12:24.730] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 10:12:24.739] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:13:44.251] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 10:13:53.722] [undefined] GET(/:id): try to get video 2 +[2025-08-26 10:13:53.725] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:13:53.740] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-26 10:13:53.764] [undefined] GET(/:id/similar): try to get similar videos for video 2 +[2025-08-26 10:13:53.776] [undefined] GET(/:id/similar): successfully get similar videos for video 2 with status 200 +[2025-08-26 10:13:53.868] [undefined] GET(/:id/views): try to add views for video 2 +[2025-08-26 10:13:53.878] [undefined] GET(/:id/views): successfully added views for video 2 with status 200 +[2025-08-26 10:16:29.567] [undefined] GET(/:id): try to get video 4 +[2025-08-26 10:16:29.589] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 10:16:29.601] [undefined] GET(/:id): successfully get video 4 with status 200 +[2025-08-26 10:16:29.627] [undefined] GET(/:id/similar): try to get similar videos for video 4 +[2025-08-26 10:16:29.637] [undefined] GET(/:id/similar): successfully get similar videos for video 4 with status 200 +[2025-08-26 10:16:29.711] [undefined] GET(/:id/views): try to add views for video 4 +[2025-08-26 10:16:29.729] [undefined] GET(/:id/views): successfully added views for video 4 with status 200 +[2025-08-26 11:12:59.783] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 11:12:59.786] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 11:12:59.795] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 11:12:59.800] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 11:12:59.805] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 11:13:04.592] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 11:18:05.615] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 11:18:05.619] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 11:18:05.624] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 11:18:05.630] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 11:18:05.639] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 11:21:36.442] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 11:21:41.944] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 15:23:15.531] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 15:23:34.781] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 15:27:25.113] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 15:27:31.837] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:27:31.840] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:27:31.849] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 15:27:31.853] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:27:31.860] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:27:38.982] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:27:38.988] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 15:27:38.995] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:27:39.000] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:27:39.007] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:27:41.475] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:27:41.479] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 15:27:41.487] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:27:41.493] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:27:41.501] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:27:43.170] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:27:43.174] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 15:27:43.182] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:27:43.190] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:27:43.199] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:28:18.239] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:28:18.243] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:28:18.251] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 15:28:18.255] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:28:18.260] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:28:29.304] [undefined] POST(/): try to create new channel with owner 6 and name Lol +[2025-08-26 15:28:29.310] [undefined] POST(/): Successfully created new channel with name Lol with status 200 +[2025-08-26 15:28:29.331] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:28:29.338] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:28:31.216] [undefined] GET(/:id): try to get channel with id 3 +[2025-08-26 15:28:31.229] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:28:31.233] [undefined] GET(/:id): Successfully get channel with id 3 with status 200 +[2025-08-26 15:28:31.241] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:28:42.096] [undefined] PUT(/:id): try to update channel with id 3 +[2025-08-26 15:28:42.103] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-26 15:28:44.775] [undefined] GET(/:id): try to get channel with id 3 +[2025-08-26 15:28:44.785] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:28:44.793] [undefined] GET(/:id): Successfully get channel with id 3 with status 200 +[2025-08-26 15:28:44.800] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:28:48.079] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:28:48.084] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:29:35.594] [undefined] POST(/): try to upload video with status undefined +[2025-08-26 15:29:35.608] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-26 15:29:35.848] [undefined] POST(/thumbnail): try to add thumbnail to video 5 +[2025-08-26 15:29:35.852] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-26 15:29:35.888] [undefined] PUT(/:id/tags): try to add tags to video 5 +[2025-08-26 15:29:35.898] [undefined] PUT(/:id/tags): successfully added tags to video 5 with status 200 +[2025-08-26 15:29:39.128] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 15:29:57.760] [undefined] GET(/:id): try to get video 5 +[2025-08-26 15:29:57.763] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:29:57.779] [undefined] GET(/:id): successfully get video 5 with status 200 +[2025-08-26 15:29:57.803] [undefined] GET(/:id/similar): try to get similar videos for video 5 +[2025-08-26 15:29:57.814] [undefined] GET(/:id/similar): successfully get similar videos for video 5 with status 200 +[2025-08-26 15:29:57.856] [undefined] GET(/:id/views): try to add views for video 5 +[2025-08-26 15:29:57.874] [undefined] GET(/:id/views): successfully added views for video 5 with status 200 +[2025-08-26 15:30:01.024] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 3 +[2025-08-26 15:30:01.046] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-26 15:30:03.756] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 15:33:13.660] [undefined] GET(/:id): try to get video 5 +[2025-08-26 15:33:13.664] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:33:13.679] [undefined] GET(/:id): successfully get video 5 with status 200 +[2025-08-26 15:33:13.701] [undefined] GET(/:id/similar): try to get similar videos for video 5 +[2025-08-26 15:33:13.714] [undefined] GET(/:id/similar): successfully get similar videos for video 5 with status 200 +[2025-08-26 15:33:13.793] [undefined] GET(/:id/views): try to add views for video 5 +[2025-08-26 15:33:13.803] [undefined] GET(/:id/views): successfully added views for video 5 with status 200 +[2025-08-26 15:33:44.021] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 15:34:58.333] [undefined] GET(/:id/stats): failed due to invalid values with status 400 +[2025-08-26 15:34:58.339] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-26 15:35:06.306] [undefined] GET(/:id/stats): failed due to invalid values with status 400 +[2025-08-26 15:35:06.316] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-26 15:35:53.954] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:35:53.973] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:35:54.017] [undefined] GET(/:id/channel/subscribed): check if user 6 is subscribed to channel 1 +[2025-08-26 15:35:54.023] [undefined] GET(/:id/channel/subscribed): user 6 is not subscribed to channel 1 with status 200 +[2025-08-26 15:36:02.097] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-26 15:36:02.108] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-26 15:36:06.090] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-26 15:36:06.108] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-26 15:36:07.000] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-08-26 15:36:07.027] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-26 15:36:13.655] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 6 with status 200 +[2025-08-26 15:41:26.274] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:41:26.279] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:41:26.288] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:41:26.293] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:41:26.301] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:41:50.682] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:41:50.686] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:41:50.695] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:41:50.703] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:41:50.714] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:42:35.491] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:42:35.497] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:42:35.506] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:42:35.512] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:42:35.523] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:42:49.724] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:42:49.729] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:42:49.738] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:42:49.744] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:42:49.757] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:42:55.139] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:42:55.144] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:42:55.153] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:42:55.157] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:42:55.168] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:43:15.023] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:43:15.028] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:43:15.032] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:43:15.037] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:43:15.045] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:43:26.176] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:43:26.181] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:43:26.187] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:43:26.194] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:43:26.204] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:44:08.173] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:44:08.178] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:44:08.186] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:44:08.192] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:44:08.199] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:44:25.097] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:44:25.102] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:44:25.110] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:44:25.116] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:44:25.125] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:44:41.414] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:44:41.419] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:44:41.427] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:44:41.436] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:44:41.449] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:45:51.589] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:45:51.594] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:45:51.601] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:45:51.605] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:45:51.616] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:46:27.177] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:46:27.181] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:46:27.191] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:46:27.200] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:46:27.209] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:46:33.985] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:46:33.990] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:46:33.998] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:46:34.004] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:46:34.017] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:46:49.302] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:46:49.308] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:46:49.316] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:46:49.323] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:46:49.334] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:48:01.797] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:48:01.803] [undefined] GET(/:id/channel): successfully retrieved channel of user 6 with status 200 +[2025-08-26 15:48:01.813] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:48:01.822] [undefined] GET(/:id/history): successfully retrieved history of user 6 with status 200 +[2025-08-26 15:48:01.833] [undefined] GET(/user/:id): Playlists retrieved for user with id 6 with status 200 +[2025-08-26 15:48:04.117] [undefined] DELETE(/:id): try to delete user 6 +[2025-08-26 15:48:04.135] [undefined] DELETE(/:id): successfully deleted user 6 with status undefined +[2025-08-26 15:48:12.208] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:48:12.216] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 15:48:12.225] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:48:12.232] [undefined] GET(/user/:id): failed because user doesn't exists with status 404 +[2025-08-26 15:48:12.238] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 15:48:24.141] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:48:24.147] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 15:48:24.155] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:48:24.158] [undefined] GET(/user/:id): failed because user doesn't exists with status 404 +[2025-08-26 15:48:24.162] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 15:48:26.460] [undefined] GET(/see-later): No 'See Later' playlist found for user with id 6 with status 404 +[2025-08-26 15:48:28.549] [undefined] GET(/see-later): No 'See Later' playlist found for user with id 6 with status 404 +[2025-08-26 15:48:29.648] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:48:29.653] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 15:48:29.657] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:48:29.662] [undefined] GET(/user/:id): failed because user doesn't exists with status 404 +[2025-08-26 15:48:29.667] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 15:48:31.930] [undefined] DELETE(/:id): failed because user doesn't exists with status 404 +[2025-08-26 15:48:38.126] [undefined] POST(/login): try to login with username 'astria' +[2025-08-26 15:48:38.185] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-26 15:48:38.274] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-26 15:48:50.976] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-26 15:48:54.169] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-26 15:48:54.173] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-26 15:48:54.182] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-26 15:48:54.191] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-26 15:48:54.200] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-26 15:48:57.070] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-08-26 15:48:59.285] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-26 15:48:59.289] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-26 15:48:59.302] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-26 15:48:59.307] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-26 15:48:59.315] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-26 15:49:01.900] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:49:01.914] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:49:01.919] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:49:01.929] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:49:43.316] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:49:43.326] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:49:43.332] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:49:43.339] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:50:04.443] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:50:04.456] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:50:04.459] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:50:04.470] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:50:10.998] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:50:11.012] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:50:11.016] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:50:11.026] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:50:41.680] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:50:41.693] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:50:41.700] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:50:41.711] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:50:48.472] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:50:48.487] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:50:48.493] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:50:48.504] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:52:15.045] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:52:15.060] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:52:15.068] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:52:15.087] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:52:33.686] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:52:33.702] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:52:33.709] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:52:33.719] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:53:06.388] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:53:06.398] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:53:06.402] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:53:06.419] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:53:17.500] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:53:17.514] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:53:17.521] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:53:17.534] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:53:29.874] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:53:29.888] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:54:48.374] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-26 15:54:48.380] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-26 15:54:48.388] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-26 15:54:48.395] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-26 15:54:48.402] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-26 15:54:49.010] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:54:49.025] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:54:49.033] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:54:49.043] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:54:58.353] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-26 15:54:58.366] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:54:58.371] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-26 15:54:58.379] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:55:00.659] [undefined] DELETE(/:id): try to delete channel with id 1 +[2025-08-26 15:55:00.678] [undefined] DELETE(/:id): Successfully deleted channel with status 200 +[2025-08-26 15:55:00.737] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-26 15:55:00.741] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-26 15:55:00.747] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-26 15:55:00.753] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-26 15:55:00.762] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-26 15:55:08.732] [undefined] POST(/): try to create new channel with owner 1 and name lol +[2025-08-26 15:55:08.737] [undefined] POST(/): Successfully created new channel with name lol with status 200 +[2025-08-26 15:55:08.756] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-26 15:55:08.760] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-26 15:55:10.726] [undefined] GET(/:id): try to get channel with id 4 +[2025-08-26 15:55:10.738] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:55:10.743] [undefined] GET(/:id): Successfully get channel with id 4 with status 200 +[2025-08-26 15:55:10.751] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:55:12.338] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-26 15:55:12.344] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-26 15:55:32.631] [undefined] POST(/): try to upload video with status undefined +[2025-08-26 15:55:32.636] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-26 15:55:32.709] [undefined] POST(/thumbnail): try to add thumbnail to video 6 +[2025-08-26 15:55:32.713] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-26 15:55:32.738] [undefined] PUT(/:id/tags): try to add tags to video 6 +[2025-08-26 15:55:32.748] [undefined] PUT(/:id/tags): successfully added tags to video 6 with status 200 +[2025-08-26 15:55:35.088] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-26 15:55:39.465] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-26 15:55:39.470] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-26 15:55:39.483] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-26 15:55:39.488] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-26 15:55:39.496] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-26 15:55:41.408] [undefined] GET(/:id): try to get channel with id 4 +[2025-08-26 15:55:41.420] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 15:55:41.424] [undefined] GET(/:id): Successfully get channel with id 4 with status 200 +[2025-08-26 15:55:41.433] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 15:55:44.085] [undefined] DELETE(/:id): try to delete channel with id 4 +[2025-08-26 15:55:44.105] [undefined] DELETE(/:id): Successfully deleted channel with status 200 +[2025-08-26 15:55:44.165] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-26 15:55:44.168] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-26 15:55:44.173] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-26 15:55:44.178] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-26 15:55:44.185] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-26 15:55:45.728] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-08-26 15:55:48.768] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-26 15:55:48.773] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-26 15:55:48.782] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-26 15:55:48.788] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-26 15:55:48.796] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-26 15:57:00.479] [undefined] GET(/see-later): No 'See Later' playlist found for user with id 6 with status 404 +[2025-08-26 15:57:04.027] [undefined] GET(/:id/channel): try to retrieve channel of user 6 +[2025-08-26 15:57:04.030] [undefined] GET(/:id/history): try to retrieve history of user 6 +[2025-08-26 15:57:04.044] [undefined] GET(/user/:id): failed because user doesn't exists with status 404 +[2025-08-26 15:57:04.047] [undefined] GET(/:id/channel): failed to retrieve channel of user 6 because it doesn't exist with status 404 +[2025-08-26 15:57:04.054] [undefined] GET(/:id/history): failed to retrieve history of user 6 because it doesn't exist with status 404 +[2025-08-26 15:57:05.125] [undefined] GET(/see-later): No 'See Later' playlist found for user with id 6 with status 404 +[2025-08-26 16:09:56.968] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-26 16:09:56.972] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-08-26 16:10:03.448] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-26 16:10:06.841] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-26 16:10:06.845] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-26 16:10:06.859] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-26 16:10:06.863] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-08-26 16:10:06.871] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-26 16:10:08.135] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-26 16:10:08.146] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 16:10:08.153] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-26 16:10:08.159] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 16:10:09.575] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-26 16:10:09.580] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-26 16:10:10.872] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-26 16:10:10.885] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 16:10:10.890] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-26 16:10:10.897] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 16:10:11.917] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:10:11.945] [undefined] GET(/:id): try to get video 1 +[2025-08-26 16:10:11.950] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:10:11.960] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-26 16:11:12.845] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:11:12.860] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:11:12.866] [undefined] GET(/:id): try to get video 1 +[2025-08-26 16:11:12.879] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-26 16:13:04.558] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:13:04.568] [undefined] GET(/:id): try to get video 1 +[2025-08-26 16:13:04.573] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:13:04.585] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-26 16:13:25.046] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:13:25.058] [undefined] GET(/:id): try to get video 1 +[2025-08-26 16:13:25.062] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:13:25.072] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-26 16:13:40.023] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:13:40.037] [undefined] GET(/:id): try to get video 1 +[2025-08-26 16:13:40.041] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:13:40.055] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-26 16:14:34.733] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:14:34.746] [undefined] GET(/:id): try to get video 1 +[2025-08-26 16:14:34.750] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:14:34.759] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-26 16:14:58.054] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:14:58.068] [undefined] GET(/:id): try to get video 1 +[2025-08-26 16:14:58.074] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:14:58.084] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-26 16:15:10.520] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:15:10.536] [undefined] GET(/:id): try to get video 1 +[2025-08-26 16:15:10.540] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:15:10.553] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-26 16:15:12.810] [undefined] DELETE(/:id): failed due to invalid values with status 400 +[2025-08-26 16:15:18.652] [undefined] DELETE(/:id): failed due to invalid values with status 400 +[2025-08-26 16:15:43.306] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:15:43.315] [undefined] GET(/:id): try to get video 1 +[2025-08-26 16:15:43.320] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:15:43.329] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-26 16:16:01.555] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:16:01.569] [undefined] GET(/:id): try to get video 1 +[2025-08-26 16:16:01.573] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:16:01.587] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-08-26 16:16:03.631] [undefined] DELETE(/:id): try to delete video 1 +[2025-08-26 16:16:03.654] [undefined] DELETE(/:id): successfully deleted video with status 200 +[2025-08-26 16:16:10.685] [undefined] GET(/:id): failed because video not found with status 404 +[2025-08-26 16:16:10.689] [undefined] GET(/:id/likes/day): failed because video not found with status 404 +[2025-08-26 16:16:14.087] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-26 16:16:14.091] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-26 16:16:14.096] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-26 16:16:14.102] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-08-26 16:16:14.114] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-26 16:16:16.462] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-26 16:16:16.475] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 16:16:16.480] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-26 16:16:16.488] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 16:16:18.484] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:16:18.498] [undefined] GET(/:id): try to get video 2 +[2025-08-26 16:16:18.502] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:16:18.512] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-26 16:16:28.707] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:16:28.718] [undefined] GET(/:id): try to get video 2 +[2025-08-26 16:16:28.722] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:16:28.740] [undefined] GET(/:id): successfully get video 2 with status 200 +[2025-08-26 16:16:39.033] [undefined] DELETE(/:id): try to delete video 2 +[2025-08-26 16:16:39.059] [undefined] DELETE(/:id): successfully deleted video with status 200 +[2025-08-26 16:16:54.602] [undefined] DELETE(/:id): failed because video not found with status 404 +[2025-08-26 16:17:04.670] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-26 16:17:04.684] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 16:17:04.689] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-26 16:17:04.697] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 16:17:20.798] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-26 16:17:20.811] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 16:17:20.822] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-26 16:17:20.829] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 16:17:22.400] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-26 16:17:22.404] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-26 16:17:34.376] [undefined] POST(/): try to upload video with status undefined +[2025-08-26 16:17:34.380] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-26 16:17:34.446] [undefined] POST(/thumbnail): try to add thumbnail to video 7 +[2025-08-26 16:17:34.450] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-26 16:17:55.921] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-26 16:17:59.436] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-26 16:17:59.439] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-26 16:17:59.445] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-26 16:17:59.451] [undefined] GET(/:id/history): failed to retrieve history of user 4 because it doesn't exist with status 404 +[2025-08-26 16:17:59.458] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-26 16:18:01.471] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-26 16:18:01.481] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 16:18:01.487] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-26 16:18:01.497] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 16:18:02.554] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-08-26 16:18:02.568] [undefined] GET(/:id): try to get video 7 +[2025-08-26 16:18:02.574] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-08-26 16:18:02.585] [undefined] GET(/:id): successfully get video 7 with status 200 +[2025-08-26 16:18:05.795] [undefined] DELETE(/:id): try to delete video 7 +[2025-08-26 16:18:05.820] [undefined] DELETE(/:id): successfully deleted video with status 200 +[2025-08-26 16:18:05.860] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-26 16:18:05.873] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 16:18:05.878] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-26 16:18:05.887] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 16:18:11.746] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-26 16:25:37.703] [undefined] POST(/login): try to login with username 'sacha' +[2025-08-26 16:25:37.762] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-26 16:25:37.885] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 2 with status 200 +[2025-08-26 16:25:41.326] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-26 16:25:41.329] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-26 16:25:41.337] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-08-26 16:25:41.341] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-08-26 16:25:41.351] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-26 16:25:46.533] [undefined] POST(/): try to create new channel with owner 2 and name sacha +[2025-08-26 16:25:46.538] [undefined] POST(/): Successfully created new channel with name sacha with status 200 +[2025-08-26 16:25:46.555] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-26 16:25:46.559] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-26 16:25:48.209] [undefined] GET(/:id): try to get channel with id 5 +[2025-08-26 16:25:48.222] [undefined] GET(/:id/stats): try to get stats +[2025-08-26 16:25:48.227] [undefined] GET(/:id): Successfully get channel with id 5 with status 200 +[2025-08-26 16:25:48.236] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-26 16:25:49.322] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-26 16:25:49.329] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-26 16:26:10.503] [undefined] POST(/): try to upload video with status undefined +[2025-08-26 16:26:10.508] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-26 16:26:10.845] [undefined] POST(/thumbnail): try to add thumbnail to video 8 +[2025-08-26 16:26:10.859] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-26 16:26:10.883] [undefined] PUT(/:id/tags): try to add tags to video 8 +[2025-08-26 16:26:10.894] [undefined] PUT(/:id/tags): successfully added tags to video 8 with status 200 +[2025-08-26 16:26:13.101] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 2 with status 200 +[2025-08-26 16:26:14.108] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-08-26 16:26:14.114] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-08-26 16:26:14.118] [undefined] GET(/:id/channel): successfully retrieved channel of user 2 with status 200 +[2025-08-26 16:26:14.124] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-08-26 16:26:14.133] [undefined] GET(/user/:id): Playlists retrieved for user with id 2 with status 200 +[2025-08-26 16:27:03.028] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 2 with status 200 +[2025-08-26 16:27:10.881] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-26 16:27:15.161] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-26 16:27:22.771] [undefined] GET(/:id): try to get video 8 +[2025-08-26 16:27:22.774] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-26 16:27:22.788] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-26 16:27:22.828] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-26 16:27:22.844] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-26 16:27:22.884] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-26 16:27:22.896] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-26 16:27:23.971] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 5 +[2025-08-26 16:27:23.986] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-26 16:35:12.279] [undefined] GET(/:id): try to get video 8 +[2025-08-26 16:35:12.283] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-26 16:35:12.305] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-26 16:35:12.352] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-26 16:35:12.381] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-26 16:35:12.452] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-26 16:35:12.468] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-26 16:35:13.888] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-26 16:35:18.862] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-26 16:35:19.678] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-26 16:35:20.454] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-26 16:35:21.161] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-26 16:35:47.725] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 09:33:01.789] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:33:01.797] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:34:34.161] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:34:34.167] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:38:02.615] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:38:02.619] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:38:41.796] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:38:41.804] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:38:57.221] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:38:57.226] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 09:38:57.234] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:39:36.309] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:39:36.313] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 09:39:36.321] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:39:36.328] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:41:19.467] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 09:41:22.182] [undefined] GET(/:id): try to get video 8 +[2025-08-27 09:41:22.185] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 09:41:22.195] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-27 09:41:22.221] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-27 09:41:22.238] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-27 09:41:22.279] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-27 09:41:22.289] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-27 09:41:28.989] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 09:44:05.985] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:44:05.991] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 09:44:05.996] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:44:06.001] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:48:53.674] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 09:48:53.677] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:48:53.685] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:48:53.689] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:49:08.453] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:49:08.457] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 09:49:08.465] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:49:08.469] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:49:21.784] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:49:21.788] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 09:49:21.801] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:49:21.805] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:49:23.976] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 09:49:26.133] [undefined] GET(/:id): try to get video 8 +[2025-08-27 09:49:26.136] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 09:49:26.146] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-27 09:49:26.194] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-27 09:49:26.208] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-27 09:49:26.281] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-27 09:49:26.290] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-27 09:49:28.224] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 5 +[2025-08-27 09:49:28.239] [undefined] POST(/:id/subscribe): Successfully unsubscribed from channel with status 200 +[2025-08-27 09:49:29.053] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 5 +[2025-08-27 09:49:29.071] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-27 09:49:31.999] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:49:32.002] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 09:49:32.010] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:49:32.014] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:49:54.980] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 09:49:54.983] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 09:49:54.992] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 09:49:54.996] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:39:13.468] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:39:13.472] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:39:13.479] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:39:13.483] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:39:29.805] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:39:29.809] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:39:29.816] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:39:29.820] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:39:53.650] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:39:53.654] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:39:53.662] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:39:53.667] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:40:10.287] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:40:10.291] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:40:10.299] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:40:10.303] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:40:20.716] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:40:20.721] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:40:20.731] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:40:20.736] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:40:38.367] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:40:38.371] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:40:38.379] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:40:38.384] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:40:45.100] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:40:45.103] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:40:45.112] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:40:45.116] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:40:51.530] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:40:51.534] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:40:51.538] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:40:51.543] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:02.917] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:02.921] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:02.929] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:02.933] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:08.425] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:08.429] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:08.433] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:08.437] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:14.106] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:14.110] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:14.118] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:14.122] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:19.163] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:19.167] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:19.170] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:19.174] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:32.815] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:32.819] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:32.827] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:32.831] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:43.208] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:43.213] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:41:43.220] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:41:43.224] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:42:03.042] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:42:03.046] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:42:03.054] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:42:03.059] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:42:14.020] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:42:14.024] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:42:14.028] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:42:14.031] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:42:38.454] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:42:38.459] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:42:38.467] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:42:38.475] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:42:53.702] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:42:53.706] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:42:53.714] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:42:53.717] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:43:13.217] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:43:13.221] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:43:13.229] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:43:13.233] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:43:24.559] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:43:24.562] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:43:24.565] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:43:24.570] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:43:33.236] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:43:33.240] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:43:33.244] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:43:33.248] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:43:43.726] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:43:43.730] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:43:43.738] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:43:43.742] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:44:05.284] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:44:05.288] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:44:05.296] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:44:05.300] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:44:32.285] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:44:32.289] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:44:32.297] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:44:32.301] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:44:44.117] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:44:44.121] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:44:44.129] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:44:44.135] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:44:59.510] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:44:59.514] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:44:59.522] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:44:59.525] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:45:17.575] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:45:17.579] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:45:17.587] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:45:17.591] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:45:31.504] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:45:31.508] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:45:31.516] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:45:31.521] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:45:44.051] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:45:44.055] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:45:44.063] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:45:44.067] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:45:54.912] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:45:54.916] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:45:54.924] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:45:54.928] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:46:49.605] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:46:49.608] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:46:49.617] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:46:49.620] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:46:50.401] [undefined] GET(/:id): failed to retrieve channel because it doesn't exist with status 404 +[2025-08-27 10:48:22.396] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:48:22.399] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:48:22.413] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:48:22.417] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:49:27.397] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:49:27.404] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:49:27.410] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:49:27.416] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:49:56.449] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:49:56.453] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:49:56.461] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:49:56.468] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:49:57.372] [undefined] GET(/:id): try to get channel with id 5 +[2025-08-27 10:49:57.384] [undefined] GET(/:id): Successfully get channel with id 5 with status 200 +[2025-08-27 10:49:57.404] [undefined] GET(/:id/channel/subscribed): check if user 4 is subscribed to channel 5 +[2025-08-27 10:49:57.408] [undefined] GET(/:id/channel/subscribed): user 4 is subscribed to channel 5 with status 200 +[2025-08-27 10:49:59.623] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:49:59.627] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:49:59.635] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:49:59.639] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:50:03.526] [undefined] GET(/:id): try to get video 8 +[2025-08-27 10:50:03.530] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 10:50:03.541] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-27 10:50:03.564] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-27 10:50:03.579] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-27 10:50:03.655] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-27 10:50:03.664] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-27 10:50:04.785] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 10:50:04.789] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 10:50:04.797] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:50:04.801] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 10:50:06.257] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 10:50:07.442] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-27 10:50:07.467] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 10:50:07.581] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-27 10:50:07.610] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-27 10:50:08.207] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 10:50:09.768] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-08-27 10:50:09.781] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-08-27 10:50:09.791] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 10:50:09.797] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-08-27 10:50:12.503] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 10:50:14.180] [undefined] GET(/:id): try to get video 8 +[2025-08-27 10:50:14.184] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 10:50:14.198] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-27 10:50:14.219] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-27 10:50:14.233] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-27 10:50:14.301] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-27 10:50:14.309] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-27 10:50:18.252] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-27 10:50:18.256] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-27 10:50:18.265] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-27 10:50:18.270] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-08-27 10:50:18.279] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 10:50:23.006] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 10:56:28.428] [undefined] GET(/:id): try to get video 8 +[2025-08-27 10:56:28.441] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 10:56:28.453] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-27 10:56:28.466] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-27 10:56:28.477] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-27 10:56:28.497] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-27 10:56:28.510] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-27 10:56:30.578] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:30.593] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 10:56:30.763] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:30.775] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 10:56:31.306] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:31.318] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 10:56:31.378] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:31.389] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 10:56:31.558] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:31.572] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 10:56:31.811] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:31.825] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 10:56:31.979] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:31.993] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 10:56:32.160] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:32.175] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 10:56:32.338] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:32.352] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 10:56:32.527] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:32.541] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 10:56:32.728] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:32.742] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 10:56:32.912] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 10:56:32.927] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 10:56:33.096] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:00:58.168] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 11:01:00.805] [undefined] GET(/:id): try to get video 8 +[2025-08-27 11:01:00.808] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 11:01:00.825] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-27 11:01:00.836] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-27 11:01:00.841] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-27 11:01:00.854] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-27 11:01:00.858] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-27 11:01:02.475] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:02.489] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:02.690] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:02.704] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:02.893] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:02.908] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:03.076] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:03.092] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:03.283] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:03.291] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:03.481] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:03.497] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:03.681] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:03.698] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:03.888] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:03.903] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:04.111] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:04.127] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:04.296] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:04.312] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:04.496] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:04.512] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:04.703] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:04.719] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:04.926] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:04.944] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:05.140] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:05.156] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:05.329] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:05.345] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:05.549] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:05.564] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:05.750] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:05.765] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:05.938] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:05.955] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:06.158] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:06.172] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:06.341] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:06.357] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:06.542] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:06.556] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:06.722] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:06.737] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:06.907] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:06.923] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:07.109] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:07.124] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:07.294] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:07.311] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:07.493] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:07.511] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:07.675] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:07.690] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:07.874] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:07.890] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:08.068] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:08.082] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:08.243] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:08.258] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:08.439] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:08.443] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:08.643] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:08.648] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:08.828] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:08.843] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:09.036] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:09.051] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:09.235] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:09.250] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:09.393] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:09.411] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:09.605] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:09.619] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:09.848] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:09.866] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:09.992] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:10.008] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:10.189] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:10.203] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:10.408] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:10.414] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:10.595] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:10.611] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:10.789] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:10.805] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:10.983] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:10.999] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:11.158] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:11.164] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:11.351] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:11.365] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:11.558] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:11.575] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:11.757] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:11.772] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:11.963] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:11.979] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:12.179] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:12.193] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:12.401] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:12.417] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:12.602] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:12.617] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:12.827] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:12.843] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:13.012] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:13.027] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:13.234] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:13.250] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:13.445] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:13.461] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:13.641] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:13.657] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:13.853] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:13.868] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:14.096] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:14.111] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:14.309] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:14.324] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:14.518] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:14.532] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:14.730] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:14.745] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:14.954] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:14.960] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:15.165] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:15.181] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:15.408] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:15.422] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:15.612] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:15.626] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:15.803] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:15.819] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:15.994] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:16.008] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:16.207] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:16.222] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:16.426] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:16.442] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:16.630] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:16.645] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:16.844] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:16.860] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:17.070] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:17.084] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:17.304] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:17.319] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:17.536] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:17.552] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:17.716] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:17.730] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:17.971] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:17.989] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:18.184] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:18.199] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:18.393] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:18.410] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:18.607] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:18.623] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:18.822] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:18.838] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:19.055] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:19.071] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:19.256] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:19.273] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:19.487] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:19.502] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:19.703] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:19.720] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:19.945] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:19.959] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:20.130] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:20.145] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:20.346] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:20.361] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:20.553] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:20.558] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:20.797] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:20.812] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:21.017] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:21.032] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:21.235] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:21.249] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:21.500] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:21.515] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:21.705] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:21.721] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:21.920] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:21.935] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:22.126] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:22.141] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:22.380] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:22.385] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:22.592] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:22.607] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:22.787] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:22.802] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:23.010] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:23.024] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:23.196] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:23.211] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:23.506] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:23.521] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:23.736] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:23.751] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:23.961] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:23.967] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:24.174] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:24.189] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:24.385] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:24.396] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:24.589] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:24.605] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:24.815] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:24.831] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:25.029] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:25.043] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:01:25.256] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:25.271] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:01:25.432] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:01:25.446] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:03:25.401] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 11:10:14.645] [undefined] POST(/): failed due to invalid values with status 400 +[2025-08-27 11:10:46.684] [undefined] POST(/): try to register a user with username: ophĂ© lail and email: youfyouf@live.fr +[2025-08-27 11:10:48.196] [undefined] POST(/): successfully registered with status 200 +[2025-08-27 11:12:38.443] [undefined] POST(/verify-email): try to verify email for youfyouf@live.fr with token 510ae +[2025-08-27 11:12:38.465] [undefined] POST(/verify-email): successfully verified email for youfyouf@live.fr with status 200 +[2025-08-27 11:12:52.481] [undefined] POST(/login): failed due to invalid values with status 400 +[2025-08-27 11:13:01.918] [undefined] POST(/login): try to login with username 'ophĂ© lail' +[2025-08-27 11:13:01.973] [undefined] POST(/login): Successfully logged in with status 200 +[2025-08-27 11:13:02.080] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 7 with status 200 +[2025-08-27 11:13:30.754] [undefined] GET(/:id): try to get video 8 +[2025-08-27 11:13:30.763] [undefined] GET(/user/:id): Playlists retrieved for user with id 7 with status 200 +[2025-08-27 11:13:30.771] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-27 11:13:30.781] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-27 11:13:30.788] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-27 11:13:30.799] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-27 11:13:30.803] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-27 11:13:40.087] [undefined] POST(/): try to post comment +[2025-08-27 11:13:40.110] [undefined] POST(/): successfully post comment with status 200 +[2025-08-27 11:13:52.781] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:13:52.797] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:13:54.657] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 5 +[2025-08-27 11:13:54.674] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-08-27 11:13:58.075] [undefined] POST(/:id): Video added to playlist with id 9 with status 200 +[2025-08-27 11:14:05.163] [undefined] GET(/:id/channel): try to retrieve channel of user 7 +[2025-08-27 11:14:05.170] [undefined] GET(/:id/channel): failed to retrieve channel of user 7 because it doesn't exist with status 404 +[2025-08-27 11:14:05.180] [undefined] GET(/:id/history): try to retrieve history of user 7 +[2025-08-27 11:14:05.185] [undefined] GET(/:id/history): successfully retrieved history of user 7 with status 200 +[2025-08-27 11:14:05.194] [undefined] GET(/user/:id): Playlists retrieved for user with id 7 with status 200 +[2025-08-27 11:14:14.640] [undefined] POST(/): Playlist created with id 10 with status 200 +[2025-08-27 11:14:14.657] [undefined] GET(/user/:id): Playlists retrieved for user with id 7 with status 200 +[2025-08-27 11:14:16.043] [undefined] GET(/:id): Playlist retrieved with id 10 with status 200 +[2025-08-27 11:14:20.664] [undefined] GET(/:id/history): try to retrieve history of user 7 +[2025-08-27 11:14:20.674] [undefined] GET(/:id/history): successfully retrieved history of user 7 with status 200 +[2025-08-27 11:14:20.687] [undefined] GET(/:id/channel): try to retrieve channel of user 7 +[2025-08-27 11:14:20.691] [undefined] GET(/:id/channel): failed to retrieve channel of user 7 because it doesn't exist with status 404 +[2025-08-27 11:14:20.696] [undefined] GET(/user/:id): Playlists retrieved for user with id 7 with status 200 +[2025-08-27 11:14:32.070] [undefined] GET(/:id/channel): try to retrieve channel of user 7 +[2025-08-27 11:14:32.074] [undefined] GET(/:id/channel): failed to retrieve channel of user 7 because it doesn't exist with status 404 +[2025-08-27 11:14:38.281] [undefined] GET(/user/:id): Playlists retrieved for user with id 7 with status 200 +[2025-08-27 11:14:38.288] [undefined] GET(/:id): try to get video 8 +[2025-08-27 11:14:38.299] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-27 11:14:38.311] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-27 11:14:38.315] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-27 11:14:38.355] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-27 11:14:38.358] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-27 11:14:44.102] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 7 +[2025-08-27 11:14:44.108] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 7 with status 200 +[2025-08-27 11:14:44.190] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 7 +[2025-08-27 11:14:44.197] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 7 with status 200 +[2025-08-27 11:14:46.621] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 7 with status 200 +[2025-08-27 11:14:48.207] [undefined] GET(/:id/history): try to retrieve history of user 7 +[2025-08-27 11:14:48.213] [undefined] GET(/:id/history): successfully retrieved history of user 7 with status 200 +[2025-08-27 11:14:48.226] [undefined] GET(/:id/channel): try to retrieve channel of user 7 +[2025-08-27 11:14:48.230] [undefined] GET(/:id/channel): failed to retrieve channel of user 7 because it doesn't exist with status 404 +[2025-08-27 11:14:48.236] [undefined] GET(/user/:id): Playlists retrieved for user with id 7 with status 200 +[2025-08-27 11:15:03.614] [undefined] POST(/): try to create new channel with owner 7 and name gfy +[2025-08-27 11:15:03.619] [undefined] POST(/): Successfully created new channel with name gfy with status 200 +[2025-08-27 11:15:03.647] [undefined] GET(/:id/channel): try to retrieve channel of user 7 +[2025-08-27 11:15:03.652] [undefined] GET(/:id/channel): successfully retrieved channel of user 7 with status 200 +[2025-08-27 11:15:06.646] [undefined] GET(/:id): try to get channel with id 6 +[2025-08-27 11:15:06.663] [undefined] GET(/:id): Successfully get channel with id 6 with status 200 +[2025-08-27 11:15:06.670] [undefined] GET(/:id/stats): try to get stats +[2025-08-27 11:15:06.674] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-27 11:15:09.985] [undefined] GET(/:id/channel): try to retrieve channel of user 7 +[2025-08-27 11:15:09.991] [undefined] GET(/:id/channel): successfully retrieved channel of user 7 with status 200 +[2025-08-27 11:17:05.450] [undefined] GET(/search): try to search user by username s +[2025-08-27 11:17:05.455] [undefined] GET(/search): successfully found user with username s with status 200 +[2025-08-27 11:17:05.851] [undefined] GET(/search): try to search user by username sa +[2025-08-27 11:17:05.860] [undefined] GET(/search): successfully found user with username sa with status 200 +[2025-08-27 11:17:06.636] [undefined] GET(/search): try to search user by username sac +[2025-08-27 11:17:06.640] [undefined] GET(/search): successfully found user with username sac with status 200 +[2025-08-27 11:17:06.985] [undefined] GET(/search): try to search user by username sa +[2025-08-27 11:17:06.992] [undefined] GET(/search): successfully found user with username sa with status 200 +[2025-08-27 11:17:07.350] [undefined] GET(/search): try to search user by username s +[2025-08-27 11:17:07.353] [undefined] GET(/search): successfully found user with username s with status 200 +[2025-08-27 11:17:08.775] [undefined] GET(/search): try to search user by username a +[2025-08-27 11:17:08.780] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-27 11:17:17.717] [undefined] GET(/search): try to search user by username s +[2025-08-27 11:17:17.721] [undefined] GET(/search): successfully found user with username s with status 200 +[2025-08-27 11:17:19.006] [undefined] GET(/search): try to search user by username a +[2025-08-27 11:17:19.009] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-08-27 11:17:24.678] [undefined] GET(/search): try to search user by username o +[2025-08-27 11:17:24.681] [undefined] GET(/search): successfully found user with username o with status 200 +[2025-08-27 11:18:04.771] [undefined] POST(/): try to upload video with status undefined +[2025-08-27 11:18:04.783] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-27 11:18:06.463] [undefined] POST(/thumbnail): try to add thumbnail to video 9 +[2025-08-27 11:18:06.478] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-27 11:18:06.543] [undefined] PUT(/:id/tags): try to add tags to video 9 +[2025-08-27 11:18:06.551] [undefined] PUT(/:id/tags): successfully added tags to video 9 with status 200 +[2025-08-27 11:18:10.148] [undefined] POST(/): try to upload video with status undefined +[2025-08-27 11:18:10.158] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-27 11:19:58.791] [undefined] GET(/:id/history): try to retrieve history of user 7 +[2025-08-27 11:19:58.800] [undefined] GET(/:id/history): successfully retrieved history of user 7 with status 200 +[2025-08-27 11:19:58.813] [undefined] GET(/:id/channel): try to retrieve channel of user 7 +[2025-08-27 11:19:58.816] [undefined] GET(/:id/channel): successfully retrieved channel of user 7 with status 200 +[2025-08-27 11:19:58.822] [undefined] GET(/user/:id): Playlists retrieved for user with id 7 with status 200 +[2025-08-27 11:20:02.093] [undefined] GET(/:id): try to get channel with id 6 +[2025-08-27 11:20:02.104] [undefined] GET(/:id): Successfully get channel with id 6 with status 200 +[2025-08-27 11:20:02.114] [undefined] GET(/:id/stats): try to get stats +[2025-08-27 11:20:02.124] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-27 11:20:15.775] [undefined] PUT(/:id): try to update channel with id 6 +[2025-08-27 11:20:15.791] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-08-27 11:20:31.838] [undefined] GET(/:id/history): try to retrieve history of user 7 +[2025-08-27 11:20:31.846] [undefined] GET(/:id/history): successfully retrieved history of user 7 with status 200 +[2025-08-27 11:20:31.857] [undefined] GET(/:id/channel): try to retrieve channel of user 7 +[2025-08-27 11:20:31.861] [undefined] GET(/:id/channel): successfully retrieved channel of user 7 with status 200 +[2025-08-27 11:20:31.866] [undefined] GET(/user/:id): Playlists retrieved for user with id 7 with status 200 +[2025-08-27 11:58:33.079] [undefined] GET(/:id): try to get video 8 +[2025-08-27 11:58:33.084] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 11:58:33.093] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-27 11:58:33.104] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-27 11:58:33.112] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-27 11:58:33.126] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-27 11:58:33.131] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-27 11:58:41.336] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 11:58:45.011] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-27 11:58:45.016] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-27 11:58:45.028] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 11:58:45.032] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-27 11:58:45.040] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-08-27 11:58:46.862] [undefined] GET(/:id): try to get channel with id 2 +[2025-08-27 11:58:46.867] [undefined] GET(/:id/stats): try to get stats +[2025-08-27 11:58:46.875] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-27 11:58:46.878] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-08-27 11:58:49.962] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 11:58:51.947] [undefined] GET(/:id): try to get video 8 +[2025-08-27 11:58:51.952] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-27 11:58:51.963] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-08-27 11:58:51.975] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-08-27 11:58:51.986] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-08-27 11:58:52.006] [undefined] GET(/:id/views): try to add views for video 8 +[2025-08-27 11:58:52.011] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-08-27 11:58:53.515] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:53.531] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:53.705] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:53.720] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:53.895] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:53.909] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:54.093] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:54.108] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:54.270] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:54.284] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:54.480] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:54.494] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:54.688] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:54.702] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:54.875] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:54.891] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:55.083] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:55.097] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:55.173] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:55.179] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:55.375] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:55.389] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:55.449] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:55.454] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:55.630] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:55.645] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:55.737] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:55.742] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:55.885] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:55.900] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:55.984] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:55.993] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:56.133] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:56.148] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:56.233] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:56.238] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:56.359] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:56.364] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:56.455] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:56.459] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:56.636] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:56.651] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:56.893] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:56.897] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:56.990] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:56.996] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:57.168] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:57.183] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:57.260] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:57.265] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:57.441] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:57.457] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:57.556] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:57.561] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:57.824] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:57.834] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:57.988] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:58.002] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:58.095] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:58.099] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:58.258] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:58.272] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:58.352] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:58.357] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:58.487] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:58.502] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:58.605] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:58.610] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:58.761] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:58.777] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:58.875] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:58.881] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:59.003] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:59.018] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:59.143] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:59.159] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:59.263] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:59.268] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:59.370] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:59.375] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:59.516] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:59.531] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:59.645] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:59.662] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:58:59.774] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:59.789] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:58:59.902] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:58:59.917] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:00.059] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:00.074] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:00.167] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:00.172] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:00.323] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:00.339] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:00.437] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:00.445] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:00.582] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:00.598] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:00.688] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:00.694] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:06.632] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:06.648] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:06.789] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:06.806] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:06.912] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:06.917] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:07.077] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:07.093] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:07.178] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:07.183] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:07.366] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:07.381] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:07.468] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:07.473] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:07.635] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:07.650] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:07.774] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:07.788] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:07.920] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:07.935] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:08.047] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:08.066] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:08.166] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:08.172] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:08.296] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:08.312] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:08.434] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:08.449] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:08.534] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:08.539] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:08.643] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:08.648] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:08.751] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:08.755] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:08.849] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:08.854] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:09.075] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:09.090] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:09.184] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:09.190] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:09.278] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:09.282] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:09.402] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:09.419] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:09.526] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:09.544] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:09.640] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:09.646] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:09.759] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:09.777] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:09.866] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:09.871] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:10.009] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:10.024] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:10.135] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:10.151] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:10.277] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:10.294] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:10.405] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:10.419] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:10.512] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:10.517] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:10.787] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:10.804] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:10.848] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:10.853] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:11.094] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:11.111] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:11.268] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:11.273] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:11.447] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:11.461] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:12.655] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:12.669] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:12.867] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:12.882] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:12.962] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:12.967] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:13.145] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:13.159] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:13.217] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:13.222] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:13.397] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:13.412] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:13.490] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:13.495] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:13.680] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:13.694] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:13.754] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:13.758] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:13.976] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:13.990] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:14.082] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:14.089] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:14.248] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:14.264] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:14.363] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:14.368] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:14.506] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:14.522] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:14.618] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:14.624] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:14.774] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:14.788] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:14.872] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:14.876] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:15.037] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:15.052] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:16.572] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:16.581] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:16.802] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:16.818] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:17.003] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:17.017] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:17.137] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:17.152] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:17.311] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:17.325] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:17.432] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:17.448] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:17.609] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:17.627] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:17.689] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:17.694] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:17.826] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:17.840] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:17.934] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:17.939] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:18.126] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:18.141] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:18.216] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:18.221] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:18.579] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:18.594] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:18.930] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:18.946] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:19.201] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:19.216] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:19.456] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:19.472] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:19.627] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:19.642] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:19.885] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:19.900] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:20.337] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:20.356] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:20.863] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:20.870] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:22.737] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:22.753] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:22.861] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:22.876] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:23.082] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:23.099] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:23.240] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:23.256] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:23.361] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:23.380] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:23.594] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:23.609] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:24.714] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:24.720] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:24.932] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:24.946] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:25.134] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:25.149] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:25.328] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:25.342] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:25.608] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:25.625] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:25.767] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:25.782] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:25.889] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:25.904] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:26.026] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:26.032] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:26.174] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:26.194] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:26.450] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:26.467] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:26.707] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:26.723] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:26.917] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:26.921] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:27.101] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:27.116] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:27.262] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:27.277] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:27.432] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:27.447] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:27.588] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:27.604] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:27.789] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:27.805] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 11:59:27.982] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:27.997] [undefined] GET(/:id/like): no likes found adding likes for video 8 with status 200 +[2025-08-27 11:59:28.142] [undefined] GET(/:id/like): try to toggle like on video 8 +[2025-08-27 11:59:28.159] [undefined] GET(/:id/like): likes found, removing like for video 8 with status 200 +[2025-08-27 14:02:50.682] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-08-27 14:02:53.508] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-08-27 14:02:53.512] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-08-27 14:02:53.516] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 14:02:53.521] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-08-27 14:02:56.733] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-08-27 14:02:56.738] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-08-27 14:02:56.751] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-08-27 14:02:56.755] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-08-27 14:02:56.761] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-08-31 10:18:51.355] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-08-31 10:18:51.361] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:18:51.367] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:18:51.373] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-08-31 10:18:51.384] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-08-31 10:18:55.307] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-31 10:18:55.354] [undefined] GET(/:id/stats): try to get stats +[2025-08-31 10:18:55.360] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-31 10:18:55.371] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-31 10:19:10.594] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:19:10.599] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:22:07.050] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:22:07.056] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:22:30.580] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:22:30.586] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:22:48.827] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:22:48.834] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:22:56.007] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:22:56.012] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:23:10.939] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:23:10.945] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:23:11.668] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:23:11.673] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:23:47.510] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:23:47.516] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:23:53.769] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:23:53.775] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:25:15.205] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:25:15.210] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:25:35.308] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:25:35.313] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:25:52.991] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:25:52.997] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:26:48.298] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:26:48.304] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:26:55.482] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:26:55.488] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:27:21.463] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:27:21.469] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:28:55.696] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:28:55.701] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:29:12.334] [undefined] POST(/): try to upload video with status undefined +[2025-08-31 10:29:12.342] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-31 10:29:12.457] [undefined] POST(/thumbnail): try to add thumbnail to video 4 +[2025-08-31 10:29:12.464] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-31 10:29:12.492] [undefined] PUT(/:id/tags): try to add tags to video 4 +[2025-08-31 10:29:12.505] [undefined] PUT(/:id/tags): successfully added tags to video 4 with status 200 +[2025-08-31 10:29:45.158] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-08-31 10:29:45.164] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-08-31 10:29:58.657] [undefined] POST(/): try to upload video with status undefined +[2025-08-31 10:29:58.663] [undefined] POST(/): successfully uploaded video with status 200 +[2025-08-31 10:29:58.774] [undefined] POST(/thumbnail): try to add thumbnail to video 5 +[2025-08-31 10:29:58.780] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-08-31 10:29:58.805] [undefined] PUT(/:id/tags): try to add tags to video 5 +[2025-08-31 10:29:58.820] [undefined] PUT(/:id/tags): successfully added tags to video 5 with status 200 +[2025-08-31 10:29:58.856] [undefined] GET(/:id): try to get channel with id 1 +[2025-08-31 10:29:58.869] [undefined] GET(/:id/stats): try to get stats +[2025-08-31 10:29:58.875] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-08-31 10:29:58.885] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-08-31 10:30:58.389] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 17:34:12.979] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 17:34:15.647] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-09-03 17:34:15.660] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-09-03 17:34:15.671] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-03 17:34:15.736] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-09-03 17:34:24.176] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 17:34:26.470] [undefined] GET(/:id): failed due to invalid values with status 400 +[2025-09-03 17:34:26.478] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-03 17:34:26.485] [undefined] GET(/:id/similar): failed due to invalid values with status 400 +[2025-09-03 17:34:26.494] [undefined] GET(/:id/views): failed due to invalid values with status 400 +[2025-09-03 17:34:26.941] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 17:34:29.468] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-09-03 17:34:29.523] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-09-03 17:34:29.535] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-09-03 17:34:29.541] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-09-03 17:34:29.550] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-03 17:34:30.404] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-09-03 17:34:31.607] [undefined] DELETE(/:id/video/:videoId): Video deleted from playlist with id 1 with status 200 +[2025-09-03 17:34:31.690] [undefined] GET(/:id): Playlist retrieved with id 1 with status 200 +[2025-09-03 17:34:32.741] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 17:34:41.091] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 17:35:57.790] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 17:44:19.296] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 17:44:20.911] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 17:50:33.774] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 20:04:12.031] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 20:04:13.537] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-09-03 20:04:13.544] [undefined] GET(/:id/history): failed to retrieve history of user 1 because it doesn't exist with status 404 +[2025-09-03 20:04:13.556] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-09-03 20:04:13.561] [undefined] GET(/:id/channel): failed to retrieve channel of user 1 because it doesn't exist with status 404 +[2025-09-03 20:04:13.566] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-03 20:04:18.757] [undefined] POST(/): try to create new channel with owner 1 and name c2lamerde +[2025-09-03 20:04:18.762] [undefined] POST(/): Successfully created new channel with name c2lamerde with status 200 +[2025-09-03 20:04:18.857] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-09-03 20:04:18.862] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-09-03 20:04:20.055] [undefined] GET(/:id): try to get channel with id 1 +[2025-09-03 20:04:20.060] [undefined] GET(/:id/stats): try to get stats +[2025-09-03 20:04:20.065] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-09-03 20:04:20.070] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-09-03 20:04:20.845] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-09-03 20:04:20.849] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-09-03 20:04:33.523] [undefined] POST(/): try to upload video with status undefined +[2025-09-03 20:04:33.528] [undefined] POST(/): successfully uploaded video with status 200 +[2025-09-03 20:04:33.621] [undefined] POST(/thumbnail): try to add thumbnail to video 1 +[2025-09-03 20:04:33.627] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-09-03 20:04:33.638] [undefined] PUT(/:id/tags): try to add tags to video 1 +[2025-09-03 20:04:33.646] [undefined] PUT(/:id/tags): successfully added tags to video 1 with status 200 +[2025-09-03 20:04:33.671] [undefined] GET(/:id): try to get channel with id 1 +[2025-09-03 20:04:33.675] [undefined] GET(/:id/stats): try to get stats +[2025-09-03 20:04:33.679] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-09-03 20:04:33.685] [undefined] GET(/:id): Successfully get channel with id 1 with status 200 +[2025-09-03 20:04:35.555] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-03 20:04:36.856] [undefined] GET(/:id): try to get video 1 +[2025-09-03 20:04:36.860] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-03 20:04:36.867] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-03 20:04:36.877] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-03 20:04:36.882] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-03 20:04:36.893] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-03 20:04:36.900] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:32:34.492] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-04 20:32:36.797] [undefined] GET(/:id/channel): try to retrieve channel of user 1 +[2025-09-04 20:32:36.803] [undefined] GET(/:id/channel): successfully retrieved channel of user 1 with status 200 +[2025-09-04 20:32:36.815] [undefined] GET(/:id/history): try to retrieve history of user 1 +[2025-09-04 20:32:36.822] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:32:36.826] [undefined] GET(/:id/history): successfully retrieved history of user 1 with status 200 +[2025-09-04 20:32:47.165] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-04 20:34:30.396] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-04 20:34:31.179] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-04 20:35:34.522] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-04 20:36:03.193] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-04 20:37:37.442] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-04 20:37:42.936] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-04 20:42:20.620] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-04 20:42:31.482] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-04 20:43:51.613] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-04 20:44:03.089] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:44:03.095] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:44:03.102] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:44:03.112] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:44:03.119] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:44:03.131] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:44:03.136] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:44:42.468] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:44:42.523] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:44:42.534] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:44:42.544] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:44:42.553] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:44:42.569] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:44:42.573] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:45:08.656] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:45:08.660] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:45:08.667] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:45:08.677] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:45:08.682] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:45:08.711] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:45:08.718] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:45:27.395] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:45:27.403] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:45:27.413] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:45:27.418] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:45:27.424] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:45:27.455] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:45:27.465] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:45:40.775] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:45:40.780] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:45:40.787] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:45:40.799] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:45:40.805] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:45:40.887] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:45:40.894] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:48:09.425] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:48:09.433] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:48:09.442] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:48:09.454] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:48:09.461] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:48:09.487] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:48:09.495] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:48:14.450] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:48:14.455] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:48:14.461] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:48:14.479] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:48:14.485] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:48:14.516] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:48:14.524] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:48:23.210] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:48:23.215] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:48:23.221] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:48:23.232] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:48:23.237] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:48:23.268] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:48:23.277] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:48:28.466] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:48:28.471] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:48:28.478] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:48:28.491] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:48:28.498] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:48:28.562] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:48:28.567] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:48:55.091] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:48:55.099] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:48:55.109] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:48:55.116] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:48:55.122] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:48:55.142] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:48:55.150] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:49:01.822] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:49:01.827] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:49:01.834] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:49:01.844] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:49:01.850] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:49:01.906] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:49:01.912] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:49:37.215] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:49:37.223] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:49:37.230] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:49:37.241] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:49:37.248] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:49:37.271] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:49:37.277] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:50:00.804] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:50:00.808] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:50:00.815] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:50:00.826] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:50:00.832] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:50:00.888] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:50:00.894] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:50:16.435] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:50:16.445] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:50:16.451] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:50:16.462] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:50:16.468] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:50:16.539] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:50:16.545] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:51:09.495] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:51:09.502] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:51:09.509] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:51:09.519] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:51:09.526] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:51:09.581] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:51:09.588] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:51:20.516] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:51:20.520] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:51:20.527] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:51:20.539] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:51:20.545] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:51:20.597] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:51:20.604] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:51:38.559] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:51:38.563] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:51:38.570] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:51:38.583] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:51:38.589] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:51:38.660] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:51:38.666] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:51:59.262] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:51:59.269] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:51:59.278] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:51:59.284] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:51:59.290] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:51:59.312] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:51:59.320] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:52:08.947] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:52:08.951] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:52:08.957] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:52:08.968] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:52:08.974] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:52:09.029] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:52:09.033] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:53:15.575] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:53:15.583] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:53:15.590] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:53:15.596] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:53:15.602] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:53:15.694] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:53:15.699] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:53:40.778] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:53:40.782] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:53:40.789] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:53:40.799] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:53:40.805] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:53:40.859] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:53:40.866] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:53:53.650] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:53:53.658] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:53:53.666] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:53:53.675] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:53:53.681] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:53:53.748] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:53:53.754] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:57:38.645] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:57:38.652] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:57:38.659] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:57:38.666] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:57:38.673] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:57:38.707] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:57:38.716] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:57:47.609] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:57:47.614] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:57:47.621] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:57:47.635] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:57:47.641] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:57:47.693] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:57:47.699] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:57:54.157] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:57:54.162] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:57:54.168] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:57:54.181] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:57:54.187] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:57:54.260] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:57:54.266] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:58:40.327] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:58:40.335] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:58:40.342] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:58:40.353] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:58:40.359] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:58:40.380] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:58:40.389] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:59:06.564] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:59:06.568] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:59:06.574] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:59:06.583] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:59:06.588] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:59:06.609] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:59:06.618] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 20:59:50.463] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 20:59:50.474] [undefined] GET(/:id): try to get video 1 +[2025-09-04 20:59:50.481] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 20:59:50.495] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 20:59:50.501] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 20:59:50.530] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 20:59:50.537] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 21:01:19.527] [undefined] GET(/:id): try to get video 1 +[2025-09-04 21:01:19.535] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 21:01:19.541] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 21:01:19.547] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 21:01:19.554] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 21:01:19.571] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 21:01:19.579] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 21:01:28.790] [undefined] GET(/:id): try to get video 1 +[2025-09-04 21:01:28.846] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 21:01:28.853] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 21:01:28.882] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 21:01:28.888] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 21:01:28.935] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 21:01:28.941] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-04 21:01:30.079] [undefined] GET(/:id): try to get video 1 +[2025-09-04 21:01:30.084] [undefined] GET(/user/:id): Playlists retrieved for user with id 1 with status 200 +[2025-09-04 21:01:30.091] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-04 21:01:30.110] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-04 21:01:30.115] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-04 21:01:30.138] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-04 21:01:30.145] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-05 09:09:15.576] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:09:24.015] [undefined] GET(/:id): try to get video 8 +[2025-09-05 09:09:24.019] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:09:24.030] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-09-05 09:09:24.040] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-09-05 09:09:24.045] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-09-05 09:09:24.066] [undefined] GET(/:id/views): try to add views for video 8 +[2025-09-05 09:09:24.072] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-09-05 09:09:35.618] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-09-05 09:09:35.623] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-09-05 09:09:35.629] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-09-05 09:09:35.636] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-09-05 09:09:35.640] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:09:37.238] [undefined] GET(/:id): try to get channel with id 2 +[2025-09-05 09:09:37.243] [undefined] GET(/:id/stats): try to get stats +[2025-09-05 09:09:37.248] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-09-05 09:09:37.254] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-09-05 09:09:38.422] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-09-05 09:09:38.426] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-09-05 09:10:03.997] [undefined] POST(/): try to upload video with status undefined +[2025-09-05 09:10:04.013] [undefined] POST(/): successfully uploaded video with status 200 +[2025-09-05 09:10:04.026] [undefined] POST(/thumbnail): try to add thumbnail to video 11 +[2025-09-05 09:10:04.032] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-09-05 09:10:04.051] [undefined] PUT(/:id/tags): try to add tags to video 11 +[2025-09-05 09:10:04.058] [undefined] PUT(/:id/tags): successfully added tags to video 11 with status 200 +[2025-09-05 09:10:04.079] [undefined] GET(/:id): try to get channel with id 2 +[2025-09-05 09:10:04.085] [undefined] GET(/:id/stats): try to get stats +[2025-09-05 09:10:04.091] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-09-05 09:10:04.101] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-09-05 09:10:09.459] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:10:11.821] [undefined] GET(/:id): try to get video 8 +[2025-09-05 09:10:11.825] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:10:11.836] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-09-05 09:10:11.846] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-09-05 09:10:11.852] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-09-05 09:10:11.873] [undefined] GET(/:id/views): try to add views for video 8 +[2025-09-05 09:10:11.881] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-09-05 09:10:23.198] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-09-05 09:10:23.206] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-09-05 09:10:23.216] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-09-05 09:10:23.221] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-09-05 09:10:23.226] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:10:24.469] [undefined] GET(/:id): try to get channel with id 2 +[2025-09-05 09:10:24.474] [undefined] GET(/:id/stats): try to get stats +[2025-09-05 09:10:24.478] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-09-05 09:10:24.483] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-09-05 09:10:28.356] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:10:34.421] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-09-05 09:10:34.426] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-09-05 09:10:34.430] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-09-05 09:10:34.436] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-09-05 09:10:34.441] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:10:35.603] [undefined] GET(/:id): try to get channel with id 2 +[2025-09-05 09:10:35.608] [undefined] GET(/:id/stats): try to get stats +[2025-09-05 09:10:35.612] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-09-05 09:10:35.619] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-09-05 09:10:36.921] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-09-05 09:10:36.925] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-09-05 09:10:59.327] [undefined] POST(/): try to upload video with status undefined +[2025-09-05 09:10:59.332] [undefined] POST(/): successfully uploaded video with status 200 +[2025-09-05 09:10:59.377] [undefined] POST(/thumbnail): try to add thumbnail to video 12 +[2025-09-05 09:10:59.382] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-09-05 09:10:59.398] [undefined] PUT(/:id/tags): try to add tags to video 12 +[2025-09-05 09:10:59.402] [undefined] PUT(/:id/tags): Tag prive already exists for video 12 with status 200 +[2025-09-05 09:10:59.413] [undefined] PUT(/:id/tags): successfully added tags to video 12 with status 200 +[2025-09-05 09:10:59.431] [undefined] GET(/:id): try to get channel with id 2 +[2025-09-05 09:10:59.436] [undefined] GET(/:id/stats): try to get stats +[2025-09-05 09:10:59.440] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-09-05 09:10:59.451] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-09-05 09:11:04.346] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:11:07.011] [undefined] GET(/:id): try to get video 12 +[2025-09-05 09:11:07.015] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:11:07.021] [undefined] GET(/:id): successfully get video 12 with status 200 +[2025-09-05 09:11:07.030] [undefined] GET(/:id/similar): try to get similar videos for video 12 +[2025-09-05 09:11:07.035] [undefined] GET(/:id/similar): successfully get similar videos for video 12 with status 200 +[2025-09-05 09:11:07.050] [undefined] GET(/:id/views): try to add views for video 12 +[2025-09-05 09:11:07.059] [undefined] GET(/:id/views): successfully added views for video 12 with status 200 +[2025-09-05 09:12:29.703] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:12:29.711] [undefined] GET(/:id): try to get video 12 +[2025-09-05 09:12:29.726] [undefined] GET(/:id): successfully get video 12 with status 200 +[2025-09-05 09:12:29.737] [undefined] GET(/:id/similar): try to get similar videos for video 12 +[2025-09-05 09:12:29.744] [undefined] GET(/:id/similar): successfully get similar videos for video 12 with status 200 +[2025-09-05 09:12:29.760] [undefined] GET(/:id/views): try to add views for video 12 +[2025-09-05 09:12:29.766] [undefined] GET(/:id/views): successfully added views for video 12 with status 200 +[2025-09-05 09:13:57.318] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:15:07.924] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:15:28.583] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:15:56.114] [undefined] GET(/:id): try to get video 12 +[2025-09-05 09:15:56.117] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:15:56.129] [undefined] GET(/:id): successfully get video 12 with status 200 +[2025-09-05 09:15:56.141] [undefined] GET(/:id/similar): try to get similar videos for video 12 +[2025-09-05 09:15:56.146] [undefined] GET(/:id/similar): successfully get similar videos for video 12 with status 200 +[2025-09-05 09:15:56.160] [undefined] GET(/:id/views): try to add views for video 12 +[2025-09-05 09:15:56.164] [undefined] GET(/:id/views): successfully added views for video 12 with status 200 +[2025-09-05 09:16:01.720] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:18:55.271] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:18:57.236] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-09-05 09:18:57.242] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-09-05 09:18:57.258] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-09-05 09:18:57.262] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:18:57.267] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-09-05 09:19:19.417] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-09-05 09:19:19.425] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-09-05 09:19:19.445] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-09-05 09:19:19.449] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:19:19.459] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-09-05 09:19:21.373] [undefined] GET(/:id): try to get channel with id 2 +[2025-09-05 09:19:21.378] [undefined] GET(/:id/stats): try to get stats +[2025-09-05 09:19:21.382] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-09-05 09:19:21.388] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-09-05 09:19:22.607] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-09-05 09:19:22.611] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-09-05 09:19:31.231] [undefined] GET(/search): try to search user by username A +[2025-09-05 09:19:31.237] [undefined] GET(/search): successfully found user with username A with status 200 +[2025-09-05 09:19:31.507] [undefined] GET(/search): try to search user by username As +[2025-09-05 09:19:31.513] [undefined] GET(/search): successfully found user with username As with status 200 +[2025-09-05 09:19:37.369] [undefined] GET(/search): try to search user by username A +[2025-09-05 09:19:37.373] [undefined] GET(/search): successfully found user with username A with status 200 +[2025-09-05 09:19:37.603] [undefined] GET(/search): try to search user by username As +[2025-09-05 09:19:37.608] [undefined] GET(/search): successfully found user with username As with status 200 +[2025-09-05 09:19:37.809] [undefined] GET(/search): try to search user by username Ast +[2025-09-05 09:19:37.816] [undefined] GET(/search): successfully found user with username Ast with status 200 +[2025-09-05 09:19:37.889] [undefined] GET(/search): try to search user by username Astr +[2025-09-05 09:19:37.892] [undefined] GET(/search): successfully found user with username Astr with status 200 +[2025-09-05 09:19:49.328] [undefined] POST(/): try to upload video with status undefined +[2025-09-05 09:19:49.350] [undefined] POST(/): successfully uploaded video with status 200 +[2025-09-05 09:19:49.397] [undefined] POST(/thumbnail): try to add thumbnail to video 13 +[2025-09-05 09:19:49.401] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-09-05 09:19:49.416] [undefined] PUT(/:id/tags): try to add tags to video 13 +[2025-09-05 09:19:49.422] [undefined] PUT(/:id/tags): successfully added tags to video 13 with status 200 +[2025-09-05 09:19:49.443] [undefined] GET(/:id): try to get channel with id 2 +[2025-09-05 09:19:49.448] [undefined] GET(/:id/stats): try to get stats +[2025-09-05 09:19:49.453] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-09-05 09:19:49.467] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-09-05 09:21:02.547] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-09-05 09:21:02.553] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-09-05 09:21:10.923] [undefined] GET(/search): try to search user by username a +[2025-09-05 09:21:10.928] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-09-05 09:21:11.146] [undefined] GET(/search): try to search user by username as +[2025-09-05 09:21:11.150] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-09-05 09:21:11.335] [undefined] GET(/search): try to search user by username ast +[2025-09-05 09:21:11.344] [undefined] GET(/search): successfully found user with username ast with status 200 +[2025-09-05 09:21:11.382] [undefined] GET(/search): try to search user by username astr +[2025-09-05 09:21:11.388] [undefined] GET(/search): successfully found user with username astr with status 200 +[2025-09-05 09:21:11.564] [undefined] GET(/search): try to search user by username astri +[2025-09-05 09:21:11.568] [undefined] GET(/search): successfully found user with username astri with status 200 +[2025-09-05 09:21:15.516] [undefined] GET(/search): try to search user by username a +[2025-09-05 09:21:15.523] [undefined] GET(/search): successfully found user with username a with status 200 +[2025-09-05 09:21:15.737] [undefined] GET(/search): try to search user by username as +[2025-09-05 09:21:15.741] [undefined] GET(/search): successfully found user with username as with status 200 +[2025-09-05 09:21:15.918] [undefined] GET(/search): try to search user by username ast +[2025-09-05 09:21:15.924] [undefined] GET(/search): successfully found user with username ast with status 200 +[2025-09-05 09:21:15.972] [undefined] GET(/search): try to search user by username astr +[2025-09-05 09:21:15.980] [undefined] GET(/search): successfully found user with username astr with status 200 +[2025-09-05 09:21:27.039] [undefined] POST(/): try to upload video with status undefined +[2025-09-05 09:21:27.051] [undefined] POST(/): successfully uploaded video with status 200 +[2025-09-05 09:21:27.068] [undefined] POST(/thumbnail): try to add thumbnail to video 14 +[2025-09-05 09:21:27.073] [undefined] POST(/thumbnail): successfully uploaded thumbnail with status 200 +[2025-09-05 09:21:27.093] [undefined] PUT(/:id/tags): try to add tags to video 14 +[2025-09-05 09:21:27.101] [undefined] PUT(/:id/tags): successfully added tags to video 14 with status 200 +[2025-09-05 09:21:27.122] [undefined] GET(/:id): try to get channel with id 2 +[2025-09-05 09:21:27.130] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-09-05 09:21:27.139] [undefined] GET(/:id/stats): try to get stats +[2025-09-05 09:21:27.143] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-09-05 09:33:45.020] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-09-05 09:33:45.025] [undefined] GET(/:id): try to get video 12 +[2025-09-05 09:33:45.035] [undefined] GET(/:id): successfully get video 12 with status 200 +[2025-09-05 09:33:45.042] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-09-05 09:34:02.855] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:36:29.635] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 4 +[2025-09-05 09:36:29.640] [undefined] GET(/:id/subscriptions): successfully retrieved all subscriptions of user 4 with status 200 +[2025-09-05 09:36:29.649] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 4 +[2025-09-05 09:36:29.655] [undefined] GET(/:id/subscriptions/videos): successfully retrieved all subscriptions of user 4 with status 200 +[2025-09-05 09:36:32.965] [undefined] GET(/:id): try to get channel with id 5 +[2025-09-05 09:36:32.976] [undefined] GET(/:id): Successfully get channel with id 5 with status 200 +[2025-09-05 09:36:32.989] [undefined] GET(/:id/channel/subscribed): check if user 4 is subscribed to channel 5 +[2025-09-05 09:36:32.994] [undefined] GET(/:id/channel/subscribed): user 4 is subscribed to channel 5 with status 200 +[2025-09-05 09:37:01.587] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:37:47.320] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:38:00.125] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:38:02.317] [undefined] GET(/:id/history): try to retrieve history of user 4 +[2025-09-05 09:38:02.324] [undefined] GET(/:id/history): successfully retrieved history of user 4 with status 200 +[2025-09-05 09:38:02.344] [undefined] GET(/:id/channel): try to retrieve channel of user 4 +[2025-09-05 09:38:02.350] [undefined] GET(/:id/channel): successfully retrieved channel of user 4 with status 200 +[2025-09-05 09:38:02.355] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:38:03.268] [undefined] GET(/:id): Playlist retrieved with id 4 with status 200 +[2025-09-05 09:38:04.837] [undefined] DELETE(/:id/video/:videoId): Video deleted from playlist with id 4 with status 200 +[2025-09-05 09:38:04.945] [undefined] GET(/:id): Playlist retrieved with id 4 with status 200 +[2025-09-05 09:38:06.399] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:38:22.999] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:40:19.073] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:40:19.081] [undefined] GET(/:id): try to get video 8 +[2025-09-05 09:40:19.087] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-09-05 09:40:19.098] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-09-05 09:40:19.109] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-09-05 09:40:19.166] [undefined] GET(/:id/views): try to add views for video 8 +[2025-09-05 09:40:19.172] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-09-05 09:40:20.697] [undefined] GET(/:id): try to get video 8 +[2025-09-05 09:40:20.700] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:40:20.711] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-09-05 09:40:20.721] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-09-05 09:40:20.726] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-09-05 09:40:20.784] [undefined] GET(/:id/views): try to add views for video 8 +[2025-09-05 09:40:20.788] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-09-05 09:40:32.075] [undefined] GET(/:id): try to get video 8 +[2025-09-05 09:40:32.079] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:40:32.089] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-09-05 09:40:32.102] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-09-05 09:40:32.108] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-09-05 09:40:32.162] [undefined] GET(/:id/views): try to add views for video 8 +[2025-09-05 09:40:32.167] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-09-05 09:40:33.008] [undefined] GET(/:id): try to get video 8 +[2025-09-05 09:40:33.013] [undefined] GET(/user/:id): Playlists retrieved for user with id 4 with status 200 +[2025-09-05 09:40:33.023] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-09-05 09:40:33.050] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-09-05 09:40:33.059] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-09-05 09:40:33.162] [undefined] GET(/:id/views): try to add views for video 8 +[2025-09-05 09:40:33.166] [undefined] GET(/:id/views): successfully added views for video 8 with status 200 +[2025-09-05 09:41:02.165] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 4 with status 200 +[2025-09-05 09:50:00.863] [undefined] GET(/:id): try to get channel with id 6 +[2025-09-05 09:50:00.876] [undefined] GET(/:id): Successfully get channel with id 6 with status 200 +[2025-09-05 09:50:08.677] [undefined] GET(/:id): try to get channel with id 2 +[2025-09-05 09:50:08.689] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-09-05 09:50:14.446] [undefined] GET(/:id): try to get channel with id 5 +[2025-09-05 09:50:14.458] [undefined] GET(/:id): Successfully get channel with id 5 with status 200 +[2025-09-05 09:50:16.410] [undefined] GET(/:id): try to get video 8 +[2025-09-05 09:50:16.421] [undefined] GET(/:id): successfully get video 8 with status 200 +[2025-09-05 09:50:16.430] [undefined] GET(/:id/similar): try to get similar videos for video 8 +[2025-09-05 09:50:16.435] [undefined] GET(/:id/similar): successfully get similar videos for video 8 with status 200 +[2025-09-05 09:59:02.737] [undefined] GET(/:id): try to get video 12 +[2025-09-05 09:59:02.743] [undefined] GET(/:id): successfully get video 12 with status 200 +[2025-09-05 09:59:02.756] [undefined] GET(/:id/similar): try to get similar videos for video 12 +[2025-09-05 09:59:02.761] [undefined] GET(/:id/similar): successfully get similar videos for video 12 with status 200 +[2025-09-05 10:02:49.939] [undefined] GET(/:id): try to get video 12 +[2025-09-05 10:02:49.952] [undefined] GET(/:id): successfully get video 12 with status 200 +[2025-09-05 10:02:49.963] [undefined] GET(/:id/similar): try to get similar videos for video 12 +[2025-09-05 10:02:49.969] [undefined] GET(/:id/similar): successfully get similar videos for video 12 with status 200 +[2025-09-05 10:04:14.469] [undefined] GET(/:id): try to get video 12 +[2025-09-05 10:04:14.479] [undefined] GET(/:id): successfully get video 12 with status 200 +[2025-09-05 10:04:14.491] [undefined] GET(/:id/similar): try to get similar videos for video 12 +[2025-09-05 10:04:14.498] [undefined] GET(/:id/similar): successfully get similar videos for video 12 with status 200 +[2025-09-05 10:06:26.495] [undefined] GET(/:id): try to get channel with id 6 +[2025-09-05 10:06:26.509] [undefined] GET(/:id): Successfully get channel with id 6 with status 200 +[2025-09-05 10:06:37.217] [undefined] GET(/:id): try to get channel with id 5 +[2025-09-05 10:06:37.227] [undefined] GET(/:id): Successfully get channel with id 5 with status 200 +[2025-09-05 16:39:37.274] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-05 16:41:47.205] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-05 17:01:58.738] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 1 with status 200 +[2025-09-05 17:04:07.324] [undefined] POST(/): try to register a user with username: test and email: test@test.com +[2025-09-05 17:04:08.497] [undefined] POST(/): successfully registered with status 200 +[2025-09-05 17:04:46.774] [undefined] POST(/): try to register a user with username: teste and email: teste@test.com +[2025-09-05 17:04:47.739] [undefined] POST(/): successfully registered with status 200 +[2025-09-05 17:05:50.681] [undefined] POST(/): try to register a user with username: testre and email: testre@test.com +[2025-09-05 17:05:51.611] [undefined] POST(/): successfully registered with status 200 +[2025-09-05 17:06:30.976] [undefined] POST(/login): try to login with username 'test' +[2025-09-05 17:06:31.027] [undefined] POST(/login): Successfully logged in with status 200 +[2025-09-05 17:10:52.763] [undefined] POST(/login): try to login with username 'test' +[2025-09-05 17:10:52.861] [undefined] POST(/login): Successfully logged in with status 200 +[2025-09-05 17:11:15.670] [undefined] GET(/search): Invalid token with status 401 +[2025-09-05 17:11:27.652] [undefined] POST(/login): try to login with username 'test' +[2025-09-05 17:11:27.751] [undefined] POST(/login): Successfully logged in with status 200 +[2025-09-05 17:11:41.375] [undefined] GET(/search): try to search user by username test +[2025-09-05 17:11:41.432] [undefined] GET(/search): successfully found user with username test with status 200 +[2025-09-05 17:11:51.707] [undefined] GET(/:id): try to retrieve user 2 +[2025-09-05 17:11:51.762] [undefined] GET(/:id): successfully retrieved user 2 with status 200 +[2025-09-05 17:12:15.622] [undefined] PUT(/:id): try to update user 2 +[2025-09-05 17:12:15.630] [undefined] PUT(/:id): successfully updated user 2 with status 200 +[2025-09-05 17:12:28.053] [undefined] DELETE(/:id): failed because he wasn't the owner of the user with status 403 +[2025-09-05 17:12:38.114] [undefined] GET(/username/:username): try to retrieve user string +[2025-09-05 17:12:38.169] [undefined] GET(/username/:username): successfully retrieved user string with status 200 +[2025-09-05 17:12:46.243] [undefined] GET(/:id/channel): try to retrieve channel of user 2 +[2025-09-05 17:12:46.249] [undefined] GET(/:id/channel): failed to retrieve channel of user 2 because it doesn't exist with status 404 +[2025-09-05 17:12:52.671] [undefined] GET(/:id/history): try to retrieve history of user 2 +[2025-09-05 17:12:52.726] [undefined] GET(/:id/history): failed to retrieve history of user 2 because it doesn't exist with status 404 +[2025-09-05 17:12:58.929] [undefined] GET(/:id/subscriptions): try to retrieve all subscriptions of user 2 +[2025-09-05 17:12:58.936] [undefined] GET(/:id/subscriptions): no subscriptions found for user 2 with status 404 +[2025-09-05 17:13:04.939] [undefined] GET(/:id/subscriptions/videos): try to retrieve all subscriptions of user 2 +[2025-09-05 17:13:04.998] [undefined] GET(/:id/subscriptions/videos): no subscriptions found for user 2 with status 404 +[2025-09-05 17:13:25.706] [undefined] POST(/): try to create new channel with owner 2 and name chien +[2025-09-05 17:13:25.710] [undefined] POST(/): Successfully created new channel with name chien with status 200 +[2025-09-05 17:13:41.559] [undefined] GET(/): try to get all channels +[2025-09-05 17:13:41.564] [undefined] GET(/): Successfully get all channels with status 200 +[2025-09-05 17:13:52.689] [undefined] GET(/:id): try to get channel with id 2 +[2025-09-05 17:13:52.751] [undefined] GET(/:id): Successfully get channel with id 2 with status 200 +[2025-09-05 17:14:09.069] [undefined] PUT(/:id): try to update channel with id 2 +[2025-09-05 17:14:09.130] [undefined] PUT(/:id): Successfully updated channel with status 200 +[2025-09-05 17:14:19.755] [undefined] DELETE(/:id): failed because user do not own the channel with status 403 +[2025-09-05 17:14:29.922] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-09-05 17:53:33.682] [undefined] POST(/:id/subscribe): Invalid token with status 401 +[2025-09-05 17:53:46.173] [undefined] POST(/:id/subscribe): Invalid token with status 401 +[2025-09-05 17:53:56.975] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 1 +[2025-09-05 17:55:37.631] [undefined] POST(/:id/subscribe): try to toggle subscription for channel with id 2 +[2025-09-05 17:55:37.693] [undefined] POST(/:id/subscribe): Successfully subscribed to channel with status 200 +[2025-09-05 17:55:57.145] [undefined] GET(/:id/stats): try to get stats +[2025-09-05 17:55:57.151] [undefined] GET(/:id/stats): Successfully get stats with status 200 +[2025-09-05 17:56:13.319] [undefined] GET(/:id): try to get video 1 +[2025-09-05 17:56:13.350] [undefined] GET(/:id): successfully get video 1 with status 200 +[2025-09-05 17:56:24.622] [undefined] GET(/channel/:id): try to get video from channel 1 +[2025-09-05 17:56:24.627] [undefined] GET(/channel/:id): successfully get video from channel 1 with status 200 +[2025-09-05 17:56:30.445] [undefined] GET(/:id/like): try to toggle like on video 1 +[2025-09-05 17:56:30.453] [undefined] GET(/:id/like): no likes found adding likes for video 1 with status 200 +[2025-09-05 17:56:37.689] [undefined] GET(/:id/similar): try to get similar videos for video 1 +[2025-09-05 17:56:37.696] [undefined] GET(/:id/similar): successfully get similar videos for video 1 with status 200 +[2025-09-05 17:56:43.181] [undefined] GET(/:id/views): try to add views for video 1 +[2025-09-05 17:56:43.230] [undefined] GET(/:id/views): successfully added views for video 1 with status 200 +[2025-09-05 17:56:48.002] [undefined] GET(/:id/likes/day): try to get likes per day +[2025-09-05 17:56:48.063] [undefined] GET(/:id/likes/day): successfully retrieved likes per day with status 200 +[2025-09-05 17:57:00.119] [undefined] POST(/): try to post comment +[2025-09-05 17:57:00.126] [undefined] POST(/): successfully post comment with status 200 +[2025-09-05 17:57:09.337] [undefined] GET(/video/:id): try to get comment from video 1 +[2025-09-05 17:57:09.343] [undefined] GET(/video/:id): successfully get comment with status 200 +[2025-09-05 17:57:15.838] [undefined] GET(/:id): try to get comment 1 +[2025-09-05 17:57:15.843] [undefined] GET(/:id): successfully get comment with status 200 +[2025-09-05 17:57:26.069] [undefined] POST(/): Playlist created with id 5 with status 200 +[2025-09-05 17:57:32.550] [undefined] GET(/see-later): 'See Later' playlist retrieved for user with id 2 with status 200 +[2025-09-05 17:57:44.224] [undefined] POST(/:id): user not the owner of the playlist with id 1 with status 403 +[2025-09-05 17:58:14.088] [undefined] POST(/:id): Video added to playlist with id 2 with status 200 +[2025-09-05 17:58:21.531] [undefined] GET(/:id): Playlist retrieved with id 2 with status 200 diff --git a/backend/package-lock.json b/backend/package-lock.json index 967c063..9a88007 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -14,11 +14,18 @@ "cors": "^2.8.5", "dotenv": "^17.0.1", "express": "^5.1.0", + "express-session": "^1.18.2", "express-validator": "^7.2.1", "jsonwebtoken": "^9.0.2", "moment": "^2.30.1", "multer": "^2.0.1", - "pg": "^8.16.3" + "nodemailer": "^7.0.5", + "passport": "^0.7.0", + "passport-github2": "^0.1.12", + "pg": "^8.16.3", + "swagger-jsdoc": "^6.2.8", + "swagger-ui-express": "^5.0.1", + "yaml": "^2.8.1" }, "devDependencies": { "chai": "^5.2.0", @@ -31,6 +38,50 @@ "vitest": "^3.2.4" } }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", + "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "license": "MIT" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "z-schema": "^5.0.1" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", @@ -481,6 +532,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, "node_modules/@noble/hashes": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", @@ -795,6 +852,13 @@ "win32" ] }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, "node_modules/@types/chai": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", @@ -826,6 +890,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, "node_modules/@types/methods": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", @@ -1034,7 +1104,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/asap": { @@ -1065,9 +1134,17 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, "license": "MIT" }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/bcrypt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", @@ -1119,7 +1196,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -1217,6 +1293,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -1467,6 +1549,15 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", @@ -1481,7 +1572,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, "license": "MIT" }, "node_modules/concat-stream": { @@ -1666,6 +1756,18 @@ "node": ">=0.3.1" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dotenv": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.0.1.tgz", @@ -1863,6 +1965,15 @@ "@types/estree": "^1.0.0" } }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1924,6 +2035,46 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-session": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.2.tgz", + "integrity": "sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.7", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.1.0", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/express-session/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express-session/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/express-validator": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.2.1.tgz", @@ -2094,6 +2245,12 @@ "node": ">= 0.8" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2354,6 +2511,17 @@ "dev": true, "license": "ISC" }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2531,7 +2699,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -2605,6 +2772,13 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -2617,6 +2791,13 @@ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", "license": "MIT" }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", @@ -2641,6 +2822,12 @@ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "license": "MIT" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -2822,7 +3009,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -3104,6 +3290,15 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/nodemailer": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.5.tgz", + "integrity": "sha512-nsrh2lO3j4GkLLXoeEksAMgAOqxOv6QumNRVQTJwKH4nuiww6iC2y7GyANs9kRAxCexg3+lTWM3PZ91iLlVjfg==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/nodemon": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", @@ -3143,6 +3338,12 @@ "node": ">=0.10.0" } }, + "node_modules/oauth": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.2.tgz", + "integrity": "sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q==", + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3176,6 +3377,15 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3185,6 +3395,13 @@ "wrappy": "1" } }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT", + "peer": true + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -3233,6 +3450,63 @@ "node": ">= 0.8" } }, + "node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "license": "MIT", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-github2": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/passport-github2/-/passport-github2-0.1.12.tgz", + "integrity": "sha512-3nPUCc7ttF/3HSP/k9sAXjz3SkGv5Nki84I05kSQPo01Jqq1NzJACgMblCK0fGcv9pKCG/KXU3AJRDGLqHLoIw==", + "dependencies": { + "passport-oauth2": "1.x.x" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/passport-oauth2": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.8.0.tgz", + "integrity": "sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA==", + "license": "MIT", + "dependencies": { + "base64url": "3.x.x", + "oauth": "0.10.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3243,6 +3517,15 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3296,6 +3579,11 @@ "node": ">= 14.16" } }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "node_modules/pg": { "version": "8.16.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", @@ -3524,6 +3812,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -4125,6 +4422,92 @@ "node": ">=4" } }, + "node_modules/swagger-jsdoc": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz", + "integrity": "sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==", + "license": "MIT", + "dependencies": { + "commander": "6.2.0", + "doctrine": "3.0.0", + "glob": "7.1.6", + "lodash.mergewith": "^4.6.2", + "swagger-parser": "^10.0.3", + "yaml": "2.0.0-1" + }, + "bin": { + "swagger-jsdoc": "bin/swagger-jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/swagger-jsdoc/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/swagger-jsdoc/node_modules/yaml": { + "version": "2.0.0-1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", + "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-parser": "10.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.28.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.28.1.tgz", + "integrity": "sha512-IvPrtNi8MvjiuDgoSmPYgg27Lvu38fnLD1OSd8Y103xXsPAqezVNnNeHnVCZ/d+CMXJblflGaIyHxAYIF3O71w==", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } + }, + "node_modules/swagger-ui-express": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz", + "integrity": "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==", + "license": "MIT", + "dependencies": { + "swagger-ui-dist": ">=5.0.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0 || >=5.0.0-beta" + } + }, "node_modules/time-span": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", @@ -4282,6 +4665,24 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "license": "MIT" }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "license": "MIT", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==", + "license": "MIT" + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -4311,6 +4712,15 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/validator": { "version": "13.12.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", @@ -4704,6 +5114,18 @@ "node": ">=10" } }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -4806,6 +5228,36 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "license": "MIT", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } } } } diff --git a/backend/package.json b/backend/package.json index b960bb8..93c9231 100644 --- a/backend/package.json +++ b/backend/package.json @@ -18,11 +18,18 @@ "cors": "^2.8.5", "dotenv": "^17.0.1", "express": "^5.1.0", + "express-session": "^1.18.2", "express-validator": "^7.2.1", "jsonwebtoken": "^9.0.2", "moment": "^2.30.1", "multer": "^2.0.1", - "pg": "^8.16.3" + "nodemailer": "^7.0.5", + "passport": "^0.7.0", + "passport-github2": "^0.1.12", + "pg": "^8.16.3", + "swagger-jsdoc": "^6.2.8", + "swagger-ui-express": "^5.0.1", + "yaml": "^2.8.1" }, "devDependencies": { "chai": "^5.2.0", diff --git a/backend/requests/top-tags-videos.http b/backend/requests/top-tags-videos.http new file mode 100644 index 0000000..1891010 --- /dev/null +++ b/backend/requests/top-tags-videos.http @@ -0,0 +1,17 @@ +### Get all videos from the three most watched tags +GET http://127.0.0.1:8000/api/videos/top-tags/videos + +### Alternative localhost URL +GET http://localhost:8000/api/videos/top-tags/videos + +### With frontend URL (if using nginx proxy) +GET http://localhost/api/videos/top-tags/videos + +### +# This endpoint returns: +# - topTags: The 3 most used tags with their usage count +# - videos: All public videos that have any of these top 3 tags +# - totalVideos: Count of videos returned +# +# Videos are ordered by popularity score (calculated from views, likes, comments) +# and then by release date (newest first) 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..ab22864 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,4 +1,7 @@ import express from "express"; +import swaggerui from "swagger-ui-express"; +import fs from "fs"; +import YAML from "yaml"; import dotenv from "dotenv"; import UserRoute from "./app/routes/user.route.js"; import ChannelRoute from "./app/routes/channel.route.js"; @@ -11,19 +14,71 @@ import PlaylistRoute from "./app/routes/playlist.route.js"; import {initDb} from "./app/utils/database.js"; import MediaRoutes from "./app/routes/media.routes.js"; import SearchRoute from "./app/routes/search.route.js"; +import OAuthRoute from "./app/routes/oauth.route.js"; +import session from "express-session"; +import passport from "passport"; +import { Strategy as GitHubStrategy } from "passport-github2"; console.clear(); dotenv.config(); +console.log(process.env) const app = express(); -// INITIALIZE DATABASE +// Increase body size limits for file uploads +app.use(express.urlencoded({extended: true, limit: '500mb'})); +app.use(express.json({limit: '500mb'})); +app.use(session({ + secret: "your-secret", + resave: false, + saveUninitialized: false, +})); -app.use(express.urlencoded({extended: true})); -app.use(express.json()); -app.use(cors()) +// Swagger setup +const file = fs.readFileSync('./swagger.yaml', 'utf8'); +const swaggerDocument = YAML.parse(file); + +// Swagger UI options +const swaggerOptions = { + explorer: true, + swaggerOptions: { + requestInterceptor: (req) => { + req.headers['Content-Type'] = 'application/json'; + return req; + } + } +}; + +app.use('/api/api-docs', swaggerui.serve, swaggerui.setup(swaggerDocument, swaggerOptions)); + +// --- Passport setup --- +app.use(passport.initialize()); +app.use(passport.session()); + +// Serialize user -> session +passport.serializeUser((user, done) => { + done(null, user); +}); + +// Deserialize session -> user +passport.deserializeUser((obj, done) => { + done(null, obj); +}); + +// --- GitHub Strategy --- + passport.use(new GitHubStrategy({ + clientID: process.env.GITHUB_ID, + clientSecret: process.env.GITHUB_SECRET, + callbackURL: "https://localhost/api/oauth/callback", + scope: ["user:email"] + }, + (accessToken, refreshToken, profile, done) => { + + return done(null, profile); + } + )); // ROUTES app.use("/api/users/", UserRoute); @@ -34,6 +89,7 @@ app.use("/api/playlists", PlaylistRoute); app.use("/api/recommendations", RecommendationRoute); app.use("/api/media", MediaRoutes); app.use("/api/search", SearchRoute); +app.use("/api/oauth", OAuthRoute); const port = process.env.PORT; diff --git a/backend/swagger.yaml b/backend/swagger.yaml new file mode 100644 index 0000000..ba6adf4 --- /dev/null +++ b/backend/swagger.yaml @@ -0,0 +1,2317 @@ +openapi: 3.0.0 +info: + title: FreeTube - Video Sharing Platform API + version: 1.0.0 + description: API documentation for the FreeTube Video Sharing Platform + contact: + name: FreeTube Team + email: contact@freetube.com +servers: + - url: https://localhost + description: Local development server + +components: + securitySchemes: + BearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + + schemas: + User: + type: object + properties: + id: + type: integer + username: + type: string + email: + type: string + format: email + picture: + type: string + created_at: + type: string + format: date-time + + Channel: + type: object + properties: + id: + type: integer + name: + type: string + description: + type: string + owner: + type: integer + subscribers: + type: integer + created_at: + type: string + format: date-time + + Video: + type: object + properties: + id: + type: integer + title: + type: string + description: + type: string + file: + type: string + thumbnail: + type: string + visibility: + type: string + enum: [public, private, unlisted] + channel: + type: integer + views: + type: integer + likes: + type: integer + release_date: + type: string + format: date-time + tags: + type: array + items: + type: string + + Comment: + type: object + properties: + id: + type: integer + content: + type: string + video: + type: integer + author: + type: integer + created_at: + type: string + format: date-time + + Playlist: + type: object + properties: + id: + type: integer + name: + type: string + owner: + type: integer + created_at: + type: string + format: date-time + + Error: + type: object + properties: + message: + type: string + error: + type: string + +paths: + # USER ENDPOINTS + /api/users: + post: + tags: + - Users + summary: Register a new user + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + username: + type: string + email: + type: string + format: email + password: + type: string + minLength: 6 + profile: + type: string + format: binary + required: + - username + - email + - password + responses: + '201': + description: User created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/User' + '400': + description: Bad request - validation failed + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '409': + description: User already exists + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/users/login: + post: + tags: + - Users + summary: Login user + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + username: + type: string + password: + type: string + required: + - username + - password + responses: + '200': + description: Login successful + content: + application/json: + schema: + type: object + properties: + token: + type: string + user: + $ref: '#/components/schemas/User' + '401': + description: Invalid credentials + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/users/search: + get: + tags: + - Users + summary: Search users by username + security: + - BearerAuth: [] + parameters: + - name: username + in: query + required: true + schema: + type: string + responses: + '200': + description: Users found + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/users/{id}: + get: + tags: + - Users + summary: Get user by ID + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: User found + content: + application/json: + schema: + $ref: '#/components/schemas/User' + '404': + description: User not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + put: + tags: + - Users + summary: Update user + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + username: + type: string + email: + type: string + format: email + responses: + '200': + description: User updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/User' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: User not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + delete: + tags: + - Users + summary: Delete user + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: User deleted successfully + content: + application/json: + schema: + type: object + properties: + message: + type: string + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: User not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/users/username/{username}: + get: + tags: + - Users + summary: Get user by username + security: + - BearerAuth: [] + parameters: + - name: username + in: path + required: true + schema: + type: string + responses: + '200': + description: User found + content: + application/json: + schema: + $ref: '#/components/schemas/User' + '404': + description: User not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/users/{id}/channel: + get: + tags: + - Users + summary: Get user's channel + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Channel found + content: + application/json: + schema: + $ref: '#/components/schemas/Channel' + '404': + description: Channel not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/users/{id}/history: + get: + tags: + - Users + summary: Get user's watch history + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: History retrieved + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Video' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/users/{id}/subscriptions: + get: + tags: + - Users + summary: Get user's subscriptions + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Subscriptions retrieved + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Channel' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: User not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/users/{id}/subscriptions/videos: + get: + tags: + - Users + summary: Get videos from subscribed channels + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Subscription videos retrieved + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Video' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/users/verify-email: + post: + tags: + - Users + summary: Verify user email + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + token: + type: string + email: + type: string + format: email + required: + - token + - email + responses: + '200': + description: Email verified successfully + content: + application/json: + schema: + type: object + properties: + message: + type: string + '400': + description: Invalid or expired token + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + # CHANNEL ENDPOINTS + /api/channels: + post: + tags: + - Channels + summary: Create a new channel + security: + - BearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: + type: string + owner: + type: integer + required: + - name + - description + - owner + responses: + '201': + description: Channel created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/Channel' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '409': + description: Channel name already exists + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + get: + tags: + - Channels + summary: Get all channels + security: + - BearerAuth: [] + responses: + '200': + description: Channels retrieved successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Channel' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/channels/{id}: + get: + tags: + - Channels + summary: Get channel by ID + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Channel found + content: + application/json: + schema: + $ref: '#/components/schemas/Channel' + '404': + description: Channel not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + put: + tags: + - Channels + summary: Update channel + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: + type: string + responses: + '200': + description: Channel updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/Channel' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Channel not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + delete: + tags: + - Channels + summary: Delete channel + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Channel deleted successfully + content: + application/json: + schema: + type: object + properties: + message: + type: string + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Channel not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/channels/{id}/subscribe: + post: + tags: + - Channels + summary: Toggle subscription to channel + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + userId: + type: integer + required: + - userId + responses: + '200': + description: Subscription toggled successfully + content: + application/json: + schema: + type: object + properties: + subscribed: + type: boolean + subscriptions: + type: integer + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Channel not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/channels/{id}/stats: + get: + tags: + - Channels + summary: Get channel statistics + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Channel statistics retrieved + content: + application/json: + schema: + type: object + properties: + total_views: + type: integer + subscribers: + type: integer + videos_count: + type: integer + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Channel not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + # VIDEO ENDPOINTS + /api/videos: + post: + tags: + - Videos + summary: Upload a new video + security: + - BearerAuth: [] + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary + title: + type: string + description: + type: string + visibility: + type: string + enum: [public, private, unlisted] + channel: + type: integer + authorizedUsers: + type: array + items: + type: integer + required: + - file + - title + - description + - visibility + - channel + responses: + '201': + description: Video uploaded successfully + content: + application/json: + schema: + $ref: '#/components/schemas/Video' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the channel owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/videos/thumbnail: + post: + tags: + - Videos + summary: Upload or update video thumbnail + security: + - BearerAuth: [] + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary + video: + type: integer + channel: + type: integer + required: + - file + - video + - channel + responses: + '200': + description: Thumbnail uploaded successfully + content: + application/json: + schema: + type: object + properties: + thumbnail: + type: string + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the channel owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/videos/{id}: + get: + tags: + - Videos + summary: Get video by ID + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Video found + content: + application/json: + schema: + $ref: '#/components/schemas/Video' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - no access to video + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + put: + tags: + - Videos + summary: Update video metadata + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + description: + type: string + visibility: + type: string + enum: [public, private, unlisted] + channel: + type: integer + responses: + '200': + description: Video updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/Video' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + delete: + tags: + - Videos + summary: Delete video + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Video deleted successfully + content: + application/json: + schema: + type: object + properties: + message: + type: string + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/videos/{id}/video: + put: + tags: + - Videos + summary: Update video file + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary + channel: + type: integer + required: + - file + - channel + responses: + '200': + description: Video file updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/Video' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/videos/channel/{id}: + get: + tags: + - Videos + summary: Get videos by channel + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Videos retrieved successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Video' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Channel not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/videos/{id}/like: + get: + tags: + - Videos + summary: Toggle like on video + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Like toggled successfully + content: + application/json: + schema: + type: object + properties: + liked: + type: boolean + likes: + type: integer + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/videos/{id}/tags: + put: + tags: + - Videos + summary: Update video tags + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + tags: + type: array + items: + type: string + responses: + '200': + description: Tags updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/Video' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/videos/{id}/similar: + get: + tags: + - Videos + summary: Get similar videos + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Similar videos retrieved + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Video' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/videos/{id}/views: + get: + tags: + - Videos + summary: Add view to video + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: View added successfully + content: + application/json: + schema: + type: object + properties: + views: + type: integer + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/videos/{id}/likes/day: + get: + tags: + - Videos + summary: Get likes per day for video + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Likes per day retrieved + content: + application/json: + schema: + type: array + items: + type: object + properties: + date: + type: string + format: date + likes: + type: integer + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/videos/{id}/authorized-users: + put: + tags: + - Videos + summary: Update authorized users for private video + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + authorizedUsers: + type: array + items: + type: integer + responses: + '200': + description: Authorized users updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/Video' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + # COMMENT ENDPOINTS + /api/comments: + post: + tags: + - Comments + summary: Create a new comment + security: + - BearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + content: + type: string + video: + type: integer + required: + - content + - video + responses: + '201': + description: Comment created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/Comment' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/comments/video/{id}: + get: + tags: + - Comments + summary: Get comments for a video + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Comments retrieved successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Comment' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/comments/{id}: + get: + tags: + - Comments + summary: Get comment by ID + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Comment found + content: + application/json: + schema: + $ref: '#/components/schemas/Comment' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Comment not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + put: + tags: + - Comments + summary: Update comment + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + content: + type: string + video: + type: integer + required: + - content + - video + responses: + '200': + description: Comment updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/Comment' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the author + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Comment not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + delete: + tags: + - Comments + summary: Delete comment + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Comment deleted successfully + content: + application/json: + schema: + type: object + properties: + message: + type: string + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the author + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Comment not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + # PLAYLIST ENDPOINTS + /api/playlists: + post: + tags: + - Playlists + summary: Create a new playlist + security: + - BearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + required: + - name + responses: + '200': + description: Playlist created successfully + content: + application/json: + schema: + type: object + properties: + id: + type: integer + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/playlists/see-later: + get: + tags: + - Playlists + summary: Get "See Later" playlist + security: + - BearerAuth: [] + responses: + '200': + description: See Later playlist retrieved + content: + application/json: + schema: + $ref: '#/components/schemas/Playlist' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Playlist not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/playlists/{id}: + post: + tags: + - Playlists + summary: Add video to playlist + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + video: + type: integer + required: + - video + responses: + '200': + description: Video added to playlist successfully + content: + application/json: + schema: + type: object + properties: + id: + type: integer + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Playlist or video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + get: + tags: + - Playlists + summary: Get playlist by ID + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Playlist retrieved successfully + content: + application/json: + schema: + $ref: '#/components/schemas/Playlist' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Playlist not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + put: + tags: + - Playlists + summary: Update playlist + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + required: + - name + responses: + '200': + description: Playlist updated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/Playlist' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Playlist not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + delete: + tags: + - Playlists + summary: Delete playlist + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Playlist deleted successfully + content: + application/json: + schema: + type: object + properties: + message: + type: string + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Playlist not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/playlists/user/{id}: + get: + tags: + - Playlists + summary: Get playlists by user + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + responses: + '200': + description: User playlists retrieved successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Playlist' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: User not found or no playlists found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/playlists/{id}/video/{videoId}: + delete: + tags: + - Playlists + summary: Remove video from playlist + security: + - BearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: integer + - name: videoId + in: path + required: true + schema: + type: integer + responses: + '200': + description: Video removed from playlist successfully + content: + application/json: + schema: + type: object + properties: + message: + type: string + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden - not the owner + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Playlist or video not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + # SEARCH ENDPOINTS + /api/search: + get: + tags: + - Search + summary: Search videos and channels + parameters: + - name: q + in: query + required: true + schema: + type: string + description: Search query + - name: type + in: query + schema: + type: string + enum: [videos, channel] + default: videos + description: Type of search (videos or channel) + responses: + '200': + description: Search results retrieved successfully + content: + application/json: + schema: + oneOf: + - type: array + items: + $ref: '#/components/schemas/Video' + - type: array + items: + $ref: '#/components/schemas/Channel' + '400': + description: Bad request - query parameter required or invalid type + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + # RECOMMENDATION ENDPOINTS + /api/recommendations: + get: + tags: + - Recommendations + summary: Get personalized recommendations + responses: + '200': + description: Recommendations retrieved successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Video' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/recommendations/trending: + get: + tags: + - Recommendations + summary: Get trending videos + responses: + '200': + description: Trending videos retrieved successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Video' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/recommendations/creators: + get: + tags: + - Recommendations + summary: Get top creators + responses: + '200': + description: Top creators retrieved successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Channel' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + # MEDIA ENDPOINTS + /api/media/profile/{file}: + get: + tags: + - Media + summary: Get profile picture + parameters: + - name: file + in: path + required: true + schema: + type: string + responses: + '200': + description: Profile picture retrieved successfully + content: + image/*: + schema: + type: string + format: binary + '404': + description: File not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/media/video/{file}: + get: + tags: + - Media + summary: Get video file + parameters: + - name: file + in: path + required: true + schema: + type: string + responses: + '200': + description: Video file retrieved successfully + content: + video/*: + schema: + type: string + format: binary + '404': + description: File not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/media/thumbnail/{file}: + get: + tags: + - Media + summary: Get video thumbnail + parameters: + - name: file + in: path + required: true + schema: + type: string + responses: + '200': + description: Thumbnail retrieved successfully + content: + image/*: + schema: + type: string + format: binary + '404': + description: File not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + # OAUTH ENDPOINTS + /api/oauth/github: + get: + tags: + - OAuth + summary: Initiate GitHub OAuth login + responses: + '302': + description: Redirect to GitHub OAuth + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/oauth/callback: + get: + tags: + - OAuth + summary: GitHub OAuth callback + parameters: + - name: code + in: query + required: true + schema: + type: string + - name: state + in: query + schema: + type: string + responses: + '302': + description: Redirect after successful authentication + '400': + description: OAuth error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /api/oauth/me: + get: + tags: + - OAuth + summary: Get current authenticated user info + security: + - BearerAuth: [] + responses: + '200': + description: User info retrieved successfully + content: + application/json: + schema: + $ref: '#/components/schemas/User' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' \ No newline at end of file diff --git a/backend/tools.js b/backend/tools.js index 36b42fb..bea73a3 100644 --- a/backend/tools.js +++ b/backend/tools.js @@ -17,14 +17,13 @@ async function flushDatabase() { port: 5432 }); - await client.connect(); - - - - await client.query('TRUNCATE TABLE users CASCADE', (err, res) => { - if (err) { - console.error('Error flushing database:', err); - } else { - console.log('Database flushed successfully.'); - } - });} \ No newline at end of file + try { + await client.connect(); + await client.query('TRUNCATE TABLE users CASCADE'); + console.log('Database flushed successfully.'); + } catch (err) { + console.error('Error flushing database:', err); + } finally { + await client.end(); + } +} \ No newline at end of file diff --git a/checklist.md b/checklist.md index 895dbd2..4c6f68a 100644 --- a/checklist.md +++ b/checklist.md @@ -22,122 +22,125 @@ ## **ADMINISTRATION CHAÎNE FREETUBE** (55 points) -### Mettre en ligne une vidĂ©o (30 points) +### Mettre en ligne une vidĂ©o (30 points) - 27/30 points ✅ - [x] Upload mĂ©dia vidĂ©o (10 points) - [x] Upload miniature vidĂ©o (2 points) - [x] Titre (2 points) - [x] Description (2 points) - [x] Date de mise en ligne automatique (2 points) - [ ] Mots-clefs/hashtags jusqu'Ă  10 (2 points) -- [ ] VisibilitĂ© publique/privĂ©e (5 points) -- [ ] GĂ©nĂ©ration lien partageable (5 points) +- [x] VisibilitĂ© publique/privĂ©e (5 points) +- [x] GĂ©nĂ©ration lien partageable (5 points) - via slug systĂšme -### Gestion vidĂ©os existantes -- [ ] Éditer une vidĂ©o existante (5 points) -- [ ] Changer la visibilitĂ© (5 points) +### Gestion vidĂ©os existantes (15 points) - 10/15 points +- [x] Éditer une vidĂ©o existante (5 points) +- [x] Changer la visibilitĂ© (5 points) - [x] Supprimer une vidĂ©o (5 points) -### Statistiques -- [ ] Statistiques par vidĂ©o (vues, likes, commentaires) (5 points) +### Statistiques (10 points) - 5/10 points +- [x] Statistiques par vidĂ©o (vues, likes, commentaires) (5 points) - [ ] Statistiques globales de la chaĂźne (5 points) -## **PAGE ACCUEIL** (30 points) +## **RECHERCHE ET NAVIGATION** (20 points) ✅ -### Utilisateur authentifiĂ© (15 points) +### SystĂšme de recherche (20 points) - 20/20 points ✅ +- [x] Recherche par titre de vidĂ©o (8 points) +- [x] Recherche par chaĂźne (8 points) +- [x] Interface de recherche fonctionnelle (4 points) + +## **PAGE ACCUEIL** (30 points) - 10/30 points + +### Utilisateur authentifiĂ© (15 points) - 5/15 points +- [x] Section Tendances (contenu avec plus d'interactions rĂ©centes) (5 points) - [ ] Section Recommendations (contenu similaire non vu) (5 points) - [ ] Section "À consulter plus tard" (5 points) -- [ ] Section Tendances (contenu avec plus d'interactions rĂ©centes) (5 points) -### Utilisateur non-authentifiĂ© (15 points) +### Utilisateur non-authentifiĂ© (15 points) - 5/15 points +- [x] Section Tendances (5 points) - [ ] Section Recommendations (3 mots-clefs les plus utilisĂ©s) (5 points) -- [ ] Section Tendances (5 points) - [ ] Section Top crĂ©ateurs (plus d'abonnĂ©s) (5 points) ## **PAGE ABONNEMENTS** (10 points) - [ ] Fil d'actualitĂ© des abonnements (8 points) - [ ] Redirection pour non-authentifiĂ©s (2 points) -## **PAGE UTILISATEUR** (15 points) +## **PAGE UTILISATEUR** (15 points) - 5/15 points - [ ] Historique des vidĂ©os regardĂ©es (10 points) -- [ ] Gestion et liste des playlists (5 points) +- [x] Gestion et liste des playlists (5 points) -## **PAGE PLAYLIST** (10 points) -- [ ] Affichage nom playlist et vidĂ©os -- [ ] Tri par date d'ajout -- [ ] Navigation depuis page utilisateur +## **PAGE PLAYLIST** (10 points) - 8/10 points ✅ +- [x] Affichage nom playlist et vidĂ©os (4 points) +- [x] Tri par date d'ajout (2 points) +- [x] Navigation depuis page utilisateur (2 points) +- [ ] Interface utilisateur complĂšte (2 points) -## **PAGE VIDÉO** (50 points) +## **PAGE VIDÉO** (50 points) - 27/50 points -### Lecteur vidĂ©o (20 points) +### Lecteur vidĂ©o (20 points) - 10/20 points - [x] MĂ©dia visualisable (10 points) - [ ] Bouton Pause (2 points) - [ ] Bouton Play (2 points) - [ ] Saut XX secondes en avant (3 points) - [ ] Saut XX secondes en arriĂšre (3 points) -### Informations vidĂ©o (20 points) +### Informations vidĂ©o (20 points) - 12/20 points - [x] Titre de la vidĂ©o (2 points) - [x] Description (2 points) - [x] Nom de la chaĂźne (2 points) +- [x] Compteur "J'aime" (2 points) +- [x] Compteur vues (2 points) +- [x] Bouton "J'aime" (2 points) - [ ] Compteur abonnĂ©s (2 points) -- [ ] Compteur "J'aime" (2 points) -- [ ] Bouton "J'aime" (5 points) -- [ ] Bouton "S'abonner" (5 points) +- [ ] Bouton "S'abonner" (6 points) ### Commentaires (10 points) ✅ - [x] CrĂ©er un commentaire (5 points) - [x] Voir les commentaires (5 points) ### Recommendations (5 points) -- [ ] Section recommendations/tendances selon authentification +- [ ] Section recommendations/tendances selon authentification (5 points) ## **FONCTIONNALITÉS SYSTÈME** +### SystĂšme de playlists (15 points) ✅ +- [x] Routes crĂ©er/gĂ©rer playlists (8 points) +- [x] Ajouter/retirer vidĂ©os des playlists (4 points) +- [x] Playlist "À regarder plus tard" automatique (3 points) + +### SystĂšme "J'aime" (10 points) ✅ +- [x] Routes like/unlike vidĂ©o (5 points) +- [x] Compteur de likes par vidĂ©o (3 points) +- [x] Interface utilisateur (2 points) + ### SystĂšme d'abonnements (18 points estimĂ©s) -- [ ] Routes s'abonner/dĂ©sabonner Ă  une chaĂźne -- [ ] ModĂšle de donnĂ©es abonnements -- [ ] Compteur d'abonnĂ©s par chaĂźne - -### SystĂšme "J'aime" (10 points estimĂ©s) -- [ ] Routes aimer/ne plus aimer vidĂ©o -- [ ] ModĂšle de donnĂ©es likes -- [ ] Mise Ă  jour compteur likes - -### Gestion playlists (25 points estimĂ©s) -- [ ] Routes crĂ©er/supprimer playlists -- [ ] Ajout/suppression vidĂ©os dans playlists -- [ ] Playlist "À consulter plus tard" par dĂ©faut -- [ ] Affichage contenu playlist - -### Historique utilisateur (10 points estimĂ©s) -- [ ] Enregistrement automatique vidĂ©os regardĂ©es -- [ ] Routes consultation historique - -### SystĂšme recommandations (15 points estimĂ©s) -- [ ] Algorithme pour utilisateurs authentifiĂ©s -- [ ] Recommendations mots-clĂ©s pour non-authentifiĂ©s -- [ ] Calcul tendances (interactions rĂ©centes) - -### Compteurs et statistiques -- [ ] Compteur de vues par vidĂ©o -- [ ] Mise Ă  jour automatique lors du visionnage -- [ ] Statistiques complĂštes par vidĂ©o et chaĂźne - -## **POINTS CRITIQUES POUR ÉVITER L'AJOURNEMENT** -- **FonctionnalitĂ©s : 120/200 points minimum** -- **QualitĂ© code : 60/100 points minimum** -- **Documentation : 30/50 points minimum** -- **DĂ©ploiement : 30/50 points minimum** - -## **AMÉLIORATIONS TECHNIQUES** -- [ ] Validation robuste donnĂ©es d'entrĂ©e -- [ ] Gestion d'erreurs appropriĂ©e -- [ ] Middleware de sĂ©curitĂ© complet -- [ ] Tests unitaires (fichiers prĂ©sents Ă  complĂ©ter) -- [ ] Architecture REST propre -- [ ] Optimisation performances base de donnĂ©es +- [ ] Routes s'abonner/dĂ©sabonner Ă  une chaĂźne (8 points) +- [ ] ModĂšle de donnĂ©es abonnements (5 points) +- [ ] Compteur d'abonnĂ©s par chaĂźne (5 points) + +### SystĂšme de tags/mots-clefs (8 points estimĂ©s) +- [ ] ModĂšle de donnĂ©es tags (3 points) +- [ ] Association vidĂ©os-tags (3 points) +- [ ] Interface gestion tags (2 points) + +## **SÉCURITÉ ET MIDDLEWARE** ✅ +- [x] Middleware d'authentification JWT +- [x] Validation des donnĂ©es d'entrĂ©e +- [x] Gestion des erreurs +- [x] Upload sĂ©curisĂ© de fichiers +- [x] Logging des actions + +## **INFRASTRUCTURE** ✅ +- [x] Configuration Docker +- [x] Base de donnĂ©es PostgreSQL +- [x] Serveur de fichiers mĂ©dias +- [x] Tests unitaires --- - -**Status actuel estimĂ© : ~102/200 points fonctionnalitĂ©s** -**Objectif prioritaire : Atteindre 120 points minimum** \ No newline at end of file +## **SCORE ESTIMÉ** +**Backend: ~127/183 points (69%)** +**Points prioritaires manquants:** +- OAuth2 (10 points) +- SystĂšme d'abonnements (18 points) +- Tags/mots-clefs (8 points) +- Statistiques globales chaĂźne (5 points) +- ContrĂŽles lecteur vidĂ©o (10 points) diff --git a/create_db.sql b/create_db.sql new file mode 100644 index 0000000..d4129fd --- /dev/null +++ b/create_db.sql @@ -0,0 +1,4 @@ + + CREATE ROLE 'sacha' WITH PASSWORD 'sacha'; + CREATE DATABASE 'sacha' OWNER 'sacha'; + diff --git a/db.sql b/db.sql new file mode 100644 index 0000000..d4129fd --- /dev/null +++ b/db.sql @@ -0,0 +1,4 @@ + + CREATE ROLE 'sacha' WITH PASSWORD 'sacha'; + CREATE DATABASE 'sacha' OWNER 'sacha'; + diff --git a/default.conf b/default.conf new file mode 100644 index 0000000..65c5154 --- /dev/null +++ b/default.conf @@ -0,0 +1,68 @@ +server { + server_name localhost; + listen 80; + + return 301 https://$host$request_uri; +} + +server { + server_name localhost; + listen 443 ssl; + + 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; + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + + # API routes - proxy to backend (MUST come before static file rules) + location /api/ { + # Handle preflight OPTIONS requests + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Origin' '$http_origin' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Max-Age' 1728000 always; + add_header 'Content-Type' 'text/plain; charset=utf-8' always; + add_header 'Content-Length' 0 always; + return 204; + } + + proxy_pass http://localhost:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Origin $http_origin; + proxy_buffering off; + + # CORS headers for actual requests + add_header 'Access-Control-Allow-Origin' '$http_origin' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + + # Also set timeout for large uploads + proxy_read_timeout 300s; + proxy_send_timeout 300s; + } + + # Static assets - NO CACHING for development + location ~* ^/(?!api/).*\.(js|css|png|jpg|jpeg|gif|ico|svg)$ { + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + add_header Pragma "no-cache"; + add_header Expires "0"; + try_files $uri =404; + } + + # Handle React Router - all other routes should serve index.html + location / { + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + try_files $uri $uri/ /index.html; + } +} \ No newline at end of file diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..93566dc --- /dev/null +++ b/deploy.sh @@ -0,0 +1,100 @@ +#!/bin/bash +if [[ $EUID -ne 0 ]]; then + echo "Ce script doit ĂȘtre lancĂ© avec les droits root" + exit 1 +fi + +pwd=$PWD + +# Environment variables +echo -e "\033[0;32m CrĂ©ation des variables d'environnement \033[0m" +echo -e "\033[1;33m Nom d'utilisateur de la base de donnĂ©es \033[0m" +read POSTGRES_USER +echo -e "\033[1;33m Mot de passe de la base de donnĂ©es \033[0m" +read POSTGRES_PASSWORD +echo -e "\033[1;33m Nom de la base de donnĂ©es \033[0m" +read POSTGRES_DB + +echo -e "\033[1;33m ClĂ© d'encryption des JWTs \033[0m" +read JWT_SECRET + +echo -e "\033[1;33m Utilisateur Gmail \033[0m" +read GMAIL_USER +echo -e "\033[1;33m Mot de passe de l'application Gmail \033[0m" +read GMAIL_PASSWORD + +echo -e "\033[1;33m Url du site web \033[0m" +read FRONTEND_URL + +echo -e "\033[1;33m Client ID de l'application Github OAuth \033[0m" +read GITHUB_ID +echo -e "\033[1;33m Client secret de l'application Github OAuth \033[0m" +read GITHUB_PASSWORD + +touch $pwd/backend/.env +echo " + POSTGRES_USER=$POSTGRES_USER + POSTGRES_PASSWORD=$POSTGRES_PASSWORD + POSTGRES_DB=$POSTGRES_DB + POSTGRES_HOST=localhost + + BACKEND_PORT=8000 + + JWT_SECRET=$JWT_SECRET + + LOG_FILE=/var/log/freetube/access.log + + GMAIL_USER=$GMAIL_USER + GMAIL_PASSWORD=$GMAIL_PASSWORD + + FRONTEND_URL=$FRONTEND_URL + + GITHUB_ID=$GITHUB_ID + GITHUB_SECRET=$GITHUB_PASSWORD +" > $pwd/backend/.env + +# Install dependencies (NodeJS 22/PostgreSQL/Nginx) +echo -e "\033[0;32m Installation des dĂ©pendances... \033[0m" +apt install postgresql nginx openssl curl && + +# Install NVM and NodeJS & NPM +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash && +export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" +\. "$HOME/.nvm/nvm.sh" && +nvm install 22 && + +# Install node packages for backend +echo -e "\033[0;32m Installation des paquets NodeJS \033[0m" +cd $pwd/backend && npm install && +cd $pwd/frontend && npm install && + +echo "Construction du frontend" +npx vite build +cd $pwd + +# Create Nginx configuration +echo -e "\033[0;32m CrĂ©ation de la configuration Nginx \033[0m" +mkdir /etc/nginx/ssl/ +openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx-selfsigned.key -out /etc/nginx/ssl/nginx-selfsigned.crt +touch /etc/nginx/conf.d/freetube.conf +cat $pwd/default.conf > /etc/nginx/conf.d/freetube.conf + +echo -e "\033[0;32m Copie des fichiers vers /usr/share/nginx/html \033[0m" +rm /usr/share/nginx/html/index.html +mv $pwd/frontend/dist/* /usr/share/nginx/html/ + +# Create PostgreSQL database +echo -e "\033[0;32m CrĂ©ation de l'utilisateur $POSTGRES_USER \033[0m" + +sudo -u postgres psql -c "CREATE USER $POSTGRES_USER WITH PASSWORD '$POSTGRES_PASSWORD';" +sudo -u postgres psql -c "CREATE ROLE $POSTGRES_USER WITH PASSWORD '$POSTGRES_PASSWORD';" +sudo -u postgres psql -c "CREATE DATABASE $POSTGRES_DB OWNER $POSTGRES_USER;" + +# Add log file +mkdir /var/log/freetube +touch /var/log/freetube/access.log +systemctl enable nginx +systemctl enable postgresql +systemctl start nginx +systemctl start postgresql \ No newline at end of file diff --git a/developpement.yaml b/developpement.yaml index 5b12e0b..35ed232 100644 --- a/developpement.yaml +++ b/developpement.yaml @@ -1,32 +1,35 @@ services: - backend: + resit_backend: build: context: ./backend dockerfile: Dockerfile network: host container_name: resit_backend ports: - - "${BACKEND_PORT}:${BACKEND_PORT}" + - "8000:8000" environment: - DB_USER: ${POSTGRES_USER} - DB_NAME: ${POSTGRES_DB} - DB_HOST: ${POSTGRES_HOST} - DB_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_HOST: db + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} JWT_SECRET: ${JWT_SECRET} LOG_FILE: ${LOG_FILE} PORT: ${BACKEND_PORT} + GMAIL_USER: ${GMAIL_USER} + GMAIL_PASSWORD: ${GMAIL_PASSWORD} + GITHUB_ID: ${GITHUB_ID} + GITHUB_SECRET: ${GITHUB_SECRET} + FRONTEND_URL: ${FRONTEND_URL} volumes: - ./backend/logs:/var/log/freetube - - ./backend/app/uploads:/app/app/uploads - - ./backend/app/utils/wait-for-it.sh:/wait-for-it.sh + - ./backend:/app depends_on: - - db - command: ["/wait-for-it.sh", "${POSTGRES_HOST}:5432", "--", "npm", "start"] + db: + condition: service_healthy db: image: postgres:latest - container_name: resit_db ports: - "5432:5432" environment: @@ -35,20 +38,29 @@ services: POSTGRES_DB: ${POSTGRES_DB} volumes: - db_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s frontend: - build: - context: ./frontend - dockerfile: Dockerfile - network: host + image: nginx:alpine + container_name: resit_frontend ports: - - "5173:5173" + - "80:80" + - "443:443" volumes: - - ./frontend/:/app - - /app/node_modules + - ./frontend/dist:/usr/share/nginx/html + - ./frontend/nginx-selfsigned.crt:/etc/nginx/ssl/nginx-selfsigned.crt + - ./frontend/nginx-selfsigned.key:/etc/nginx/ssl/nginx-selfsigned.key + - ./frontend/default.conf:/etc/nginx/conf.d/default.conf + environment: + - VITE_API_BASE_URL=https://localhost/api depends_on: - - backend + - resit_backend volumes: db_data: - driver: local + driver: local \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index f2c6e24..ab63c0f 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -9,18 +9,24 @@ services: ports: - "8000:8000" environment: - DB_USER: ${POSTGRES_USER} - DB_NAME: ${POSTGRES_DB} - DB_HOST: ${POSTGRES_HOST} - DB_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_HOST: db + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} JWT_SECRET: ${JWT_SECRET} LOG_FILE: ${LOG_FILE} PORT: ${BACKEND_PORT} + GMAIL_USER: ${GMAIL_USER} + GMAIL_PASSWORD: ${GMAIL_PASSWORD} + GITHUB_ID: ${GITHUB_ID} + GITHUB_SECRET: ${GITHUB_SECRET} + FRONTEND_URL: ${FRONTEND_URL} volumes: - ./backend/logs:/var/log/freetube - ./backend:/app depends_on: - - db + db: + condition: service_healthy db: image: postgres:latest @@ -32,15 +38,25 @@ services: POSTGRES_DB: ${POSTGRES_DB} volumes: - db_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s frontend: - image: nginx:latest - network_mode: host + build: + context: ./frontend + dockerfile: Dockerfile + container_name: resit_frontend ports: - "80:80" - volumes: - - ./frontend/dist:/usr/share/nginx/html - - ./nginx/default.conf:/etc/nginx/conf.d/default.conf + - "443:443" + environment: + - VITE_API_BASE_URL=https://localhost/api + depends_on: + - resit_backend volumes: db_data: diff --git a/documentation.md b/documentation.md new file mode 100644 index 0000000..3796d59 --- /dev/null +++ b/documentation.md @@ -0,0 +1,49 @@ +# 3RESIT Freetube + +## Sommaire + +1) Introduction au projet +2) Organisation +2) Les technologies utilisĂ©es + 1) Le serveur + 2) Le site web + 3) La base de donnĂ©es +3) Le serveur + 1) Les dĂ©pendances + 2) Le fonctionnement +4) Le site web + 1) Les dĂ©pendances + 2) Le fonctionnement +5) La base de donnĂ©es + 1) Diagramme des tables +6) Installation + 1) Docker Compose + 2) Script Shell + 3) Manuelle + +## Introduction + +Pour ce projet il nous a Ă©tĂ© demandĂ© de recrĂ©er une plateforme similaire a Youtube nommĂ©e Freetube. Cette application web devait ĂȘtre gratuite et sans publicitĂ©s. Nous avions la main libre sur le choix de la pile technologique utilisĂ©e et sur l'organisation du projet. + +## Organisation + +J'ai commencĂ© par faire un plan dĂ©taillĂ©s de toute les routes et vĂ©rifications a effectuĂ© pour chaque fonctionnalitĂ©, puis faire un plan de la base de donnĂ©es. Ceci allait dĂ©finir toute la structure du projet. + +Pour ce qui est du dĂ©veloppement, j'ai choisis de procĂ©der fonctionnalitĂ© par fonctionnalitĂ© en commençant par le serveur et la base de donnĂ©es pour les intĂ©grer ensuite dans le site web. Pour sĂ©parer toute ces parties j'ai utilisĂ© **git** en crĂ©ant plusieurs branches, une par fonctionnalitĂ©. + +## Les technologies utilisĂ©es + +### Le serveur +Le serveur utilise **NodeJS**, j'ai choisis ce langage car il permet d'implementer une **API REST** efficacement grĂące a son systĂšme d'asynchronisation natif trĂšs performant. Etant crĂ©er a partir du **Javascript** il est aussi plus simple a comprendre et a Ă©crire. MĂȘme si NodeJS n'est pas le plus connu en terme de rapiditĂ© d'Ă©xecution ce n'est pas un problĂšme dans notre situation car nous travaillons avec une **API** qui ajoutera un temps de latence supplĂ©mentaire. + +### Le site web +Le site web est programmĂ© en **ReactJS** avec **Vite** ce qui donne un **backend** et un **frontend** dans le mĂȘme langage ce qui permet une maintenance et des mises Ă  jour plus simple. Tout comme NodeJS, ReactJS et créé a partir de Javascript, il bĂ©nĂ©ficie donc de la mĂȘme intĂ©gration de l'asynchrone natif. Le systĂšme de **composant** de ReactJS permet aussi une gestion de mise Ă  jour de l'interface en temps rĂ©el plus simple a mettre en place et Ă©vite la duplication de code. + +### La base donnĂ©es +La base de donnĂ©es et une base **PostgreSQL**, un systĂšme basĂ© sur le langage SQL largement connu. PostgreSQL est une alternative **OpenSource** Ă  **MySQL**. Il possĂšde une trĂšs bonne intĂ©gration du **JSON** trĂšs utilisĂ© comme moyen d'envoyer des donnĂ©es via **requĂȘte HTTP** utilisĂ© dans les API REST. + +## Le serveur + +### Les dĂ©pendances + +Pour l'API REST j'ai choisis d'utiliser **ExpressJS** couplĂ© avec **express-validator** \ No newline at end of file diff --git a/freetube.sh b/freetube.sh new file mode 100755 index 0000000..4a4af30 --- /dev/null +++ b/freetube.sh @@ -0,0 +1,2 @@ +#!/bin/bash +node ./backend/server.js \ No newline at end of file diff --git a/frontend/Docker.Development b/frontend/Docker.Development new file mode 100644 index 0000000..2bc8951 --- /dev/null +++ b/frontend/Docker.Development @@ -0,0 +1,7 @@ +# Build stage +FROM node:22-alpine3.20 as build-stage + +WORKDIR /app +COPY package*.json ./ +RUN npm install +COPY . . diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 5b114a4..e0a2a74 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,9 +1,17 @@ -FROM node:21-alpine3.20 +# Build stage +FROM node:22-alpine3.20 as build-stage WORKDIR /app COPY package*.json ./ RUN npm install COPY . . -EXPOSE 5173 -CMD ["npm", "run", "dev"] +RUN npm run build +# Production stage +FROM nginx:alpine +RUN mkdir -p /etc/nginx/ssl +COPY --from=build-stage /app/dist /usr/share/nginx/html +COPY default.conf /etc/nginx/conf.d/default.conf +COPY nginx-selfsigned.crt nginx-selfsigned.key /etc/nginx/ssl/ +EXPOSE 80 443 +CMD ["nginx", "-g", "daemon off;"] diff --git a/frontend/default.conf b/frontend/default.conf new file mode 100644 index 0000000..314181e --- /dev/null +++ b/frontend/default.conf @@ -0,0 +1,68 @@ +server { + server_name localhost; + listen 80; + + return 301 https://$host$request_uri; +} + +server { + server_name localhost; + listen 443 ssl; + + 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; + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + + # API routes - proxy to backend (MUST come before static file rules) + location /api/ { + # Handle preflight OPTIONS requests + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Origin' '$http_origin' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Max-Age' 1728000 always; + add_header 'Content-Type' 'text/plain; charset=utf-8' always; + add_header 'Content-Length' 0 always; + return 204; + } + + proxy_pass http://resit_backend:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Origin $http_origin; + proxy_buffering off; + + # CORS headers for actual requests + add_header 'Access-Control-Allow-Origin' '$http_origin' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + + # Also set timeout for large uploads + proxy_read_timeout 300s; + proxy_send_timeout 300s; + } + + # Static assets - NO CACHING for development + location ~* ^/(?!api/).*\.(js|css|png|jpg|jpeg|gif|ico|svg)$ { + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + add_header Pragma "no-cache"; + add_header Expires "0"; + try_files $uri =404; + } + + # Handle React Router - all other routes should serve index.html + location / { + add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"; + try_files $uri $uri/ /index.html; + } +} \ No newline at end of file diff --git a/frontend/nginx-selfsigned.crt b/frontend/nginx-selfsigned.crt new file mode 100644 index 0000000..29fac8a --- /dev/null +++ b/frontend/nginx-selfsigned.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID5zCCAs+gAwIBAgIUXzNzqa/12lyIcoxXf+v371J3fWkwDQYJKoZIhvcNAQEL +BQAwgYIxCzAJBgNVBAYTAkZSMREwDwYDVQQIDAhOb3JtYW5keTENMAsGA1UEBwwE +Q2FlbjERMA8GA1UECgwIRnJhbWluZm8xFTATBgNVBAMMDFNhY2hhIEdVRVJJTjEn +MCUGCSqGSIb3DQEJARYYc2FjaGEuZ3VlcmluQHN1cGluZm8uY29tMB4XDTI1MDcy +MTEzMzgwMVoXDTI2MDcyMTEzMzgwMVowgYIxCzAJBgNVBAYTAkZSMREwDwYDVQQI +DAhOb3JtYW5keTENMAsGA1UEBwwEQ2FlbjERMA8GA1UECgwIRnJhbWluZm8xFTAT +BgNVBAMMDFNhY2hhIEdVRVJJTjEnMCUGCSqGSIb3DQEJARYYc2FjaGEuZ3Vlcmlu +QHN1cGluZm8uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvLg7 +nR0UqRZ7UadhI8jrUjRMV1SZj+ljxEnV6tDOVMsvafsym1MhDZHb+cyv8769yqPv +CKtIOQKhMH0PkSqau8szNlF1Tg/1UzT+Mkd4zvLvGE5+aW/oDMg7E2LMJZuCyO4X +9SzWDVA5+b1QFIw6vvb3mCkUOtVDkOFreBBwryZKcWJ0b8o1hT60oB2wr18P14j0 +0C2/TmHMtim0o4r3gKGvpatqt1fXJo0UlYOwTvfMrYhu2VHqsQ2qP7ocazXEWt5u +Alf1vNPkAenF0ZV/2UiaL41Q8GMoV1enDP7k7/qfgXvta/hOeYnLtmv5Qpi4XiWz +xKjSukTUD2sRtSX+YQIDAQABo1MwUTAdBgNVHQ4EFgQUVj9KtmjLFy4xWzkNI9Kq +NAxNsfUwHwYDVR0jBBgwFoAUVj9KtmjLFy4xWzkNI9KqNAxNsfUwDwYDVR0TAQH/ +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAGpUPMoF/ASIqOOfX5anDtaPvnslj +DuEVbU7Uoyc4EuSD343DPV7iMUKoFvVLPxJJqMLhSo3aEGJyqOF6q3fvq/vX2VE7 +9MhwS1t2DBGb5foWRosnT1EuqFU1/S0RJ/Y+GNcoY1PrUES4+r7zqqJJjwKOzneV +ktUVCdKl0C1gtw6W4Ajxse3fm9DNLxnZZXbyNqn+KbI8QdO0xSEl+gyiycvPu/NT ++EesdlFoYjO7gdA8dXkmu+Z7R61MYhE9Zvyop5KVMqgU8/Ym04UUWjWQYWWLMyuu +bxngE4XNEI5fhg+0e/I25xJJ9wVV/ZNAF4+XOylHz/CmU8V/SPKuGXBGHg== +-----END CERTIFICATE----- diff --git a/frontend/nginx-selfsigned.key b/frontend/nginx-selfsigned.key new file mode 100644 index 0000000..0ac5345 --- /dev/null +++ b/frontend/nginx-selfsigned.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC8uDudHRSpFntR +p2EjyOtSNExXVJmP6WPESdXq0M5Uyy9p+zKbUyENkdv5zK/zvr3Ko+8Iq0g5AqEw +fQ+RKpq7yzM2UXVOD/VTNP4yR3jO8u8YTn5pb+gMyDsTYswlm4LI7hf1LNYNUDn5 +vVAUjDq+9veYKRQ61UOQ4Wt4EHCvJkpxYnRvyjWFPrSgHbCvXw/XiPTQLb9OYcy2 +KbSjiveAoa+lq2q3V9cmjRSVg7BO98ytiG7ZUeqxDao/uhxrNcRa3m4CV/W80+QB +6cXRlX/ZSJovjVDwYyhXV6cM/uTv+p+Be+1r+E55icu2a/lCmLheJbPEqNK6RNQP +axG1Jf5hAgMBAAECggEAAj+hmDRx6jafAAf67sqi3ZgEGEmBkXNeeLGBTPc/qhxd +ip6krTELnz8TE26RG5LYXzslasUNrn42nIImvBT5ZkcjcosKpWfEqQEAjc1PQovC +9eyKnKfw4TpUvvmiveT4T98vCYEOOqHE0/WTdlOoaBY/f+sZKQYu+1NMtAjFcg2r +vVqwsZb5vGyh7CKmIHZnz3UP8P+7G5digiNRne18pGnE2oTnSoQ3/QIqUWBs69DS +k5ew+CSyTLiUFFnMnE4adwyg6wAud5fBlzowF6UF2agToX7pxEaGxGvpBGG034kk +1UXaB/d5YwcsBeH+x5cNMLKZy4zqjoxEEW31Q466NQKBgQDtKk1R/slpTpRqvtBT +NC7InvjcCBXkXttylQHJRN9glqhmflEOe8iMW1/qRwBPlQgK1wq/sXySanVv2+gO +JGq8XNRLbHyG3YRyshdnJHP1HoWQE0uedD/rfqgkNaW5S1IvHrD7Q7tOvCrF+KbS +612pmIgNVzn+inafDXPhMZc4pQKBgQDLtQGAu2eK58ewndyL8+7+VHZSTEtKpt+h +G/U/ccv+6NGqdxI5YUkrJ7k6vV81VeRMvmN9uUS/i8znORFQmm6noRVkhXytwW5B +HXq2co4WRvv9b/XqcqS0GSYVPJ1u4YNH6lvtDZ4UWPyBzYl700GdHrGa+erT44yL +tnibHx9GDQKBgFW1J+Qt85O+9hvtgVPQU+fkq4K42VCCh0PNXavi2+cICyufEqPt +T/iJPQxpRE9+SD3CoPvNpHs1ReN60U3rEzenRIFNX2NNwoPAoHyBy/YVZac/keBd +mov8Zb9QM+fWtIiaytLDE3nMvph017T5ogucN+66SxcV6vBn6CzFwySRAoGAcUf2 +Tv1ohkGAtgIDrLx5cmvL5NZSpHAKOpDOoHqLA/W66v4OX2RviRUtF7JJ6OIb9GWH +9Fl8Fr0KtKbyrw1CbevRdrYY8JN52bIoFJ+9zjupVHXXnookd5boq7SqpAe6ttpo +RnplJ1GZEiIXy4lemp6AC/vhD/YhqWxOw4zaGl0CgYBslhqVt5F0EHf94p7NrCuY +hNHKHaNaULYP0VXKefQamt/ssDuktqb6DNSIvx2rbbB5+33nTlLTya67gimY1lKt +WeNB33/yBkCjfSP/J5UDD9mE/oPLt3vAOkOUgMCfp2IpC2Wez1QGqLHS260zpotP +VpgalHuSWtn8D4nO2pk1hg== +-----END PRIVATE KEY----- diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 7497e3b..a2cbbf8 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,7 +9,9 @@ "version": "0.0.0", "dependencies": { "@tailwindcss/vite": "^4.1.11", + "chart.js": "^4.5.0", "react": "^19.1.0", + "react-chartjs-2": "^5.3.0", "react-dom": "^19.1.0", "react-router-dom": "^7.6.3", "tailwindcss": "^4.1.11" @@ -1004,6 +1006,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.19", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", @@ -1794,6 +1802,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chart.js": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", + "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", @@ -2999,6 +3019,16 @@ "node": ">=0.10.0" } }, + "node_modules/react-chartjs-2": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.0.tgz", + "integrity": "sha512-UfZZFnDsERI3c3CZGxzvNJd02SHjaSJ8kgW1djn65H1KK8rehwTjyrRKOG3VTMG8wtHZ5rgAO5oTHtHi9GCCmw==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-dom": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 3769dca..2af0127 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,13 +5,16 @@ "type": "module", "scripts": { "dev": "vite --host", - "build": "vite build --watch", + "build": "vite build", + "build:watch": "vite build --watch", "lint": "eslint .", "preview": "vite preview" }, "dependencies": { "@tailwindcss/vite": "^4.1.11", + "chart.js": "^4.5.0", "react": "^19.1.0", + "react-chartjs-2": "^5.3.0", "react-dom": "^19.1.0", "react-router-dom": "^7.6.3", "tailwindcss": "^4.1.11" diff --git a/frontend/src/assets/img/background.png b/frontend/src/assets/img/background.png new file mode 100644 index 0000000..51fd619 Binary files /dev/null and b/frontend/src/assets/img/background.png differ diff --git a/frontend/src/assets/svg/check.svg b/frontend/src/assets/svg/check.svg new file mode 100644 index 0000000..1a8e9b3 --- /dev/null +++ b/frontend/src/assets/svg/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/svg/exit_fullscreen.svg b/frontend/src/assets/svg/exit_fullscreen.svg new file mode 100644 index 0000000..d6f4973 --- /dev/null +++ b/frontend/src/assets/svg/exit_fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/svg/eye-slash.svg b/frontend/src/assets/svg/eye-slash.svg new file mode 100644 index 0000000..96fa82e --- /dev/null +++ b/frontend/src/assets/svg/eye-slash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/src/assets/svg/eye.svg b/frontend/src/assets/svg/eye.svg new file mode 100644 index 0000000..cb70721 --- /dev/null +++ b/frontend/src/assets/svg/eye.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/src/assets/svg/fullscreen.svg b/frontend/src/assets/svg/fullscreen.svg new file mode 100644 index 0000000..a316690 --- /dev/null +++ b/frontend/src/assets/svg/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/svg/infinite.svg b/frontend/src/assets/svg/infinite.svg new file mode 100644 index 0000000..13b900a --- /dev/null +++ b/frontend/src/assets/svg/infinite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/svg/play.svg b/frontend/src/assets/svg/play.svg index 1dd584c..3d94f71 100644 --- a/frontend/src/assets/svg/play.svg +++ b/frontend/src/assets/svg/play.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/frontend/src/assets/svg/plus.svg b/frontend/src/assets/svg/plus.svg new file mode 100644 index 0000000..e9def70 --- /dev/null +++ b/frontend/src/assets/svg/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/svg/trash.svg b/frontend/src/assets/svg/trash.svg new file mode 100644 index 0000000..4bf6118 --- /dev/null +++ b/frontend/src/assets/svg/trash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/svg/user.svg b/frontend/src/assets/svg/user.svg new file mode 100644 index 0000000..d6c2c0b --- /dev/null +++ b/frontend/src/assets/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/components/Alert.jsx b/frontend/src/components/Alert.jsx new file mode 100644 index 0000000..ef41c19 --- /dev/null +++ b/frontend/src/components/Alert.jsx @@ -0,0 +1,33 @@ +import { useEffect } from 'react'; + +export default function Alert({ type, message, onClose }) { + const alertClass = `cursor-pointer flex items-center gap-4 p-4 rounded-md text-white transition-opacity duration-300 ${ type === "error" ? "glassmorphism-red" : "glassmorphism-green" } `; + + useEffect(() => { + const timer = setTimeout(() => { + onClose(); + }, 5000); // 5 seconds + + return () => clearTimeout(timer); + }, [onClose]); + + return ( +
+ + { + type === 'success' ? ( + + ) : ( + + ) + } + + {message} +
+ ); + +} \ No newline at end of file diff --git a/frontend/src/components/AlertList.jsx b/frontend/src/components/AlertList.jsx new file mode 100644 index 0000000..82bc9b6 --- /dev/null +++ b/frontend/src/components/AlertList.jsx @@ -0,0 +1,17 @@ +import Alert from "./Alert.jsx"; + + +export default function AlertList({ alerts, onCloseAlert }) { + return ( +
+ {alerts.map((alert, index) => ( + onCloseAlert(alert)} + /> + ))} +
+ ); +} \ No newline at end of file diff --git a/frontend/src/components/ChannelLastVideos.jsx b/frontend/src/components/ChannelLastVideos.jsx new file mode 100644 index 0000000..66d66c8 --- /dev/null +++ b/frontend/src/components/ChannelLastVideos.jsx @@ -0,0 +1,20 @@ +import VideoCard from "./VideoCard.jsx"; + +export default function ChannelLastVideos({ videos }) { + + return ( +
+ { + videos && videos.length > 0 ? ( + videos.map((video) => ( + + ) + ) + ) : ( +

Aucune vidéo trouvée

+ ) + } +
+ ) + +} \ No newline at end of file diff --git a/frontend/src/components/Comment.jsx b/frontend/src/components/Comment.jsx index de6dc96..a041398 100644 --- a/frontend/src/components/Comment.jsx +++ b/frontend/src/components/Comment.jsx @@ -1,8 +1,9 @@ import {useAuth} from "../contexts/AuthContext.jsx"; import {useRef, useState} from "react"; +import { updateComment, deleteComment } from "../services/comment.service.js"; -export default function Comment({ comment, index, videoId, refetchVideo }) { +export default function Comment({ comment, index, videoId, refetchVideo, doShowCommands=true, addAlert }) { let {user, isAuthenticated} = useAuth(); let commentRef = useRef(); @@ -17,23 +18,11 @@ export default function Comment({ comment, index, videoId, refetchVideo }) { } const handleDelete = async (id) => { - try { - const token = localStorage.getItem('token'); - const response = await fetch(`/api/comments/${id}`, { - method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - } - }); - - if (response.ok) { - // Refresh the video data to update the comments list - refetchVideo(); - } - } catch (error) { - console.error('Error deleting comment:', error); - } + const token = localStorage.getItem('token'); + const response = await deleteComment(id, token, addAlert); + if (response) { + refetchVideo(); + } } const handleEditSubmit = async (id, content) => { @@ -41,36 +30,25 @@ export default function Comment({ comment, index, videoId, refetchVideo }) { alert("Comment cannot be empty"); return; } + // Retrieve the token from localStorage + const token = localStorage.getItem('token'); - try { - // Retrieve the token from localStorage - const token = localStorage.getItem('token'); + if (!token) { + navigation('/login'); + return; + } - if (!token) { - navigation('/login'); - return; - } + const body = { + content: content, + video: videoId + }; - const response = await fetch(`/api/comments/${comment.id}`, { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ - content: content, - video: videoId - }) - }); + const response = await updateComment(id, body, token, addAlert); - if (!response.ok) { - throw new Error('Failed to post comment'); - } + if (response) { setEditMode(false); - - } catch (error) { - console.error('Error posting comment:', error); } + } return ( @@ -82,39 +60,44 @@ export default function Comment({ comment, index, videoId, refetchVideo }) { className="w-8 h-8 rounded-full object-cover mr-3" /> {comment.username} + {new Date(comment.created_at).toLocaleDateString()}

{comment.content}

-
- { isAuthenticated && user.username === comment.username && editMode === false ? ( - - ) : null } - { isAuthenticated && user.username === comment.username && editMode === false ? ( - - - ) : null - } - { isAuthenticated && user.username === comment.username && editMode ? ( - - ) : null } - { isAuthenticated && user.username === comment.username && editMode ? ( - - ) : null } -
+ { + doShowCommands && ( +
+ { isAuthenticated && user.username === comment.username && editMode === false ? ( + + ) : null } + { isAuthenticated && user.username === comment.username && editMode === false ? ( + + + ) : null + } + { isAuthenticated && user.username === comment.username && editMode ? ( + + ) : null } + { isAuthenticated && user.username === comment.username && editMode ? ( + + ) : null } +
+ ) + } ) diff --git a/frontend/src/components/CreatorCard.jsx b/frontend/src/components/CreatorCard.jsx new file mode 100644 index 0000000..efd16be --- /dev/null +++ b/frontend/src/components/CreatorCard.jsx @@ -0,0 +1,21 @@ + + +export default function CreatorCard({ creator }) { + const handleClick = () => { + window.location.href = `/manage-channel/${creator.id}`; + }; + + return ( +
+ {creator.name} +

{creator.name}

+
+ {creator.subscribers} abonné(e)s +
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/components/GitHubLoginButton.jsx b/frontend/src/components/GitHubLoginButton.jsx new file mode 100644 index 0000000..466d102 --- /dev/null +++ b/frontend/src/components/GitHubLoginButton.jsx @@ -0,0 +1,23 @@ +import oauthService from '../services/oauthService'; + +export default function GitHubLoginButton({ className = "" }) { + const handleGitHubLogin = () => { + oauthService.loginWithGitHub(); + }; + + return ( + + ); +} diff --git a/frontend/src/components/LinearGraph.jsx b/frontend/src/components/LinearGraph.jsx new file mode 100644 index 0000000..60b3c9e --- /dev/null +++ b/frontend/src/components/LinearGraph.jsx @@ -0,0 +1,52 @@ +import {Line} from "react-chartjs-2"; +import {Chart as ChartJS, CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip, Legend} from "chart.js"; + +ChartJS.register( + CategoryScale, + LinearScale, + PointElement, + LineElement, + Title, + Tooltip, + Legend +); + +export default function LinearGraph({ dataToGraph, className, legend, borderColor="rgba(75, 192, 192, 1)" }) { + + const prepareData = () => { + if (!dataToGraph || dataToGraph.length === 0) { + return { + labels: [], + datasets: [] + }; + } + + const labels = dataToGraph.map(item => item.date.split("T")[0]); + const data = dataToGraph.map(item => item.count); + + return { + labels, + datasets: [{ + label: legend, + data, + fill: false, + pointRadius: 3, + borderColor: borderColor, + tension: 0, + stepped: false + }] + }; + } + + const data = prepareData(); + + const options = { + + } + return ( +
+ +
+ ) + +} \ No newline at end of file diff --git a/frontend/src/components/Navbar.jsx b/frontend/src/components/Navbar.jsx index 27249f1..12618c8 100644 --- a/frontend/src/components/Navbar.jsx +++ b/frontend/src/components/Navbar.jsx @@ -1,65 +1,209 @@ import { useAuth } from '../contexts/AuthContext'; +import React, { useState } from 'react'; +import {useNavigate} from "react-router-dom"; +import AlertList from "./AlertList.jsx"; -export default function Navbar({ isSearchPage = false }) { +export default function Navbar({ isSearchPage = false, alerts = [], onCloseAlert = () => {} }) { const { user, logout, isAuthenticated } = useAuth(); + const [searchQuery, setSearchQuery] = useState(''); + const [internalAlerts, setInternalAlerts] = useState([]); + const [isNavbarOpen, setIsNavbarOpen] = useState(false); + const navigate = useNavigate(); const handleLogout = () => { logout(); }; + const handleKeypress = (event) => { + if (event.key === 'Enter') { + const searchQuery = event.target.value; + if (searchQuery) { + navigate(`/search?q=${encodeURIComponent(searchQuery)}&type=videos`); + } + } + } + + const onCloseInternalAlert = (alertToRemove) => { + setInternalAlerts(internalAlerts.filter(alert => alert !== alertToRemove)); + } + + // Combine internal alerts with external alerts + const allAlerts = [...internalAlerts, ...alerts]; + + const handleCloseAlert = (alertToRemove) => { + // Check if it's an internal alert or external alert + if (internalAlerts.includes(alertToRemove)) { + onCloseInternalAlert(alertToRemove); + } else { + onCloseAlert(alertToRemove); + } + }; + return ( - + + + + + {/* Mobile menu overlay - moved outside of nav container */} + {isNavbarOpen && ( +
+
+

+ FreeTube +

+ +
+
+ +
+
+ )} + + + ) } \ No newline at end of file diff --git a/frontend/src/components/PlaylistCard.jsx b/frontend/src/components/PlaylistCard.jsx index c9e9156..0dbe932 100644 --- a/frontend/src/components/PlaylistCard.jsx +++ b/frontend/src/components/PlaylistCard.jsx @@ -4,7 +4,7 @@ export default function PlaylistCard(props){ const {playlist, onClick} = props; return ( -
{onClick(playlist.id)}}> +
{onClick(playlist.id)}}> {playlist.name}

{playlist.name}

diff --git a/frontend/src/components/PlaylistVideoCard.jsx b/frontend/src/components/PlaylistVideoCard.jsx new file mode 100644 index 0000000..5b13f8d --- /dev/null +++ b/frontend/src/components/PlaylistVideoCard.jsx @@ -0,0 +1,17 @@ + + +export default function PlaylistVideoCard({ video, playlistId, navigation, currentVideo }) { + return ( +
navigation(`/video/${video.id}?playlistId=${playlistId}`)} > +
+ {video.title} + {currentVideo == video.id && ( +
+ +
+ )} +
+

{video.title}

+
+ ); +} \ No newline at end of file diff --git a/frontend/src/components/ProtectedRoute.jsx b/frontend/src/components/ProtectedRoute.jsx index 1e5f666..38fa525 100644 --- a/frontend/src/components/ProtectedRoute.jsx +++ b/frontend/src/components/ProtectedRoute.jsx @@ -17,10 +17,6 @@ const ProtectedRoute = ({ children, requireAuth = true }) => { return ; } - if (!requireAuth && isAuthenticated) { - return ; - } - return children; diff --git a/frontend/src/components/Recommendations.jsx b/frontend/src/components/Recommendations.jsx index 6a118dc..d59b791 100644 --- a/frontend/src/components/Recommendations.jsx +++ b/frontend/src/components/Recommendations.jsx @@ -1,17 +1,17 @@ - +import VideoCard from "./VideoCard"; export default function Recommendations({videos}) { - - - + console.log(videos); return ( -
-

Recommendations

+
+

Recommandations

-
- {videos && videos.map((video, index) => ( +
+ {videos && videos.length > 0 ? videos.map((video, index) => ( - ))} + )) : ( +

Aucune recommandation disponible

+ )}
diff --git a/frontend/src/components/SeeLater.jsx b/frontend/src/components/SeeLater.jsx new file mode 100644 index 0000000..bbb421c --- /dev/null +++ b/frontend/src/components/SeeLater.jsx @@ -0,0 +1,21 @@ +import VideoCard from "./VideoCard.jsx"; + + +export default function SeeLater({videos}) { + + return ( +
+

A regarder plus tard

+
+
+ {videos && videos.length > 0 ? videos.map((video, index) => ( + + )) : ( +

Aucune vidéo à regarder plus tard

+ )} +
+
+
+ ) + +} \ No newline at end of file diff --git a/frontend/src/components/TabLayout.jsx b/frontend/src/components/TabLayout.jsx new file mode 100644 index 0000000..b92a0db --- /dev/null +++ b/frontend/src/components/TabLayout.jsx @@ -0,0 +1,43 @@ +import React, { useState } from 'react'; + +export default function TabLayout({ tabs }) { + + const [activeTab, setActiveTab] = useState(tabs[0].id); + const onTabChange = (tabId) => { + setActiveTab(tabId); + }; + + return ( + +
+ + {/* TABS */} +
+ { + tabs.map((tab) => ( + + )) + } +
+ + {/* ELEMENT */} + +
+ {tabs.map((tab) => ( +
+ {tab.element()} +
+ ))} +
+ +
+ + ) + +} \ No newline at end of file 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/components/TopCreators.jsx b/frontend/src/components/TopCreators.jsx index aa3305e..32efd4e 100644 --- a/frontend/src/components/TopCreators.jsx +++ b/frontend/src/components/TopCreators.jsx @@ -1,17 +1,26 @@ -export default function TopCreators({ creators }) { +export default function TopCreators({ creators, navigate }) { return (
-

Top Creators

-
- {creators && creators.map((creator, index) => ( -
- {creator.name} -

{creator.name}

- {creator.subscribers} subscribers +

Top Créateurs

+
+ {creators && creators.length > 0 ? creators.map((creator, index) => ( +
navigate(`/channel/${creator.id}`)} + > + {creator.name} +

{creator.name}

+ {creator.subscriber_count} abonné{creator.subscriber_count > 1 ? 's' : ''} +

+ {creator.description.slice(0, 100) + (creator.description.length > 100 ? '...' : '')} +

- ))} + )) : ( +

Aucun créateur disponible

+ )}
); diff --git a/frontend/src/components/TrendingVideos.jsx b/frontend/src/components/TrendingVideos.jsx index 028077c..955c99b 100644 --- a/frontend/src/components/TrendingVideos.jsx +++ b/frontend/src/components/TrendingVideos.jsx @@ -6,12 +6,12 @@ export default function TrendingVideos({ videos }) { return (

Tendances

-
- {videos && videos.map((video, index) => ( -
+
+ {videos && videos.length > 0 ? videos.map((video, index) => ( -
- ))} + )) : ( +

Aucune vidéo tendance disponible

+ )}
); diff --git a/frontend/src/components/UserCard.jsx b/frontend/src/components/UserCard.jsx new file mode 100644 index 0000000..3a18068 --- /dev/null +++ b/frontend/src/components/UserCard.jsx @@ -0,0 +1,20 @@ + + +export default function UserCard({ user, onSubmit, doShowControls, control }) { + return ( +
+
+ {`${user.username}'s + {user.username} +
+ {doShowControls && ( + +
{ + onSubmit(user); + }}> + {control} +
+ )} +
+ ); +} \ No newline at end of file diff --git a/frontend/src/components/VideoCard.jsx b/frontend/src/components/VideoCard.jsx index 7926efb..01fb738 100644 --- a/frontend/src/components/VideoCard.jsx +++ b/frontend/src/components/VideoCard.jsx @@ -1,27 +1,64 @@ import { useNavigate } from 'react-router-dom'; -export default function VideoCard({ video }) { +// SUPPORTED JSON FORMAT +// [ +// { +// "id": 1, +// "title": "Video minecraft", +// "thumbnail": "/api/media/thumbnail/78438E11ABA5D0C8.webp", +// "video_description": "Cest une super video minecraft", +// "channel": 1, +// "visibility": "public", +// "file": "/api/media/video/78438E11ABA5D0C8.mp4", +// "slug": "78438E11ABA5D0C8", +// "format": "mp4", +// "release_date": "2025-08-11T11:14:01.357Z", +// "channel_id": 1, +// "owner": 2, +// "views": "2", +// "creator": { +// "name": "astria", +// "profilePicture": "/api/media/profile/sacha.jpg", +// "description": "salut tout le monde" +// }, +// "type": "video" +// } +// ] + +export default function VideoCard({ video, showControls = false, onDelete = () => {}, link = `/video/${video.id}` }) { const navigation = useNavigate(); const handleClick = () => { - navigation(`/video/${video.id}`, { + navigation(link, { state: { video } }) } return ( -
-
- {video.title} -
-

{video.title}

-
- {video.title} - {video.creator.name} - {video.views} vues +
+
+
+ {video.title} +
+

{video.title}

+
+ {video.title} + {video.creator.name} + {video.views} vues +
+ {showControls && ( +
+ +
+ )}
); } \ No newline at end of file diff --git a/frontend/src/components/VideoStatListElement.jsx b/frontend/src/components/VideoStatListElement.jsx new file mode 100644 index 0000000..7feac86 --- /dev/null +++ b/frontend/src/components/VideoStatListElement.jsx @@ -0,0 +1,19 @@ + + +export default function VideoStatListElement ({ video, onClick }) { + return ( +
+ +
+

{video.title.slice(0, 25)}{video.title.length > 25 ? "...":""}

+

Vues: {video.views}

+

Likes: {video.likes}

+

Commentaires: {video.comments}

+
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/contexts/AuthContext.jsx b/frontend/src/contexts/AuthContext.jsx index 087df4d..c2fac22 100644 --- a/frontend/src/contexts/AuthContext.jsx +++ b/frontend/src/contexts/AuthContext.jsx @@ -74,8 +74,8 @@ export const AuthProvider = ({ children }) => { throw new Error(data.message || 'Erreur lors de la création du compte'); } - // After successful registration, log the user in - await login(username, password); + // // After successful registration, log the user in + // await login(username, password); return data; } catch (error) { @@ -83,6 +83,13 @@ export const AuthProvider = ({ children }) => { } }; + const loginWithOAuth = (userData, token) => { + // Store token and user data + localStorage.setItem('token', token); + localStorage.setItem('user', JSON.stringify(userData)); + setUser(userData); + }; + const logout = () => { localStorage.removeItem('token'); localStorage.removeItem('user'); @@ -97,6 +104,7 @@ export const AuthProvider = ({ children }) => { const value = { user, login, + loginWithOAuth, register, logout, getAuthHeaders, diff --git a/frontend/src/index.css b/frontend/src/index.css index 9a9cfa1..cc39166 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -31,6 +31,47 @@ backdrop-filter: blur(27.5px); } +.glassmorphism-rounded-full { + border-radius: 50%; + border: 2px solid rgba(239, 239, 239, 0.60); + background: linear-gradient(93deg, rgba(239, 239, 239, 0.06) 0%, rgba(239, 239, 239, 0.01) 100%); + backdrop-filter: blur(27.5px); +} + +.glassmorphism-top-round { + border-top-left-radius: 15px; + border-top-right-radius: 15px; + border: 1px solid rgba(239, 239, 239, 0.60); + background: linear-gradient(93deg, rgba(239, 239, 239, 0.06) 0%, rgba(239, 239, 239, 0.01) 100%); + backdrop-filter: blur(27.5px); +} + +.glassmorphism-bottom-round { + border-bottom-left-radius: 15px; + border-bottom-right-radius: 15px; + border: 1px solid rgba(239, 239, 239, 0.60); + background: linear-gradient(93deg, rgba(239, 239, 239, 0.06) 0%, rgba(239, 239, 239, 0.01) 100%); + backdrop-filter: blur(27.5px); +} + +.resizable-none { + resize: none; +} + +.glassmorphism-red { + border-radius: 15px; + border: 1px solid rgba(239, 239, 239, 0.60); + background: linear-gradient(93deg, rgba(226, 107, 107, 0.40) 0%, rgba(226, 107, 107, 0.15) 100%); + backdrop-filter: blur(27.5px); +} + +.glassmorphism-green { + border-radius: 15px; + border: 1px solid rgba(239, 239, 239, 0.60); + background: linear-gradient(93deg, rgba(127, 226, 107, 0.40) 0%, rgba(127, 226, 107, 0.15) 100%); + backdrop-filter: blur(27.5px); +} + @theme { /* Fonts */ --font-inter: 'Inter', sans-serif; diff --git a/frontend/src/modals/CreateChannelModal.jsx b/frontend/src/modals/CreateChannelModal.jsx new file mode 100644 index 0000000..8c2019e --- /dev/null +++ b/frontend/src/modals/CreateChannelModal.jsx @@ -0,0 +1,71 @@ +import {useState} from "react"; +import { createChannel } from "../services/channel.service.js"; + + +export default function CreateChannelModal({isOpen, onClose, addAlert}) { + + const [name, setName] = useState(''); + const [description, setDescription] = useState(''); + + const token = localStorage.getItem('token'); + const userStored = localStorage.getItem('user'); + const user = userStored ? JSON.parse(userStored) : {}; + + const onSubmit = async (e) => { + e.preventDefault(); + + const body = { + "name": name, + "description": description, + "owner": user.id + } + + const data = await createChannel(body, token, addAlert); + + console.log(data); + + onClose(); + } + + return isOpen && ( +
+
+

Créer une chaine

+ + setName(e.target.value)} + value={name} + /> + + + + + +
+
+ ) + +} \ No newline at end of file diff --git a/frontend/src/modals/CreatePlaylistModal.jsx b/frontend/src/modals/CreatePlaylistModal.jsx new file mode 100644 index 0000000..195f9d4 --- /dev/null +++ b/frontend/src/modals/CreatePlaylistModal.jsx @@ -0,0 +1,46 @@ +import { useState } from "react"; +import { createPlaylist } from "../services/playlist.service.js"; + +export default function CreatePlaylistModal({ isOpen, onClose, addAlert }) { + + const [name, setName] = useState(''); + + const onSubmit = async (e) => { + e.preventDefault(); + const token = localStorage.getItem("token"); + const body = { name }; + await createPlaylist(body, token, addAlert); + onClose(); + }; + + return isOpen && ( + +
+
+

Créer une playlist

+ + setName(e.target.value)} + value={name} + /> + + +
+
+ ) +} \ No newline at end of file diff --git a/frontend/src/modals/EmailVerificationModal.jsx b/frontend/src/modals/EmailVerificationModal.jsx new file mode 100644 index 0000000..e2f78e1 --- /dev/null +++ b/frontend/src/modals/EmailVerificationModal.jsx @@ -0,0 +1,26 @@ +import React, { useState } from 'react'; + +export default function EmailVerificationModal({ isOpen, onSubmit, onClose }) { + + const [verificationCode, setVerificationCode] = useState(''); + + return isOpen && ( +
+
+

Vérification de l'email

+

Un email de vérification a été envoyé à votre adresse email. Veuillez vérifier votre boßte de réception.

+ setVerificationCode(e.target.value)} + /> + +
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/modals/LoadingVideoModal.jsx b/frontend/src/modals/LoadingVideoModal.jsx new file mode 100644 index 0000000..3416584 --- /dev/null +++ b/frontend/src/modals/LoadingVideoModal.jsx @@ -0,0 +1,17 @@ + + +export default function LoadingVideoModal({state, message}) { + return state === "loading" && ( +
+
+ {/* Spinner */} +
+
+
+
+

{message}

+
+
+ ); + +} \ No newline at end of file diff --git a/frontend/src/modals/VerificationModal.jsx b/frontend/src/modals/VerificationModal.jsx new file mode 100644 index 0000000..2147090 --- /dev/null +++ b/frontend/src/modals/VerificationModal.jsx @@ -0,0 +1,27 @@ + + +export default function VerificationModal({title, onConfirm, onCancel, isOpen}) { + if (!isOpen) return null; + + return ( +
+
+

{title}

+
+ + +
+
+
+ ); +} diff --git a/frontend/src/pages/Account.jsx b/frontend/src/pages/Account.jsx index 2931bf2..a21f8a6 100644 --- a/frontend/src/pages/Account.jsx +++ b/frontend/src/pages/Account.jsx @@ -1,7 +1,12 @@ import Navbar from "../components/Navbar.jsx"; -import {useEffect, useState} from "react"; +import { useEffect, useState } from "react"; import PlaylistCard from "../components/PlaylistCard.jsx"; import VideoCard from "../components/VideoCard.jsx"; +import { useNavigate } from "react-router-dom"; +import CreateChannelModal from "../modals/CreateChannelModal.jsx"; +import CreatePlaylistModal from "../modals/CreatePlaylistModal.jsx"; +import { getChannel, getUserHistory, getPlaylists, updateUser, deleteUser } from "../services/user.service.js"; +import VerificationModal from "../modals/VerificationModal.jsx"; export default function Account() { @@ -16,68 +21,22 @@ export default function Account() { const [isPictureEditActive, setIsPictureEditActive] = useState(false); const [userHistory, setUserHistory] = useState([]); const [userPlaylists, setUserPlaylists] = useState([]); - const [userChannel, setUserChannel] = useState(null); + const [isModalOpen, setIsModalOpen] = useState(false); + const [isCreatePlaylistModalOpen, setIsCreatePlaylistModalOpen] = useState(false); + const [alerts, setAlerts] = useState([]); + const [isVerificationModalOpen, setIsVerificationModalOpen] = useState(false); + + const navigation = useNavigate(); const fetchUserChannel = async () => { - try { - const response = await fetch(`/api/users/${user.id}/channel`, { - method: "GET", - headers: { - "Authorization": `Bearer ${token}`, - } - }); - if (!response.ok) { - throw new Error("Failed to fetch user data"); - } - const data = await response.json(); - setUserChannel(data); - } catch (error) { - console.error("Error fetching user channel:", error); - return null; - } + setUserChannel(await getChannel(user.id, token, addAlert)); // Reset before fetching } const fetchUserHistory = async () => { - if (!user.id || !token) { - console.warn("User ID or token missing, skipping history fetch"); - return; - } - try { - const response = await fetch(`/api/users/${user.id}/history`, { - method: "GET", - headers: { - "Authorization": `Bearer ${token}`, - } - }); - if (!response.ok) { - throw new Error("Failed to fetch user history"); - } - const data = await response.json(); - setUserHistory(data); - } catch (error) { - console.error("Error fetching user history:", error); - } + setUserHistory(await getUserHistory(user.id, token, addAlert)); } const fetchUserPlaylists = async () => { - if (!user.id || !token) { - console.warn("User ID or token missing, skipping playlists fetch"); - return; - } - try { - const response = await fetch(`/api/playlists/user/${user.id}`, { - method: "GET", - headers: { - "Authorization": `Bearer ${token}`, - } - }); - if (!response.ok) { - throw new Error("Failed to fetch user playlists"); - } - const data = await response.json(); - setUserPlaylists(data); - } catch (error) { - console.error("Error fetching user playlists:", error); - } + setUserPlaylists(await getPlaylists(user.id, token, addAlert)); } useEffect(() => { @@ -89,16 +48,16 @@ export default function Account() { const [editMode, setEditMode] = useState(false); - const nonEditModeClasses = "text-2xl font-bold text-white p-2 focus:text-white focus:outline-none w-full font-montserrat"; + const nonEditModeClasses = "text-lg lg:text-2xl font-bold text-white p-2 focus:text-white focus:outline-none w-full font-montserrat"; const editModeClasses = nonEditModeClasses + " glassmorphism"; const handlePlaylistClick = (playlistId) => { - + navigation(`/playlist/${playlistId}`); } const handleUpdateUser = async () => { if (password !== confirmPassword) { - alert("Les mots de passe ne correspondent pas."); + addAlert('error', "Les mots de passe ne correspondent pas."); return; } @@ -108,55 +67,63 @@ export default function Account() { password: password || undefined, // Only send password if it's not empty }; - try { - const response = await fetch(`/api/users/${user.id}`, { - method: "PUT", - headers: { - "Content-Type": "application/json", - "Authorization": `Bearer ${token}`, - }, - body: JSON.stringify(updatedUser), - }); - - if (!response.ok) { - throw new Error("Failed to update user"); - } - - const data = await response.json(); - localStorage.setItem("user", JSON.stringify(data.user)); + const result = await updateUser(user.id, token, updatedUser, addAlert); + if (result) { + localStorage.setItem("user", JSON.stringify(result)); setEditMode(false); - alert("Profil mis Ă  jour avec succĂšs !"); - } catch (error) { - console.error("Error updating user:", error); - alert("Erreur lors de la mise Ă  jour du profil."); + addAlert('success', "Profil mis Ă  jour avec succĂšs."); } } + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; // Add unique ID + setAlerts([...alerts, newAlert]); + }; + + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + }; + + const closeModal = () => { + setIsModalOpen(false); + fetchUserChannel(); + } + const closePlaylistModal = () => { + setIsCreatePlaylistModalOpen(false); + fetchUserPlaylists(); + } + const onDeleteAccount = async () => { + await deleteUser(user.id, token, addAlert); + localStorage.removeItem("user"); + navigation("/login"); + } + return (
- + -
+
{/* Left side */} - {/* Profile / Edit profile */} -
+ {/* Profile / Edit profile */} +
+
setIsPictureEditActive(true)} onMouseLeave={() => setIsPictureEditActive(false)} >
- + closeModal()} addAlert={addAlert} /> + closePlaylistModal()} addAlert={addAlert} />
) diff --git a/frontend/src/pages/AddVideo.jsx b/frontend/src/pages/AddVideo.jsx new file mode 100644 index 0000000..511d06e --- /dev/null +++ b/frontend/src/pages/AddVideo.jsx @@ -0,0 +1,362 @@ +import Navbar from "../components/Navbar.jsx"; +import { useEffect, useState } from "react"; +import Tag from "../components/Tag.jsx"; +import { getChannel, searchByUsername } from "../services/user.service.js"; +import { uploadVideo, uploadThumbnail, uploadTags } from "../services/video.service.js"; +import UserCard from "../components/UserCard.jsx"; +import LoadingVideoModal from "../modals/LoadingVideoModal.jsx"; +import { useNavigate } from "react-router-dom"; + +export default function AddVideo() { + + const storedUser = localStorage.getItem("user"); + const user = storedUser ? JSON.parse(storedUser) : null; + const token = localStorage.getItem("token"); + const navigation = useNavigate(); + + const [videoTitle, setVideoTitle] = useState(""); + const [videoDescription, setVideoDescription] = useState(""); + const [videoTags, setVideoTags] = useState([]); + const [visibility, setVisibility] = useState("private"); + const [videoThumbnail, setVideoThumbnail] = useState(null); + const [videoFile, setVideoFile] = useState(null); + const [channel, setChannel] = useState(null); + const [searchUser, setSearchUser] = useState(""); + const [authorizedUsers, setAuthorizedUsers] = useState([]); + const [searchResults, setSearchResults] = useState([]); + const [alerts, setAlerts] = useState([]); + const [loadingState, setLoadingState] = useState("none"); + const [loadingMessage, setLoadingMessage] = useState(""); + + useEffect(() => { + fetchChannel(); + }, []) + + const fetchChannel = async () => { + const fetchedChannel = await getChannel(user.id, token, addAlert); + setChannel(fetchedChannel.channel); + console.log(fetchedChannel.channel); + } + + const handleTagKeyDown = (e) => { + if (e.key === 'Enter' && videoTags.length < 10) { + e.preventDefault(); + const newTag = e.target.value.trim(); + if (newTag && !videoTags.includes(newTag)) { + setVideoTags([...videoTags, newTag]); + e.target.value = ''; + } + } + } + const handleTagRemove = (tagToRemove) => { + setVideoTags(videoTags.filter(tag => tag !== tagToRemove)); + }; + + // This function handles the submission of the video form + const handleSubmit = async (e) => { + e.preventDefault(); + + console.log(channel) + setLoadingState("loading"); + setLoadingMessage("Envoie de la vidéo..."); + + if (!videoTitle || !videoDescription || !videoThumbnail || !videoFile) { + addAlert('error', 'Veuillez remplir tous les champs requis.'); + return; + } + if (!channel || !channel.id) { + addAlert('error', 'Chaßne non valide veuillez recharger la page.'); + return; + } + if (videoTags.length > 10) { + addAlert('error', 'Vous ne pouvez pas ajouter plus de 10 tags.'); + return; + } + + const formData = new FormData(); + formData.append("title", videoTitle); + formData.append("description", videoDescription); + formData.append("channel", channel.id.toString()); + formData.append("visibility", visibility); + formData.append("authorizedUsers", JSON.stringify(authorizedUsers.map(user => user.id))); + formData.append("file", videoFile); + + const request = await uploadVideo(formData, token, addAlert); + + setLoadingMessage("Envoie de la miniature..."); + + // If the video was successfully created, we can now upload the thumbnail + const response = await request.json(); + const videoId = response.id; + const thumbnailFormData = new FormData(); + thumbnailFormData.append("video", videoId); + thumbnailFormData.append("file", videoThumbnail); + thumbnailFormData.append("channel", channel.id.toString()); + await uploadThumbnail(thumbnailFormData, token, addAlert); + + setLoadingMessage("Envoie des tags..."); + // if the thumbnail was successfully uploaded, we can send the tags + const body = { + tags: videoTags, + channel: channel.id.toString() + }; + await uploadTags(body, videoId, token, addAlert); + // If everything is successful, redirect to the video management page + navigation("/manage-channel/" + channel.id); + addAlert('success', 'Vidéo ajoutée avec succÚs !'); + + + }; + + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; // Add unique ID + setAlerts([...alerts, newAlert]); + }; + + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + }; + + const onUserSearch = (e) => { + const searchUser = e.target.value; + if (searchUser.trim() !== "") { + // Call the API to search for users + searchByUsername(searchUser, token, addAlert) + .then((results) => { + console.log(results); + setSearchResults(results); + }) + .catch((error) => { + addAlert('error', 'Erreur lors de la recherche d\'utilisateurs.'); + }); + } else { + setSearchResults([]); + } + } + + const onAuthorizedUserAdd = (user) => { + + // Verify if user is not already authorized + if (authorizedUsers.find((u) => u.id === user.id)) { + addAlert('error', 'Utilisateur déjà autorisé.'); + setSearchUser("") + setSearchResults([]); + return; + } + + setAuthorizedUsers([...authorizedUsers, user]); + setSearchResults([]); + setSearchUser("") + }; + + const onAuthorizedUserRemove = (user) => { + setAuthorizedUsers(authorizedUsers.filter((u) => u.id !== user.id)); + }; + + return ( +
+ + +
+

+ Ajouter une vidéo +

+ +
+ {/* Left side: Form for adding video details */} +
+ + setVideoTitle(e.target.value)} + required + /> + + + + + + +
+ {videoTags.map((tag, index) => ( + handleTagRemove(tag)} /> + ))} +
+ + + + + + + + + + + + + { + visibility == "private" && ( +
+ +
+ setSearchUser(e.target.value)} + onKeyDown={(e) => { + onUserSearch(e) + }} + /> +
+ {searchResults && searchResults.map((user, index) => ( + + ajouter + + } + /> + ))} +
+
+ + + +
+ {authorizedUsers.length > 0 ? authorizedUsers.map((user, index) => ( + + supprimer + + } + /> + )) : ( +

Aucun utilisateur autorisé

+ )} +
+
+ ) + } + + + + + + + + + + + + + + setVideoThumbnail(e.target.files[0])} + required + /> + + + setVideoFile(e.target.files[0])} + required + /> + + + +
+ + {/* Right side: Preview of the video being added */} +
+
+ {videoTitle} +

{videoTitle || "Titre de la vidéo"}

+ +
+

+ {videoDescription || "Description de la vidéo"} +

+ +
+ {videoTags.length > 0 ? ( + videoTags.map((tag, index) => ( + + )) + ) : ( + Aucun tag ajouté + )} +
+
+ +
+
+
+ +
+ +
+ ); + +} \ No newline at end of file diff --git a/frontend/src/pages/Channel.jsx b/frontend/src/pages/Channel.jsx new file mode 100644 index 0000000..618c55f --- /dev/null +++ b/frontend/src/pages/Channel.jsx @@ -0,0 +1,115 @@ +import Navbar from "../components/Navbar.jsx"; +import {useEffect, useState} from "react"; +import {useParams} from "react-router-dom"; +import {fetchChannelDetails, subscribe} from "../services/channel.service.js"; +import TabLayout from "../components/TabLayout.jsx"; +import ChannelLastVideos from "../components/ChannelLastVideos.jsx"; +import { isSubscribed } from "../services/user.service.js"; + + +export default function Channel() { + + const id = useParams().id; + + const [alerts, setAlerts] = useState([]); + const [channel, setChannel] = useState(null); + const [isSubscribedToChannel, setIsSubscribedToChannel] = useState(false); + const tabs = [ + { id: 'last', label: 'DerniÚres vidéos', element: () => }, + { id: 'all', label: 'Toutes les vidéos', element: () => }, + ]; + + useEffect(() => { + async function fetchData() { + const chan = await fetchChannelDetails(id, addAlert); + setChannel(chan); + // If not authenticated, isSubscribed may be undefined -> default to false + const subscribed = await isSubscribed(id, addAlert); + setIsSubscribedToChannel(Boolean(subscribed)); + } + fetchData(); + }, [id]) + + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; // Add unique ID + setAlerts(prev => [...prev, newAlert]); + }; + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + } + + const handleSubscribe = async () => { + try { + const result = await subscribe(id, addAlert); + // Update local counter from API response + const newCount = Number(result?.subscriptions ?? (channel?.subscriptions ?? 0)); + setChannel(prev => (prev ? { ...prev, subscriptions: newCount } : prev)); + + // Toggle local subscription state and notify + const next = !isSubscribedToChannel; + setIsSubscribedToChannel(next); + } catch (e) { + // Error alert already handled in service + } + }; + + return ( +
+ + +
+ + {/* Channel Header */} +
+
+ {channel +
+
+

{channel && channel.name}

+

{channel && channel.subscriptions} abonné(es)

+
+ { + isSubscribedToChannel ? ( + + ) : ( + + ) + } +
+
+ +

Description

+

+ { channel && channel.description } +

+ +
+ + {/* Tab selector */} + + + + {/* 10 Last videos */} + + + +
+ +
+ ) + +} \ No newline at end of file diff --git a/frontend/src/pages/Home.jsx b/frontend/src/pages/Home.jsx index 78123cd..2ddf1f9 100644 --- a/frontend/src/pages/Home.jsx +++ b/frontend/src/pages/Home.jsx @@ -5,6 +5,10 @@ import {useState, useEffect} from "react"; import { useAuth } from '../contexts/AuthContext'; import TopCreators from "../components/TopCreators.jsx"; import TrendingVideos from "../components/TrendingVideos.jsx"; +import { getRecommendations, getTrendingVideos, getTopCreators } from '../services/recommendation.service.js'; +import { useNavigate } from 'react-router-dom'; +import SeeLater from "../components/SeeLater.jsx"; +import {getSeeLater} from "../services/playlist.service.js"; export default function Home() { const { isAuthenticated, user } = useAuth(); @@ -12,65 +16,98 @@ export default function Home() { const [loading, setLoading] = useState(true); const [topCreators, setTopCreators] = useState([]); const [trendingVideos, setTrendingVideos] = useState([]); + const [seeLaterVideos, setSeeLaterVideos] = useState([]); + const [alerts, setAlerts] = useState([]); + + const navigate = useNavigate(); useEffect(() => { // Fetch recommendations, top creators, and trending videos const fetchData = async () => { - try { - const response = await fetch('/api/recommendations'); - const data = await response.json(); - setRecommendations(data.recommendations); - } catch (error) { - console.error('Error fetching data:', error); - } finally { - setLoading(false); + if (isAuthenticated) { + const token = localStorage.getItem('token'); + try { + setRecommendations(await getRecommendations(token, addAlert)); + } finally { + setLoading(false); + } + } else { + try { + setRecommendations(await getRecommendations(null, addAlert)); + } finally { + setLoading(false); + } } try { - const trendingResponse = await fetch('/api/recommendations/trending'); - const trendingData = await trendingResponse.json(); - setTrendingVideos(trendingData); - } catch (error) { - console.error('Error fetching trending videos:', error); + setTrendingVideos(await getTrendingVideos(addAlert)); } finally { setLoading(false); } + if (isAuthenticated) { + try { + const token = localStorage.getItem('token'); + setSeeLaterVideos(await getSeeLater(token, addAlert)); + } finally { + setLoading(false); + } + } else { + try { + setTopCreators(await getTopCreators(addAlert)); + } finally { + setLoading(false); + } + } + }; fetchData(); }, []); + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; + setAlerts([...alerts, newAlert]); + }; + + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + }; + return ( -
+
- -
+ +
{/* Hero section */} -
- +
+ {isAuthenticated ? ( -

+

Bienvenue {user?.username} !

) : ( <> -

+

Regarder des vidéos comme jamais auparavant

- + + )}
@@ -79,7 +116,16 @@ export default function Home() { {/* Top Creators section */} - + + { + isAuthenticated ? ( + + ) : ( + + ) + } + + {/* Trending Videos section */} diff --git a/frontend/src/pages/Login.jsx b/frontend/src/pages/Login.jsx index d111c7d..9e13cb5 100644 --- a/frontend/src/pages/Login.jsx +++ b/frontend/src/pages/Login.jsx @@ -2,15 +2,17 @@ import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../contexts/AuthContext'; import Navbar from '../components/Navbar'; +import GitHubLoginButton from '../components/GitHubLoginButton'; export default function Login() { const [formData, setFormData] = useState({ username: '', password: '' }); - const [error, setError] = useState(''); + const [alerts, setAlerts] = useState([]); const [loading, setLoading] = useState(false); - + const [showPassword, setShowPassword] = useState(false); + const navigate = useNavigate(); const { login } = useAuth(); @@ -21,16 +23,25 @@ export default function Login() { }); }; + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; // Add unique ID + setAlerts([...alerts, newAlert]); + }; + + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + }; + const handleSubmit = async (e) => { e.preventDefault(); - setError(''); + setAlerts([]); // Clear existing alerts setLoading(true); try { await login(formData.username, formData.password); navigate('/'); } catch (err) { - setError(err.message || 'Erreur de connexion'); + addAlert('error', err.message || 'Erreur de connexion'); } finally { setLoading(false); } @@ -38,21 +49,15 @@ export default function Login() { return (
- - + +
-
-

Connexion

- - {error && ( -
- {error} -
- )} +
+

Connexion

-
-
+ +
diff --git a/frontend/src/pages/LoginSuccess.jsx b/frontend/src/pages/LoginSuccess.jsx new file mode 100644 index 0000000..a70848a --- /dev/null +++ b/frontend/src/pages/LoginSuccess.jsx @@ -0,0 +1,59 @@ +import { useEffect, useRef } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import { useAuth } from '../contexts/AuthContext'; + +export default function LoginSuccess() { + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const { loginWithOAuth } = useAuth(); + const hasProcessed = useRef(false); + + useEffect(() => { + // Prevent multiple executions + if (hasProcessed.current) return; + + const token = searchParams.get('token'); + const userParam = searchParams.get('user'); + + console.log('Processing OAuth callback:', { token: !!token, userParam: !!userParam }); + + if (token && userParam) { + try { + hasProcessed.current = true; + + const userData = JSON.parse(decodeURIComponent(userParam)); + console.log('Parsed user data:', userData); + + // Use the OAuth login method to update auth context + loginWithOAuth(userData, token); + + // Small delay before navigation to ensure state is updated + setTimeout(() => { + navigate('/', { replace: true }); + }, 100); + + } catch (error) { + console.error('Error processing OAuth login:', error); + hasProcessed.current = true; + setTimeout(() => { + navigate('/login?error=invalid_data', { replace: true }); + }, 100); + } + } else { + console.log('Missing token or user data'); + hasProcessed.current = true; + setTimeout(() => { + navigate('/login?error=missing_data', { replace: true }); + }, 100); + } + }, []); // Remove dependencies to prevent re-runs + + return ( +
+
+
+

Finalisation de la connexion...

+
+
+ ); +} diff --git a/frontend/src/pages/ManageChannel.jsx b/frontend/src/pages/ManageChannel.jsx new file mode 100644 index 0000000..f28c56a --- /dev/null +++ b/frontend/src/pages/ManageChannel.jsx @@ -0,0 +1,203 @@ +import Navbar from "../components/Navbar.jsx"; +import {useEffect, useState} from "react"; +import {useNavigate, useParams} from "react-router-dom"; +import {useAuth} from "../contexts/AuthContext.jsx"; +import VideoStatListElement from "../components/VideoStatListElement.jsx"; +import {fetchChannelDetails, fetchChannelStats, updateChannel, deleteChannel} from "../services/channel.service.js"; +import VerificationModal from "../modals/VerificationModal.jsx"; + + +export default function ManageChannel() { + + const {id} = useParams(); + const {user} = useAuth(); + const navigate = useNavigate(); + + const [channel, setChannel] = useState(); + const [channelStats, setChannelStats] = useState(); + const [channelName, setChannelName] = useState(null); + const [description, setDescription] = useState(null); + const [editMode, setEditMode] = useState(false); + const [alerts, setAlerts] = useState([]); + const [isVerificationModalOpen, setIsVerificationModalOpen] = useState(false); + + const token = localStorage.getItem("token"); + const nonEditModeClasses = "text-2xl font-bold text-white p-2 focus:text-white focus:outline-none w-full font-montserrat resizable-none text-center"; + 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" + const editModeClassesTextArea = nonEditModeClassesTextArea + " glassmorphism h-48"; + + useEffect(() => { + fetchChannelData() + fetchStats() + }, []); + + const fetchChannelData = async () => { + setChannel(await fetchChannelDetails(id, addAlert)); + + } + const fetchStats = async () => { + setChannelStats(await fetchChannelStats(id, token, addAlert)); + } + + const handleUpdateChannel = async () => { + if (!editMode) return; + + const data = { + name: channelName || channel.name, + description: description || channel.description, + }; + + const response = await updateChannel(id, data, token, addAlert); + + if (response) { + setEditMode(false); + } + + } + + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + }; + + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; // Add unique ID + setAlerts([...alerts, newAlert]); + }; + + const onDeleteChannel = async () => { + await deleteChannel(id, token, addAlert); + navigate("/profile"); + } + + return ( +
+ + +
+ + {/* LEFT SIDE */} +
+
+ + + setChannelName(e.target.value)} + placeholder="Nom d'utilisateur" + disabled={!editMode} + /> + + + { + editMode ? ( +
+ + +
+ ) : ( + + ) + } +
+ + setIsVerificationModalOpen(false)} + onConfirm={onDeleteChannel} + /> +
+ + {/* RIGHT SIDE */} +
+ {/* VIEW / SUBSCRIBERS STATS */} + +
+
+ {/* TOTAL VIEWS */} +

Vues totales

+

{channelStats ? channelStats.views : "0"}

+
+
+ {/* TOTAL SUBSCRIBERS */} +

Abonnés

+

{channelStats ? channelStats.subscribers : "0"}

+
+
+ + {/* VIDEOS */} +
+

Vidéos

+ + +
+ + { channel?.videos?.length > 0 ? ( +
+ {channel.videos.map((video) => ( + navigate("/manage-video/" + video.id)} + key={video.id} + /> + ))} +
+ ) : ( +

Aucune vidéo trouvée pour cette chaßne.

+ )} + + + +
+ +
+ +
+ ) + +} \ No newline at end of file diff --git a/frontend/src/pages/ManageVideo.jsx b/frontend/src/pages/ManageVideo.jsx new file mode 100644 index 0000000..24479ca --- /dev/null +++ b/frontend/src/pages/ManageVideo.jsx @@ -0,0 +1,494 @@ +import Navbar from "../components/Navbar.jsx"; +import {useParams} from "react-router-dom"; +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"; +import UserCard from "../components/UserCard.jsx"; +import {getVideoById, getLikesPerDay, updateVideo, updateVideoFile, uploadThumbnail, uploadTags, updateAuthorizedUsers, deleteVideo} from "../services/video.service.js"; +import {searchByUsername} from "../services/user.service.js"; +import VerificationModal from "../modals/VerificationModal.jsx"; +import {useNavigate} from "react-router-dom"; + + +export default function ManageVideo() { + + const { user } = useAuth(); + const token = localStorage.getItem("token"); + const {id} = useParams(); + const navigate = useNavigate(); + + const [video, setVideo] = useState(null); + const [likesPerDay, setLikesPerDay] = useState([]); + 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 [alerts, setAlerts] = useState([]); + const [searchUser, setSearchUser] = useState(""); + const [searchResults, setSearchResults] = useState([]); + const [isVerificationModalOpen, setIsVerificationModalOpen] = useState(false); + + 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" + const editModeClassesTextArea = nonEditModeClassesTextArea + " glassmorphism h-48"; + + const fetchVideo = async () => { + const data = await getVideoById(id, addAlert); + if (!data) return; + setVideo(data); + setVisibility(data.visibility) + setVideoTitle(data.title); + setDescription(data.description); + } + const fetchLikesPerDay = async () => { + const data = await getLikesPerDay(id, token, addAlert); + if (!data) return; + setLikesPerDay(data.likes); + setViewsPerDay(data.views); + } + + useEffect(() => { + if (user) { + fetchVideo() + fetchLikesPerDay() + } + }, [user, id, token]); + + const onSubmit = async (e) => { + e.preventDefault(); + if (!editMode) return; + + const body = { + title: videoTitle, + description: description, + visibility: visibility, + channel: video.channel + }; + + const request = await updateVideo(id, body, token, addAlert); + + const form = new FormData(); + if (videoFile) { + form.append('file', videoFile); + form.append('video', id); + form.append('channel', video.channel); + + await updateVideoFile(id, form, token, addAlert); + } + + const data = await request.json(); + setVideo(data); + setEditMode(false); + addAlert('success', 'VidĂ©o mise Ă  jour avec succĂšs'); + } + + 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); + + const request = await uploadThumbnail(formData, token, addAlert); + }; + + const onAddTag = async (e) => { + if (e.key !== 'Enter' || e.target.value.trim() === "") return; + + const newTag = e.target.value.trim(); + e.target.value = ""; + const body = { + tags: [...video.tags, newTag], + channel: video.channel + } + + const request = await uploadTags(body, id, token, addAlert); + setVideo({ + ...video, + tags: [...video.tags, newTag] + }); + } + + const onSuppressTag = async (tag) => { + + const body = { + tags: video.tags.filter(t => t !== tag), + channel: video.channel + } + + const request = await uploadTags(body, id, token, addAlert); + const newTags = video.tags.filter(t => t !== tag); + setVideo({ + ...video, + tags: newTags + }); + } + + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; // Add unique ID + setAlerts([...alerts, newAlert]); + }; + + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + }; + + const onUserSearch = async (value) => { + if (value.trim() === "") { + setSearchResults([]); + return; + } + + const results = await searchByUsername(value, token, addAlert); + setSearchResults(results); + }; + + const onAuthorizedUserAdd = async (user) => { + // Don't modify video directly - use current state + const currentAuthorizedUsers = video?.authorizedUsers || []; + + if (currentAuthorizedUsers.some(u => u.id === user.id)) { + addAlert('error', "Cet utilisateur est dĂ©jĂ  autorisĂ©."); + return; + } + + // authorizedUsers = only ids + const body = { + authorizedUsers: [...currentAuthorizedUsers.map(u => u.id), user.id], + channel: video.channel + }; + + console.log("Sending to API:", body); // Debug log + + const request = await updateAuthorizedUsers(id, body, token, addAlert); + + // Only update state after successful API call + setVideo({ + ...video, + authorizedUsers: [...currentAuthorizedUsers, user] + }); + setSearchUser(""); + setSearchResults([]); + addAlert('success', "Utilisateur ajoutĂ© avec succĂšs."); + } + + const onRemoveAuthorizedUser = async (user) => { + console.log("Êtes-vous sĂ»r de vouloir supprimer cet utilisateur autorisĂ© ?", user.id); + const body = { + authorizedUsers: video.authorizedUsers.filter(u => u.id !== user.id), + channel: video.channel + }; + + const request = await updateAuthorizedUsers(id, body, token, addAlert); + setVideo({ + ...video, + authorizedUsers: video.authorizedUsers.filter(u => u.id !== user.id) + }); + addAlert('success', "Utilisateur supprimĂ© avec succĂšs."); + } + + const onDeleteVideo = async () => { + await deleteVideo(id, video.channel, token, addAlert); + navigate("/manage-channel/" + video.channel); + } + + return ( +
+ + + +
+ + { /* GRAPHS */ } +
+
+ + +
+ +
+ + { /* LEFT SIDE */ } +
+ { /* THUMBNAIL */ } + + + + { /* VIDEO INFOS */ } + +
+ + setVideoTitle(e.target.value)} + className={(editMode ? editModeClasses : nonEditModeClasses) + " text-xl"} + placeholder="Titre de la vidéo" + disabled={!editMode} + /> + + + + + + + + + setVideoFile(e.target.files[0])} + /> + + { + editMode ? ( +
+ + +
+ ) : ( + + ) + } + +
+ + {/* AUTHORIZED USERS */} + + { + video && video.visibility === "private" && ( +
+

Utilisateurs autorisés

+ +
+ { + setSearchUser(e.target.value); + onUserSearch(e.target.value); + }} + /> +
+ {searchResults && searchResults.map((user, index) => ( + + ajouter + + } + /> + ))} +
+
+ +
+ {video && video.authorizedUsers && video.authorizedUsers.length > 0 ? ( + video.authorizedUsers.map((user) => ( + + supprimer + + } /> + )) + ) : ( +

Aucun utilisateur autorisé

+ )} +
+
+ ) + } + + + setIsVerificationModalOpen(false)} + onConfirm={onDeleteVideo} + /> +
+ + + { /* RIGHT SIDE */ } +
+ +
+ { /* TOTAL VIEWS */ } +
+

{video ? video.views : 0} vues

+
+ + { /* TOTAL LIKES */ } +
+

{video ? video.likes : 0} likes

+
+
+ + { /* COMMENTS */ } +
+ +

Commentaires

+ + {video && video.comments && video.comments.length > 0 ? ( + video.comments.map((comment) => ( + + )) + ) : ( +

Aucun commentaire

+ )} + +
+ + { /* 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} + + +

+ +
+
+ +
+ +
+ + +
+
+ ) + +} \ No newline at end of file diff --git a/frontend/src/pages/Playlist.jsx b/frontend/src/pages/Playlist.jsx new file mode 100644 index 0000000..53966af --- /dev/null +++ b/frontend/src/pages/Playlist.jsx @@ -0,0 +1,98 @@ +import { useParams } from "react-router-dom"; +import Navbar from "../components/Navbar"; +import { useEffect, useState } from "react"; +import { getPlaylistById, deletePlaylist, deleteVideo } from "../services/playlist.service.js"; +import VideoCard from "../components/VideoCard.jsx"; +import VerificationModal from "../modals/VerificationModal.jsx"; +import { useNavigate } from "react-router-dom"; + +export default function Playlist() { + + const { id } = useParams(); + const navigate = useNavigate(); + + const [alerts, setAlerts] = useState([]); + const [playlist, setPlaylist] = useState(null); + const [isDeletePlaylistModalOpen, setIsDeletePlaylistModalOpen] = useState(false); + + const fetchPlaylistDetails = async () => { + const token = localStorage.getItem("token"); + const data = await getPlaylistById(id, token, addAlert); + setPlaylist(data); + } + + useEffect(() => { + fetchPlaylistDetails(); + }, [id]); + + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; // Add unique ID + setAlerts([...alerts, newAlert]); + }; + + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + }; + + const onDeletePlaylist = async () => { + const token = localStorage.getItem("token"); + await deletePlaylist(id, token, addAlert); + setIsDeletePlaylistModalOpen(false); + navigate("/profile"); + } + + const onDeleteVideo = async (videoId) => { + const token = localStorage.getItem("token"); + await deleteVideo(id, videoId, token, addAlert); + fetchPlaylistDetails(); + } + + return ( +
+ + +
+ +

{playlist && playlist.name}

+ {/* CONTROLS */} +
+ + +
+ +
+ { + playlist && playlist.videos && playlist.videos.length > 0 ? playlist.videos.map(video => ( + + )) : ( +

Aucun vidéo trouvée dans cette playlist.

+ ) + } +
+
+ onDeletePlaylist()} + onCancel={() => setIsDeletePlaylistModalOpen(false)} + isOpen={isDeletePlaylistModalOpen} + /> +
+ ); + +} \ No newline at end of file diff --git a/frontend/src/pages/Register.jsx b/frontend/src/pages/Register.jsx index bf74d9e..8b1ae64 100644 --- a/frontend/src/pages/Register.jsx +++ b/frontend/src/pages/Register.jsx @@ -2,6 +2,9 @@ import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../contexts/AuthContext'; import Navbar from '../components/Navbar'; +import EmailVerificationModal from '../modals/EmailVerificationModal'; +import { verifyEmail } from '../services/user.service'; +import GitHubLoginButton from '../components/GitHubLoginButton'; export default function Register() { const [formData, setFormData] = useState({ @@ -14,7 +17,11 @@ export default function Register() { const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const [previewImage, setPreviewImage] = useState(null); - + const [alerts, setAlerts] = useState([]); + const [showPassword, setShowPassword] = useState(false); + const [showConfirmPassword, setShowConfirmPassword] = useState(false); + const [isEmailVerificationModalOpen, setEmailVerificationModalOpen] = useState(false); + const navigate = useNavigate(); const { register } = useAuth(); @@ -44,16 +51,15 @@ export default function Register() { const handleSubmit = async (e) => { e.preventDefault(); - setError(''); // Validation if (formData.password !== formData.confirmPassword) { - setError('Les mots de passe ne correspondent pas'); + addAlert("error", "Les mots de passe ne correspondent pas"); return; } if (formData.password.length < 6) { - setError('Le mot de passe doit contenir au moins 6 caractÚres'); + addAlert("error", "Le mot de passe doit contenir au moins 6 caractÚres"); return; } @@ -61,31 +67,48 @@ export default function Register() { try { await register(formData.email, formData.username, formData.password, formData.profile); - navigate('/'); + setEmailVerificationModalOpen(true); } catch (err) { - setError(err.message || 'Erreur lors de la création du compte'); + addAlert('error', 'Erreur lors de la création du compte'); } finally { setLoading(false); } }; + const onVerificationSubmit = async (token) => { + + console.log("Submitting email verification with token:", token); + + const response = await verifyEmail(formData.email, token, addAlert); + + if (response) { + // Email verified successfully + setEmailVerificationModalOpen(false); + navigate('/login'); + } + + } + + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; // Add unique ID + setAlerts([...alerts, newAlert]); + }; + + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + }; + return (
- +
-
-

Créer un compte

- - {error && ( -
- {error} -
- )} +
+

Créer un compte

-
-
-
-
-
+ setEmailVerificationModalOpen(false)} />
); } diff --git a/frontend/src/pages/Search.jsx b/frontend/src/pages/Search.jsx new file mode 100644 index 0000000..5c07606 --- /dev/null +++ b/frontend/src/pages/Search.jsx @@ -0,0 +1,138 @@ +import Navbar from "../components/Navbar.jsx"; +import {useEffect, useState} from "react"; +import {search} from "../services/search.service.js" +import VideoCard from "../components/VideoCard.jsx"; +import CreatorCard from "../components/CreatorCard.jsx"; +import {useSearchParams} from "react-router-dom"; + +export default function Search() { + + const [searchParams, setSearchParams] = useSearchParams(); + const queryFromUrl = searchParams.get('q') || ''; + const typeFromUrl = searchParams.get('type') || 'videos'; + + const [filter, setFilter] = useState(typeFromUrl); + const [searchQuery, setSearchQuery] = useState(queryFromUrl); + + const [results, setResults] = useState({}); + const [alerts, setAlerts] = useState([]); + + useEffect(() => { + async function fetchData() { + if (searchParams) { + setResults(await search(queryFromUrl, typeFromUrl, 0, 20, addAlert)); + } + } + fetchData(); + }, [searchParams]); + useEffect(() => { + async function fetchData() { + if (searchQuery) { + setResults(await search(searchQuery, filter, 0, 20, addAlert)); + } + } + fetchData(); + }, [filter]); + + const handleKeyPress = async (e) => { + if (e.key === 'Enter') { + setResults(await search(e.target.value, filter, 0, 20)); + } + } + + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; // Add unique ID + setAlerts([...alerts, newAlert]); + }; + + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + }; + + return ( +
+ + +
+ + {/* MEGA SEARCH BAR */} +
+
+ setSearchQuery(e.target.value)} + onKeyPress={(e) => handleKeyPress(e) } + /> + + + + +
+ + {/* FILTERS */} +
+ + setFilter("videos")} + /> + + + setFilter("channel")} + /> + +
+ +
+ + {/* RESULTS */} +
+ {results && results.length > 0 ? ( + results.map((result, index) => { + if (result.type === "video") { + return ( + + ); + } else if (result.type === "channel") { + return ( + + ); + } + }) + ) : ( + +
+

Aucun résultat trouvé

+

Essayez de modifier votre recherche ou d'utiliser un autre filtre.

+
+ + )} +
+ +
+
+ ) +} \ No newline at end of file diff --git a/frontend/src/pages/Subscription.jsx b/frontend/src/pages/Subscription.jsx new file mode 100644 index 0000000..b0d1776 --- /dev/null +++ b/frontend/src/pages/Subscription.jsx @@ -0,0 +1,95 @@ +import React from "react"; +import Navbar from "../components/Navbar"; +import { useEffect, useState } from "react"; +import { getAllUserSubscriptions, getAllUserSubscriptionVideos } from "../services/user.service.js"; +import { useAuth } from "../contexts/AuthContext.jsx"; +import VideoCard from "../components/VideoCard.jsx"; +import { useNavigate } from "react-router-dom"; + +export default function Subscription() { + + const navigate = useNavigate(); + + const [alerts, setAlerts] = useState([]); + const [subscriptions, setSubscriptions] = React.useState([]); + const [videos, setVideos] = useState([]); + const {user, isAuth} = useAuth(); + + useEffect(() => { + fetchSubscriptions(); + fetchSubscriptionVideos(); + }, []); + + const fetchSubscriptions = async () => { + const token = localStorage.getItem('token'); + if (!token) { + addAlert('error', "User not authenticated"); + return; + } + + const data = await getAllUserSubscriptions(user.id, token, addAlert); + if (data) { + setSubscriptions(data); + } + }; + + const fetchSubscriptionVideos = async () => { + const token = localStorage.getItem('token'); + if (!token) { + addAlert('error', "User not authenticated"); + return; + } + + const data = await getAllUserSubscriptionVideos(user.id, token, addAlert); + if (data) { + setVideos(data); + } + }; + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; // Add unique ID + setAlerts([...alerts, newAlert]); + }; + + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + }; + + return ( +
+ + +
+ + {/* LEFT SIDE (subscription list) */} +
+

Mes Abonnements

+
    + {subscriptions.map(subscription => ( +
  • navigate(`/channel/${subscription.channel_id}`)} + > + {subscription.channel_name} +

    {subscription.channel_name}

    +
  • + ))} +
+
+ + {/* RIGHT SIDE (videos from subscriptions) */} +
+ {videos.map(video => ( + + ))} +
+ + +
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/pages/Video.jsx b/frontend/src/pages/Video.jsx index 9320f90..d599d98 100644 --- a/frontend/src/pages/Video.jsx +++ b/frontend/src/pages/Video.jsx @@ -1,90 +1,147 @@ -import {useNavigate, useParams} from "react-router-dom"; +import {useNavigate, useParams, useSearchParams} from "react-router-dom"; import {useEffect, useState, useRef, useCallback} from "react"; 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"; +import {addView, getSimilarVideos, getVideoById, toggleLike} from "../services/video.service.js"; +import {subscribe} from "../services/channel.service.js"; +import {addComment} from "../services/comment.service.js"; +import { getPlaylists } from "../services/user.service.js"; +import { addToPlaylist, getPlaylistById } from "../services/playlist.service.js"; +import PlaylistVideoCard from "../components/PlaylistVideoCard.jsx"; export default function Video() { - // This component can be used to display a video player or video-related content. const {id} = useParams(); const { user, isAuthenticated } = useAuth(); const videoRef = useRef(null); const controllerRef = useRef(null); + const hideControlsTimeoutRef = useRef(null); const navigation = useNavigate(); + const [searchParams] = useSearchParams(); + const playlistId = searchParams.get("playlistId"); + const isPlaylist = playlistId !== null; const [video, setVideo] = useState(null); + const [nextVideo, setNextVideo] = useState(null); const [similarVideos, setSimilarVideos] = useState([]); const [currentTime, setCurrentTime] = useState(0); const [duration, setDuration] = useState(0); const [progress, setProgress] = useState(0); const [showControls, setShowControls] = useState(false); const [comment, setComment] = useState(""); + const [alerts, setAlerts] = useState([]); + const [playlists, setPlaylists] = useState([]); + const [isAddToPlaylistOpen, setIsAddToPlaylistOpen] = useState(false); + const [currentPlaylist, setCurrentPlaylist] = useState(null); + const [isFullscreen, setIsFullscreen] = useState(false); + const [isCommentVisible, setIsCommentVisible] = useState(window.innerWidth >= 1024); // Show comments by default on large screens const fetchVideo = useCallback(async () => { // Fetch video data and similar videos based on the video ID from the URL - try { - const response = await fetch(`/api/videos/${id}`); - if (!response.ok) { - throw new Error('Network response was not ok'); - } - const videoData = await response.json(); - setVideo(videoData); - } catch (error) { - console.error('Error fetching video:', error); + if (!id) { + addAlert('error', 'Vidéo introuvable'); + navigation('/'); + return; } - try { - const response = await fetch(`/api/videos/${id}/similar`); - if (!response.ok) { - throw new Error('Network response was not ok'); - } - const similarVideosData = await response.json(); - setSimilarVideos(similarVideosData); - } catch (error) { - console.error('Error fetching similar videos:', error); + + const data = await getVideoById(id, navigation, addAlert); + if (!data) return; + setVideo(data); + + const similarVideosResponse = await getSimilarVideos(id, addAlert); + if (similarVideosResponse) { + setSimilarVideos(similarVideosResponse); } // Add views to the video - try { - const token = localStorage.getItem('token'); - if (!token) { - navigation('/login'); - return; - } - await fetch(`/api/videos/${id}/views`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - } - }); - } catch (error) { - console.error('Error adding views:', error); - } + await addView(id, addAlert); }, [id, navigation]); - const fetchComments = useCallback(async () => { - // Fetch comments for the video - try { - const response = await fetch(`/api/comments/video/${id}`); - if (!response.ok) { - throw new Error('Network response was not ok'); + const fetchPlaylists = async () => { + const token = localStorage.getItem('token'); + if (!token) return; + const user = JSON.parse(localStorage.getItem('user')); + + const data = await getPlaylists(user.id, token, addAlert); + if (data) { + setPlaylists(data); + } + } + + const fetchCurrentPlaylist = async () => { + const token = localStorage.getItem('token'); + if (!token) return; + + if (!playlistId) return; + + setCurrentPlaylist(await getPlaylistById(playlistId, token, addAlert)); + } + + const fetchNextVideo = async () => { + const token = localStorage.getItem('token'); + if (!token) return; + + console.log("Fetching next video"); + console.log("currentPlaylist", currentPlaylist); + console.log("current video id from params:", id, "type:", typeof id); + console.log("playlist videos:", currentPlaylist?.videos?.map(v => ({ id: v.id, type: typeof v.id }))); + + //Find position of current video id in currentPlaylist.videos + const currentIndex = currentPlaylist?.videos.findIndex(video => { + console.log(`Comparing video.id: ${video.id} (${typeof video.id}) with id: ${id} (${typeof id})`); + return video.id.toString() === id.toString(); + }); + console.log("currentIndex", currentIndex); + + if (currentIndex !== -1) { + if (currentPlaylist?.videos[currentIndex + 1]) { + setNextVideo(currentPlaylist.videos[currentIndex + 1]); + console.log("nextVideo", currentPlaylist.videos[currentIndex + 1]); } - const commentsData = await response.json(); - setVideo((prevVideo) => ({ - ...prevVideo, - comments: commentsData - })); - } catch (error) { - console.error('Error fetching comments:', error); } - }, [id]); + } + + const passToNextVideo = () => { + if (!nextVideo) { + console.log("No next video available"); + return; + } + console.log("Passing to next video:", nextVideo); + + // Navigate to the next video with playlist context + if (playlistId) { + navigation(`/video/${nextVideo.id}?playlistId=${playlistId}`); + } else { + navigation(`/video/${nextVideo.id}`); + } + } useEffect(() => { fetchVideo(); + fetchPlaylists(); + fetchCurrentPlaylist(); }, [fetchVideo]); + useEffect(() => { + fetchNextVideo(); + }, [currentPlaylist]); + + // Handle fullscreen state changes + useEffect(() => { + if (!isFullscreen) { + // Clear timeout when exiting fullscreen + if (hideControlsTimeoutRef.current) { + clearTimeout(hideControlsTimeoutRef.current); + hideControlsTimeoutRef.current = null; + } + // Reset controls visibility for normal mode + setShowControls(false); + } + }, [isFullscreen]); + const handlePlayPause = () => { if (videoRef.current) { if (videoRef.current.paused) { @@ -157,11 +214,31 @@ export default function Video() { } const handleMouseEnter = () => { - setShowControls(true); + if (!isFullscreen) { + setShowControls(true); + } }; const handleMouseLeave = () => { - setShowControls(false); + if (!isFullscreen) { + setShowControls(false); + } + }; + + const handleMouseMove = () => { + if (isFullscreen) { + setShowControls(true); + + // Clear existing timeout + if (hideControlsTimeoutRef.current) { + clearTimeout(hideControlsTimeoutRef.current); + } + + // Hide controls after 3 seconds of no mouse movement + hideControlsTimeoutRef.current = setTimeout(() => { + setShowControls(false); + }, 3000); + } }; const handleSubscribe = async () => { @@ -170,48 +247,20 @@ export default function Video() { return; } - try { - // Retrieve the token from localStorage - const token = localStorage.getItem('token'); + const response = await subscribe(video.creator.id, addAlert); - if (!token) { - navigation('/login'); - return; - } - - const response = await fetch(`/api/channels/${video.creator.id}/subscribe`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ - userId: user.id - }) - }); - - if (!response.ok) { - throw new Error('Failed to subscribe'); - } + console.log('Subscription successful:', response); - const data = await response.json(); - console.log('Subscription successful:', data); - - const subscriptionCount = data.subscriptions || 0; - setVideo((prevVideo) => { - return { - ...prevVideo, - creator: { - ...prevVideo.creator, - subscribers: subscriptionCount - } - }; - }) - - } catch (error) { - console.error('Error subscribing:', error); - alert('Failed to subscribe. Please try again.'); - } + const subscriptionCount = response.subscriptions || 0; + setVideo((prevVideo) => { + return { + ...prevVideo, + creator: { + ...prevVideo.creator, + subscribers: subscriptionCount + } + }; + }) }; const handleLike = async () => { @@ -220,40 +269,22 @@ export default function Video() { return; } - try { - // Retrieve the token from localStorage - const token = localStorage.getItem('token'); - - if (!token) { - navigation('/login'); - return; - } - - const response = await fetch(`/api/videos/${id}/like`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - } - }); - - if (!response.ok) { - throw new Error('Failed to like video'); - } + // Retrieve the token from localStorage + const token = localStorage.getItem('token'); - const data = await response.json(); - console.log('Video liked successfully:', data); + if (!token) { + navigation('/login'); + return; + } - setVideo((prevVideo) => { - return { - ...prevVideo, - likes: data.likes || prevVideo.likes + 1 // Update likes count - }; - }) + const data = await toggleLike(id, token, addAlert); - } catch (error) { - console.error('Error liking video:', error); - } + setVideo((prevVideo) => { + return { + ...prevVideo, + likes: data.likes || prevVideo.likes + 1 // Update likes count + }; + }) }; const handleComment = async () => { @@ -266,67 +297,74 @@ export default function Video() { alert("Comment cannot be empty"); return; } + // Retrieve the token from localStorage + const token = localStorage.getItem('token'); - try { - // Retrieve the token from localStorage - const token = localStorage.getItem('token'); + if (!token) { + navigation('/login'); + return; + } - if (!token) { - navigation('/login'); - return; - } + const data = await addComment(video.id, comment, token, addAlert); + setComment(""); // Clear the comment input - const response = await fetch(`/api/comments/`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ - content: comment, - video: id - }) - }); - - if (!response.ok) { - throw new Error('Failed to post comment'); - } + setVideo((prevVideo) => ({ + ...prevVideo, + comments: [...(prevVideo.comments || []), data] + })); + } - const data = await response.json(); - console.log('Comment posted successfully:', data); - setComment(""); // Clear the comment input + const addAlert = (type, message) => { + const newAlert = { type, message, id: Date.now() }; // Add unique ID + setAlerts([...alerts, newAlert]); + }; - setVideo((prevVideo) => ({ - ...prevVideo, - comments: [...(prevVideo.comments || []), data] // Add the new comment to the existing comments - })); + const onCloseAlert = (alertToRemove) => { + setAlerts(alerts.filter(alert => alert !== alertToRemove)); + }; + const handleAddToPlaylist = async (id) => { + if (!isAuthenticated) { + navigation('/login'); + return; + } - } catch (error) { - console.error('Error posting comment:', error); + const body = { + video: video.id } + const token = localStorage.getItem('token'); + + await addToPlaylist(id, body, token, addAlert); + + setIsAddToPlaylistOpen(!isAddToPlaylistOpen); } return (
- + -
+
{video ? ( <> {/* Video player section */} -
+
+ { + !isFullscreen ? ( + setIsFullscreen(true)} + > + + + ) : ( + setIsFullscreen(false)} + > + + + ) + }
@@ -368,25 +449,63 @@ export default function Video() {

{video.title}

{/* Channel and like */} -
- +
+ {video.creator?.name -
-

{video.creator?.name}

-

{video.creator?.subscribers || 0} abonnés

+ /> +
+

{video.creator?.name}

+

{video.creator?.subscribers || 0} abonnés

+
+ +
+ +
+ +

{video.likes}

+ + { + isAuthenticated && ( + + ) + }
- - -

{video.likes}

{/* Video details */} @@ -396,12 +515,7 @@ export default function Video() {
{video.tags.map((tag, index) => ( - - #{tag} - + ))}
@@ -413,7 +527,12 @@ export default function Video() { {/* Comments section */}
-

Commentaires

+
+

Commentaires

+ +