Skip to content

Release/0.43 - #431

Merged
hacan359 merged 36 commits into
mainfrom
release/0.43
Aug 20, 2026
Merged

hacan359 merged 36 commits into
mainfrom
release/0.43

Conversation

@hacan359

@hacan359 hacan359 commented Aug 12, 2026 •

Copy link
Copy Markdown
Owner

feat(app): add music as a media type backed by MusicBrainz
feat(app): replace the vertical tag sidebar with a horizontal chip bar

feat(app): unify tag dialogs with search, in-place editing and persist

hcan359 and others added 2 commits August 12, 2026 20:32
Albums as the tenth media type: MusicBrainz search/browse with filters,
ListenBrainz popularity and fresh releases, Cover Art Archive covers,
per-collection listened-track tracker, offline export/import/backup.
Rate limiting, 503 retries and cover-download hardening included.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat(app): add music as a media type backed by MusicBrainz
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.26%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%36–37, 70–71, 92
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%159, 213, 244, 246, 248–249, 251, 32–33
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%154, 174, 176–177, 179, 31–32
   hardcover_api.dart84.85%100%100%84.85%21–22, 45, 62–63
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%137, 149, 162, 20–23, 46
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%242, 244, 295, 301–302, 329, 339, 51–56
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%58
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%48–49
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart9.76%100%100%9.76%11–12, 121, 123–124, 129–130, 134–135, 137, 141–142, 146, 148–151, 154–159, 16, 160–164, 169–171, 175, 177, 179–182, 184–186, 188–192, 23–27, 37, 43–44, 46–49, 51, 56–58, 61–63, 73, 81–88
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%152, 157, 24, 87, 92
   tvdb_api.dart75%100%100%75%102–103, 111, 120, 73, 80–81, 95
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%125–128, 13, 133–134, 136–138, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%100, 103, 106, 112, 114–118, 122–124, 127–129, 136–137, 139, 142–144, 148–149, 151, 154–156, 16, 160–161, 163, 167, 171, 174, 177–178, 180, 182, 20–24, 29–33, 42, 47, 49, 56, 61, 63, 70, 77–78, 80–81, 84, 87–88, 95, 97, 99
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%128
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%105–107
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart6.25%100%100%6.25%22–23, 25–26, 28, 33–34, 37–43, 48
   tvmaze_episode_source.dart82.35%100%100%82.35%44–46
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%16, 20, 49, 65–66, 68
   fantlab_search_api.dart96.88%100%100%96.88%75
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%26, 41, 67
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%123–124, 126, 130, 133–134, 41, 67, 69
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.50%100%100%67.50%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 342, 344, 401, 413, 417, 419–420, 422–423, 425–426, 429, 433, 435–437, 441, 443–445, 449–454, 457, 459, 462–463, 465, 469, 471–474, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   mangabaka_manga_api.dart88.89%100%100%88.89%28–31, 33, 35
   mangabaka_tags_api.dart100%100%100%100%
   mangabaka_types.dart100%100%100%100%
lib/core/api/mangadex
   mangadex_http_client.dart80%100%100%80%

hcan359 and others added 2 commits August 13, 2026 14:01
Music (MusicBrainz albums, shipped unreleased as MediaType.music) becomes
the audio media type, and Podcast Index podcasts join it as a second
AudioKind — the BookKind pattern. MigrationV64 drops the unreleased music
tables and creates audio_cache / audio_tracks_cache / listened_tracks with
the kind discriminator; podcast episodes key progress by the stable
Podcast Index episode id (disc 0), since RSS season/episode numbers are
unreliable. Search, trending browse with category/language filters, a
trending discover row, an episode tracker with year/month spans, progress
bars and whole-span toggles, statistics, export/import, backups and the
selfhost proxy (server-side request signing) all cover the new type.
Podcast Index key/secret: built-in pair via CI secrets, personal pair in
Settings / the welcome wizard, carried by settings dumps.

Also fixes the import stamping "now" into started/completed dates that
were exported as null: the status restore's automatic date bump is now
undone by the file's explicit nulls.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011Li6WmsLcmfZqhMvF5Amvx
feat(app): add audio as a media type with music and podcasts
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.07%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%36–37, 70–71, 92
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%159, 213, 244, 246, 248–249, 251, 32–33
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%154, 174, 176–177, 179, 31–32
   hardcover_api.dart84.85%100%100%84.85%21–22, 45, 62–63
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%137, 149, 162, 20–23, 46
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%242, 244, 295, 301–302, 329, 339, 51–56
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%58
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%48–49
   podcast_index_api.dart79.10%100%100%79.10%116–117, 138–139, 144, 146, 148, 21–22, 47–48, 52, 84–85
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart9.76%100%100%9.76%11–12, 121, 123–124, 129–130, 134–135, 137, 141–142, 146, 148–151, 154–159, 16, 160–164, 169–171, 175, 177, 179–182, 184–186, 188–192, 23–27, 37, 43–44, 46–49, 51, 56–58, 61–63, 73, 81–88
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%152, 157, 24, 87, 92
   tvdb_api.dart75%100%100%75%102–103, 111, 120, 73, 80–81, 95
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%125–128, 13, 133–134, 136–138, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%100, 103, 106, 112, 114–118, 122–124, 127–129, 136–137, 139, 142–144, 148–149, 151, 154–156, 16, 160–161, 163, 167, 171, 174, 177–178, 180, 182, 20–24, 29–33, 42, 47, 49, 56, 61, 63, 70, 77–78, 80–81, 84, 87–88, 95, 97, 99
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%128
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%105–107
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart6.25%100%100%6.25%22–23, 25–26, 28, 33–34, 37–43, 48
   tvmaze_episode_source.dart82.35%100%100%82.35%44–46
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%16, 20, 49, 65–66, 68
   fantlab_search_api.dart96.88%100%100%96.88%75
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%26, 41, 67
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%123–124, 126, 130, 133–134, 41, 67, 69
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 342, 344, 401, 413, 417, 419–420, 422–423, 425–426, 429, 433, 435–437, 441, 443–445, 449–454, 457, 459, 462–463, 465, 469, 471–474, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   

