From b76ff63b483645ce9e88009ffd41b2684c76373a Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Mon, 21 Apr 2025 14:26:50 +0200 Subject: [PATCH 01/10] Update movies.py Since kodi piers standard version is changed to 1. Sourced from the MyVideosDatabase and https://github.com/xbmc/xbmc/blob/c0be4a8e34263cb939e453dbb4ce3430b46a458c/xbmc/video/VideoManagerTypes.h#L21 --- jellyfin_kodi/objects/kodi/movies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jellyfin_kodi/objects/kodi/movies.py b/jellyfin_kodi/objects/kodi/movies.py index 14fba843..5fe29293 100644 --- a/jellyfin_kodi/objects/kodi/movies.py +++ b/jellyfin_kodi/objects/kodi/movies.py @@ -158,7 +158,7 @@ class Movies(Kodi): # Sets all existing movies without a version to standard version for entry in self.cursor.fetchall(): - self.add_videoversion(entry[0], entry[1], "movie", "0", 40400) + self.add_videoversion(entry[0], entry[1], "movie", "1", 40400) changes = True LOG.info("Omega database migration is complete") From 5c944816637806320dddde8cf9816b564093ed93 Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Mon, 21 Apr 2025 14:53:02 +0200 Subject: [PATCH 02/10] Update queries.py --- jellyfin_kodi/objects/kodi/queries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jellyfin_kodi/objects/kodi/queries.py b/jellyfin_kodi/objects/kodi/queries.py index d02ef832..738b8c7f 100644 --- a/jellyfin_kodi/objects/kodi/queries.py +++ b/jellyfin_kodi/objects/kodi/queries.py @@ -414,7 +414,7 @@ VALUES (?, ?, ?, ?, ?) check_video_version = """ SELECT COUNT(name) FROM sqlite_master WHERE type='table' AND name='videoversion' """ -add_video_version_obj = ["{FileId}", "{MovieId}", "movie", "0", 40400] +add_video_version_obj = ["{FileId}", "{MovieId}", "movie", "1", 40400] add_musicvideo = """ INSERT INTO musicvideo(idMVideo, idFile, c00, c04, c05, c06, c07, c08, c09, c10, c11, c12, premiered) From 72bfc5dacffc321fc984ef8af94954f53a518dfc Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Tue, 6 May 2025 10:21:40 +0200 Subject: [PATCH 03/10] Adds Piers database migration logic Introduces a new migration step for Kodi versions 134 and above by implementing the piers_migration method. This ensures all existing movies without a version receive a standard version, enhancing database consistency. Omega migration logic is now limited to versions between 131 and 133. No additional context provided. --- jellyfin_kodi/objects/kodi/movies.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/jellyfin_kodi/objects/kodi/movies.py b/jellyfin_kodi/objects/kodi/movies.py index 5fe29293..71cbe324 100644 --- a/jellyfin_kodi/objects/kodi/movies.py +++ b/jellyfin_kodi/objects/kodi/movies.py @@ -142,8 +142,11 @@ class Movies(Kodi): # Will run every time Kodi starts, but will be fast enough on # subsequent runs to not be a meaningful delay - if version_id >= 131: + if 131 <= version_id < 134: changes = self.omega_migration() + + if version_id >= 134: + changes = self.piers_migration() return changes @@ -158,8 +161,25 @@ class Movies(Kodi): # Sets all existing movies without a version to standard version for entry in self.cursor.fetchall(): - self.add_videoversion(entry[0], entry[1], "movie", "1", 40400) + self.add_videoversion(entry[0], entry[1], "movie", "0", 40400) changes = True LOG.info("Omega database migration is complete") return changes + + def piers_migration(self): + """ + Adds a video version for all existing movies + """ + LOG.info("Starting migration for Piers database changes") + # Tracks if this migration made any changes + changes = False + self.cursor.execute(QU.get_missing_versions) + + # Sets all existing movies without a version to standard version + for entry in self.cursor.fetchall(): + self.add_videoversion(entry[0], entry[1], "movie", "1", 40400) + changes = True + + LOG.info("Piers database migration is complete") + return changes From 8428c623f0cbb40008bcc624fe63df32f684612c Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Mon, 2 Jun 2025 12:49:20 +0200 Subject: [PATCH 04/10] Improves video version migration logic for movies Updates migration to fetch version type dynamically from the database rather than using hardcoded values, ensuring accurate mapping during database upgrades. Refines video version insertion query to utilize the correct item type from the version type table. Helps prevent mismatches and enhances database integrity. --- jellyfin_kodi/objects/kodi/movies.py | 4 ++-- jellyfin_kodi/objects/kodi/queries.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jellyfin_kodi/objects/kodi/movies.py b/jellyfin_kodi/objects/kodi/movies.py index 71cbe324..0d72ab5f 100644 --- a/jellyfin_kodi/objects/kodi/movies.py +++ b/jellyfin_kodi/objects/kodi/movies.py @@ -144,7 +144,7 @@ class Movies(Kodi): # subsequent runs to not be a meaningful delay if 131 <= version_id < 134: changes = self.omega_migration() - + if version_id >= 134: changes = self.piers_migration() @@ -178,7 +178,7 @@ class Movies(Kodi): # Sets all existing movies without a version to standard version for entry in self.cursor.fetchall(): - self.add_videoversion(entry[0], entry[1], "movie", "1", 40400) + self.add_videoversion(entry[0], entry[1], "movie", 40400, 40400) changes = True LOG.info("Piers database migration is complete") diff --git a/jellyfin_kodi/objects/kodi/queries.py b/jellyfin_kodi/objects/kodi/queries.py index 738b8c7f..8f194ee8 100644 --- a/jellyfin_kodi/objects/kodi/queries.py +++ b/jellyfin_kodi/objects/kodi/queries.py @@ -409,12 +409,12 @@ VALUES (?, ?) add_set_obj = ["{Title}", "{Overview}"] add_video_version = """ INSERT INTO videoversion(idFile, idMedia, media_type, itemType, idType) -VALUES (?, ?, ?, ?, ?) +VALUES (?, ?, ?, (SELECT itemType FROM videoversiontype WHERE id = ?), ?) """ check_video_version = """ SELECT COUNT(name) FROM sqlite_master WHERE type='table' AND name='videoversion' """ -add_video_version_obj = ["{FileId}", "{MovieId}", "movie", "1", 40400] +add_video_version_obj = ["{FileId}", "{MovieId}", "movie", 40400, 40400] add_musicvideo = """ INSERT INTO musicvideo(idMVideo, idFile, c00, c04, c05, c06, c07, c08, c09, c10, c11, c12, premiered) From b87d1911cbc4a514a23a1e3c67697389229c8b76 Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Fri, 6 Jun 2025 11:30:52 +0200 Subject: [PATCH 05/10] Making sure we're not in the matrix and at least reached the nexus Omega and Piers don't have such xbmc.python version --- release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.yaml b/release.yaml index 4e14bbf7..13e9eb84 100644 --- a/release.yaml +++ b/release.yaml @@ -23,7 +23,7 @@ changelog: |- dependencies: py3: - addon: 'xbmc.python' - version: '3.0.0' + version: '3.0.1' - addon: 'script.module.requests' version: '2.22.0+matrix.1' - addon: 'script.module.dateutil' From 170d5b2b9dfaca898a561d7b5735bbed786b8951 Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Wed, 10 Sep 2025 16:27:32 +0200 Subject: [PATCH 06/10] Downgrades xbmc.python dependency version Changes version of xbmc.python from 3.0.1 to 3.0.0 to ensure compatibility with existing library constraints or dependent features. --- release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.yaml b/release.yaml index 13e9eb84..4e14bbf7 100644 --- a/release.yaml +++ b/release.yaml @@ -23,7 +23,7 @@ changelog: |- dependencies: py3: - addon: 'xbmc.python' - version: '3.0.1' + version: '3.0.0' - addon: 'script.module.requests' version: '2.22.0+matrix.1' - addon: 'script.module.dateutil' From bccb376d21d0576a42d971acbfa73443fd3164b6 Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Wed, 10 Sep 2025 17:01:12 +0200 Subject: [PATCH 07/10] Simplifies movie version migration logic Consolidates migration logic to handle versions >= 131, eliminating redundant checks for version ranges. Clarifies version assignment for Omega and Piers migrations, ensuring database migrations align with Kodi's automatic behaviors. Improves code maintainability and reduces duplication. --- jellyfin_kodi/objects/kodi/movies.py | 31 ++++++++-------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/jellyfin_kodi/objects/kodi/movies.py b/jellyfin_kodi/objects/kodi/movies.py index 0d72ab5f..4044a698 100644 --- a/jellyfin_kodi/objects/kodi/movies.py +++ b/jellyfin_kodi/objects/kodi/movies.py @@ -142,44 +142,31 @@ class Movies(Kodi): # Will run every time Kodi starts, but will be fast enough on # subsequent runs to not be a meaningful delay - if 131 <= version_id < 134: + if version_id >= 131: changes = self.omega_migration() - if version_id >= 134: - changes = self.piers_migration() - return changes def omega_migration(self): """ Adds a video version for all existing movies + + For Omega: video_version_id = 0 + For Piers: video_version_id = 1 + + Migration from Nexus to Omega adds video version with id 0 + Migration from Nexus to Peirs adds video version with id 1 + Migration from Omega to Piers this does nothing and is handled by kodi itself """ LOG.info("Starting migration for Omega database changes") # Tracks if this migration made any changes changes = False self.cursor.execute(QU.get_missing_versions) - # Sets all existing movies without a version to standard version - for entry in self.cursor.fetchall(): - self.add_videoversion(entry[0], entry[1], "movie", "0", 40400) - changes = True - - LOG.info("Omega database migration is complete") - return changes - - def piers_migration(self): - """ - Adds a video version for all existing movies - """ - LOG.info("Starting migration for Piers database changes") - # Tracks if this migration made any changes - changes = False - self.cursor.execute(QU.get_missing_versions) - # Sets all existing movies without a version to standard version for entry in self.cursor.fetchall(): self.add_videoversion(entry[0], entry[1], "movie", 40400, 40400) changes = True - LOG.info("Piers database migration is complete") + LOG.info("Omega database migration is complete") return changes From 2ca9cf212b54075f376aad9f0b2e204298fce5ea Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Wed, 10 Sep 2025 17:01:45 +0200 Subject: [PATCH 08/10] Refactors video version handling for consistency Retrieves video version item type through a query for setting default values, enhancing flexibility and reducing hardcoding. Replaces static item type in video version insertion with dynamic retrieval, improving maintainability. --- jellyfin_kodi/objects/kodi/movies.py | 3 ++- jellyfin_kodi/objects/kodi/queries.py | 8 ++++++-- jellyfin_kodi/objects/movies.py | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/jellyfin_kodi/objects/kodi/movies.py b/jellyfin_kodi/objects/kodi/movies.py index 4044a698..a9c84aa6 100644 --- a/jellyfin_kodi/objects/kodi/movies.py +++ b/jellyfin_kodi/objects/kodi/movies.py @@ -21,6 +21,7 @@ class Movies(Kodi): self.cursor = cursor Kodi.__init__(self) + self.itemtype = self.cursor.execute(QU.get_videoversion_itemtype, [40400]) def create_entry_unique_id(self): self.cursor.execute(QU.create_unique_id) @@ -165,7 +166,7 @@ class Movies(Kodi): # Sets all existing movies without a version to standard version for entry in self.cursor.fetchall(): - self.add_videoversion(entry[0], entry[1], "movie", 40400, 40400) + self.add_videoversion(entry[0], entry[1], "movie", self.itemtype, 40400) changes = True LOG.info("Omega database migration is complete") diff --git a/jellyfin_kodi/objects/kodi/queries.py b/jellyfin_kodi/objects/kodi/queries.py index 8f194ee8..b1b90998 100644 --- a/jellyfin_kodi/objects/kodi/queries.py +++ b/jellyfin_kodi/objects/kodi/queries.py @@ -409,12 +409,16 @@ VALUES (?, ?) add_set_obj = ["{Title}", "{Overview}"] add_video_version = """ INSERT INTO videoversion(idFile, idMedia, media_type, itemType, idType) -VALUES (?, ?, ?, (SELECT itemType FROM videoversiontype WHERE id = ?), ?) +VALUES (?, ?, ?, ?, ?) """ +add_video_version_obj = ["{FileId}", "{MovieId}", "movie", "{VideoVersionItemType}", 40400] +get_videoversion_itemtype = """ +SELECT itemType FROM videoversiontype WHERE id = ? +""" +get_videoversion_itemtype_obj = [ "{VideoVersionId}" ] check_video_version = """ SELECT COUNT(name) FROM sqlite_master WHERE type='table' AND name='videoversion' """ -add_video_version_obj = ["{FileId}", "{MovieId}", "movie", 40400, 40400] add_musicvideo = """ INSERT INTO musicvideo(idMVideo, idFile, c00, c04, c05, c06, c07, c08, c09, c10, c11, c12, premiered) diff --git a/jellyfin_kodi/objects/movies.py b/jellyfin_kodi/objects/movies.py index cc180338..e155af9e 100644 --- a/jellyfin_kodi/objects/movies.py +++ b/jellyfin_kodi/objects/movies.py @@ -156,6 +156,7 @@ class Movies(KodiDb): obj["PathId"] = self.add_path(*values(obj, QU.add_path_obj)) obj["FileId"] = self.add_file(*values(obj, QU.add_file_obj)) + obj["VideoVersionItemType"] = self.itemtype self.add(*values(obj, QU.add_movie_obj)) self.add_videoversion(*values(obj, QU.add_video_version_obj)) From fbfce5c4238a4b8f78d7debe0d928dc2f319d0ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Str=C3=A5b=C3=B8?= Date: Sat, 13 Sep 2025 03:12:58 +0200 Subject: [PATCH 09/10] Fix fetching videoversion itemtype and gracefully handle failure --- jellyfin_kodi/objects/kodi/movies.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/jellyfin_kodi/objects/kodi/movies.py b/jellyfin_kodi/objects/kodi/movies.py index a9c84aa6..da959806 100644 --- a/jellyfin_kodi/objects/kodi/movies.py +++ b/jellyfin_kodi/objects/kodi/movies.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import division, absolute_import, print_function, unicode_literals +from sqlite3 import DatabaseError + ################################################################################################## from ...helper import LazyLogger @@ -17,11 +19,18 @@ LOG = LazyLogger(__name__) class Movies(Kodi): + itemtype: int + def __init__(self, cursor): self.cursor = cursor Kodi.__init__(self) - self.itemtype = self.cursor.execute(QU.get_videoversion_itemtype, [40400]) + try: + self.cursor.execute(QU.get_videoversion_itemtype, [40400]) + self.itemtype = self.cursor.fetchone()[0] + except (IndexError, DatabaseError, TypeError) as e: + LOG.warning("Unable to fetch videoversion itemtype: %s", e) + self.itemtype = 0 def create_entry_unique_id(self): self.cursor.execute(QU.create_unique_id) From 15fb05dad57108a04219635a111b4e934a47d00e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Str=C3=A5b=C3=B8?= Date: Sun, 14 Sep 2025 06:26:22 +0200 Subject: [PATCH 10/10] Run black --- jellyfin_kodi/objects/kodi/queries.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/jellyfin_kodi/objects/kodi/queries.py b/jellyfin_kodi/objects/kodi/queries.py index b1b90998..86b0b8ba 100644 --- a/jellyfin_kodi/objects/kodi/queries.py +++ b/jellyfin_kodi/objects/kodi/queries.py @@ -411,11 +411,17 @@ add_video_version = """ INSERT INTO videoversion(idFile, idMedia, media_type, itemType, idType) VALUES (?, ?, ?, ?, ?) """ -add_video_version_obj = ["{FileId}", "{MovieId}", "movie", "{VideoVersionItemType}", 40400] +add_video_version_obj = [ + "{FileId}", + "{MovieId}", + "movie", + "{VideoVersionItemType}", + 40400, +] get_videoversion_itemtype = """ SELECT itemType FROM videoversiontype WHERE id = ? """ -get_videoversion_itemtype_obj = [ "{VideoVersionId}" ] +get_videoversion_itemtype_obj = ["{VideoVersionId}"] check_video_version = """ SELECT COUNT(name) FROM sqlite_master WHERE type='table' AND name='videoversion' """