How to Download All Videos from a YouTube Channel with yt-dlp
Recently, one of our clients temporarily lost access to their YouTube account to a potentially bad actor. As we met with them to regain access, we wanted to back up all their videos as quickly as possible to guarantee they retained access to over a decade of videos. Their channel had over 1000 videos, many of which were over an hour long.
The Google-approved solution here is Google Takeout, but this requires access to the Google account, meaning it wasn’t an option. What’s more, it only downloads in up to 720p quality (or as low as 360p, “depending on the video size”)! This was unacceptable for proper archiving. It also told me I need to improve my personal Google backup process, which currently relies on Takeout 🙃.
I have used yt-dlp for years, so I knew it would be a good option. It’s an open-source command-line tool which is perfect for this situation: you provide the URL of a YouTube video, playlist, or channel and it downloads the corresponding video(s). It’s easy to automate and repeat, and is important for archival purposes, personal backups, and situations like ours. The final command we used was:
yt-dlp <channel URL>
By default, …
!-->tips
Using esbuild and pnpm to Set Up Frontend Asset Bundling in an ASP.NET Core Web App
Recently we had to build an admin dashboard on ASP.NET Core. We decided to hit the ground running by looking for a template online. Luckily, we found a very cool one from Start Bootstrap that met our requirements. It was built using Bootstrap, had nice styling, and included examples of graphs, tables, and basic common pages like login and registration.
However, integrating the template into an ASP.NET Core web app was a bit involved. The template uses tools like Pug and Sass/SCSS, which are not supported out of the box by ASP.NET. So some work had to be done to properly integrate it.
We ended up with a nice approach for handling frontend asset bundling using pnpm and esbuild, with support for JavaScript and Sass.
You can find a codebase that uses the setup we’ll be discussing here on Github. It’s an empty ASP.NET Core Razor Pages project that implements Start Bootrap’s admin template. Feel free to review it alongside this article and/or use it for your own projects.
We’ve also uploaded to NuGet a template for an empty ASP.NET Core Razor Pages web app that has implemented the esbuild-based frontend asset bundling.
Installing pnpm and the necessary …
!-->aspdotnet javascript css
Announcing End Point Ecommerce, Our New Open Source Project
Today we’re pleased to announce a new open source project: End Point Ecommerce.
End Point Ecommerce is a minimalist ecommerce system that’s quick to set up and easy to understand. It is meant for developers to own, adapt, customize, and extend.
You can learn more about it on our landing page. You can also fork it today on GitHub. There are running demos here:
Are you interested in using End Point Ecommerce for your ecommerce site? Feel free to contact us and we can work together to help you deploy, customize, and maintain it.
Key features
- Built with ASP.NET, PostgreSQL, and Authorize.net
- Multiple deployment strategies, including Docker Compose
- Code base designed to follow Clean Architecture and Domain Driven Design concepts, without being dogmatic about it — simplicity trumps all
- Good test coverage with xUnit
- Includes a backend admin portal for managing the store, a REST API for building user-facing store frontends, and a simple web frontend
- Limited functionality — implements the bare minimum of ecommerce use cases
- Product catalog, shopping cart, order submission, email delivery
How we got here
We recently had the opportunity to …
!-->dotnet ecommerce open-source
Risks of Paper Checks for Secure Transactions
Fraud is on the rise, and paper checks are one of the easiest targets. In the not-so-distant past, a grandparent could tuck a crisp $5 bill into an envelope and trust it would arrive. Today, even checks sent to pay your bills are being stolen, altered, and cashed by criminals before they reach their destination.
So, the practice of sending a paper check in the mail to reach a creditor should be stopped. According to the US Financial Crimes Enforcement Network (FinCEN), there were over 660,000 check fraud reports in 2024. This number has stayed in the 600,000s every year since 2022, when it nearly doubled from the previous year.1 The U.S. Postal Service has seen similar increases in mail theft, with criminals targeting collection boxes and even robbing postal carriers for paper checks.
Fraudsters have many ways to manipulate checks. Intercepting checks that are not in a secured location by simply paying attention to where mail is lying around is at the top of the list. Once they get a check in hand, they can “wash” original amounts and payees and replace them with higher numbers and their own names.
A recent incident at our company showed how risky paper checks can be. A check …
!-->security
Using Razor templates to render HTML emails in ASP.NET Core
A while ago I blogged about using Razor templates to render HTML emails in .NET. The method that I discussed there worked, but it was very verbose. Since then, .NET 8 has released, and with it came a simpler way of doing this. In this post we’ll explore how to use these new features to render HTML emails.
You can find all the code in this post on GitHub.
The plan
Similar to the original article, the objective is simple: Sending emails from an ASP.NET Core app, and having the contents of those emails be rendered fromfrom Razor templates. To that end, we need four pieces:
- A class for sending emails.
- A class for rendering Razor templates into strings.
- A Razor template.
- A class that puts it all together. That is, takes in parameters, renders the email, and sends it.
Step 1: Sending emails with the MailKit NuGet package
With the help of the MailKit NuGet package, sending emails in .NET is easy. Let’s install it with:
dotnet add package MailKit --version 4.13.0
We also need some configuration in the appsettings.json
file, to define the settings needed to establish a connection with an SMTP server:
// ./appsettings.json
{
// ...
"MailSettings": { …
csharp aspdotnet email
Vector Search for the End Point Blog
We’re excited to announce a new feature on the End Point Blog: AI-powered vector search.
Below the “Our Blog” header at the top of this page, there is a new search bar with two adjacent buttons: “Search” and “LLM Expanded Search.” If you click “Search” (or press Enter), your search will be fed directly to our vector search/similarity search engine. If you click “LLM Expanded Search” (or press Shift+Enter, Control+Enter, or Command+Enter on macOS) your query will first be expanded by an open-source LLM, then sent to the similarity search engine.
The LLM is trained to expand the query to include similar terms, keywords, etc., before sending it to the similarity search engine. For example, if I search S3
, similarity search alone returns no results — there isn’t enough semantic information for vector search to make useful connections. However, an LLM can expand this to s3, simple storage service, amazon s3, object storage, cloud storage...
, providing more anchor points for vector search to connect to results.
The model improves results fairly well, but it is still an experimental technology, so results will …
!-->company artificial-intelligence
Processing payments with Authorize.Net in a Blazor app
Blazor, the SPA framework from ASP.NET Core, is excellent technology. However, it is very particular when it comes to interacting with JavaScript. This is because Blazor apps are written in C# with Razor templates. So, if a Blazor app needs to interact with a JavaScript library (for example, to process credit card payments through Authorize.Net), special care is needed. In this article, we’ll see an approach on how to make that happen.
We’ll develop a Blazor WebAssembly standalone app which will include a form to capture credit card information and send it to Authorize.Net using their Accept.js frontend integration library. Then, Authorize.Net will return a payment token that represents the captured credit card. Our frontend will then submit the resulting token to a backend API to actually effectuate the payment.
This backend API, which we’ll also develop, will be a simple ASP.NET Core Web API. It’ll include an endpoint for submitting payment transactions to Authorize.Net, given the token obtained via Accept.js.
You can find the all the source code discussed here on GitHub.
The backend
Let’s begin by creating a new ASP.NET Core Web API project with …
!-->csharp aspdotnet blazor payments
Announcing Our 30th Anniversary!
Today marks End Point’s 30th anniversary!
On this date in 1995, as the Internet boom was just beginning, Rick Peltzman and I started the company, diving into the new and fast-changing world of the web. Since then, End Point has worked with a wide range of clients, tackled complex challenges, built reliable, long-term solutions, and adapted to continual waves of technological change — most recently integrating AI technologies into our work. The dedication and talent of our team have made all the difference.
As we reflect on these 30 years, we’re grateful for the many clients, partners, and colleagues who have been part of our story. We look forward to continuing to learn, innovate, and create in the years ahead.
company