The YoutubeLinks application allow users to save YouTube links as playlists.
Users are able to download mp3/mp4 files from the playlists they create.
Downloading playlist links as mp3/mp4 files tested on more than 3000 links.
Max downloaded mp3 file: length - 03:31:45, size - 391 MB
Max downloaded mp4 file: length - 25:44, size - 973 MB
Larger files not tested or can not work correctly.
- Youtube video
- Launch
- Presentation
- Technologies
- Architecture
- Project types and references
- Packages
- Features
- Roles
- Project status
Run application with one command (setup all docker containers, create database, apply migrations):
cd C:\Users\bartl\source\repos\YoutubeLinks
docker compose up --build -d
Created containers:
- C# Web API backend:
http://localhost:5000
- Blazor WASM frontend:
http://localhost:7000
- MSSQL database:
Host: localhost
Port: 1433
Database/Schema: YoutubeLinks
Username: sa
Password: Password1!
Server: youtubelinks.database
- Seq Api logs:
http://localhost:8081
Login credentials:
Admin:
- Email: ytlinksapp@gmail.com
- Password: Asd123!
User:
- Email: ytlinksapp1@gmail.com
- Password: Asd123!
If You have any problems check issue below or ask me in github issues: #52
- C# 12
- .NET 8.0
- Blazor WebAssembly
- Vue 3.4.21
Blazor WebAssembly frontend with .NET Minimal API backend connecting to the MSSQL database. Monolithic architecture with Vertical Slices. Code separated by feature.
- YoutubeLinks.Api - ASP .NET Core Web API (Backend)
- YoutubeLinks.Blazor - Blazor WebAssembly Standalone App (Frontend)
- YoutubeLinks.Shared - Class Library (Backend and Frontend shared code)
- YoutubeLinks.UnitTests - xUnit Test Project (Unit Tests)
- YoutubeLinks.E2E - NUnit Test Project (E2E Tests)
- youtube-links - Vue Project (Frontend 2)
Nuget packages and libraries used in projects.
- Api
- EntityFrameworkCore - ORM for connecting to the database
- MediatR - CQRS, Vertical Slices (code separated by Features)
- FluentValidation - Commands, Queries and server side logic validation
- FluentEmail - Sending registation confirmation email and registration successed email
- Serilog - Logging to console and file
- JwtBearer - Jwt Token Authentication
- Swagger - Manual Api testing
- YoutubeDLSharp - Get youtube videos titles, download videos as .mp3 and .mp4 files
- Blazor
- MudBlazor - Blazor UI library
- Blazored.FluentValidation - Frontend validation + Backend validation
- Blazored.LocalStorage - store Jwt Token in local storage
- Users
- Register new user and send confirmation email
- Resend confirmation email
- Confirm user registration and send registration success email
- Login user if email is confirmed
- Refresh Jwt Token
- Forgot password
- Update user color theme
- Get all users (paginated, sorted and filtered)
- Get selected user
- Playlist
- Create playlist
- Delete playlist
- Update playlist (set playlist as public / private)
- Export playlist (.json, .txt)
- Import playlist (.json, .txt)
- Download playlist (only undownloaded links)
- Mark all playlist links as downloaded / undownloaded
- Get all public playlists (paginated, sorted and filtered)
- Get all user playlists (paginated, sorted and filtered)
- Get selected playlist
- Link
- Create link
- Delete link
- Update link (mark as downloaded, change title)
- Set link downloaded flag
- Download link (.mp3, .mp4)
- Download single link (no need to add link to the playlist)
- Get all playlist links (paginated, sorted and filtered)
- Get selected link
- Links grid / table view
- Admin - ony one user have Admin role
- User - can view website data, can do CRUD operations on owned playlists and links
- Anonymous - can view website data (public playlists / links)
Project created as part of the "100 Commits" competition. The challenge is to add changes to the repository every day for 100 days.
I achieved 8th place in the "100 Commits" competition organized by "DevMentors.io". Over 100 days, I developed the "YoutubeLinks" application, which allows users to create playlists from YouTube links and download those playlists as MP3 and MP4 files.
This project was a significant adventure that taught me perseverance and systematic work to achieve my project goals within the given timeframe. The "100 Commits" gala was a fantastic event, well-organized with engaging talks. I look forward to a potential second edition of the competition in the future.