hcan359 and others added 3 commits August 13, 2026 20:13
On wide screens tags were a 32px right-edge rail with names rotated 90°,
so the rail's height grew with name length and dozens of tags meant
screens of vertical scrolling. Tags are now one chip row above the items
grid: readable labels with per-collection item counts, multi-select, a
reset chip, and the Group toggle. Overflow scrolls sideways through the
shared ScrollableRowWithArrows (edge-fade arrows, wheel remap, drag).
Narrow screens keep the filter-bar tag sheet.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
use_super_parameters: detail becomes super.detail in the AniList and
Hardcover exception subclasses. unawaited_return_in_try_block: return
await in downloadCollection, importFromFile and the LAN settings pull —
without the await those try blocks never caught errors from the
returned futures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.17%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%36–37, 70–71, 92
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%159, 213, 244, 246, 248–249, 251, 32–33
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%154, 174, 176–177, 179, 31–32
   hardcover_api.dart84.85%100%100%84.85%21–22, 45, 62–63
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%137, 149, 162, 20–23, 46
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%242, 244, 295, 301–302, 329, 339, 51–56
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%58
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%48–49
   podcast_index_api.dart79.10%100%100%79.10%116–117, 138–139, 144, 146, 148, 21–22, 47–48, 52, 84–85
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart9.76%100%100%9.76%11–12, 121, 123–124, 129–130, 134–135, 137, 141–142, 146, 148–151, 154–159, 16, 160–164, 169–171, 175, 177, 179–182, 184–186, 188–192, 23–27, 37, 43–44, 46–49, 51, 56–58, 61–63, 73, 81–88
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%152, 157, 24, 87, 92
   tvdb_api.dart75%100%100%75%102–103, 111, 120, 73, 80–81, 95
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%125–128, 13, 133–134, 136–138, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%100, 103, 106, 112, 114–118, 122–124, 127–129, 136–137, 139, 142–144, 148–149, 151, 154–156, 16, 160–161, 163, 167, 171, 174, 177–178, 180, 182, 20–24, 29–33, 42, 47, 49, 56, 61, 63, 70, 77–78, 80–81, 84, 87–88, 95, 97, 99
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%128
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%105–107
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart6.25%100%100%6.25%22–23, 25–26, 28, 33–34, 37–43, 48
   tvmaze_episode_source.dart82.35%100%100%82.35%44–46
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%16, 20, 49, 65–66, 68
   fantlab_search_api.dart96.88%100%100%96.88%75
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%26, 41, 67
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%123–124, 126, 130, 133–134, 41, 67, 69
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 342, 344, 401, 413, 417, 419–420, 422–423, 425–426, 429, 433, 435–437, 441, 443–445, 449–454, 457, 459, 462–463, 465, 469, 471–474, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   

hcan359 and others added 2 commits August 14, 2026 13:04
…ted sorting

Manage tags and the tag picker now share one body (TagSearchList): a
search field with filter-as-you-type and quick-create, plus a sort menu
(manual / A-Z / Z-A) persisted per profile that also orders the
collection tag chip bar and the narrow-screen filter sheet. Picker rows
carry the full edit set (colors, rename, delete, usage counts) next to
an independent checkbox selection. Duplicate tag names can no longer
crash: the create row hides on a case-insensitive match and
GlobalTagDao.create adopts the existing row on a UNIQUE conflict.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vz8jb5kwdf7sT2WKiYm1X4
feat(app): unify tag dialogs with search, in-place editing and persisted sorting
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.37%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%36–37, 70–71, 92
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%159, 213, 244, 246, 248–249, 251, 32–33
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%154, 174, 176–177, 179, 31–32
   hardcover_api.dart84.85%100%100%84.85%21–22, 45, 62–63
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%137, 149, 162, 20–23, 46
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%242, 244, 295, 301–302, 329, 339, 51–56
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%58
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%48–49
   podcast_index_api.dart79.10%100%100%79.10%116–117, 138–139, 144, 146, 148, 21–22, 47–48, 52, 84–85
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart9.76%100%100%9.76%11–12, 121, 123–124, 129–130, 134–135, 137, 141–142, 146, 148–151, 154–159, 16, 160–164, 169–171, 175, 177, 179–182, 184–186, 188–192, 23–27, 37, 43–44, 46–49, 51, 56–58, 61–63, 73, 81–88
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%152, 157, 24, 87, 92
   tvdb_api.dart75%100%100%75%102–103, 111, 120, 73, 80–81, 95
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%125–128, 13, 133–134, 136–138, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%100, 103, 106, 112, 114–118, 122–124, 127–129, 136–137, 139, 142–144, 148–149, 151, 154–156, 16, 160–161, 163, 167, 171, 174, 177–178, 180, 182, 20–24, 29–33, 42, 47, 49, 56, 61, 63, 70, 77–78, 80–81, 84, 87–88, 95, 97, 99
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%128
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%105–107
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart6.25%100%100%6.25%22–23, 25–26, 28, 33–34, 37–43, 48
   tvmaze_episode_source.dart82.35%100%100%82.35%44–46
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%16, 20, 49, 65–66, 68
   fantlab_search_api.dart96.88%100%100%96.88%75
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%26, 41, 67
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%123–124, 126, 130, 133–134, 41, 67, 69
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 342, 344, 401, 413, 417, 419–420, 422–423, 425–426, 429, 433, 435–437, 441, 443–445, 449–454, 457, 459, 462–463, 465, 469, 471–474, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   

hcan359 and others added 2 commits August 14, 2026 15:57
… upload

