Skip to content

fix(dashboard): restore artwork for synced viewing history - #2251

Merged
4gray merged 1 commit into
masterfrom
agent/synced-history-artwork
Nov 14, 2026
Merged

4gray merged 1 commit into
masterfrom
agent/synced-history-artwork

Conversation

@4gray

@4gray 4gray commented Nov 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • Return the stored TMDB ID and release year from the Electron Xtream catalog lookup so synchronized history can confirm the match and display the catalog title and poster.
  • Fill missing artwork on Stalker Continue Watching cards from a saved favorite in the same source when the provider ID, content kind, and series mode match and the favorite category is accessible.

Testing

  • SQLite regression test for identity-qualified catalog results.
  • Electron end-to-end regression for displaying catalog artwork from existing synchronized Xtream history, plus the Stalker history synchronization scenario.
  • Stalker metadata tests for matching favorites, kind and series-mode collisions, parental locks, and existing history artwork.
  • Electron backend, dashboard, Stalker, and related unit tests. Manually verified that both posters load in the desktop UI.

@greptile-apps

greptile-apps Bot commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

Greptile CLI Reused the Greptile CLI review of 5944fca by a teammate. The code matches this PR, so no new review ran.

[Medium impact] The PR appears safe to merge; no actionable issues were found.

Summary

This PR improves artwork on synced history cards.

  • Xtream history cards use matching catalog titles and posters.
  • Stalker history cards fill missing posters from saved favorites.

Reviews (1) · Last reviewed commit: "fix(dashboard): restore artwork for sync..." · Reviewed by Greptile

@chatgpt-codex-connector

Copy link
Copy Markdown
Codex Review Summary: ❌ Failed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ❌ Failed 2026-11-14T17:31:27.426227Z
We couldn’t complete this review. Comment @codex review to try again.
5944fca PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@codecov

