jellyfin-kodi/jellyfin_kodi/objects/kodi/movies.py
Jeroen De Meerleer 8428c623f0
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.
2025-06-02 13:05:14 +02:00

185 lines
5.4 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import division, absolute_import, print_function, unicode_literals
##################################################################################################
from ...helper import LazyLogger
from .kodi import Kodi
from . import queries as QU
##################################################################################################
LOG = LazyLogger(__name__)
##################################################################################################
class Movies(Kodi):
def __init__(self, cursor):
self.cursor = cursor
Kodi.__init__(self)
def create_entry_unique_id(self):
self.cursor.execute(QU.create_unique_id)
return self.cursor.fetchone()[0] + 1
def create_entry_rating(self):
self.cursor.execute(QU.create_rating)
return self.cursor.fetchone()[0] + 1
def create_entry(self):
self.cursor.execute(QU.create_movie)
return self.cursor.fetchone()[0] + 1
def get(self, *args):
try:
self.cursor.execute(QU.get_movie, args)
return self.cursor.fetchone()[0]
except TypeError:
return
def add(self, *args):
self.cursor.execute(QU.add_movie, args)
def add_videoversion(self, *args):
self.cursor.execute(QU.check_video_version)
if self.cursor.fetchone()[0] == 1:
self.cursor.execute(QU.add_video_version, args)
def update(self, *args):
self.cursor.execute(QU.update_movie, args)
def delete(self, kodi_id, file_id):
self.cursor.execute(QU.delete_movie, (kodi_id,))
self.cursor.execute(QU.delete_file, (file_id,))
self.cursor.execute(QU.check_video_version)
if self.cursor.fetchone()[0] == 1:
self.cursor.execute(QU.delete_video_version, (file_id,))
def get_rating_id(self, *args):
try:
self.cursor.execute(QU.get_rating, args)
return self.cursor.fetchone()[0]
except TypeError:
return None
def add_ratings(self, *args):
"""Add ratings, rating type and votes."""
self.cursor.execute(QU.add_rating, args)
def update_ratings(self, *args):
"""Update rating by rating_id."""
self.cursor.execute(QU.update_rating, args)
def get_unique_id(self, *args):
try:
self.cursor.execute(QU.get_unique_id, args)
return self.cursor.fetchone()[0]
except TypeError:
return
def add_unique_id(self, *args):
"""Add the provider id, imdb, tvdb."""
self.cursor.execute(QU.add_unique_id, args)
def update_unique_id(self, *args):
"""Update the provider id, imdb, tvdb."""
self.cursor.execute(QU.update_unique_id, args)
def add_countries(self, countries, *args):
for country in countries:
self.cursor.execute(QU.update_country, (self.get_country(country),) + args)
def add_country(self, *args):
self.cursor.execute(QU.add_country, args)
return self.cursor.lastrowid
def get_country(self, *args):
try:
self.cursor.execute(QU.get_country, args)
return self.cursor.fetchone()[0]
except TypeError:
return self.add_country(*args)
def add_boxset(self, *args):
self.cursor.execute(QU.add_set, args)
return self.cursor.lastrowid
def update_boxset(self, *args):
self.cursor.execute(QU.update_set, args)
def set_boxset(self, *args):
self.cursor.execute(QU.update_movie_set, args)
def remove_from_boxset(self, *args):
self.cursor.execute(QU.delete_movie_set, args)
def delete_boxset(self, *args):
self.cursor.execute(QU.delete_set, args)
def migrations(self):
"""
Used to trigger required database migrations for new versions
"""
self.cursor.execute(QU.get_version)
version_id = self.cursor.fetchone()[0]
changes = False
# 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:
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
"""
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")
return changes