From 623c6cab8557ec7c3d17613ac48a814e112e140b Mon Sep 17 00:00:00 2001 From: angelblue05 Date: Wed, 16 Mar 2016 06:13:47 -0500 Subject: [PATCH] Fix artists/music --- resources/lib/embydb_functions.py | 20 +++++ resources/lib/itemtypes.py | 131 +++++++++++++++++++++--------- resources/lib/kodidb_functions.py | 25 ++++-- 3 files changed, 129 insertions(+), 47 deletions(-) diff --git a/resources/lib/embydb_functions.py b/resources/lib/embydb_functions.py index 7a232c87..518498f5 100644 --- a/resources/lib/embydb_functions.py +++ b/resources/lib/embydb_functions.py @@ -143,6 +143,21 @@ class Embydb_Functions(): return item except: return None + def getItem_byWildId(self, embyid): + + embycursor = self.embycursor + + query = ' '.join(( + + "SELECT kodi_id, media_type", + "FROM emby", + "WHERE emby_id LIKE ?" + )) + embycursor.execute(query, (embyid+"%",)) + items = embycursor.fetchall() + + return items + def getItem_byView(self, mediafolderid): embycursor = self.embycursor @@ -302,4 +317,9 @@ class Embydb_Functions(): query = "DELETE FROM emby WHERE emby_id = ?" self.embycursor.execute(query, (embyid,)) + + def removeWildItem(self, embyid): + + query = "DELETE FROM emby WHERE emby_id LIKE ?" + self.embycursor.execute(query, (embyid+"%",)) \ No newline at end of file diff --git a/resources/lib/itemtypes.py b/resources/lib/itemtypes.py index da28bb97..0df89cde 100644 --- a/resources/lib/itemtypes.py +++ b/resources/lib/itemtypes.py @@ -2010,6 +2010,7 @@ class Music(Items): # Process single song kodiversion = self.kodiversion kodicursor = self.kodicursor + emby = self.emby emby_db = self.emby_db kodi_db = self.kodi_db artwork = self.artwork @@ -2124,14 +2125,22 @@ class Music(Items): emby_dbalbum = emby_db.getItem_byId(item['AlbumId']) albumid = emby_dbalbum[0] except KeyError: - # No album Id associated to the song. - self.logMsg("Song itemid: %s has no albumId." % itemid, 1) - return + # Verify if there's an album associated. + self.logMsg("Song itemid: %s has no albumId associated." % itemid, 1) + album_name = item.get('Album') + if album_name: + albumid = kodi_db.addAlbum(album_name, API.getProvider('MusicBrainzAlbum')) + emby_db.addReference("%salbum%s" % (itemid, albumid), albumid, "MusicAlbum_", "album") + else: + # No album Id associated to the song. + self.logMsg("Song itemid: %s has no albumId associated." % itemid, 1) + return False + except TypeError: # No album found. Let's create it self.logMsg("Album database entry missing.", 1) emby_albumId = item['AlbumId'] - album = self.emby.getItem(emby_albumId) + album = emby.getItem(emby_albumId) self.add_updateAlbum(album) emby_dbalbum = emby_db.getItem_byId(emby_albumId) try: @@ -2205,76 +2214,103 @@ class Music(Items): ) kodicursor.execute(query, (songid, albumid, track, title, duration)) - # Verify if album has artists - addArtist = False - query = ' '.join(( + # Link song to artists + for index, artist in enumerate(item['ArtistItems']): - "SELECT strArtists", - "FROM album", - "WHERE idAlbum = ?" - )) - kodicursor.execute(query, (albumid,)) - result = kodicursor.fetchone() - if result and result[0] == "": - addArtist = True - - if item['AlbumArtists']: - album_artists = item['AlbumArtists'] - else: - album_artists = item['ArtistItems'] - - # Link song to artist - artists_name = [] - for artist in album_artists: artist_name = artist['Name'] - artists_name.append(artist_name) - emby_dbartist = emby_db.getItem_byId(artist['Id']) + artist_eid = artist['Id'] + artist_edb = emby_db.getItem_byId(artist_eid) try: - artistid = emby_dbartist[0] - except: pass - else: + artistid = artist_edb[0] + except TypeError: + # Artist is missing from emby database, add it. + artist_full = emby.getItem(artist_eid) + self.add_updateArtist(artist_full) + artist_edb = emby_db.getItem_byId(artist_eid) + artistid = artist_edb[0] + finally: query = ( ''' - INSERT OR REPLACE INTO song_artist(idArtist, idSong, strArtist) + INSERT OR REPLACE INTO song_artist(idArtist, idSong, iOrder, strArtist) + + VALUES (?, ?, ?, ?) + ''' + ) + kodicursor.execute(query, (artistid, songid, index, artist_name)) + + # Verify if album artist exists + album_artists = [] + for artist in item['AlbumArtists']: + + artist_name = artist['Name'] + album_artists.append(artist_name) + artist_eid = artist['Id'] + artist_edb = emby_db.getItem_byId(artist_eid) + try: + artistid = artist_edb[0] + except TypeError: + # Artist is missing from emby database, add it. + artist_full = emby.getItem(artist_eid) + self.add_updateArtist(artist_full) + artist_edb = emby_db.getItem_byId(artist_eid) + artistid = artist_edb[0] + finally: + query = ( + ''' + INSERT OR REPLACE INTO album_artist(idArtist, idAlbum, strArtist) VALUES (?, ?, ?) ''' ) - kodicursor.execute(query, (artistid, songid, artist_name)) - - if addArtist: + kodicursor.execute(query, (artistid, albumid, artist_name)) + # Update discography + if item.get('Album'): query = ( ''' - INSERT OR REPLACE INTO album_artist(idArtist, idAlbum, strArtist) + INSERT OR REPLACE INTO discography(idArtist, strAlbum, strYear) VALUES (?, ?, ?) ''' ) - kodicursor.execute(query, (artistid, albumid, artist_name)) + kodicursor.execute(query, (artistid, item['Album'], 0)) else: - if addArtist: - artists_onalbum = " / ".join(artists_name) + album_artists = " / ".join(album_artists) + query = ' '.join(( + + "SELECT strArtists", + "FROM album", + "WHERE idAlbum = ?" + )) + kodicursor.execute(query, (albumid,)) + result = kodicursor.fetchone() + if result and result[0] != album_artists: + # Field is empty if kodiversion in (16, 17): # Kodi Jarvis, Krypton query = "UPDATE album SET strArtists = ? WHERE idAlbum = ?" - kodicursor.execute(query, (artists_onalbum, albumid)) + kodicursor.execute(query, (album_artists, albumid)) elif kodiversion == 15: # Kodi Isengard query = "UPDATE album SET strArtists = ? WHERE idAlbum = ?" - kodicursor.execute(query, (artists_onalbum, albumid)) + kodicursor.execute(query, (album_artists, albumid)) else: # Kodi Helix query = "UPDATE album SET strArtists = ? WHERE idAlbum = ?" - kodicursor.execute(query, (artists_onalbum, albumid)) + kodicursor.execute(query, (album_artists, albumid)) # Add genres kodi_db.addMusicGenres(songid, genres, "song") + # Update artwork allart = artwork.getAllArtwork(item, parentInfo=True) if hasEmbeddedCover: allart["Primary"] = "image://music@" + artwork.single_urlencode( playurl ) artwork.addArtwork(allart, songid, "song", kodicursor) + if item.get('AlbumId') is None: + # Update album artwork + artwork.addArtwork(allart, albumid, "album", kodicursor) + def updateUserdata(self, item): # This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks # Poster with progress bar @@ -2349,6 +2385,21 @@ class Music(Items): if mediatype == "song": # Delete song self.removeSong(kodiid) + # This should only address single song scenario, where server doesn't actually + # create an album for the song. + customitems = emby_db.getItem_byWildId(itemid) + emby_db.removeWildItem(itemid) + + for item in customitems: + + item_kid = item[0] + item_mediatype = item[1] + + if item_mediatype == "album": + childs = emby_db.getItem_byParentId(item_kid, "song") + if not childs: + # Delete album + self.removeAlbum(item_kid) ##### IF ALBUM ##### diff --git a/resources/lib/kodidb_functions.py b/resources/lib/kodidb_functions.py index fc117d11..a7d82a3e 100644 --- a/resources/lib/kodidb_functions.py +++ b/resources/lib/kodidb_functions.py @@ -1086,6 +1086,7 @@ class Kodidb_Functions(): def addAlbum(self, name, musicbrainz): + kodiversion = self.kodiversion cursor = self.cursor query = ' '.join(( @@ -1101,14 +1102,24 @@ class Kodidb_Functions(): # Create the album cursor.execute("select coalesce(max(idAlbum),0) from album") albumid = cursor.fetchone()[0] + 1 - query = ( - ''' - INSERT INTO album(idAlbum, strAlbum, strMusicBrainzAlbumID) + if kodiversion in (15, 16, 17): + query = ( + ''' + INSERT INTO album(idAlbum, strAlbum, strMusicBrainzAlbumID, strReleaseType) - VALUES (?, ?, ?) - ''' - ) - cursor.execute(query, (albumid, name, musicbrainz)) + VALUES (?, ?, ?, ?) + ''' + ) + cursor.execute(query, (albumid, name, musicbrainz, "album")) + else: # Helix + query = ( + ''' + INSERT INTO album(idAlbum, strAlbum, strMusicBrainzAlbumID) + + VALUES (?, ?, ?) + ''' + ) + cursor.execute(query, (albumid, name, musicbrainz)) return albumid