Skip to main content

MovieDB - Releases

← App details

Nextcloud 35

MovieDB 1.4.1
Release Details
UpdatedSept. 13, 2026, 2:22 p.m.
Changelog

Fixed

  • Translation placeholders now render correctly in paginated movie lists.

Tests

  • Added regression coverage for translated placeholders and plural arguments.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignaturefW/4adHB/dpgcR8RMr/F6/964k5AHNAz9qD1DjFFnAh/tVFcjQpUrd7ZBR8+Sc1uSe9NE8oogHa/WZ6bGr81mR1tdzUPq2jAzS91oCz6EM5o0eH3zkx21JjMLdZWJGQ2aSlqa14s/EtjgYWtWUS1HOHRfIyCmPvbvJciWQIZPXyD0GUnr5EENxgzvOm2n4duZ510ATiozQ2g3+IvlY/Mnm7rdwzza44Uokre3SSnnwi5aCA/GBjZdq3Eyu7EWtPNqUCyiW3+8l32GF1IqInQC5X00eKrEKfao8A8Zyvt6+3omx92rw4MObORIZnr7VSvu5yd7S8mz5bR72dSbNVFz1omC2DkhZquLvTE1ETLE3sxHuqEAjD0DC7CmqMIUy+mnRcNBSDdkgnuae2TOklbJK14m2tXNovCBL6BtGqIt4kPHBNloxr+zeanzhjwR/8Qz/xPbGudy7P6rGGPrdVk8GzRm+tCbh6TvhtMmYSo+GDsaJN9zQ8Tocsul7Ja960NN1jVJjIQhtyWQtd5Ym+TlPZ5UjmIqEmWrbWyzRdwzXgfAT6J1IE6hXZvujWfxFZV3u0seVej2gowsJDGD69/iWjtC5WVliAAoGTNBcjgBewO11+TeIb4HMa2cQsg9VdDeYMF/Uegawce68Tc39qWFl7YFDnG/iYnT/61T8r4QtQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.4.0
Release Details
UpdatedSept. 1, 2026, 6:57 p.m.
Changelog

Added

  • Shared Libraries: create named libraries and share your movie/TV collection with other Nextcloud users — assign viewer or editor roles, manage members, and switch between libraries from a single account. Everything about a title (catalog, watchlist, episode progress, ratings, platform, review) is shared across all library members; user_id on catalog rows becomes legacy attribution only — library membership is the sole access gate
  • New DB tables moviedb_libraries and moviedb_library_members; all catalog tables gain a library_id NOT NULL column (Migrations V5 → V7)
  • V5 backfills every user's existing data into an auto-created personal library; V6 enforces the NOT NULL constraint; V7 heals any duplicate-membership edge cases left by a check-then-insert race in V5
  • Self-leave: members added to a shared library can leave it without needing the owner to remove them (Leave button + confirmation dialog in the Libraries view)
  • GET /api/libraries/sharees?search=... — user-search endpoint backed by OCP\Collaboration\Collaborators\ISearch, respecting Nextcloud's shareapi_restrict_user_enumeration and group-restriction admin settings
  • Viewer notice banners on Add Movie, Add TV Show, and Add to Watchlist pages when the active library is view-only

Changed

  • All catalog endpoints (/api/movies, /api/series, /api/watchlist, watches, stats) now accept an optional libraryId query/body param and scope reads/writes to that library; omitting it falls back to the user's personal library
  • LibraryService.resolveLibraryId (writes) throws on a denied explicit ID instead of silently falling back to personal, preventing cross-library write confusion
  • Member management restricted to owner only (editors can no longer add/remove members); viewers see the members list read-only
  • Library delete cascade wrapped in a DB transaction (episodes → watches → watchlist → series → movies → members → library)
  • Rename preserves the caller's owner role in the response (annotate() helper centralises role annotation for all library-returning endpoints)
  • GET /api/libraries/sharees requires at least 1 character to prevent zero-query full user enumeration
  • Dashboard "Recently Watched" now interleaves movies and TV shows sorted by watch date instead of showing movies-only followed by TV-only

Fixed

  • Library rename bug: editing the name field immediately after saving no longer reverts to the pre-save name due to a stale local binding

Tests

  • 121 PHP tests, 136 JS tests, 0 lint errors
  • New: LibraryServiceTest (21 PHP tests covering create, rename, member CRUD, self-leave, canAccess/canEdit, annotate)
  • New: libraries.spec.js (28 JS tests covering store state, getters, fetch, create/rename/remove, leaveLibrary, member actions)
  • All pre-existing tests updated for v1.4 API signatures (libraryId param added to MovieService, WatchlistService, SeriesService, MovieWatchService, StatsService)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignatureW/fG+iP7aiQ4JEqCs4ZaUYIW5HEfc+0t5YrUipKM8MEUvnJZh0N48oTjVhHI17TU
BcpmMBoE9/0TsaLEsK/F2sPUij5qhbEbnHIebiDI579YJxlSfNqj4ITcVFfMYiHh
6q2uSLsxyb7fQgL66RHbzaqq3PFRfRhdc5OmoJtB3Hq+xpvBDrkz516zKjD8hy01
CrI2kLhzYvqf4V8uqBCvfEh+SP0vlCuIGyzjYpqwIAw3YX6Y/2/3Ll7WCoAGAOEA
h6jCiGRhPFXP4tgD+Hj2hqGyRA9LjgkZWLbEGDSw/TclEee43pCAcT/b3p/Pv2wH
PokcYxn+cAAeOxqWG/v/JOk0SoDItx4gH1z4dKAVbnXz3emvAO6GjX/O5M80NZAv
ZWTzNjDHi0ErKAMb+WRRR3/aEvFt1UqIUsNGq4lFYPUX/lYePMEF/bY/aw3joHse
XgwhP4y2qVERPW48FX7GphVFgy7FdAmYXuCz6TapWJGx24bQyn6R7laNNAubGazE
0kvBi8day7u5iGib80rm0IBoCP6c9FEXFJKa1jlrCqfWdb3z7z0zn5Os2bx/sQ6X
rj0e+c/c75NtU48RBx61oCDGZM2RW9VoMfnf8IYVEpn391aNLFKxedFG6sdJvto2
tx+j5B8B7BH2wSLBeGPV9BnIw6ZCeMgB5r2mxq9YIBM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.3.1
Release Details
UpdatedAug. 29, 2026, 7:33 a.m.
Changelog

Fixed

  • PlatformService::findAllForUser now checks hasDefaults() before calling createDefaults(), avoiding an unnecessary DB write on every PHP process start
  • SeriesServiceTest: test mocks corrected from non-existent findByTmdbId to findByTmdbIdAndSeries; static $defaultsSeeded flag reset between test cases so platform-seeding tests run in isolation

Changed

  • App Store description updated to reflect TV show tracking and rewatch support added in 1.2.0 and 1.3.0
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignatureMBqLzKCQipMCqtf0gq6QFUqrK631nyx3olhG568t71yV/TOlV8kNQkntE1dQqNay
t6HB0DDREGQqfvGa8cg5MBmfg1aq3+8i/DWxVOAmavSD5vU9of2XnwjZivDfvJNu
/yOvUz6DnmK/GMCQ/FufzVZKanTCLPQ6d365qdnyHSpJcjXVp4hir8d7YbwGxqWo
DNSq6+g13CvCxMLo+tCaQK6AO3YZYKscYlSoo7YTO5vOfMErupZdv8TRHz0zj8YN
+kndD8NarfyOIEid0k8KTcA7rXdAIN13V8CjtQnwbjV4uk831MEfA6weKQkdaxt3
mnUBWi4lvCLcd2pqDlriHe0c/jqFLll2GQJNoXchfGH7nYwE5Lfn3+5lq6gha7Ke
KU6rsN8DlhEdKXl80ZIWfHwOGgewUhrVx5spgvaQ90Sjsq4J+ilX1osXQW+4YMyH
w6uKZfDFbR9t/NI55iBjDuAQNGkE6pIIVDcwOu48y5KSqC0bKiO65jwrA2dr5WSn
7Z8IsFbWR6rszgI47bbuhbV8Vfk+BteeC91LfyBvWljDuxgFNeOXQBhTeedsyx6B
y45vDccx0I5KaHm6lTlZ8eMeEGmADQ3qVaB1Vv/zmgt2cGJljO1EpbIBBJQsqn2S
eRw1V0S8qgctZTtCIdXc9jyIusM/cK+dHdR/hYKpvCU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.3.0
Release Details
UpdatedAug. 29, 2026, 6:50 a.m.
Changelog