Settings gains a "Collection banner style" choice (Classic, Comic,
Sticker album, Brutalist, Strips); every non-classic style shows a
per-status summary of the collection. Picking a collection background
now works on the web build: the bytes upload to the server image cache
and render from its URL. The subfilter bar loses its bottom padding.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CXoviavAwEqULzKsGkQ5vc
feat(app): selectable banner styles for rich collections and web hero upload
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.64%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%36–37, 70–71, 92
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%159, 213, 244, 246, 248–249, 251, 32–33
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%154, 174, 176–177, 179, 31–32
   hardcover_api.dart84.85%100%100%84.85%21–22, 45, 62–63
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%137, 149, 162, 20–23, 46
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%242, 244, 295, 301–302, 329, 339, 51–56
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%58
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%48–49
   podcast_index_api.dart79.10%100%100%79.10%116–117, 138–139, 144, 146, 148, 21–22, 47–48, 52, 84–85
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart9.76%100%100%9.76%11–12, 121, 123–124, 129–130, 134–135, 137, 141–142, 146, 148–151, 154–159, 16, 160–164, 169–171, 175, 177, 179–182, 184–186, 188–192, 23–27, 37, 43–44, 46–49, 51, 56–58, 61–63, 73, 81–88
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%152, 157, 24, 87, 92
   tvdb_api.dart75%100%100%75%102–103, 111, 120, 73, 80–81, 95
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%125–128, 13, 133–134, 136–138, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%100, 103, 106, 112, 114–118, 122–124, 127–129, 136–137, 139, 142–144, 148–149, 151, 154–156, 16, 160–161, 163, 167, 171, 174, 177–178, 180, 182, 20–24, 29–33, 42, 47, 49, 56, 61, 63, 70, 77–78, 80–81, 84, 87–88, 95, 97, 99
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%128
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%105–107
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart6.25%100%100%6.25%22–23, 25–26, 28, 33–34, 37–43, 48
   tvmaze_episode_source.dart82.35%100%100%82.35%44–46
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%16, 20, 49, 65–66, 68
   fantlab_search_api.dart96.88%100%100%96.88%75
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%26, 41, 67
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%123–124, 126, 130, 133–134, 41, 67, 69
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 342, 344, 401, 413, 417, 419–420, 422–423, 425–426, 429, 433, 435–437, 441, 443–445, 449–454, 457, 459, 462–463, 465, 469, 471–474, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   

hcan359 and others added 2 commits August 16, 2026 12:31
Comments only — no production code changed. Verified by stripping every
comment from both revisions of all 435 touched Dart files and diffing.

- Translate the remaining Russian comments to English, or drop the ones
  that only restated the declaration.
- Cut every comment block down to the 2-line cap (228 blocks in 134
  files), keeping the WHY and dropping the WHAT.
- Delete file-header blocks, banner separators and boilerplate dartdoc
  ("Creates a [X].", "Provider for [X].").
- Clean the Cyrillic out of analysis_options.yaml, build.gradle.kts,
  check.ps1 and win32_window.cpp.

Kept: verbatim API tokens the code greps for (Fantlab, Kinorium, TMDB
language names) with English prose around them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ALPN9hf7ALVq8Nyc9BRMU
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.64%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%35–36, 69–70, 90
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%140, 194, 225, 227, 229–230, 232, 31–32
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%141, 161, 163–164, 166, 30–31
   hardcover_api.dart84.85%100%100%84.85%20–21, 44, 61–62
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%135, 147, 160, 20–23, 44
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%234, 236, 287, 293–294, 321, 331, 46–51
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%55
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%47–48
   podcast_index_api.dart79.10%100%100%79.10%110–111, 132–133, 138, 140, 142, 20–21, 41–42, 46, 78–79
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart9.76%100%100%9.76%11–12, 121, 123–124, 129–130, 134–135, 137, 141–142, 146, 148–151, 154–159, 16, 160–164, 169–171, 175, 177, 179–182, 184–186, 188–192, 23–27, 37, 43–44, 46–49, 51, 56–58, 61–63, 73, 81–88
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%150, 155, 24, 85, 90
   tvdb_api.dart75%100%100%75%100–101, 109, 118, 71, 78–79, 93
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%121–124, 129, 13, 130, 132–134, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%101, 104, 110, 112–116, 120–122, 125–127, 134–135, 137, 140–142, 146–147, 149, 152–154, 158–159, 16, 161, 165, 169, 172, 175–176, 178, 180, 20–24, 29–33, 40, 45, 47, 54, 59, 61, 68, 75–76, 78–79, 82, 85–86, 93, 95, 97–98
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%127
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%104–106
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart6.25%100%100%6.25%18–19, 21–22, 24, 29–30, 33–39, 44
   tvmaze_episode_source.dart82.35%100%100%82.35%39–41
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%15, 19, 45, 61–62, 64
   fantlab_search_api.dart96.88%100%100%96.88%72
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%25, 39, 65
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%119–120, 122, 126, 129–130, 37, 63, 65
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 340, 342, 399, 411, 415, 417–418, 420–421, 423–424, 427, 431, 433–435, 439, 441–443, 447–452, 455, 457, 460–461, 463, 467, 469–472, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   

hcan359 and others added 3 commits August 16, 2026 20:20
Without it the request goes out chunked, which ListenBrainz rejects with a
bare 400 — album popularity in the web build's audio search silently came
back empty.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012DPWM1n8eQbkdcWUWrWXVn
…tering

A seventh status for titles kept in the library but deliberately parked, so
the "dropped" count stops collecting them. It carries no logic of its own:
nothing transitions in or out of it, and only an authoritative downgrade
(RetroAchievements) lets a tracker override it.

The status dropdown above a collection and above All Items becomes
multi-select: the menu stays open while ticking statuses, an item passes when
it matches any of them, and the All Items choice is persisted per profile as
the whole set, migrating once from the older single-value key.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012DPWM1n8eQbkdcWUWrWXVn
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.69%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%35–36, 69–70, 90
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%140, 194, 225, 227, 229–230, 232, 31–32
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%141, 161, 163–164, 166, 30–31
   hardcover_api.dart84.85%100%100%84.85%20–21, 44, 61–62
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%135, 147, 160, 20–23, 44
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%234, 236, 287, 293–294, 321, 331, 46–51
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%55
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%47–48
   podcast_index_api.dart79.10%100%100%79.10%110–111, 132–133, 138, 140, 142, 20–21, 41–42, 46, 78–79
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart9.76%100%100%9.76%11–12, 121, 123–124, 129–130, 134–135, 137, 141–142, 146, 148–151, 154–159, 16, 160–164, 169–171, 175, 177, 179–182, 184–186, 188–192, 23–27, 37, 43–44, 46–49, 51, 56–58, 61–63, 73, 81–88
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%150, 155, 24, 85, 90
   tvdb_api.dart75%100%100%75%100–101, 109, 118, 71, 78–79, 93
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%121–124, 129, 13, 130, 132–134, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%101, 104, 110, 112–116, 120–122, 125–127, 134–135, 137, 140–142, 146–147, 149, 152–154, 158–159, 16, 161, 165, 169, 172, 175–176, 178, 180, 20–24, 29–33, 40, 45, 47, 54, 59, 61, 68, 75–76, 78–79, 82, 85–86, 93, 95, 97–98
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%127
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%104–106
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart6.25%100%100%6.25%18–19, 21–22, 24, 29–30, 33–39, 44
   tvmaze_episode_source.dart82.35%100%100%82.35%39–41
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%15, 19, 45, 61–62, 64
   fantlab_search_api.dart96.88%100%100%96.88%72
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%25, 39, 65
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%119–120, 122, 126, 129–130, 37, 63, 65
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 340, 342, 399, 411, 415, 417–418, 420–421, 423–424, 427, 431, 433–435, 439, 441–443, 447–452, 455, 457, 460–461, 463, 467, 469–472, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   