codecov Bot commented Nov 14, 2026

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 616 bytes (0.0%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
iptvnator-renderer 17.41MB 616 bytes (0.0%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: iptvnator-renderer

Assets Changed:

Asset Name Size Change Total Size Change (%)
chunk-B0QXjX-R.js (New) 2.65MB 2.65MB 100.0% 🚀
chunk-Cix2ud1o.js (New) 872.02kB 872.02kB 100.0% 🚀
chunk-C-8ono4G.js (New) 350.69kB 350.69kB 100.0% 🚀
chunk-CnUYVin5.js (New) 325.67kB 325.67kB 100.0% 🚀
main-E3KWHEBH.js (New) 276.12kB 276.12kB 100.0% 🚀
chunk-DbOZkcwV.js (New) 222.49kB 222.49kB 100.0% 🚀
chunk-BUWi86Y_.js (New) 209.44kB 209.44kB 100.0% 🚀
chunk-BvJW6-kh.js (New) 187.37kB 187.37kB 100.0% 🚀
chunk-DKSkNpwy.js (New) 169.82kB 169.82kB 100.0% 🚀
chunk-ni9B9J-3.js (New) 166.59kB 166.59kB 100.0% 🚀
chunk-CLJUs48F.js (New) 159.95kB 159.95kB 100.0% 🚀
chunk-Dk-OOs_9.js (New) 150.33kB 150.33kB 100.0% 🚀
chunk-hqWx5ZKJ.js (New) 145.1kB 145.1kB 100.0% 🚀
chunk-rUcQZNO6.js (New) 124.14kB 124.14kB 100.0% 🚀
chunk-C8eBPFKu.js (New) 90.56kB 90.56kB 100.0% 🚀
chunk-mSvOHjeW.js (New) 70.14kB 70.14kB 100.0% 🚀
chunk-ClW7i1eZ.js (New) 65.44kB 65.44kB 100.0% 🚀
chunk-DztXRzdD.js (New) 59.83kB 59.83kB 100.0% 🚀
chunk-BfmTDsG0.js (New) 55.97kB 55.97kB 100.0% 🚀
chunk-L3HF5hb9.js (New) 54.17kB 54.17kB 100.0% 🚀
chunk-PHdom98c.js (New) 52.45kB 52.45kB 100.0% 🚀
chunk-DsfkLtAQ.js (New) 49.69kB 49.69kB 100.0% 🚀
chunk-CSQLVBji.js (New) 46.26kB 46.26kB 100.0% 🚀
chunk-CXokq0JG.js (New) 43.12kB 43.12kB 100.0% 🚀
chunk-BybVKAGP.js (New) 40.18kB 40.18kB 100.0% 🚀
chunk-B62NVWHJ.js (New) 35.22kB 35.22kB 100.0% 🚀
chunk-Bm9YCwPB.js (New) 34.73kB 34.73kB 100.0% 🚀
chunk-CaYEpeJz.js (New) 30.2kB 30.2kB 100.0% 🚀
chunk-BNeYf00J.js (New) 30.11kB 30.11kB 100.0% 🚀
chunk-U-qVBXFM.js (New) 26.8kB 26.8kB 100.0% 🚀
chunk-5pfFCjNC.js (New) 22.32kB 22.32kB 100.0% 🚀
chunk-BWa7JCUf.js (New) 21.5kB 21.5kB 100.0% 🚀
chunk-4l0Aj8X-.js (New) 19.91kB 19.91kB 100.0% 🚀
chunk-MleiJf-u.js (New) 19.84kB 19.84kB 100.0% 🚀
chunk-CCHYBXBt.js (New) 18.05kB 18.05kB 100.0% 🚀
chunk-Bd0u3ylN.js (New) 17.91kB 17.91kB 100.0% 🚀
chunk-Bc4NXl9d.js (New) 16.86kB 16.86kB 100.0% 🚀
chunk-VzFreZwF.js (New) 15.62kB 15.62kB 100.0% 🚀
chunk-BISUPGbH.js (New) 15.4kB 15.4kB 100.0% 🚀
chunk-B9lp23nn.js (New) 13.29kB 13.29kB 100.0% 🚀
chunk-j_yR3CRk.js (New) 12.54kB 12.54kB 100.0% 🚀
chunk-Brxe7DCT.js (New) 12.11kB 12.11kB 100.0% 🚀
chunk-BmN9tomB.js (New) 11.04kB 11.04kB 100.0% 🚀
chunk-9Q6SOsHc.js (New) 10.64kB 10.64kB 100.0% 🚀
chunk-D28FKLub.js (New) 9.49kB 9.49kB 100.0% 🚀
chunk-_C8rIHva.js (New) 8.85kB 8.85kB 100.0% 🚀
chunk-ObBHLjMX.js (New) 8.25kB 8.25kB 100.0% 🚀
chunk-Bg02QWWM.js (New) 7.34kB 7.34kB 100.0% 🚀
chunk-BG9kyvT5.js (New) 5.67kB 5.67kB 100.0% 🚀
chunk-Cu9ViEQi.js (New) 5.47kB 5.47kB 100.0% 🚀
chunk-CcIaXNw2.js (New) 5.15kB 5.15kB 100.0% 🚀
chunk-BePoDDnm.js (New) 4.9kB 4.9kB 100.0% 🚀
chunk-DQPZM8bN.js (New) 4.72kB 4.72kB 100.0% 🚀
chunk-BMnefDoO.js (New) 4.45kB 4.45kB 100.0% 🚀
chunk-DquSc1h_.js (New) 4.44kB 4.44kB 100.0% 🚀
chunk-DPCs3HAZ.js (New) 3.61kB 3.61kB 100.0% 🚀
chunk-CfNpziZ2.js (New) 2.86kB 2.86kB 100.0% 🚀
chunk-Df4dNOsy.js (New) 2.83kB 2.83kB 100.0% 🚀
chunk-JZaAPSEw.js (New) 2.28kB 2.28kB 100.0% 🚀
chunk-D1kFKRI-.js (New) 2.24kB 2.24kB 100.0% 🚀
chunk-BduhYBg-.js (New) 2.08kB 2.08kB 100.0% 🚀
chunk-CbS6PxGx.js (New) 2.02kB 2.02kB 100.0% 🚀
chunk-NVx4o_dI.js (New) 1.81kB 1.81kB 100.0% 🚀
chunk-MW6e85Ht.js (New) 1.8kB 1.8kB 100.0% 🚀
chunk-HSX0GZT7.js (New) 1.73kB 1.73kB 100.0% 🚀
chunk-CyhwVkMb.js (New) 1.71kB 1.71kB 100.0% 🚀
chunk-x3jpT8SA.js (New) 1.68kB 1.68kB 100.0% 🚀
chunk-DpyArGzP.js (New) 1.68kB 1.68kB 100.0% 🚀
chunk-CSH4boMu.js (New) 1.67kB 1.67kB 100.0% 🚀
chunk-BUIoRhVs.js (New) 1.67kB 1.67kB 100.0% 🚀
chunk-DO2q2diL.js (New) 1.54kB 1.54kB 100.0% 🚀
chunk-C7HUjOP4.js (New) 1.51kB 1.51kB 100.0% 🚀
chunk-Bo7OCjUv.js (New) 1.51kB 1.51kB 100.0% 🚀
chunk-o8pfd5tv.js (New) 1.5kB 1.5kB 100.0% 🚀
chunk-D9eKUO3O.js (New) 1.44kB 1.44kB 100.0% 🚀
chunk-D7eAhnj6.js (New) 1.43kB 1.43kB 100.0% 🚀
chunk-CPb7KhoT.js (New) 1.37kB 1.37kB 100.0% 🚀
chunk-DcJviWnM.js (New) 759 bytes 759 bytes 100.0% 🚀
chunk-jFTEjTCY.js (New) 759 bytes 759 bytes 100.0% 🚀
chunk-B5fuajEy.js (New) 637 bytes 637 bytes 100.0% 🚀
chunk-DzB4Y87N.js (New) 588 bytes 588 bytes 100.0% 🚀
chunk-DxFp1HZy.js (New) 449 bytes 449 bytes 100.0% 🚀
chunk-B9RC2PEK.js (New) 443 bytes 443 bytes 100.0% 🚀
chunk-DqqwCXlg.js (New) 437 bytes 437 bytes 100.0% 🚀
chunk-tZptLvhG.js (New) 437 bytes 437 bytes 100.0% 🚀
chunk-BJiuOMkj.js (New) 383 bytes 383 bytes 100.0% 🚀
chunk-Ck4eg9w6.js (New) 242 bytes 242 bytes 100.0% 🚀
chunk-Cs8-d6GX.js (New) 239 bytes 239 bytes 100.0% 🚀
chunk-1LALF9On.js (Deleted) -2.65MB 0 bytes -100.0% 🗑️
chunk-BQMNMwbV.js (Deleted) -872.02kB 0 bytes -100.0% 🗑️
chunk-CDieahjb.js (Deleted) -350.69kB 0 bytes -100.0% 🗑️
chunk-7eS6Tk8V.js (Deleted) -325.62kB 0 bytes -100.0% 🗑️
main-K7VVBLGR.js (Deleted) -276.12kB 0 bytes -100.0% 🗑️
chunk-B0Qa7KHn.js (Deleted) -222.48kB 0 bytes -100.0% 🗑️
chunk-BvYjD82J.js (Deleted) -209.44kB 0 bytes -100.0% 🗑️
chunk-BnqJY6IM.js (Deleted) -187.37kB 0 bytes -100.0% 🗑️
chunk-D1A3Ft7h.js (Deleted) -169.82kB 0 bytes -100.0% 🗑️
chunk-Dlb4mNee.js (Deleted) -166.59kB 0 bytes -100.0% 🗑️
chunk-A-JZ-uIN.js (Deleted) -159.95kB 0 bytes -100.0% 🗑️
chunk-CFPgklhg.js (Deleted) -149.78kB 0 bytes -100.0% 🗑️
chunk-VSjgTtcX.js (Deleted) -145.1kB 0 bytes -100.0% 🗑️
chunk-DucPqamH.js (Deleted) -124.14kB 0 bytes -100.0% 🗑️
chunk-e6LjjlDs.js (Deleted) -90.55kB 0 bytes -100.0% 🗑️
chunk-CXEdoAK-.js (Deleted) -70.14kB 0 bytes -100.0% 🗑️
chunk-CxxHWMt5.js (Deleted) -65.44kB 0 bytes -100.0% 🗑️
chunk-BLepycvk.js (Deleted) -59.83kB 0 bytes -100.0% 🗑️
chunk-WIxNj3Gn.js (Deleted) -55.97kB 0 bytes -100.0% 🗑️
chunk-D8qaWXAI.js (Deleted) -54.17kB 0 bytes -100.0% 🗑️
chunk-BACzAli-.js (Deleted) -52.45kB 0 bytes -100.0% 🗑️
chunk-DoyIF342.js (Deleted) -49.69kB 0 bytes -100.0% 🗑️
chunk-B-JBWSdz.js (Deleted) -46.26kB 0 bytes -100.0% 🗑️
chunk-DkcYY9oZ.js (Deleted) -43.12kB 0 bytes -100.0% 🗑️
chunk-8wpNiiZ_.js (Deleted) -40.18kB 0 bytes -100.0% 🗑️
chunk-5n1qMlkR.js (Deleted) -35.22kB 0 bytes -100.0% 🗑️
chunk-A3acepSH.js (Deleted) -34.73kB 0 bytes -100.0% 🗑️
chunk-DkDW2z2p.js (Deleted) -30.2kB 0 bytes -100.0% 🗑️
chunk-D8f8iw_b.js (Deleted) -30.11kB 0 bytes -100.0% 🗑️
chunk-BlrXV8UQ.js (Deleted) -26.8kB 0 bytes -100.0% 🗑️
chunk-BpdB6myQ.js (Deleted) -22.32kB 0 bytes -100.0% 🗑️
chunk-DSA0WiVa.js (Deleted) -21.5kB 0 bytes -100.0% 🗑️
chunk-CiHSkEti.js (Deleted) -19.91kB 0 bytes -100.0% 🗑️
chunk-3BMLb9z_.js (Deleted) -19.84kB 0 bytes -100.0% 🗑️
chunk-CuL8q3B5.js (Deleted) -18.05kB 0 bytes -100.0% 🗑️
chunk-BO2JJBOi.js (Deleted) -17.91kB 0 bytes -100.0% 🗑️
chunk-CA8R19js.js (Deleted) -16.86kB 0 bytes -100.0% 🗑️
chunk-R5WTRrXB.js (Deleted) -15.62kB 0 bytes -100.0% 🗑️
chunk-DLXy-PpB.js (Deleted) -15.4kB 0 bytes -100.0% 🗑️
chunk-C41i-HM5.js (Deleted) -13.29kB 0 bytes -100.0% 🗑️
chunk-oTxOvZHs.js (Deleted) -12.54kB 0 bytes -100.0% 🗑️
chunk-DWZKeqwQ.js (Deleted) -12.11kB 0 bytes -100.0% 🗑️
chunk-J36q_cW8.js (Deleted) -11.04kB 0 bytes -100.0% 🗑️
chunk-nGW4T9IL.js (Deleted) -10.63kB 0 bytes -100.0% 🗑️
chunk-DgHg7y7-.js (Deleted) -9.49kB 0 bytes -100.0% 🗑️
chunk-BtwsWzm-.js (Deleted) -8.85kB 0 bytes -100.0% 🗑️
chunk-CwSCb8nQ.js (Deleted) -8.25kB 0 bytes -100.0% 🗑️
chunk-B68ii0tj.js (Deleted) -7.34kB 0 bytes -100.0% 🗑️
chunk-DAEDjhmX.js (Deleted) -5.67kB 0 bytes -100.0% 🗑️
chunk-C8IUWt_g.js (Deleted) -5.47kB 0 bytes -100.0% 🗑️
chunk-BqN2FD8b.js (Deleted) -5.15kB 0 bytes -100.0% 🗑️
chunk-1BQ-Qu3S.js (Deleted) -4.9kB 0 bytes -100.0% 🗑️
chunk-CE0DXsv9.js (Deleted) -4.72kB 0 bytes -100.0% 🗑️
chunk-CqYngfOI.js (Deleted) -4.45kB 0 bytes -100.0% 🗑️
chunk-b--MGOa5.js (Deleted) -4.44kB 0 bytes -100.0% 🗑️
chunk-BxmgLo9H.js (Deleted) -3.61kB 0 bytes -100.0% 🗑️
chunk-LaQ_RLdz.js (Deleted) -2.86kB 0 bytes -100.0% 🗑️
chunk-BwE3lJM2.js (Deleted) -2.83kB 0 bytes -100.0% 🗑️
chunk-JWqLPx5U.js (Deleted) -2.28kB 0 bytes -100.0% 🗑️
chunk-63cv-qhM.js (Deleted) -2.24kB 0 bytes -100.0% 🗑️
chunk-2QAo7Gmg.js (Deleted) -2.08kB 0 bytes -100.0% 🗑️
chunk-DqPTuRcw.js (Deleted) -2.02kB 0 bytes -100.0% 🗑️
chunk-Bx5U7bKu.js (Deleted) -1.81kB 0 bytes -100.0% 🗑️
chunk-2jPJUxco.js (Deleted) -1.8kB 0 bytes -100.0% 🗑️
chunk-CZQC-ilJ.js (Deleted) -1.73kB 0 bytes -100.0% 🗑️
chunk-COTr4_aw.js (Deleted) -1.71kB 0 bytes -100.0% 🗑️
chunk-DwMFPMyw.js (Deleted) -1.68kB 0 bytes -100.0% 🗑️
chunk-IslXl1Uu.js (Deleted) -1.68kB 0 bytes -100.0% 🗑️
chunk-Dsy1Zr8-.js (Deleted) -1.67kB 0 bytes -100.0% 🗑️
chunk-BKpS7mRr.js (Deleted) -1.67kB 0 bytes -100.0% 🗑️
chunk-DzqreXAa.js (Deleted) -1.54kB 0 bytes -100.0% 🗑️
chunk-uNPfxcfv.js (Deleted) -1.51kB 0 bytes -100.0% 🗑️
chunk-mjh_Az4j.js (Deleted) -1.51kB 0 bytes -100.0% 🗑️
chunk-DK82IQpb.js (Deleted) -1.5kB 0 bytes -100.0% 🗑️
chunk-BTrEyBDg.js (Deleted) -1.44kB 0 bytes -100.0% 🗑️
chunk-CutVMZe_.js (Deleted) -1.43kB 0 bytes -100.0% 🗑️
chunk-5jYt-QDs.js (Deleted) -1.37kB 0 bytes -100.0% 🗑️
chunk-CTWrzmMo.js (Deleted) -759 bytes 0 bytes -100.0% 🗑️
chunk-CYQmyXpS.js (Deleted) -759 bytes 0 bytes -100.0% 🗑️
chunk-BSyYXiyo.js (Deleted) -637 bytes 0 bytes -100.0% 🗑️
chunk-DXXnMKsE.js (Deleted) -588 bytes 0 bytes -100.0% 🗑️
chunk-CG8jqwTj.js (Deleted) -449 bytes 0 bytes -100.0% 🗑️
chunk-C1ndm4SF.js (Deleted) -443 bytes 0 bytes -100.0% 🗑️
chunk-Cma13itd.js (Deleted) -437 bytes 0 bytes -100.0% 🗑️
chunk-D7T3hgi8.js (Deleted) -437 bytes 0 bytes -100.0% 🗑️
chunk-DCmNgqfv.js (Deleted) -383 bytes 0 bytes -100.0% 🗑️
chunk-BFoPowRg.js (Deleted) -242 bytes 0 bytes -100.0% 🗑️
chunk-19hfrdbx.js (Deleted) -239 bytes 0 bytes -100.0% 🗑️

@codecov

codecov Bot commented Nov 14, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 68.18182% with 7 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (master@dd89c00). Learn more about missing BASE report.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
...ess/src/lib/stalker-collection-metadata.service.ts 71.42% 1 Missing and 5 partials ⚠️
...operations/testing/favorites-compatible-actions.ts 0.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff            @@
##             master    #2251   +/-   ##
=========================================
  Coverage          ?   81.87%           
=========================================
  Files             ?     1904           
  Lines             ?   101639           
  Branches          ?    24861           
=========================================
  Hits              ?    83220           
  Misses            ?    11130           
  Partials          ?     7289           
Flag Coverage Δ
unit 81.87% <68.18%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

@4gray
4gray merged commit 9f125b9 into master Nov 14, 2026
36 checks passed
@4gray
4gray deleted the agent/synced-history-artwork branch November 14, 2026 19:41
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