Added

  • Episode-level TV show support (#15): track series, seasons, and individual episodes. Series get their own /tv section, list view, and detail page separate from movies
  • New moviedb_series and moviedb_episodes tables; series metadata and every episode (including specials) are imported from TMDB on add, one API call per season
  • Derived progress: season and series completion are computed from each episode's watched flag — never stored as a season/series-level percentage. Unaired episodes (air date in the future or unknown) are excluded from the denominator; specials (season 0) are stored and shown but excluded from progress
  • "Up next" card surfaces the first aired, unwatched episode
  • Mark whole season / whole series watched fan-out — idempotent, so re-clicking never re-flips; only aired, non-special episodes are affected
  • Series-owned watch metadata: a TV show carries its own rating, platform, language watched, and watch date — set on the Add TV Show and Edit TV Show forms, exactly like a movie — stored as a single series-level row in moviedb_movie_watches (nullable series_id/episode_id). Individual episodes are a plain watched/unwatched checkbox with no per-episode metadata
  • TMDB Movies/TV toggle in the search UI; localized TV genre list
  • Watchlist now supports TV shows as well as movies: a unified watchlist with a Movies/TV type toggle when adding, a Movie/TV badge on each entry, and an All/Movies/TV Shows type filter. Marking a show as watched imports the whole series (all seasons/episodes) and routes to its /tv detail page; marking a movie behaves as before
  • Dashboard tiles for TV shows watched and episodes watched; total runtime now includes episode runtime
  • Translations for all new strings (de, es, fr, it, nl)

Changed

  • Migration Version000003Date20260828 adds the series/episode tables (including a watched boolean on moviedb_episodes), relaxes moviedb_movie_watches.movie_id to nullable, and adds a media_type column to moviedb_watchlist (default movie; existing rows backfill to movie) — all add-only or NOT-NULL relaxation, safe for the SQLite fresh-install batch; no columns dropped
  • media_type is now populated on movies (default movie) for forward-compatibility
  • Year and platform charts remain movies-only in this release
  • Dashboard Avg Rating and Top Rated now include TV shows alongside movies — a show's rating lives on its single series-level watch row, so it counts toward the average and can appear in the Top Rated row. Movie and series cards now carry a small Movie/TV type badge

Fixed

  • Default streaming platforms are now seeded lazily on first read (PlatformService::findAllForUser) instead of relying solely on the migration's postSchemaChange hook, which Nextcloud does not reliably fire during occ app:enable. Fresh installs no longer show an empty platform picker; the seed is idempotent so it never duplicates existing defaults
  • Recently watched TV shows now appear on the dashboard alongside movies (the recent stats endpoint returns series with at least one watched episode, most-recently-watched first)
  • Episode watched state is stored as a boolean watched column on moviedb_episodes (toggled by the per-episode checkbox and the season/series "mark all watched" actions), and total runtime counts each watched episode's runtime. This replaces the earlier per-episode "log watch" dialog: episodes no longer carry their own date/platform/language/rating — that metadata belongs to the show as a whole (see Added)
  • Series import no longer fails when a show has a specials season: moviedb_episodes.season_number/episode_number now carry a DB default of 0 so episodes in season 0 (which match the entity's default and are thus omitted from the QBMapper INSERT) persist instead of hitting a NOT NULL constraint. Affected both direct series add and "mark watched" on a series watchlist item
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
Signatureo53wujykdigXdIMMC7OwGc4U1s5G5LWDUGFrsnyTbMe4zh9zLM/pb4KwuGJNbSWZ
lNAnrJg86s3Uj+tNdHMnEVzYkeAAqZ92TSdVN6UCbL+LMU+LbdJJOijXhEQho0xF
NF0x1U2+AzuW6fVDOC7eYmtIuCBAB/4xiGra/bqGVPGTpttmdYpkg6TEmF4NkhKs
TH0sNeoqbOKH0bvWU6q4d27Icqc8klNA+Eo61AGq4OOg4zY5I2CTdZHrGQW1uarV
esawGTxZpEf0B0+eg3dvMOXRq4f7ULLDGxvgbSZ8ulevAem0zHuO0ldeov1YJScb
5ko5nINoVV/AKJLqSgqkMX2XSduc12llo4uYD2aiSS4GqoIX60JwO2fFR59YfphM
1i4E5hVxGYWfXEOX9h38sOt2ea9yUS8/CUYLaXppP5Xr7gC1/gShFennJ4HEms8+
LAJXGgYaUwVR1OZzQ1IoydswGSeeHV++5Qs2cjD0no/Hy5FG1EFUPBJUuKmcwQSG
Q8YmI8/gxs+5M1O4vxCXWl4NaOnWbEkDoKKotQA5aOJVZfk0zIFUSjb0ZW87Q5NU
tBDZNi6ccg2DWNOxWdYgvpBwGDoLySpS5Z3csCKLkEmET6YGocEVTk3QdDW/XsYV
AXyD3J/SF1omJfWKZMJhLGxmdkDEdWg0/XSlbKgaUS4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32

Nextcloud 34

MovieDB 1.4.1
Release Details
UpdatedSept. 13, 2026, 2:22 p.m.
Changelog

Fixed

  • Translation placeholders now render correctly in paginated movie lists.

Tests

  • Added regression coverage for translated placeholders and plural arguments.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignaturefW/4adHB/dpgcR8RMr/F6/964k5AHNAz9qD1DjFFnAh/tVFcjQpUrd7ZBR8+Sc1uSe9NE8oogHa/WZ6bGr81mR1tdzUPq2jAzS91oCz6EM5o0eH3zkx21JjMLdZWJGQ2aSlqa14s/EtjgYWtWUS1HOHRfIyCmPvbvJciWQIZPXyD0GUnr5EENxgzvOm2n4duZ510ATiozQ2g3+IvlY/Mnm7rdwzza44Uokre3SSnnwi5aCA/GBjZdq3Eyu7EWtPNqUCyiW3+8l32GF1IqInQC5X00eKrEKfao8A8Zyvt6+3omx92rw4MObORIZnr7VSvu5yd7S8mz5bR72dSbNVFz1omC2DkhZquLvTE1ETLE3sxHuqEAjD0DC7CmqMIUy+mnRcNBSDdkgnuae2TOklbJK14m2tXNovCBL6BtGqIt4kPHBNloxr+zeanzhjwR/8Qz/xPbGudy7P6rGGPrdVk8GzRm+tCbh6TvhtMmYSo+GDsaJN9zQ8Tocsul7Ja960NN1jVJjIQhtyWQtd5Ym+TlPZ5UjmIqEmWrbWyzRdwzXgfAT6J1IE6hXZvujWfxFZV3u0seVej2gowsJDGD69/iWjtC5WVliAAoGTNBcjgBewO11+TeIb4HMa2cQsg9VdDeYMF/Uegawce68Tc39qWFl7YFDnG/iYnT/61T8r4QtQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.4.0
Release Details
UpdatedSept. 1, 2026, 6:57 p.m.
Changelog

Added

  • Shared Libraries: create named libraries and share your movie/TV collection with other Nextcloud users — assign viewer or editor roles, manage members, and switch between libraries from a single account. Everything about a title (catalog, watchlist, episode progress, ratings, platform, review) is shared across all library members; user_id on catalog rows becomes legacy attribution only — library membership is the sole access gate
  • New DB tables moviedb_libraries and moviedb_library_members; all catalog tables gain a library_id NOT NULL column (Migrations V5 → V7)
  • V5 backfills every user's existing data into an auto-created personal library; V6 enforces the NOT NULL constraint; V7 heals any duplicate-membership edge cases left by a check-then-insert race in V5
  • Self-leave: members added to a shared library can leave it without needing the owner to remove them (Leave button + confirmation dialog in the Libraries view)
  • GET /api/libraries/sharees?search=... — user-search endpoint backed by OCP\Collaboration\Collaborators\ISearch, respecting Nextcloud's shareapi_restrict_user_enumeration and group-restriction admin settings
  • Viewer notice banners on Add Movie, Add TV Show, and Add to Watchlist pages when the active library is view-only

Changed

  • All catalog endpoints (/api/movies, /api/series, /api/watchlist, watches, stats) now accept an optional libraryId query/body param and scope reads/writes to that library; omitting it falls back to the user's personal library
  • LibraryService.resolveLibraryId (writes) throws on a denied explicit ID instead of silently falling back to personal, preventing cross-library write confusion
  • Member management restricted to owner only (editors can no longer add/remove members); viewers see the members list read-only
  • Library delete cascade wrapped in a DB transaction (episodes → watches → watchlist → series → movies → members → library)
  • Rename preserves the caller's owner role in the response (annotate() helper centralises role annotation for all library-returning endpoints)
  • GET /api/libraries/sharees requires at least 1 character to prevent zero-query full user enumeration
  • Dashboard "Recently Watched" now interleaves movies and TV shows sorted by watch date instead of showing movies-only followed by TV-only

Fixed

  • Library rename bug: editing the name field immediately after saving no longer reverts to the pre-save name due to a stale local binding

Tests

  • 121 PHP tests, 136 JS tests, 0 lint errors
  • New: LibraryServiceTest (21 PHP tests covering create, rename, member CRUD, self-leave, canAccess/canEdit, annotate)
  • New: libraries.spec.js (28 JS tests covering store state, getters, fetch, create/rename/remove, leaveLibrary, member actions)
  • All pre-existing tests updated for v1.4 API signatures (libraryId param added to MovieService, WatchlistService, SeriesService, MovieWatchService, StatsService)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignatureW/fG+iP7aiQ4JEqCs4ZaUYIW5HEfc+0t5YrUipKM8MEUvnJZh0N48oTjVhHI17TU
BcpmMBoE9/0TsaLEsK/F2sPUij5qhbEbnHIebiDI579YJxlSfNqj4ITcVFfMYiHh
6q2uSLsxyb7fQgL66RHbzaqq3PFRfRhdc5OmoJtB3Hq+xpvBDrkz516zKjD8hy01
CrI2kLhzYvqf4V8uqBCvfEh+SP0vlCuIGyzjYpqwIAw3YX6Y/2/3Ll7WCoAGAOEA
h6jCiGRhPFXP4tgD+Hj2hqGyRA9LjgkZWLbEGDSw/TclEee43pCAcT/b3p/Pv2wH
PokcYxn+cAAeOxqWG/v/JOk0SoDItx4gH1z4dKAVbnXz3emvAO6GjX/O5M80NZAv
ZWTzNjDHi0ErKAMb+WRRR3/aEvFt1UqIUsNGq4lFYPUX/lYePMEF/bY/aw3joHse
XgwhP4y2qVERPW48FX7GphVFgy7FdAmYXuCz6TapWJGx24bQyn6R7laNNAubGazE
0kvBi8day7u5iGib80rm0IBoCP6c9FEXFJKa1jlrCqfWdb3z7z0zn5Os2bx/sQ6X
rj0e+c/c75NtU48RBx61oCDGZM2RW9VoMfnf8IYVEpn391aNLFKxedFG6sdJvto2
tx+j5B8B7BH2wSLBeGPV9BnIw6ZCeMgB5r2mxq9YIBM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.3.1
Release Details
UpdatedAug. 29, 2026, 7:33 a.m.
Changelog

Fixed

  • PlatformService::findAllForUser now checks hasDefaults() before calling createDefaults(), avoiding an unnecessary DB write on every PHP process start
  • SeriesServiceTest: test mocks corrected from non-existent findByTmdbId to findByTmdbIdAndSeries; static $defaultsSeeded flag reset between test cases so platform-seeding tests run in isolation

Changed

  • App Store description updated to reflect TV show tracking and rewatch support added in 1.2.0 and 1.3.0
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignatureMBqLzKCQipMCqtf0gq6QFUqrK631nyx3olhG568t71yV/TOlV8kNQkntE1dQqNay
t6HB0DDREGQqfvGa8cg5MBmfg1aq3+8i/DWxVOAmavSD5vU9of2XnwjZivDfvJNu
/yOvUz6DnmK/GMCQ/FufzVZKanTCLPQ6d365qdnyHSpJcjXVp4hir8d7YbwGxqWo
DNSq6+g13CvCxMLo+tCaQK6AO3YZYKscYlSoo7YTO5vOfMErupZdv8TRHz0zj8YN
+kndD8NarfyOIEid0k8KTcA7rXdAIN13V8CjtQnwbjV4uk831MEfA6weKQkdaxt3
mnUBWi4lvCLcd2pqDlriHe0c/jqFLll2GQJNoXchfGH7nYwE5Lfn3+5lq6gha7Ke
KU6rsN8DlhEdKXl80ZIWfHwOGgewUhrVx5spgvaQ90Sjsq4J+ilX1osXQW+4YMyH
w6uKZfDFbR9t/NI55iBjDuAQNGkE6pIIVDcwOu48y5KSqC0bKiO65jwrA2dr5WSn
7Z8IsFbWR6rszgI47bbuhbV8Vfk+BteeC91LfyBvWljDuxgFNeOXQBhTeedsyx6B
y45vDccx0I5KaHm6lTlZ8eMeEGmADQ3qVaB1Vv/zmgt2cGJljO1EpbIBBJQsqn2S
eRw1V0S8qgctZTtCIdXc9jyIusM/cK+dHdR/hYKpvCU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.3.0
Release Details
UpdatedAug. 29, 2026, 6:50 a.m.
Changelog

Added

  • Episode-level TV show support (#15): track series, seasons, and individual episodes. Series get their own /tv section, list view, and detail page separate from movies
  • New moviedb_series and moviedb_episodes tables; series metadata and every episode (including specials) are imported from TMDB on add, one API call per season
  • Derived progress: season and series completion are computed from each episode's watched flag — never stored as a season/series-level percentage. Unaired episodes (air date in the future or unknown) are excluded from the denominator; specials (season 0) are stored and shown but excluded from progress
  • "Up next" card surfaces the first aired, unwatched episode
  • Mark whole season / whole series watched fan-out — idempotent, so re-clicking never re-flips; only aired, non-special episodes are affected
  • Series-owned watch metadata: a TV show carries its own rating, platform, language watched, and watch date — set on the Add TV Show and Edit TV Show forms, exactly like a movie — stored as a single series-level row in moviedb_movie_watches (nullable series_id/episode_id). Individual episodes are a plain watched/unwatched checkbox with no per-episode metadata
  • TMDB Movies/TV toggle in the search UI; localized TV genre list
  • Watchlist now supports TV shows as well as movies: a unified watchlist with a Movies/TV type toggle when adding, a Movie/TV badge on each entry, and an All/Movies/TV Shows type filter. Marking a show as watched imports the whole series (all seasons/episodes) and routes to its /tv detail page; marking a movie behaves as before
  • Dashboard tiles for TV shows watched and episodes watched; total runtime now includes episode runtime
  • Translations for all new strings (de, es, fr, it, nl)

Changed

  • Migration Version000003Date20260828 adds the series/episode tables (including a watched boolean on moviedb_episodes), relaxes moviedb_movie_watches.movie_id to nullable, and adds a media_type column to moviedb_watchlist (default movie; existing rows backfill to movie) — all add-only or NOT-NULL relaxation, safe for the SQLite fresh-install batch; no columns dropped
  • media_type is now populated on movies (default movie) for forward-compatibility
  • Year and platform charts remain movies-only in this release
  • Dashboard Avg Rating and Top Rated now include TV shows alongside movies — a show's rating lives on its single series-level watch row, so it counts toward the average and can appear in the Top Rated row. Movie and series cards now carry a small Movie/TV type badge

Fixed

  • Default streaming platforms are now seeded lazily on first read (PlatformService::findAllForUser) instead of relying solely on the migration's postSchemaChange hook, which Nextcloud does not reliably fire during occ app:enable. Fresh installs no longer show an empty platform picker; the seed is idempotent so it never duplicates existing defaults
  • Recently watched TV shows now appear on the dashboard alongside movies (the recent stats endpoint returns series with at least one watched episode, most-recently-watched first)
  • Episode watched state is stored as a boolean watched column on moviedb_episodes (toggled by the per-episode checkbox and the season/series "mark all watched" actions), and total runtime counts each watched episode's runtime. This replaces the earlier per-episode "log watch" dialog: episodes no longer carry their own date/platform/language/rating — that metadata belongs to the show as a whole (see Added)
  • Series import no longer fails when a show has a specials season: moviedb_episodes.season_number/episode_number now carry a DB default of 0 so episodes in season 0 (which match the entity's default and are thus omitted from the QBMapper INSERT) persist instead of hitting a NOT NULL constraint. Affected both direct series add and "mark watched" on a series watchlist item
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
Signatureo53wujykdigXdIMMC7OwGc4U1s5G5LWDUGFrsnyTbMe4zh9zLM/pb4KwuGJNbSWZ
lNAnrJg86s3Uj+tNdHMnEVzYkeAAqZ92TSdVN6UCbL+LMU+LbdJJOijXhEQho0xF
NF0x1U2+AzuW6fVDOC7eYmtIuCBAB/4xiGra/bqGVPGTpttmdYpkg6TEmF4NkhKs
TH0sNeoqbOKH0bvWU6q4d27Icqc8klNA+Eo61AGq4OOg4zY5I2CTdZHrGQW1uarV
esawGTxZpEf0B0+eg3dvMOXRq4f7ULLDGxvgbSZ8ulevAem0zHuO0ldeov1YJScb
5ko5nINoVV/AKJLqSgqkMX2XSduc12llo4uYD2aiSS4GqoIX60JwO2fFR59YfphM
1i4E5hVxGYWfXEOX9h38sOt2ea9yUS8/CUYLaXppP5Xr7gC1/gShFennJ4HEms8+
LAJXGgYaUwVR1OZzQ1IoydswGSeeHV++5Qs2cjD0no/Hy5FG1EFUPBJUuKmcwQSG
Q8YmI8/gxs+5M1O4vxCXWl4NaOnWbEkDoKKotQA5aOJVZfk0zIFUSjb0ZW87Q5NU
tBDZNi6ccg2DWNOxWdYgvpBwGDoLySpS5Z3csCKLkEmET6YGocEVTk3QdDW/XsYV
AXyD3J/SF1omJfWKZMJhLGxmdkDEdWg0/XSlbKgaUS4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.2.0
Release Details
UpdatedAug. 25, 2026, 6:53 p.m.
Changelog

Added

  • Rewatch support: new moviedb_movie_watches table stores one row per viewing (date, rating, review, platform, language). Each movie can now have a full watch history (#19)
  • Log again button on the movie detail page with a star-rating selector for quick rewatch logging
  • Watch history section on movie detail listing all watches with per-entry delete (hidden when only one entry exists)
  • Watchlist "mark as watched" on an already-watched movie now appends a new watch entry instead of creating a duplicate movie record

Changed

  • Migration Version000002Date20260824 backfills all existing per-movie watch data into the new watches table with a verify-before-drop guard; legacy columns are retained in 1.2.0 for safe downgrade and will be dropped in a future release
  • Star-rating selector replaces free-text number input in the log-watch dialog
  • Removed redundant date/language summary box from the movie detail header

Fixed

  • Edit form: rating/review/date changes now persist correctly even for movies without a prior watch row (previously silently dropped)

Tests

  • 73 JS tests, 69 PHP tests, 0 lint errors
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignaturezhR5gYHFnW4DQvbjaabhFfJoVCbw2xCpGDCzNmSHHNauQYQqsDweLrZpfHvADAHPuAvzv4OPDCXxngxRRvDTviwUnx+jmuvNpzSDazRNbQ18yZdGqrKF/T/ccCTMjpxtDqTnOJJIcPpAAASc4WWG6Vu44w3L2bzH7/4yC2AkXuAFoC9P+yAXnDNUvgpfHHGRj7CeYjBlqOZNwvOTfYacvw+kyJ0ozzWteH0sy5Y1+I4BNL0wtK3T7V7RD1BzALT889qCGyUtIph8D7XT57+uiVAntBZQQpTqoN3yGNu9fTPVzyC5b8frY45XOGX6pSQ/q0uQ7++BU4sKp8DuKiEZ9mwbHNp2Y4CnoY3rSE+IWi6CZpRAi+UY6UeL9dwcJ98Ts/1SHh9HYn/URPi02mAI1xmXkTfkQyfU+lLvASs5LfYrx69Cdi9O43tbYijo3SrtTANvy2TgicMj9maiMPP4eCtJ2fyN5T2vvYxJv3GYvKOmc4ZhBOG4OPhlOZtb1HnGbXFF+Vm/9oPpNax5KrbX3Ne7kSZs791ibk0hiXNPfHehdDZxBnXVTVhXvBknF8VyAQ09lXKlQ3GT9R9PKcZDVKXN4m/do4Lcs7XgeSQOEzmXS8LUY7ihwjHv7AIWK1e6To3MKLd5mT0RpJSbnTv6OFwhgv1psHfjOkkVQzVRkGs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
MovieDB 1.1.2
Release Details
UpdatedAug. 24, 2026, 6:27 p.m.
Changelog

Fixed

  • Prevent adding the same movie twice: POST /api/movies now returns 409 Conflict with the existing movie's id when a duplicate tmdbId is submitted, matching the existing watchlist behavior (#17)
  • Watchlist store now shows a specific "already in your watchlist" message on 409 instead of the generic "failed to add" toast

Added

  • Friendly duplicate-movie dialog in the Add Movie view offering "View existing entry" (routes to the existing movie's detail page) or "Cancel", instead of a plain error toast
  • New i18n strings for the duplicate-movie dialog in all 5 locales (de, es, fr, it, nl)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
Signature3svKAWeA1wnMKWjv6gguqWhW0hzWaovMs/B5VSy/vgo3j6zWKdUSnhPh18kL1STC4zCJ32lrpiMZzzeqMLUzDbVobV/8vY+fNpy02JV8doFOd+3UCf2kpxjY6Mt6AnfgSpoS7RDgykSZYmnX0qcVvH3GMJEfoZ1qCwSPZ5o2OPVQqv58e1jTYo+NVyOV6lkGZSoBt/qFxbupa4SZpSHp8Nx3h/fSeQdmRKewWjzHTJXhKXgpbMWUu0iCYx9wF/+uJO60OAGD4NFtVIPQmS7TEJ2CdYtQl+2DGquEPAx41RlxCWsjskwKpq5/BSq/uogwbM6Gz9pp3+G8viW6PDWC+nLlGdReXETOdVLCCMIGSGPfW5adYl2ZZb+gUcwb7ndKZ5Mm7vuoRh/HA5KNwxbSPwEXKCBY8WgkzcRRA/Ijc014G9run2px7yLA7E/j1Ym8ENkvOh3Kpk5V79lPjOya5ul4KcJw3idLmGSUFUDS2e4htJCmOyE3u3p+8t78ZU+PVvXOhxL43Aet9Bg3I+jW+WDqtdiRDv/9O4eiGCi1DiJBclroeKIYamOHcco5a3ZTEeqEe9LTS/iF1078BI7JTDhT/iAh1P+Fxpiarvr3gEh/tR6ae0OrwTH1/VWKQike1fkEzubcd81ArfoudJrylOxv+O/2W27j28DGpAI3DB4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
MovieDB 1.1.1
Release Details
UpdatedJuly 31, 2026, 10:10 a.m.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignatureoBoTuKwkslFX+XV2GPd7IYGCm/NvKhzIAawUt8qG9Gy4GCmIDGmPAtoiQa3ze9+2
MttRv3DMyuODHW1/Idr386cNa+L3witDP8hyiNv6uWLlJzQeh3Qo/etyKfhtdHGf
R4YAq/sIIQF02s9jtlsKaQ5dDLd+EpbP/1JD2/uWPu0vbQerL2HJTLIrPGn78kI4
nyK2nSUJCH0MtV4Elq4dG87Sg2jZCQvqkxZgle208FN9jx19EogjZSy1Dfyq49CI
NzdoKYX6+/EGcF1Vizl0ibtR+A+k+8E9c40qnUrs+XfbLNe+G+VBZ/Eo0AvEO79I
hiJWWaqorAwIUkt27vjik4Re6gsSjP0qo2b9btnsYn2Dj5s+dfza93QmygS6ExKL
ScGvTxSr/tANM6gAWIZqmzSu0plvp6uSA+1dRplhPkLGMk4KcJS0y1YvGdXEpbK+
caBHHdfkG6EAv9Y65+frFxCPxQdh9UloV4bYcVV8XTbhISC9J/rKPd2qlcmkaM2d
SsaC4+3F4Vbcw26CDEYi7mUl9SGW9BnBVqUmiEjZhbIAmuJssuwaVQQpn0nkUcxb
GE+k8b5+5W5J+EdMZISrZtChQz/uS7Ori+XSkxYuL7msRhlmUAWibZUl9LY66OxY
LEXNNteTYhC0n6PSBpIcsPNkFYGW5SLVsv21gyxc/Dg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32

Nextcloud 33

MovieDB 1.4.1
Release Details
UpdatedSept. 13, 2026, 2:22 p.m.
Changelog

Fixed

  • Translation placeholders now render correctly in paginated movie lists.

Tests

  • Added regression coverage for translated placeholders and plural arguments.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignaturefW/4adHB/dpgcR8RMr/F6/964k5AHNAz9qD1DjFFnAh/tVFcjQpUrd7ZBR8+Sc1uSe9NE8oogHa/WZ6bGr81mR1tdzUPq2jAzS91oCz6EM5o0eH3zkx21JjMLdZWJGQ2aSlqa14s/EtjgYWtWUS1HOHRfIyCmPvbvJciWQIZPXyD0GUnr5EENxgzvOm2n4duZ510ATiozQ2g3+IvlY/Mnm7rdwzza44Uokre3SSnnwi5aCA/GBjZdq3Eyu7EWtPNqUCyiW3+8l32GF1IqInQC5X00eKrEKfao8A8Zyvt6+3omx92rw4MObORIZnr7VSvu5yd7S8mz5bR72dSbNVFz1omC2DkhZquLvTE1ETLE3sxHuqEAjD0DC7CmqMIUy+mnRcNBSDdkgnuae2TOklbJK14m2tXNovCBL6BtGqIt4kPHBNloxr+zeanzhjwR/8Qz/xPbGudy7P6rGGPrdVk8GzRm+tCbh6TvhtMmYSo+GDsaJN9zQ8Tocsul7Ja960NN1jVJjIQhtyWQtd5Ym+TlPZ5UjmIqEmWrbWyzRdwzXgfAT6J1IE6hXZvujWfxFZV3u0seVej2gowsJDGD69/iWjtC5WVliAAoGTNBcjgBewO11+TeIb4HMa2cQsg9VdDeYMF/Uegawce68Tc39qWFl7YFDnG/iYnT/61T8r4QtQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.4.0
Release Details
UpdatedSept. 1, 2026, 6:57 p.m.
Changelog

Added

  • Shared Libraries: create named libraries and share your movie/TV collection with other Nextcloud users — assign viewer or editor roles, manage members, and switch between libraries from a single account. Everything about a title (catalog, watchlist, episode progress, ratings, platform, review) is shared across all library members; user_id on catalog rows becomes legacy attribution only — library membership is the sole access gate
  • New DB tables moviedb_libraries and moviedb_library_members; all catalog tables gain a library_id NOT NULL column (Migrations V5 → V7)
  • V5 backfills every user's existing data into an auto-created personal library; V6 enforces the NOT NULL constraint; V7 heals any duplicate-membership edge cases left by a check-then-insert race in V5
  • Self-leave: members added to a shared library can leave it without needing the owner to remove them (Leave button + confirmation dialog in the Libraries view)
  • GET /api/libraries/sharees?search=... — user-search endpoint backed by OCP\Collaboration\Collaborators\ISearch, respecting Nextcloud's shareapi_restrict_user_enumeration and group-restriction admin settings
  • Viewer notice banners on Add Movie, Add TV Show, and Add to Watchlist pages when the active library is view-only

Changed

  • All catalog endpoints (/api/movies, /api/series, /api/watchlist, watches, stats) now accept an optional libraryId query/body param and scope reads/writes to that library; omitting it falls back to the user's personal library
  • LibraryService.resolveLibraryId (writes) throws on a denied explicit ID instead of silently falling back to personal, preventing cross-library write confusion
  • Member management restricted to owner only (editors can no longer add/remove members); viewers see the members list read-only
  • Library delete cascade wrapped in a DB transaction (episodes → watches → watchlist → series → movies → members → library)
  • Rename preserves the caller's owner role in the response (annotate() helper centralises role annotation for all library-returning endpoints)
  • GET /api/libraries/sharees requires at least 1 character to prevent zero-query full user enumeration
  • Dashboard "Recently Watched" now interleaves movies and TV shows sorted by watch date instead of showing movies-only followed by TV-only

Fixed

  • Library rename bug: editing the name field immediately after saving no longer reverts to the pre-save name due to a stale local binding

Tests

  • 121 PHP tests, 136 JS tests, 0 lint errors
  • New: LibraryServiceTest (21 PHP tests covering create, rename, member CRUD, self-leave, canAccess/canEdit, annotate)
  • New: libraries.spec.js (28 JS tests covering store state, getters, fetch, create/rename/remove, leaveLibrary, member actions)
  • All pre-existing tests updated for v1.4 API signatures (libraryId param added to MovieService, WatchlistService, SeriesService, MovieWatchService, StatsService)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignatureW/fG+iP7aiQ4JEqCs4ZaUYIW5HEfc+0t5YrUipKM8MEUvnJZh0N48oTjVhHI17TU
BcpmMBoE9/0TsaLEsK/F2sPUij5qhbEbnHIebiDI579YJxlSfNqj4ITcVFfMYiHh
6q2uSLsxyb7fQgL66RHbzaqq3PFRfRhdc5OmoJtB3Hq+xpvBDrkz516zKjD8hy01
CrI2kLhzYvqf4V8uqBCvfEh+SP0vlCuIGyzjYpqwIAw3YX6Y/2/3Ll7WCoAGAOEA
h6jCiGRhPFXP4tgD+Hj2hqGyRA9LjgkZWLbEGDSw/TclEee43pCAcT/b3p/Pv2wH
PokcYxn+cAAeOxqWG/v/JOk0SoDItx4gH1z4dKAVbnXz3emvAO6GjX/O5M80NZAv
ZWTzNjDHi0ErKAMb+WRRR3/aEvFt1UqIUsNGq4lFYPUX/lYePMEF/bY/aw3joHse
XgwhP4y2qVERPW48FX7GphVFgy7FdAmYXuCz6TapWJGx24bQyn6R7laNNAubGazE
0kvBi8day7u5iGib80rm0IBoCP6c9FEXFJKa1jlrCqfWdb3z7z0zn5Os2bx/sQ6X
rj0e+c/c75NtU48RBx61oCDGZM2RW9VoMfnf8IYVEpn391aNLFKxedFG6sdJvto2
tx+j5B8B7BH2wSLBeGPV9BnIw6ZCeMgB5r2mxq9YIBM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.3.1
Release Details
UpdatedAug. 29, 2026, 7:33 a.m.
Changelog

Fixed

  • PlatformService::findAllForUser now checks hasDefaults() before calling createDefaults(), avoiding an unnecessary DB write on every PHP process start
  • SeriesServiceTest: test mocks corrected from non-existent findByTmdbId to findByTmdbIdAndSeries; static $defaultsSeeded flag reset between test cases so platform-seeding tests run in isolation

Changed

  • App Store description updated to reflect TV show tracking and rewatch support added in 1.2.0 and 1.3.0
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignatureMBqLzKCQipMCqtf0gq6QFUqrK631nyx3olhG568t71yV/TOlV8kNQkntE1dQqNay
t6HB0DDREGQqfvGa8cg5MBmfg1aq3+8i/DWxVOAmavSD5vU9of2XnwjZivDfvJNu
/yOvUz6DnmK/GMCQ/FufzVZKanTCLPQ6d365qdnyHSpJcjXVp4hir8d7YbwGxqWo
DNSq6+g13CvCxMLo+tCaQK6AO3YZYKscYlSoo7YTO5vOfMErupZdv8TRHz0zj8YN
+kndD8NarfyOIEid0k8KTcA7rXdAIN13V8CjtQnwbjV4uk831MEfA6weKQkdaxt3
mnUBWi4lvCLcd2pqDlriHe0c/jqFLll2GQJNoXchfGH7nYwE5Lfn3+5lq6gha7Ke
KU6rsN8DlhEdKXl80ZIWfHwOGgewUhrVx5spgvaQ90Sjsq4J+ilX1osXQW+4YMyH
w6uKZfDFbR9t/NI55iBjDuAQNGkE6pIIVDcwOu48y5KSqC0bKiO65jwrA2dr5WSn
7Z8IsFbWR6rszgI47bbuhbV8Vfk+BteeC91LfyBvWljDuxgFNeOXQBhTeedsyx6B
y45vDccx0I5KaHm6lTlZ8eMeEGmADQ3qVaB1Vv/zmgt2cGJljO1EpbIBBJQsqn2S
eRw1V0S8qgctZTtCIdXc9jyIusM/cK+dHdR/hYKpvCU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.3.0
Release Details
UpdatedAug. 29, 2026, 6:50 a.m.
Changelog

Added

  • Episode-level TV show support (#15): track series, seasons, and individual episodes. Series get their own /tv section, list view, and detail page separate from movies
  • New moviedb_series and moviedb_episodes tables; series metadata and every episode (including specials) are imported from TMDB on add, one API call per season
  • Derived progress: season and series completion are computed from each episode's watched flag — never stored as a season/series-level percentage. Unaired episodes (air date in the future or unknown) are excluded from the denominator; specials (season 0) are stored and shown but excluded from progress
  • "Up next" card surfaces the first aired, unwatched episode
  • Mark whole season / whole series watched fan-out — idempotent, so re-clicking never re-flips; only aired, non-special episodes are affected
  • Series-owned watch metadata: a TV show carries its own rating, platform, language watched, and watch date — set on the Add TV Show and Edit TV Show forms, exactly like a movie — stored as a single series-level row in moviedb_movie_watches (nullable series_id/episode_id). Individual episodes are a plain watched/unwatched checkbox with no per-episode metadata
  • TMDB Movies/TV toggle in the search UI; localized TV genre list
  • Watchlist now supports TV shows as well as movies: a unified watchlist with a Movies/TV type toggle when adding, a Movie/TV badge on each entry, and an All/Movies/TV Shows type filter. Marking a show as watched imports the whole series (all seasons/episodes) and routes to its /tv detail page; marking a movie behaves as before
  • Dashboard tiles for TV shows watched and episodes watched; total runtime now includes episode runtime
  • Translations for all new strings (de, es, fr, it, nl)

Changed

  • Migration Version000003Date20260828 adds the series/episode tables (including a watched boolean on moviedb_episodes), relaxes moviedb_movie_watches.movie_id to nullable, and adds a media_type column to moviedb_watchlist (default movie; existing rows backfill to movie) — all add-only or NOT-NULL relaxation, safe for the SQLite fresh-install batch; no columns dropped
  • media_type is now populated on movies (default movie) for forward-compatibility
  • Year and platform charts remain movies-only in this release
  • Dashboard Avg Rating and Top Rated now include TV shows alongside movies — a show's rating lives on its single series-level watch row, so it counts toward the average and can appear in the Top Rated row. Movie and series cards now carry a small Movie/TV type badge

Fixed

  • Default streaming platforms are now seeded lazily on first read (PlatformService::findAllForUser) instead of relying solely on the migration's postSchemaChange hook, which Nextcloud does not reliably fire during occ app:enable. Fresh installs no longer show an empty platform picker; the seed is idempotent so it never duplicates existing defaults
  • Recently watched TV shows now appear on the dashboard alongside movies (the recent stats endpoint returns series with at least one watched episode, most-recently-watched first)
  • Episode watched state is stored as a boolean watched column on moviedb_episodes (toggled by the per-episode checkbox and the season/series "mark all watched" actions), and total runtime counts each watched episode's runtime. This replaces the earlier per-episode "log watch" dialog: episodes no longer carry their own date/platform/language/rating — that metadata belongs to the show as a whole (see Added)
  • Series import no longer fails when a show has a specials season: moviedb_episodes.season_number/episode_number now carry a DB default of 0 so episodes in season 0 (which match the entity's default and are thus omitted from the QBMapper INSERT) persist instead of hitting a NOT NULL constraint. Affected both direct series add and "mark watched" on a series watchlist item
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
Signatureo53wujykdigXdIMMC7OwGc4U1s5G5LWDUGFrsnyTbMe4zh9zLM/pb4KwuGJNbSWZ
lNAnrJg86s3Uj+tNdHMnEVzYkeAAqZ92TSdVN6UCbL+LMU+LbdJJOijXhEQho0xF
NF0x1U2+AzuW6fVDOC7eYmtIuCBAB/4xiGra/bqGVPGTpttmdYpkg6TEmF4NkhKs
TH0sNeoqbOKH0bvWU6q4d27Icqc8klNA+Eo61AGq4OOg4zY5I2CTdZHrGQW1uarV
esawGTxZpEf0B0+eg3dvMOXRq4f7ULLDGxvgbSZ8ulevAem0zHuO0ldeov1YJScb
5ko5nINoVV/AKJLqSgqkMX2XSduc12llo4uYD2aiSS4GqoIX60JwO2fFR59YfphM
1i4E5hVxGYWfXEOX9h38sOt2ea9yUS8/CUYLaXppP5Xr7gC1/gShFennJ4HEms8+
LAJXGgYaUwVR1OZzQ1IoydswGSeeHV++5Qs2cjD0no/Hy5FG1EFUPBJUuKmcwQSG
Q8YmI8/gxs+5M1O4vxCXWl4NaOnWbEkDoKKotQA5aOJVZfk0zIFUSjb0ZW87Q5NU
tBDZNi6ccg2DWNOxWdYgvpBwGDoLySpS5Z3csCKLkEmET6YGocEVTk3QdDW/XsYV
AXyD3J/SF1omJfWKZMJhLGxmdkDEdWg0/XSlbKgaUS4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.2.0
Release Details
UpdatedAug. 25, 2026, 6:53 p.m.
Changelog

Added

  • Rewatch support: new moviedb_movie_watches table stores one row per viewing (date, rating, review, platform, language). Each movie can now have a full watch history (#19)
  • Log again button on the movie detail page with a star-rating selector for quick rewatch logging
  • Watch history section on movie detail listing all watches with per-entry delete (hidden when only one entry exists)
  • Watchlist "mark as watched" on an already-watched movie now appends a new watch entry instead of creating a duplicate movie record

Changed

  • Migration Version000002Date20260824 backfills all existing per-movie watch data into the new watches table with a verify-before-drop guard; legacy columns are retained in 1.2.0 for safe downgrade and will be dropped in a future release
  • Star-rating selector replaces free-text number input in the log-watch dialog
  • Removed redundant date/language summary box from the movie detail header

Fixed

  • Edit form: rating/review/date changes now persist correctly even for movies without a prior watch row (previously silently dropped)

Tests

  • 73 JS tests, 69 PHP tests, 0 lint errors
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignaturezhR5gYHFnW4DQvbjaabhFfJoVCbw2xCpGDCzNmSHHNauQYQqsDweLrZpfHvADAHPuAvzv4OPDCXxngxRRvDTviwUnx+jmuvNpzSDazRNbQ18yZdGqrKF/T/ccCTMjpxtDqTnOJJIcPpAAASc4WWG6Vu44w3L2bzH7/4yC2AkXuAFoC9P+yAXnDNUvgpfHHGRj7CeYjBlqOZNwvOTfYacvw+kyJ0ozzWteH0sy5Y1+I4BNL0wtK3T7V7RD1BzALT889qCGyUtIph8D7XT57+uiVAntBZQQpTqoN3yGNu9fTPVzyC5b8frY45XOGX6pSQ/q0uQ7++BU4sKp8DuKiEZ9mwbHNp2Y4CnoY3rSE+IWi6CZpRAi+UY6UeL9dwcJ98Ts/1SHh9HYn/URPi02mAI1xmXkTfkQyfU+lLvASs5LfYrx69Cdi9O43tbYijo3SrtTANvy2TgicMj9maiMPP4eCtJ2fyN5T2vvYxJv3GYvKOmc4ZhBOG4OPhlOZtb1HnGbXFF+Vm/9oPpNax5KrbX3Ne7kSZs791ibk0hiXNPfHehdDZxBnXVTVhXvBknF8VyAQ09lXKlQ3GT9R9PKcZDVKXN4m/do4Lcs7XgeSQOEzmXS8LUY7ihwjHv7AIWK1e6To3MKLd5mT0RpJSbnTv6OFwhgv1psHfjOkkVQzVRkGs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
MovieDB 1.1.2
Release Details
UpdatedAug. 24, 2026, 6:27 p.m.
Changelog

Fixed

  • Prevent adding the same movie twice: POST /api/movies now returns 409 Conflict with the existing movie's id when a duplicate tmdbId is submitted, matching the existing watchlist behavior (#17)
  • Watchlist store now shows a specific "already in your watchlist" message on 409 instead of the generic "failed to add" toast

Added

  • Friendly duplicate-movie dialog in the Add Movie view offering "View existing entry" (routes to the existing movie's detail page) or "Cancel", instead of a plain error toast
  • New i18n strings for the duplicate-movie dialog in all 5 locales (de, es, fr, it, nl)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
Signature3svKAWeA1wnMKWjv6gguqWhW0hzWaovMs/B5VSy/vgo3j6zWKdUSnhPh18kL1STC4zCJ32lrpiMZzzeqMLUzDbVobV/8vY+fNpy02JV8doFOd+3UCf2kpxjY6Mt6AnfgSpoS7RDgykSZYmnX0qcVvH3GMJEfoZ1qCwSPZ5o2OPVQqv58e1jTYo+NVyOV6lkGZSoBt/qFxbupa4SZpSHp8Nx3h/fSeQdmRKewWjzHTJXhKXgpbMWUu0iCYx9wF/+uJO60OAGD4NFtVIPQmS7TEJ2CdYtQl+2DGquEPAx41RlxCWsjskwKpq5/BSq/uogwbM6Gz9pp3+G8viW6PDWC+nLlGdReXETOdVLCCMIGSGPfW5adYl2ZZb+gUcwb7ndKZ5Mm7vuoRh/HA5KNwxbSPwEXKCBY8WgkzcRRA/Ijc014G9run2px7yLA7E/j1Ym8ENkvOh3Kpk5V79lPjOya5ul4KcJw3idLmGSUFUDS2e4htJCmOyE3u3p+8t78ZU+PVvXOhxL43Aet9Bg3I+jW+WDqtdiRDv/9O4eiGCi1DiJBclroeKIYamOHcco5a3ZTEeqEe9LTS/iF1078BI7JTDhT/iAh1P+Fxpiarvr3gEh/tR6ae0OrwTH1/VWKQike1fkEzubcd81ArfoudJrylOxv+O/2W27j28DGpAI3DB4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
MovieDB 1.1.1
Release Details
UpdatedJuly 31, 2026, 10:10 a.m.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignatureoBoTuKwkslFX+XV2GPd7IYGCm/NvKhzIAawUt8qG9Gy4GCmIDGmPAtoiQa3ze9+2
MttRv3DMyuODHW1/Idr386cNa+L3witDP8hyiNv6uWLlJzQeh3Qo/etyKfhtdHGf
R4YAq/sIIQF02s9jtlsKaQ5dDLd+EpbP/1JD2/uWPu0vbQerL2HJTLIrPGn78kI4
nyK2nSUJCH0MtV4Elq4dG87Sg2jZCQvqkxZgle208FN9jx19EogjZSy1Dfyq49CI
NzdoKYX6+/EGcF1Vizl0ibtR+A+k+8E9c40qnUrs+XfbLNe+G+VBZ/Eo0AvEO79I
hiJWWaqorAwIUkt27vjik4Re6gsSjP0qo2b9btnsYn2Dj5s+dfza93QmygS6ExKL
ScGvTxSr/tANM6gAWIZqmzSu0plvp6uSA+1dRplhPkLGMk4KcJS0y1YvGdXEpbK+
caBHHdfkG6EAv9Y65+frFxCPxQdh9UloV4bYcVV8XTbhISC9J/rKPd2qlcmkaM2d
SsaC4+3F4Vbcw26CDEYi7mUl9SGW9BnBVqUmiEjZhbIAmuJssuwaVQQpn0nkUcxb
GE+k8b5+5W5J+EdMZISrZtChQz/uS7Ori+XSkxYuL7msRhlmUAWibZUl9LY66OxY
LEXNNteTYhC0n6PSBpIcsPNkFYGW5SLVsv21gyxc/Dg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32

Nextcloud 32

MovieDB 1.4.1
Release Details
UpdatedSept. 13, 2026, 2:22 p.m.
Changelog

Fixed

  • Translation placeholders now render correctly in paginated movie lists.

Tests

  • Added regression coverage for translated placeholders and plural arguments.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignaturefW/4adHB/dpgcR8RMr/F6/964k5AHNAz9qD1DjFFnAh/tVFcjQpUrd7ZBR8+Sc1uSe9NE8oogHa/WZ6bGr81mR1tdzUPq2jAzS91oCz6EM5o0eH3zkx21JjMLdZWJGQ2aSlqa14s/EtjgYWtWUS1HOHRfIyCmPvbvJciWQIZPXyD0GUnr5EENxgzvOm2n4duZ510ATiozQ2g3+IvlY/Mnm7rdwzza44Uokre3SSnnwi5aCA/GBjZdq3Eyu7EWtPNqUCyiW3+8l32GF1IqInQC5X00eKrEKfao8A8Zyvt6+3omx92rw4MObORIZnr7VSvu5yd7S8mz5bR72dSbNVFz1omC2DkhZquLvTE1ETLE3sxHuqEAjD0DC7CmqMIUy+mnRcNBSDdkgnuae2TOklbJK14m2tXNovCBL6BtGqIt4kPHBNloxr+zeanzhjwR/8Qz/xPbGudy7P6rGGPrdVk8GzRm+tCbh6TvhtMmYSo+GDsaJN9zQ8Tocsul7Ja960NN1jVJjIQhtyWQtd5Ym+TlPZ5UjmIqEmWrbWyzRdwzXgfAT6J1IE6hXZvujWfxFZV3u0seVej2gowsJDGD69/iWjtC5WVliAAoGTNBcjgBewO11+TeIb4HMa2cQsg9VdDeYMF/Uegawce68Tc39qWFl7YFDnG/iYnT/61T8r4QtQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.4.0
Release Details
UpdatedSept. 1, 2026, 6:57 p.m.
Changelog

Added

  • Shared Libraries: create named libraries and share your movie/TV collection with other Nextcloud users — assign viewer or editor roles, manage members, and switch between libraries from a single account. Everything about a title (catalog, watchlist, episode progress, ratings, platform, review) is shared across all library members; user_id on catalog rows becomes legacy attribution only — library membership is the sole access gate
  • New DB tables moviedb_libraries and moviedb_library_members; all catalog tables gain a library_id NOT NULL column (Migrations V5 → V7)
  • V5 backfills every user's existing data into an auto-created personal library; V6 enforces the NOT NULL constraint; V7 heals any duplicate-membership edge cases left by a check-then-insert race in V5
  • Self-leave: members added to a shared library can leave it without needing the owner to remove them (Leave button + confirmation dialog in the Libraries view)
  • GET /api/libraries/sharees?search=... — user-search endpoint backed by OCP\Collaboration\Collaborators\ISearch, respecting Nextcloud's shareapi_restrict_user_enumeration and group-restriction admin settings
  • Viewer notice banners on Add Movie, Add TV Show, and Add to Watchlist pages when the active library is view-only

Changed

  • All catalog endpoints (/api/movies, /api/series, /api/watchlist, watches, stats) now accept an optional libraryId query/body param and scope reads/writes to that library; omitting it falls back to the user's personal library
  • LibraryService.resolveLibraryId (writes) throws on a denied explicit ID instead of silently falling back to personal, preventing cross-library write confusion
  • Member management restricted to owner only (editors can no longer add/remove members); viewers see the members list read-only
  • Library delete cascade wrapped in a DB transaction (episodes → watches → watchlist → series → movies → members → library)
  • Rename preserves the caller's owner role in the response (annotate() helper centralises role annotation for all library-returning endpoints)
  • GET /api/libraries/sharees requires at least 1 character to prevent zero-query full user enumeration
  • Dashboard "Recently Watched" now interleaves movies and TV shows sorted by watch date instead of showing movies-only followed by TV-only

Fixed

  • Library rename bug: editing the name field immediately after saving no longer reverts to the pre-save name due to a stale local binding

Tests

  • 121 PHP tests, 136 JS tests, 0 lint errors
  • New: LibraryServiceTest (21 PHP tests covering create, rename, member CRUD, self-leave, canAccess/canEdit, annotate)
  • New: libraries.spec.js (28 JS tests covering store state, getters, fetch, create/rename/remove, leaveLibrary, member actions)
  • All pre-existing tests updated for v1.4 API signatures (libraryId param added to MovieService, WatchlistService, SeriesService, MovieWatchService, StatsService)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignatureW/fG+iP7aiQ4JEqCs4ZaUYIW5HEfc+0t5YrUipKM8MEUvnJZh0N48oTjVhHI17TU
BcpmMBoE9/0TsaLEsK/F2sPUij5qhbEbnHIebiDI579YJxlSfNqj4ITcVFfMYiHh
6q2uSLsxyb7fQgL66RHbzaqq3PFRfRhdc5OmoJtB3Hq+xpvBDrkz516zKjD8hy01
CrI2kLhzYvqf4V8uqBCvfEh+SP0vlCuIGyzjYpqwIAw3YX6Y/2/3Ll7WCoAGAOEA
h6jCiGRhPFXP4tgD+Hj2hqGyRA9LjgkZWLbEGDSw/TclEee43pCAcT/b3p/Pv2wH
PokcYxn+cAAeOxqWG/v/JOk0SoDItx4gH1z4dKAVbnXz3emvAO6GjX/O5M80NZAv
ZWTzNjDHi0ErKAMb+WRRR3/aEvFt1UqIUsNGq4lFYPUX/lYePMEF/bY/aw3joHse
XgwhP4y2qVERPW48FX7GphVFgy7FdAmYXuCz6TapWJGx24bQyn6R7laNNAubGazE
0kvBi8day7u5iGib80rm0IBoCP6c9FEXFJKa1jlrCqfWdb3z7z0zn5Os2bx/sQ6X
rj0e+c/c75NtU48RBx61oCDGZM2RW9VoMfnf8IYVEpn391aNLFKxedFG6sdJvto2
tx+j5B8B7BH2wSLBeGPV9BnIw6ZCeMgB5r2mxq9YIBM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.3.1
Release Details
UpdatedAug. 29, 2026, 7:33 a.m.
Changelog

Fixed

  • PlatformService::findAllForUser now checks hasDefaults() before calling createDefaults(), avoiding an unnecessary DB write on every PHP process start
  • SeriesServiceTest: test mocks corrected from non-existent findByTmdbId to findByTmdbIdAndSeries; static $defaultsSeeded flag reset between test cases so platform-seeding tests run in isolation

Changed

  • App Store description updated to reflect TV show tracking and rewatch support added in 1.2.0 and 1.3.0
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignatureMBqLzKCQipMCqtf0gq6QFUqrK631nyx3olhG568t71yV/TOlV8kNQkntE1dQqNay
t6HB0DDREGQqfvGa8cg5MBmfg1aq3+8i/DWxVOAmavSD5vU9of2XnwjZivDfvJNu
/yOvUz6DnmK/GMCQ/FufzVZKanTCLPQ6d365qdnyHSpJcjXVp4hir8d7YbwGxqWo
DNSq6+g13CvCxMLo+tCaQK6AO3YZYKscYlSoo7YTO5vOfMErupZdv8TRHz0zj8YN
+kndD8NarfyOIEid0k8KTcA7rXdAIN13V8CjtQnwbjV4uk831MEfA6weKQkdaxt3
mnUBWi4lvCLcd2pqDlriHe0c/jqFLll2GQJNoXchfGH7nYwE5Lfn3+5lq6gha7Ke
KU6rsN8DlhEdKXl80ZIWfHwOGgewUhrVx5spgvaQ90Sjsq4J+ilX1osXQW+4YMyH
w6uKZfDFbR9t/NI55iBjDuAQNGkE6pIIVDcwOu48y5KSqC0bKiO65jwrA2dr5WSn
7Z8IsFbWR6rszgI47bbuhbV8Vfk+BteeC91LfyBvWljDuxgFNeOXQBhTeedsyx6B
y45vDccx0I5KaHm6lTlZ8eMeEGmADQ3qVaB1Vv/zmgt2cGJljO1EpbIBBJQsqn2S
eRw1V0S8qgctZTtCIdXc9jyIusM/cK+dHdR/hYKpvCU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.3.0
Release Details
UpdatedAug. 29, 2026, 6:50 a.m.
Changelog

Added

  • Episode-level TV show support (#15): track series, seasons, and individual episodes. Series get their own /tv section, list view, and detail page separate from movies
  • New moviedb_series and moviedb_episodes tables; series metadata and every episode (including specials) are imported from TMDB on add, one API call per season
  • Derived progress: season and series completion are computed from each episode's watched flag — never stored as a season/series-level percentage. Unaired episodes (air date in the future or unknown) are excluded from the denominator; specials (season 0) are stored and shown but excluded from progress
  • "Up next" card surfaces the first aired, unwatched episode
  • Mark whole season / whole series watched fan-out — idempotent, so re-clicking never re-flips; only aired, non-special episodes are affected
  • Series-owned watch metadata: a TV show carries its own rating, platform, language watched, and watch date — set on the Add TV Show and Edit TV Show forms, exactly like a movie — stored as a single series-level row in moviedb_movie_watches (nullable series_id/episode_id). Individual episodes are a plain watched/unwatched checkbox with no per-episode metadata
  • TMDB Movies/TV toggle in the search UI; localized TV genre list
  • Watchlist now supports TV shows as well as movies: a unified watchlist with a Movies/TV type toggle when adding, a Movie/TV badge on each entry, and an All/Movies/TV Shows type filter. Marking a show as watched imports the whole series (all seasons/episodes) and routes to its /tv detail page; marking a movie behaves as before
  • Dashboard tiles for TV shows watched and episodes watched; total runtime now includes episode runtime
  • Translations for all new strings (de, es, fr, it, nl)

Changed

  • Migration Version000003Date20260828 adds the series/episode tables (including a watched boolean on moviedb_episodes), relaxes moviedb_movie_watches.movie_id to nullable, and adds a media_type column to moviedb_watchlist (default movie; existing rows backfill to movie) — all add-only or NOT-NULL relaxation, safe for the SQLite fresh-install batch; no columns dropped
  • media_type is now populated on movies (default movie) for forward-compatibility
  • Year and platform charts remain movies-only in this release
  • Dashboard Avg Rating and Top Rated now include TV shows alongside movies — a show's rating lives on its single series-level watch row, so it counts toward the average and can appear in the Top Rated row. Movie and series cards now carry a small Movie/TV type badge

Fixed

  • Default streaming platforms are now seeded lazily on first read (PlatformService::findAllForUser) instead of relying solely on the migration's postSchemaChange hook, which Nextcloud does not reliably fire during occ app:enable. Fresh installs no longer show an empty platform picker; the seed is idempotent so it never duplicates existing defaults
  • Recently watched TV shows now appear on the dashboard alongside movies (the recent stats endpoint returns series with at least one watched episode, most-recently-watched first)
  • Episode watched state is stored as a boolean watched column on moviedb_episodes (toggled by the per-episode checkbox and the season/series "mark all watched" actions), and total runtime counts each watched episode's runtime. This replaces the earlier per-episode "log watch" dialog: episodes no longer carry their own date/platform/language/rating — that metadata belongs to the show as a whole (see Added)
  • Series import no longer fails when a show has a specials season: moviedb_episodes.season_number/episode_number now carry a DB default of 0 so episodes in season 0 (which match the entity's default and are thus omitted from the QBMapper INSERT) persist instead of hitting a NOT NULL constraint. Affected both direct series add and "mark watched" on a series watchlist item
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
Signatureo53wujykdigXdIMMC7OwGc4U1s5G5LWDUGFrsnyTbMe4zh9zLM/pb4KwuGJNbSWZ
lNAnrJg86s3Uj+tNdHMnEVzYkeAAqZ92TSdVN6UCbL+LMU+LbdJJOijXhEQho0xF
NF0x1U2+AzuW6fVDOC7eYmtIuCBAB/4xiGra/bqGVPGTpttmdYpkg6TEmF4NkhKs
TH0sNeoqbOKH0bvWU6q4d27Icqc8klNA+Eo61AGq4OOg4zY5I2CTdZHrGQW1uarV
esawGTxZpEf0B0+eg3dvMOXRq4f7ULLDGxvgbSZ8ulevAem0zHuO0ldeov1YJScb
5ko5nINoVV/AKJLqSgqkMX2XSduc12llo4uYD2aiSS4GqoIX60JwO2fFR59YfphM
1i4E5hVxGYWfXEOX9h38sOt2ea9yUS8/CUYLaXppP5Xr7gC1/gShFennJ4HEms8+
LAJXGgYaUwVR1OZzQ1IoydswGSeeHV++5Qs2cjD0no/Hy5FG1EFUPBJUuKmcwQSG
Q8YmI8/gxs+5M1O4vxCXWl4NaOnWbEkDoKKotQA5aOJVZfk0zIFUSjb0ZW87Q5NU
tBDZNi6ccg2DWNOxWdYgvpBwGDoLySpS5Z3csCKLkEmET6YGocEVTk3QdDW/XsYV
AXyD3J/SF1omJfWKZMJhLGxmdkDEdWg0/XSlbKgaUS4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Minimum Integer bits32
MovieDB 1.2.0
Release Details
UpdatedAug. 25, 2026, 6:53 p.m.
Changelog

Added

  • Rewatch support: new moviedb_movie_watches table stores one row per viewing (date, rating, review, platform, language). Each movie can now have a full watch history (#19)
  • Log again button on the movie detail page with a star-rating selector for quick rewatch logging
  • Watch history section on movie detail listing all watches with per-entry delete (hidden when only one entry exists)
  • Watchlist "mark as watched" on an already-watched movie now appends a new watch entry instead of creating a duplicate movie record

Changed

  • Migration Version000002Date20260824 backfills all existing per-movie watch data into the new watches table with a verify-before-drop guard; legacy columns are retained in 1.2.0 for safe downgrade and will be dropped in a future release
  • Star-rating selector replaces free-text number input in the log-watch dialog
  • Removed redundant date/language summary box from the movie detail header

Fixed

  • Edit form: rating/review/date changes now persist correctly even for movies without a prior watch row (previously silently dropped)

Tests

  • 73 JS tests, 69 PHP tests, 0 lint errors
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignaturezhR5gYHFnW4DQvbjaabhFfJoVCbw2xCpGDCzNmSHHNauQYQqsDweLrZpfHvADAHPuAvzv4OPDCXxngxRRvDTviwUnx+jmuvNpzSDazRNbQ18yZdGqrKF/T/ccCTMjpxtDqTnOJJIcPpAAASc4WWG6Vu44w3L2bzH7/4yC2AkXuAFoC9P+yAXnDNUvgpfHHGRj7CeYjBlqOZNwvOTfYacvw+kyJ0ozzWteH0sy5Y1+I4BNL0wtK3T7V7RD1BzALT889qCGyUtIph8D7XT57+uiVAntBZQQpTqoN3yGNu9fTPVzyC5b8frY45XOGX6pSQ/q0uQ7++BU4sKp8DuKiEZ9mwbHNp2Y4CnoY3rSE+IWi6CZpRAi+UY6UeL9dwcJ98Ts/1SHh9HYn/URPi02mAI1xmXkTfkQyfU+lLvASs5LfYrx69Cdi9O43tbYijo3SrtTANvy2TgicMj9maiMPP4eCtJ2fyN5T2vvYxJv3GYvKOmc4ZhBOG4OPhlOZtb1HnGbXFF+Vm/9oPpNax5KrbX3Ne7kSZs791ibk0hiXNPfHehdDZxBnXVTVhXvBknF8VyAQ09lXKlQ3GT9R9PKcZDVKXN4m/do4Lcs7XgeSQOEzmXS8LUY7ihwjHv7AIWK1e6To3MKLd5mT0RpJSbnTv6OFwhgv1psHfjOkkVQzVRkGs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
MovieDB 1.1.2
Release Details
UpdatedAug. 24, 2026, 6:27 p.m.
Changelog

Fixed

  • Prevent adding the same movie twice: POST /api/movies now returns 409 Conflict with the existing movie's id when a duplicate tmdbId is submitted, matching the existing watchlist behavior (#17)
  • Watchlist store now shows a specific "already in your watchlist" message on 409 instead of the generic "failed to add" toast

Added

  • Friendly duplicate-movie dialog in the Add Movie view offering "View existing entry" (routes to the existing movie's detail page) or "Cancel", instead of a plain error toast
  • New i18n strings for the duplicate-movie dialog in all 5 locales (de, es, fr, it, nl)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
Signature3svKAWeA1wnMKWjv6gguqWhW0hzWaovMs/B5VSy/vgo3j6zWKdUSnhPh18kL1STC4zCJ32lrpiMZzzeqMLUzDbVobV/8vY+fNpy02JV8doFOd+3UCf2kpxjY6Mt6AnfgSpoS7RDgykSZYmnX0qcVvH3GMJEfoZ1qCwSPZ5o2OPVQqv58e1jTYo+NVyOV6lkGZSoBt/qFxbupa4SZpSHp8Nx3h/fSeQdmRKewWjzHTJXhKXgpbMWUu0iCYx9wF/+uJO60OAGD4NFtVIPQmS7TEJ2CdYtQl+2DGquEPAx41RlxCWsjskwKpq5/BSq/uogwbM6Gz9pp3+G8viW6PDWC+nLlGdReXETOdVLCCMIGSGPfW5adYl2ZZb+gUcwb7ndKZ5Mm7vuoRh/HA5KNwxbSPwEXKCBY8WgkzcRRA/Ijc014G9run2px7yLA7E/j1Ym8ENkvOh3Kpk5V79lPjOya5ul4KcJw3idLmGSUFUDS2e4htJCmOyE3u3p+8t78ZU+PVvXOhxL43Aet9Bg3I+jW+WDqtdiRDv/9O4eiGCi1DiJBclroeKIYamOHcco5a3ZTEeqEe9LTS/iF1078BI7JTDhT/iAh1P+Fxpiarvr3gEh/tR6ae0OrwTH1/VWKQike1fkEzubcd81ArfoudJrylOxv+O/2W27j28DGpAI3DB4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
MovieDB 1.1.1
Release Details
UpdatedJuly 31, 2026, 10:10 a.m.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhMUMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzE3MTMyMTI5WhcNMzYwNjIyMTMyMTI5WjASMRAwDgYD
VQQDDAdtb3ZpZWRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6t01
0BBouRw8rCA2eTQU1HdZfNE4scCAg9UwsujvnjDJwMslqUV+Lue3+g8/pZOubxNA
GDDiaKku3iYbRSnVzQsmsSUa6oUZ7d49+RTJpWl0IkpJEz8i+J+aPkNj3eB7lXR8
db1Ke/b59ATZIUAhkq8skx4kMUqjfHnH6e3IkWxbvYbmqFGV+cnReiwODgPSA0Sf
Y+L3S2XnPg/O8xtPmvEpA6gvhYZnYsytlrqh/vkt1TaeSLrroOeXKtG6hEtffVXT
UNklss/84vbjOKwkQtQA4LpaT827y5MyrCi8nIcT6kcYeaNMlOMM/587WYg3HU75
suTKz7DGoOeIWrHuaz1ic8f0O5qZGNCNOku2vz4/GU0ZzQsefIXnrix+4jcj8EX3
3hRb3xsIV/bpP2yPobMGu2MRYHccMNqfnT11O6LNvSXzjOITh39WJdf43pb/mddj
8an3cS+wNmcYU09RzB6dGyk++fVwnZvZ7rFCaRiIRYNOZ69J1BtcAxhb6UenuK7b
bFcknbRQEZOxr0qy4IdRBPr2h27COv2vROEDbSMZF9YtO8KL1k/JleCyJgj7uFoY
jo+mgfyJsr/ytco0TZrEskgoZvUffRnzedqbbTyzTDLiX7CYMKT6Ks9aCDgHUb8k
iSe6+Uqr1rLqJlPg5cgiPY1+sd7WeQNom47qUhkCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEANsVS7rTvACg3I3Ncfo9d9VMGHnRsgXlEmGYg+KiAQ2OMoVxmpG/0rftp
wNDZV5Gyq8d6E5BO6YgmR+nCWnY7qwXt9t2r2wV0MZ3hVc1s6Hhrk/ZcXuCM3QE0
SGYSi4Th/IyNXN2JvY668aVigglsoD2Mq+cp/XZdMG/6UOyDZKdo/GEQYTv9+eHi
j/Ol1ayXhIK9JruEy2Y6NyB5qs3Y5CRzKne343UiSd8rPWX1GrRuBQ59diRTCL/v
F40EqVxaT7j/BFHmLr86J2+ycXNOPyd9tqzjn3ZSoSK/46zAethu31e2B95BcHCe
d9kofYWAJaLP98he/XqKJvQMGa4g9A==
-----END CERTIFICATE-----
SignatureoBoTuKwkslFX+XV2GPd7IYGCm/NvKhzIAawUt8qG9Gy4GCmIDGmPAtoiQa3ze9+2
MttRv3DMyuODHW1/Idr386cNa+L3witDP8hyiNv6uWLlJzQeh3Qo/etyKfhtdHGf
R4YAq/sIIQF02s9jtlsKaQ5dDLd+EpbP/1JD2/uWPu0vbQerL2HJTLIrPGn78kI4
nyK2nSUJCH0MtV4Elq4dG87Sg2jZCQvqkxZgle208FN9jx19EogjZSy1Dfyq49CI
NzdoKYX6+/EGcF1Vizl0ibtR+A+k+8E9c40qnUrs+XfbLNe+G+VBZ/Eo0AvEO79I
hiJWWaqorAwIUkt27vjik4Re6gsSjP0qo2b9btnsYn2Dj5s+dfza93QmygS6ExKL
ScGvTxSr/tANM6gAWIZqmzSu0plvp6uSA+1dRplhPkLGMk4KcJS0y1YvGdXEpbK+
caBHHdfkG6EAv9Y65+frFxCPxQdh9UloV4bYcVV8XTbhISC9J/rKPd2qlcmkaM2d
SsaC4+3F4Vbcw26CDEYi7mUl9SGW9BnBVqUmiEjZhbIAmuJssuwaVQQpn0nkUcxb
GE+k8b5+5W5J+EdMZISrZtChQz/uS7Ori+XSkxYuL7msRhlmUAWibZUl9LY66OxY
LEXNNteTYhC0n6PSBpIcsPNkFYGW5SLVsv21gyxc/Dg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32