尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗WhatchaWatching is a Blazor Web App (.NET 10) to keep a list of the anime you want to watch, and to let chance pick the next one. Anime come from Jikan (MyAnimeList), with AniList as a fallback when Jikan does not answer.
Live site: https://whatcha-watching.alwaysdata.net
?type=anime|movie|tv). The links and the search of the header keep the type./anime/{id}, /movie/{id}, /tv/{id}): poster, summary, genres, episodes and seasons, duration, status, score, and where to watch it (streaming platforms: Jikan and AniList for anime, TMDB and JustWatch for the others, for the country each user picks in the account page)./anime/new) when the providers do not have it. It is private to you, limited to 200 per user, and removing it from your list deletes it.v0.3.0 (d386362)).The solution (WhatchaWatching.slnx) follows a layered Clean Architecture:
| Project | Role |
|---|---|
WhatchaWatching | User interface and Blazor components, accounts (Identity) |
WhatchaWatching.Application | Services (anime, watchlist, random picker, anime added by hand, user settings) and mappers |
WhatchaWatching.Infrastructure | Entities, EF Core configurations and migrations |
WhatchaWatching.Middleware | Anime providers: Jikan and AniList clients, the fallback between them |
WhatchaWatching.Common | DTOs, constants and enums |
WhatchaWatching.AppHost | .NET Aspire orchestrator |
WhatchaWatching.Tests | xUnit tests |
Dependencies: Web → Application → (Infrastructure, Middleware) → Common. The one exception is UserEntity, which the web project uses to set up Identity.
The data model is described in docs/DATA_MODEL.md.
Prerequisites: the .NET 10 SDK, and either a MySQL (or MariaDB) database or a container runtime such as Docker Desktop (Aspire starts a MySQL container for you).
# Build
dotnet build
# Run the tests (they need no database and no network)
dotnet test
# Run everything via Aspire, with a MySQL container (dashboard at http://localhost:15209)
dotnet run --project WhatchaWatching.AppHost --launch-profile http
# Run the web app alone against a database you configured (http://localhost:5209)
dotnet run --project WhatchaWatching --launch-profile http
# Publish
dotnet publish WhatchaWatching -c Release
Aspire needs a container runtime. Without one, the mysql resource never starts and the site cannot reach its database: install Docker Desktop, or install MySQL yourself and run the web app alone.
The schema is managed with EF Core migrations, which are not applied automatically. A new local database is empty until you apply them:
dotnet tool restore
dotnet ef database update --project WhatchaWatching.Infrastructure
This applies them to the database named by the connection string in your user secrets: check that it is not the production one before running it.
Secrets must not be committed. Provide them through user secrets or environment variables.
| Key | Meaning |
|---|---|
ConnectionStrings:DefaultConnection | The MySQL connection string (injected by Aspire when it runs the database). |
Database:ServerVersion | Optional, for example 8.0.36-mysql. Skips the version detection that connects to the database; without it a database outage breaks every page that uses a service. |
Tmdb:AccessToken | The TMDB "API Read Access Token". Without it the site starts, but movies and TV series are reported as unavailable. |
Email:Host, Port, UserName, Password, From, FromName | The mailbox that sends the confirmation and password reset links (STARTTLS, port 587). Without it nothing is sent. |
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "<value>" --project WhatchaWatching
In production, the same settings are environment variables of the site (ConnectionStrings__DefaultConnection, Database__ServerVersion, Tmdb__AccessToken, Email__Host...).
.github/workflows/ci.yml runs on every push to main and every pull request: build and tests in Release, a check for vulnerable packages, and a gitleaks scan of the history. It does not deploy.
Locally, git hooks in .githooks/ run the same secret scan before each commit and push. On a new clone, install gitleaks and run git config core.hooksPath .githooks (see docs/OPERATIONS.md).
The site runs on AlwaysData. Two Claude Code skills in .claude/skills automate the steps; each one shows what it will do and asks for confirmation first:
/apply-migrations previews the SQL of the pending migrations and applies them to the production database./deploy-alwaysdata builds, tests, publishes, uploads over SFTP, restarts the site and checks it answers. It needs an SSH key registered at AlwaysData and the ALWAYSDATA_API_TOKEN environment variable; its non-secret settings are in .claude/skills/deploy-alwaysdata/config.json (not committed)./commit-push commits and pushes with a detailed message, and raises the version of the site (<Version> in WhatchaWatching/WhatchaWatching.csproj, shown in the footer) from what the commit changes: a new feature raises the minor number, a fix the patch number, docs and tests alone nothing.When a release adds a migration, apply the migration first, then deploy: the previous code ignores a new column or table, but the new code needs it.
Anime data comes from Jikan (an unofficial MyAnimeList API) and AniList; movie and TV series data from TMDB, with streaming availability by JustWatch. Streaming links point to the platforms' own pages; availability depends on the country.