hcan359 and others added 3 commits August 17, 2026 20:48
…ages

In a browser nothing came back at all. The developer pair a desktop build
carries as a --dart-define deliberately never ships to a tab, and no screen
could put one on the server either, so the proxy answered every request with
503 "No ss_dev_id configured" while the app still believed the pair existed
and offered the gallery.

Settings -> API Keys now takes the devid/devpassword on web, keeps them where
the proxy reads them, and the gallery and the quota button follow what the
server actually holds. An entered pair outranks the built-in one, like every
other key, so an imported config works the same on desktop.

Media moved to the server's image cache too: the media host drops its CORS
header on an error page, which blanked the whole gallery whenever
ScreenScraper hiccupped, and the cache spares the account's daily quota. The
cache itself no longer stores a 200 body the source did not label image/*,
which otherwise served ScreenScraper's HTML outage notice as a broken cover
for the year the entry is declared immutable.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QsAQNHmsUNifLRJizjChCn
Replaces the old mockup set with a new one (12 shots, both themes) and adds
the per-source icons the page needs as its own assets instead of linking into
the app bundle. README points at the new file names.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QsAQNHmsUNifLRJizjChCn
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.82%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%35–36, 69–70, 90
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%140, 194, 225, 227, 229–230, 232, 31–32
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%141, 161, 163–164, 166, 30–31
   hardcover_api.dart84.85%100%100%84.85%20–21, 44, 61–62
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%135, 147, 160, 20–23, 44
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%234, 236, 287, 293–294, 321, 331, 46–51
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%55
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%47–48
   podcast_index_api.dart79.10%100%100%79.10%110–111, 132–133, 138, 140, 142, 20–21, 41–42, 46, 78–79
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart91.30%100%100%91.30%11–12, 203, 207, 210–213
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%150, 155, 24, 85, 90
   tvdb_api.dart75%100%100%75%100–101, 109, 118, 71, 78–79, 93
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%121–124, 129, 13, 130, 132–134, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%101, 104, 110, 112–116, 120–122, 125–127, 134–135, 137, 140–142, 146–147, 149, 152–154, 158–159, 16, 161, 165, 169, 172, 175–176, 178, 180, 20–24, 29–33, 40, 45, 47, 54, 59, 61, 68, 75–76, 78–79, 82, 85–86, 93, 95, 97–98
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%127
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%104–106
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart6.25%100%100%6.25%18–19, 21–22, 24, 29–30, 33–39, 44
   tvmaze_episode_source.dart82.35%100%100%82.35%39–41
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%15, 19, 45, 61–62, 64
   fantlab_search_api.dart96.88%100%100%96.88%72
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%25, 39, 65
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%119–120, 122, 126, 129–130, 37, 63, 65
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 340, 342, 399, 411, 415, 417–418, 420–421, 423–424, 427, 431, 433–435, 439, 441–443, 447–452, 455, 457, 460–461, 463, 467, 469–472, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   mangabaka_manga_api.dart88.89%100%100%88.89%26–29, 31, 33
   mangabaka_tags_api.dart100%100%100%100%
   mangabaka_types.dart100%100%100%100%
lib/core/api/mangadex
   mangadex_http_client.dart80%100%100%80%12, 58–59
   mangadex_manga_api.dart91.57%100%100%91.57%102, 51–54, 59–60
   mangadex_tags_api.dart80%100%100%80%30–31
   mangadex_types.dart66.67%100%100%66.67%18–19
lib/co

hcan359 and others added 3 commits August 19, 2026 08:25
The theme shots are retaken at 2029x1257, and the source-icon rows on the
landing page gained TheTVDB, Kitsu, Google Books and Comic Vine.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Picking a new picture for a custom card — by URL or from disk — kept
showing the old one. The cache file was named after the card, so the
replacement landed on the name the previous cover already held, and
Flutter's decoded-image cache is keyed by that same path. A picked cover
now carries a token in its name, and the decoded copies of a replaced one
are evicted. On web the delete goes through a new route on the server's
image cache, where a stale copy would outrank the URL for every client.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Deleting a series leaves its watch marks in the database on purpose, so
re-adding it restores the progress — but the statistics page counted them
forever, and editing the marks of a live card was the only thing that made
the numbers agree again. Every episode and track counter now ignores marks
whose title is no longer in the collection, via an EXISTS predicate
mirroring CollectionItem.usesEpisodeTrackerFor. Nothing is deleted, so a
re-added series still comes back with its progress.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
hcan359 and others added 4 commits August 19, 2026 08:25
A TheTVDB series record states no episode count anywhere, so the progress
badge had no denominator and seasons showed no episode totals. Both are now
counted from the episode list, skipping specials; the list is fetched only
when a season lacks its own count.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three parts of the same surface, which share the files they touch:

The collection banner now carries the title and a back control drawn in
each style's own look, so the plain title row above a rich collection is
gone and the name is no longer printed twice. The banner also stays up
while items load or fail to load, so the way back never disappears. Strips
reads as torn comic panels instead of an evenly sliced photo, the sticker
album no longer overflows a narrow window, and the status breakdown is dots
and counts rather than wrapped labels.

Every card grid and its loading skeleton read one geometry helper, so
placeholders honor the card-size setting and stop jumping to another size
once the items arrive; search gains the landscape-phone density, the tablet
breakpoint and the compact card form the collection grid already had.

Three effects stop burning frames: a blurred-poster backdrop no longer
follows the gyroscope, a tagged card's border highlight is static on
phones, and every shimmer placeholder shares one clock instead of owning an
AnimationController.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.92%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%35–36, 69–70, 90
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%140, 194, 225, 227, 229–230, 232, 31–32
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%141, 161, 163–164, 166, 30–31
   hardcover_api.dart84.85%100%100%84.85%20–21, 44, 61–62
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%135, 147, 160, 20–23, 44
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%234, 236, 287, 293–294, 321, 331, 46–51
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%55
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%47–48
   podcast_index_api.dart79.10%100%100%79.10%110–111, 132–133, 138, 140, 142, 20–21, 41–42, 46, 78–79
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart91.30%100%100%91.30%11–12, 203, 207, 210–213
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%150, 155, 24, 85, 90
   tvdb_api.dart75%100%100%75%100–101, 109, 118, 71, 78–79, 93
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%121–124, 129, 13, 130, 132–134, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%101, 104, 110, 112–116, 120–122, 125–127, 134–135, 137, 140–142, 146–147, 149, 152–154, 158–159, 16, 161, 165, 169, 172, 175–176, 178, 180, 20–24, 29–33, 40, 45, 47, 54, 59, 61, 68, 75–76, 78–79, 82, 85–86, 93, 95, 97–98
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%127
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%104–106
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart100%100%100%100%
   tvmaze_episode_source.dart82.35%100%100%82.35%39–41
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%15, 19, 45, 61–62, 64
   fantlab_search_api.dart96.88%100%100%96.88%72
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%25, 39, 65
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%119–120, 122, 126, 129–130, 37, 63, 65
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 340, 342, 399, 411, 415, 417–418, 420–421, 423–424, 427, 431, 433–435, 439, 441–443, 447–452, 455, 457, 460–461, 463, 467, 469–472, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   mangabaka_manga_api.dart88.89%100%100%88.89%26–29, 31, 33
   mangabaka_tags_api.dart100%100%100%100%
   mangabaka_types.dart100%100%100%100%
lib/core/api/mangadex
   mangadex_http_client.dart80%100%100%80%12, 58–59
   mangadex_manga_api.dart91.57%100%100%91.57%102, 51–54, 59–60
   mangadex_tags_api.dart80%100%100%80%30–31
   mangadex_types.dart66.67%100%100%66.67%18–19
lib/core/api/musicbrainz
   musicbrainz_http_client.dart88.89%100%100%88.89%13, 54, 83
   musicbrainz_release_group_api.dart<

@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.92%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%35–36, 69–70, 90
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%140, 194, 225, 227, 229–230, 232, 31–32
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%141, 161, 163–164, 166, 30–31
   hardcover_api.dart84.85%100%100%84.85%20–21, 44, 61–62
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%135, 147, 160, 20–23, 44
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%234, 236, 287, 293–294, 321, 331, 46–51
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%55
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%47–48
   podcast_index_api.dart79.10%100%100%79.10%110–111, 132–133, 138, 140, 142, 20–21, 41–42, 46, 78–79
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart91.30%100%100%91.30%11–12, 203, 207, 210–213
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%150, 155, 24, 85, 90
   tvdb_api.dart75%100%100%75%100–101, 109, 118, 71, 78–79, 93
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%121–124, 129, 13, 130, 132–134, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%101, 104, 110, 112–116, 120–122, 125–127, 134–135, 137, 140–142, 146–147, 149, 152–154, 158–159, 16, 161, 165, 169, 172, 175–176, 178, 180, 20–24, 29–33, 40, 45, 47, 54, 59, 61, 68, 75–76, 78–79, 82, 85–86, 93, 95, 97–98
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%127
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%104–106
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart100%100%100%100%
   tvmaze_episode_source.dart82.35%100%100%82.35%39–41
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%15, 19, 45, 61–62, 64
   fantlab_search_api.dart96.88%100%100%96.88%72
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%25, 39, 65
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%119–120, 122, 126, 129–130, 37, 63, 65
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 340, 342, 399, 411, 415, 417–418, 420–421, 423–424, 427, 431, 433–435, 439, 441–443, 447–452, 455, 457, 460–461, 463, 467, 469–472, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   mangabaka_manga_api.dart88.89%100%100%88.89%26–29, 31, 33
   mangabaka_tags_api.dart100%100%100%100%
   mangabaka_types.dart100%100%100%100%
lib/core/api/mangadex
   mangadex_http_client.dart80%100%100%80%12, 58–59
   mangadex_manga_api.dart91.57%100%100%91.57%102, 51–54, 59–60
   mangadex_tags_api.dart80%100%100%80%30–31
   mangadex_types.dart66.67%100%100%66.67%18–19
lib/core/api/musicbrainz
   musicbrainz_http_client.dart88.89%100%100%88.89%13, 54, 83
   musicbrainz_release_group_api.dart<

hcan359 and others added 5 commits August 19, 2026 20:44
Reject absolute and drive-qualified image ids that p.join would resolve
outside the cache directory; send every forwarded body with an explicit
Content-Length, including an empty one; extract the FIFO throttle from
the proxy and pace coverartarchive.org fetches in the image cache.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PG1rmfsvYi61LmS9PS88bY
A 63-bit fnv1a64 id exceeds what a JS double holds exactly, so the web
build rounded it and every keyed lookup missed. New fnv1a53 xor-folds
the hash to 53 bits, bit-identical between the VM and dart2js; albums
and the ListenBrainz feed now use it. MangaDex and Google Books keep
fnv1a64 — their ids already shipped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PG1rmfsvYi61LmS9PS88bY
The card's cover and blurred background render from the local cover
cache on the first frame: the base path is memoized so a cached file
resolves synchronously, and one shared decode width lets the grid, the
card and the search sheet reuse a single decoded copy. On web the
backdrop routes through the server image cache, a replaced hero is
deleted from it, and exports skip the hero file there. "Refresh item"
drops the decoded copies so the refetched cover shows without a restart.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PG1rmfsvYi61LmS9PS88bY
…en cleanups

Listened counters intersect with the loaded track list, so imported
marks outside the fetched window no longer inflate the header or flip a
podcast to completed. Collapsed episode spans skip building their rows.
In a track row the circle toggles the mark and a tap on the row unfolds
an ellipsized title. The collection screen reuses one CollectionFilters
instance and memoizes per-tag counts; the VGMaps panel gates on
kVgMapsEnabled instead of a bare Platform check.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PG1rmfsvYi61LmS9PS88bY
Entries state what a feature or fix does — no rationale, no bug history,
no comparisons with other sources; fixes get their own entry only for
features shipped in a past release. Same-release tweaks fold into the
feature entry. The finish skill's Phase 4 now enforces this.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PG1rmfsvYi61LmS9PS88bY
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.96%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%35–36, 69–70, 90
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%140, 194, 225, 227, 229–230, 232, 31–32
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%141, 161, 163–164, 166, 30–31
   hardcover_api.dart84.85%100%100%84.85%20–21, 44, 61–62
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%135, 147, 160, 20–23, 44
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%234, 236, 287, 293–294, 321, 331, 46–51
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%55
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%47–48
   podcast_index_api.dart79.10%100%100%79.10%110–111, 132–133, 138, 140, 142, 20–21, 41–42, 46, 78–79
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart91.30%100%100%91.30%11–12, 203, 207, 210–213
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%150, 155, 24, 85, 90
   tvdb_api.dart75%100%100%75%100–101, 109, 118, 71, 78–79, 93
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%121–124, 129, 13, 130, 132–134, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%101, 104, 110, 112–116, 120–122, 125–127, 134–135, 137, 140–142, 146–147, 149, 152–154, 158–159, 16, 161, 165, 169, 172, 175–176, 178, 180, 20–24, 29–33, 40, 45, 47, 54, 59, 61, 68, 75–76, 78–79, 82, 85–86, 93, 95, 97–98
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%127
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%104–106
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart100%100%100%100%
   tvmaze_episode_source.dart82.35%100%100%82.35%39–41
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%15, 19, 45, 61–62, 64
   fantlab_search_api.dart96.88%100%100%96.88%72
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%25, 39, 65
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%119–120, 122, 126, 129–130, 37, 63, 65
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 340, 342, 399, 411, 415, 417–418, 420–421, 423–424, 427, 431, 433–435, 439, 441–443, 447–452, 455, 457, 460–461, 463, 467, 469–472, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   mangabaka_manga_api.dart88.89%100%100%88.89%26–29, 31, 33
   mangabaka_tags_api.dart100%100%100%100%
   mangabaka_types.dart100%100%100%100%
lib/core/api/mangadex
   mangadex_http_client.dart80%100%100%80%12, 58–59
   mangadex_manga_api.dart91.57%100%100%91.57%102, 51–54, 59–60
   mangadex_tags_api.dart80%100%100%80%30–31
   mangadex_types.dart66.67%100%100%66.67%18–19
lib/core/api/musicbrainz
   musicbrainz_http_client.dart88.89%100%100%88.89%13, 54, 83
   musicbrainz_release_group_api.dart<

The DAO surface changed (AudioDao, listen-count stats, renamed
getCollectionIdsWithStatuses), so a mixed client/server pair must fail
with the explicit protocol error instead of opaque per-method failures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XgdzMthon3rnVVYTLnjw49
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

55.96%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%35–36, 69–70, 90
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%140, 194, 225, 227, 229–230, 232, 31–32
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%141, 161, 163–164, 166, 30–31
   hardcover_api.dart84.85%100%100%84.85%20–21, 44, 61–62
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%135, 147, 160, 20–23, 44
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%234, 236, 287, 293–294, 321, 331, 46–51
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%55
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%47–48
   podcast_index_api.dart79.10%100%100%79.10%110–111, 132–133, 138, 140, 142, 20–21, 41–42, 46, 78–79
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart91.30%100%100%91.30%11–12, 203, 207, 210–213
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%150, 155, 24, 85, 90
   tvdb_api.dart75%100%100%75%100–101, 109, 118, 71, 78–79, 93
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%121–124, 129, 13, 130, 132–134, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%101, 104, 110, 112–116, 120–122, 125–127, 134–135, 137, 140–142, 146–147, 149, 152–154, 158–159, 16, 161, 165, 169, 172, 175–176, 178, 180, 20–24, 29–33, 40, 45, 47, 54, 59, 61, 68, 75–76, 78–79, 82, 85–86, 93, 95, 97–98
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%127
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%104–106
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart100%100%100%100%
   tvmaze_episode_source.dart82.35%100%100%82.35%39–41
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%15, 19, 45, 61–62, 64
   fantlab_search_api.dart96.88%100%100%96.88%72
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%25, 39, 65
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%119–120, 122, 126, 129–130, 37, 63, 65
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 340, 342, 399, 411, 415, 417–418, 420–421, 423–424, 427, 431, 433–435, 439, 441–443, 447–452, 455, 457, 460–461, 463, 467, 469–472, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   mangabaka_manga_api.dart88.89%100%100%88.89%26–29, 31, 33
   mangabaka_tags_api.dart100%100%100%100%
   mangabaka_types.dart100%100%100%100%
lib/core/api/mangadex
   mangadex_http_client.dart80%100%100%80%12, 58–59
   mangadex_manga_api.dart91.57%100%100%91.57%102, 51–54, 59–60
   mangadex_tags_api.dart80%100%100%80%30–31
   mangadex_types.dart66.67%100%100%66.67%18–19
lib/core/api/musicbrainz
   musicbrainz_http_client.dart88.89%100%100%88.89%13, 54, 83
   musicbrainz_release_group_api.dart<

hcan359 and others added 2 commits August 20, 2026 18:43
… lookup

Sort keys are computed once per item instead of inside the comparator,
with a deterministic id tie-breaker for duplicate names. The All Items
card watches selection through bool-valued selects so a toggle rebuilds
one card instead of the screen; the bulk bar owns its own selection
watch. Platform chips load via one getPlatformsByIds call instead of a
per-id loop. Grid cards are wrapped in RepaintBoundary. A new core test
checks every model constructor parameter against its toDb keys.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012T8oQLW3qG2Vbw7WNg9U11
perf(app): keyed sorting, scoped selection rebuilds, batched platform…
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

56.00%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%35–36, 69–70, 90
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%140, 194, 225, 227, 229–230, 232, 31–32
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%141, 161, 163–164, 166, 30–31
   hardcover_api.dart84.85%100%100%84.85%20–21, 44, 61–62
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%135, 147, 160, 20–23, 44
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%234, 236, 287, 293–294, 321, 331, 46–51
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%55
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%47–48
   podcast_index_api.dart79.10%100%100%79.10%110–111, 132–133, 138, 140, 142, 20–21, 41–42, 46, 78–79
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart91.30%100%100%91.30%11–12, 203, 207, 210–213
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%150, 155, 24, 85, 90
   tvdb_api.dart75%100%100%75%100–101, 109, 118, 71, 78–79, 93
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%121–124, 129, 13, 130, 132–134, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%101, 104, 110, 112–116, 120–122, 125–127, 134–135, 137, 140–142, 146–147, 149, 152–154, 158–159, 16, 161, 165, 169, 172, 175–176, 178, 180, 20–24, 29–33, 40, 45, 47, 54, 59, 61, 68, 75–76, 78–79, 82, 85–86, 93, 95, 97–98
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%127
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%104–106
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart100%100%100%100%
   tvmaze_episode_source.dart82.35%100%100%82.35%39–41
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%15, 19, 45, 61–62, 64
   fantlab_search_api.dart96.88%100%100%96.88%72
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%25, 39, 65
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%119–120, 122, 126, 129–130, 37, 63, 65
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 340, 342, 399, 411, 415, 417–418, 420–421, 423–424, 427, 431, 433–435, 439, 441–443, 447–452, 455, 457, 460–461, 463, 467, 469–472, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   mangabaka_manga_api.dart88.89%100%100%88.89%26–29, 31, 33
   mangabaka_tags_api.dart100%100%100%100%
   mangabaka_types.dart100%100%100%100%
lib/core/api/mangadex
   mangadex_http_client.dart80%100%100%80%12, 58–59
   mangadex_manga_api.dart91.57%100%100%91.57%102, 51–54, 59–60
   mangadex_tags_api.dart80%100%100%80%30–31
   mangadex_types.dart66.67%100%100%66.67%18–19
lib/core/api/musicbrainz
   musicbrainz_http_client.dart88.89%100%100%88.89%13, 54, 83
   musicbrainz_release_group_api.dart<

hcan359 added 2 commits August 20, 2026 19:27
The key was declared twice in every locale but pt; the later "Select tags"
entry won, so the earlier one was dead weight that silently swallowed edits.
Removing it moves the generated getter next to its tagPicker siblings and
leaves the resolved value unchanged.
A release branch matched both the push and the pull_request trigger, so each
push to it queued a push run and a synchronize run of its own PR to main —
two Analyze and two Test jobs for the same commit. Push now watches main
only; a release branch is covered by its PR, which gates the merge anyway.
@hacan359
hacan359 merged commit 2ebf56b into main Aug 20, 2026
2 checks passed
@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

56.01%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%35–36, 69–70, 90
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%140, 194, 225, 227, 229–230, 232, 31–32
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%141, 161, 163–164, 166, 30–31
   hardcover_api.dart84.85%100%100%84.85%20–21, 44, 61–62
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%135, 147, 160, 20–23, 44
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%234, 236, 287, 293–294, 321, 331, 46–51
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%55
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%47–48
   podcast_index_api.dart79.10%100%100%79.10%110–111, 132–133, 138, 140, 142, 20–21, 41–42, 46, 78–79
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart91.30%100%100%91.30%11–12, 203, 207, 210–213
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%150, 155, 24, 85, 90
   tvdb_api.dart75%100%100%75%100–101, 109, 118, 71, 78–79, 93
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%121–124, 129, 13, 130, 132–134, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%101, 104, 110, 112–116, 120–122, 125–127, 134–135, 137, 140–142, 146–147, 149, 152–154, 158–159, 16, 161, 165, 169, 172, 175–176, 178, 180, 20–24, 29–33, 40, 45, 47, 54, 59, 61, 68, 75–76, 78–79, 82, 85–86, 93, 95, 97–98
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%127
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%104–106
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart100%100%100%100%
   tvmaze_episode_source.dart82.35%100%100%82.35%39–41
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%15, 19, 45, 61–62, 64
   fantlab_search_api.dart96.88%100%100%96.88%72
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%25, 39, 65
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%119–120, 122, 126, 129–130, 37, 63, 65
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 340, 342, 399, 411, 415, 417–418, 420–421, 423–424, 427, 431, 433–435, 439, 441–443, 447–452, 455, 457, 460–461, 463, 467, 469–472, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   mangabaka_manga_api.dart88.89%100%100%88.89%26–29, 31, 33
   mangabaka_tags_api.dart100%100%100%100%
   mangabaka_types.dart100%100%100%100%
lib/core/api/mangadex
   mangadex_http_client.dart80%100%100%80%12, 58–59
   mangadex_manga_api.dart91.57%100%100%91.57%102, 51–54, 59–60
   mangadex_tags_api.dart80%100%100%80%30–31
   mangadex_types.dart66.67%100%100%66.67%18–19
lib/core/api/musicbrainz
   musicbrainz_http_client.dart88.89%100%100%88.89%13, 54, 83
   musicbrainz_release_group_api.dart<

@github-actions

Copy link
Copy Markdown

Coverage after merging release/0.43 into main will be

56.01%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
lib
   app.dart83.33%100%100%83.33%35–36, 69–70, 90
   main.dart1.96%100%100%1.96%105–108, 112, 114–121, 124, 23–26, 28–29, 31–35, 40, 44, 48, 50–51, 55, 57–59, 64–65, 69–72, 75, 77–79, 81, 92, 94–95, 98–99
lib/core/api
   anilist_api.dart69.23%100%100%69.23%106–107, 128–129, 131–132, 134, 139, 145, 150, 20, 95
   api_dio.dart28.57%100%100%28.57%28–29, 32, 40, 44–45, 47, 49–51
   api_error_detail.dart100%100%100%100%
   api_error_extract.dart100%100%100%100%
   comicvine_api.dart90.82%100%100%90.82%140, 194, 225, 227, 229–230, 232, 31–32
   fantlab_api.dart100%100%100%100%
   google_books_api.dart89.55%100%100%89.55%141, 161, 163–164, 166, 30–31
   hardcover_api.dart84.85%100%100%84.85%20–21, 44, 61–62
   host_rate_limiter.dart80.95%100%100%80.95%66, 70, 72–73
   igdb_api.dart80.95%100%100%80.95%135, 147, 160, 20–23, 44
   kitsu_api.dart92.86%100%100%92.86%106, 66
   kodi_api.dart89.34%100%100%89.34%234, 236, 287, 293–294, 321, 331, 46–51
   listenbrainz_api.dart0%100%100%0%101, 103, 111, 113, 115, 117–123, 126–129, 13, 134, 139, 142–145, 33–34, 36–44, 51, 53, 61, 65, 68, 70, 72, 74, 78–84, 88, 95
   mangabaka_api.dart91.67%100%100%91.67%50
   mangadex_api.dart91.67%100%100%91.67%55
   musicbrainz_api.dart0%100%100%0%14–15, 21, 32, 44–45, 47, 51, 53–54, 56–57, 59, 63, 65, 68–71
   openlibrary_api.dart77.78%100%100%77.78%47–48
   podcast_index_api.dart79.10%100%100%79.10%110–111, 132–133, 138, 140, 142, 20–21, 41–42, 46, 78–79
   proxy_rewrite_interceptor.dart100%100%100%100%
   ra_api.dart66.67%100%100%66.67%17, 33, 52, 56, 58, 62, 64–65, 67
   screenscraper_api.dart91.30%100%100%91.30%11–12, 203, 207, 210–213
   simkl_api.dart96.55%100%100%96.55%88
   steam_api.dart93.48%100%100%93.48%69, 8–9
   steamgriddb_api.dart95.65%100%100%95.65%17
   tmdb_api.dart93.98%100%100%93.98%150, 155, 24, 85, 90
   tvdb_api.dart75%100%100%75%100–101, 109, 118, 71, 78–79, 93
   tvmaze_api.dart90.91%100%100%90.91%30
   vndb_api.dart85.71%100%100%85.71%10–11
lib/core/api/anilist
   anilist_graphql_client.dart78%100%100%78%121–124, 129, 13, 130, 132–134, 16
   anilist_mal_lookup_api.dart1.52%100%100%1.52%101, 104, 110, 112–116, 120–122, 125–127, 134–135, 137, 140–142, 146–147, 149, 152–154, 158–159, 16, 161, 165, 169, 172, 175–176, 178, 180, 20–24, 29–33, 40, 45, 47, 54, 59, 61, 68, 75–76, 78–79, 82, 85–86, 93, 95, 97–98
   anilist_media_api.dart77.67%100%100%77.67%129–130, 165, 173–175, 210–212, 253–254, 259–260, 263–264, 285, 288, 47–48, 51, 82–83, 86
   anilist_media_parser.dart96.08%100%100%96.08%111, 7
   anilist_queries.dart93.75%100%100%93.75%14
   anilist_types.dart100%100%100%100%
   anilist_user_list_api.dart98.36%100%100%98.36%127
lib/core/api/episode_source
   kitsu_episode_source.dart94.83%100%100%94.83%104–106
   tmdb_episode_source.dart100%100%100%100%
   tv_episode_source.dart100%100%100%100%
   tvdb_episode_source.dart100%100%100%100%
   tvmaze_episode_source.dart82.35%100%100%82.35%39–41
lib/core/api/fantlab
   fantlab_editions.dart100%100%100%100%
   fantlab_http_client.dart71.43%100%100%71.43%15, 19, 45, 61–62, 64
   fantlab_search_api.dart96.88%100%100%96.88%72
   fantlab_types.dart100%100%100%100%
   fantlab_works_api.dart89.29%100%100%89.29%25, 39, 65
lib/core/api/hardcover
   hardcover_graphql_client.dart80%100%100%80%119–120, 122, 126, 129–130, 37, 63, 65
   hardcover_search_api.dart100%100%100%100%
   hardcover_types.dart94.87%100%100%94.87%10–11
   hardcover_user_library_api.dart100%100%100%100%
lib/core/api/igdb
   igdb_games_api.dart67.34%100%100%67.34%143, 145, 190, 203, 205, 252, 254, 262–263, 292, 294, 307–308, 340, 342, 399, 411, 415, 417–418, 420–421, 423–424, 427, 431, 433–435, 439, 441–443, 447–452, 455, 457, 460–461, 463, 467, 469–472, 54–55, 57–58, 61, 65, 67–69, 73, 75–77, 86, 95, 97
   igdb_genres_api.dart8.33%100%100%8.33%11–12, 15, 20–21, 23, 27, 29–32
   igdb_http_client.dart100%100%100%100%
   igdb_platforms_api.dart97.06%100%100%97.06%44
   igdb_types.dart100%100%100%100%
lib/core/api/kitsu
   kitsu_anime_api.dart65.96%100%100%65.96%25–27, 47–48, 73–74, 80, 82, 84–90
   kitsu_episode_api.dart97.73%100%100%97.73%29
   kitsu_http_client.dart90.91%100%100%90.91%73–74
   kitsu_manga_api.dart83.33%100%100%83.33%25–27, 61–63
   kitsu_mapping_api.dart96.23%100%100%96.23%102–103
   kitsu_types.dart100%100%100%100%
lib/core/api/mangabaka
   mangabaka_http_client.dart80%100%100%80%12, 60–61
   mangabaka_manga_api.dart88.89%100%100%88.89%26–29, 31, 33
   mangabaka_tags_api.dart100%100%100%100%
   mangabaka_types.dart100%100%100%100%
lib/core/api/mangadex
   mangadex_http_client.dart80%100%100%80%12, 58–59
   mangadex_manga_api.dart91.57%100%100%91.57%102, 51–54, 59–60
   mangadex_tags_api.dart80%100%100%80%30–31
   mangadex_types.dart66.67%100%100%66.67%18–19
lib/core/api/musicbrainz
   musicbrainz_http_client.dart88.89%100%100%88.89%13, 54, 83
   musicbrainz_release_group_api.dart<

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant