Clementine-->Strawberry migration, fixes to SQL
-
First - Thank You for bringing us the sweet taste of Strawberry!
Second - Sorry my first post is so long!I followed the guide but, for me, it failed. Because of:
- A "Not Null" constraint violation on the insert to strawberry.playlist_items for the url column (which is sourced from the clementine filename column). Fixed by adding a case expression to convert the null from clementine to an empty string.
- The cover art path "art_manual" points to the old clementine directory. Fixed by adding a REPLACE expression to modify the offending part of the path to match the new location for album covers. (in the playlist_items and songs tables).
As I had to re-run it a few times I pulled the listed statements from the wiki page into a script which can be run in one shot with:
sqlite3 < migrate_clementine_to_strawberry.sql
The script is (See -- SQLFIX comments for my changes):
-- "full/path/to" needs to be replaced with the absolute path to your user home directory ATTACH '/full/path/to/.config/Clementine/clementine.db' AS clementine; ATTACH '/full/path/to/.local/share/strawberry/strawberry/strawberry.db' AS strawberry; DELETE FROM strawberry.directories; DELETE FROM strawberry.subdirectories; DELETE FROM strawberry.songs; DELETE FROM strawberry.playlists; DELETE FROM strawberry.playlist_items; INSERT INTO strawberry.directories (path, subdirs) SELECT path, subdirs FROM clementine.directories; INSERT INTO strawberry.subdirectories (directory_id, path, mtime) SELECT directory, path, mtime FROM clementine.subdirectories; INSERT INTO strawberry.songs (ROWID, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, beginning, length, bitrate, samplerate, directory_id, url, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, compilation_detected, compilation_on, compilation_off, compilation_effective, art_automatic, art_manual, effective_albumartist, effective_originalyear, cue_path, rating) SELECT ROWID, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, beginning, length, bitrate, samplerate, directory, filename, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, sampler, forced_compilation_on, forced_compilation_off, effective_compilation, art_automatic, -- SQLFIX: Not sure if an equivalent expression is needed for the 'art_automatic' column, above, too? REPLACE(art_manual, '.config/Clementine/albumcovers','.local/share/strawberry/strawberry/collectionalbumcovers'), effective_albumartist, effective_originalyear, cue_path, rating FROM clementine.songs WHERE unavailable = 0; UPDATE strawberry.songs SET source = 2; UPDATE strawberry.songs SET artist_id = ""; UPDATE strawberry.songs SET album_id = ""; UPDATE strawberry.songs SET song_id = ""; INSERT INTO strawberry.playlists (ROWID, name, last_played, special_type, ui_path, is_favorite, dynamic_playlist_type, dynamic_playlist_data, dynamic_playlist_backend) SELECT ROWID, name, last_played, special_type, ui_path, is_favorite, dynamic_playlist_type, dynamic_playlist_data, dynamic_playlist_backend FROM clementine.playlists WHERE dynamic_playlist_type ISNULL; INSERT INTO strawberry.playlist_items (ROWID, playlist, collection_id, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, beginning, length, bitrate, samplerate, directory_id, url, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, compilation_detected, compilation_on, compilation_off, compilation_effective, art_automatic, art_manual, effective_albumartist, effective_originalyear, cue_path, rating ) SELECT ROWID, playlist, library_id, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, beginning, length, bitrate, samplerate, directory, -- SQLFIX Constraint violation on the insert without this case as strawberry has "NOT NULL" constraint on url column, whereas clementine didn't case when filename IS NULL then "" else filename end, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, sampler, forced_compilation_on, forced_compilation_off, effective_compilation, art_automatic, -- SQLFIX: Not sure if an equivalent expression is needed for the 'art_automatic' column, above, too? REPLACE(art_manual, '.config/Clementine/albumcovers','.local/share/strawberry/strawberry/collectionalbumcovers'), effective_albumartist, effective_originalyear, cue_path, rating FROM clementine.playlist_items WHERE type = 'Library'; UPDATE strawberry.playlist_items SET source = 2; UPDATE strawberry.playlist_items SET type = 2; UPDATE strawberry.playlist_items SET artist_id = ""; UPDATE strawberry.playlist_items SET album_id = ""; UPDATE strawberry.playlist_items SET song_id = ""; DELETE FROM strawberry.songs_fts; INSERT INTO strawberry.songs_fts (ROWID, ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsperformer, ftsgrouping, ftsgenre, ftscomment) SELECT ROWID, title, album, artist, albumartist, composer, performer, grouping, genre, comment FROM strawberry.songs; DETACH clementine; DETACH strawberry;
-
Nice work - just saved a few hours on import it seems.
thanks! -
@cookie A bit of a threadcromancy but I also ran into some issues there and made the account to suggest fixes
Double vs single quotes got me but also after importing, loads of my playlists were empty. This is because not all of my stuff is within the Library DB. So on the statement where you're adding to the
playlist_items
table, there are two considerations:As OP made a case, the
filename
column in Clementine isNULL
for Library type entries, and you need to insert''
instead.ADDITIONALLY, you DO want to insert also where
type = 'File'
.I'm bad with SQL so i just ran the thing twice instead of looking up how to inline OR, but yeah, this needs to get fixed in the wiki too
-
@cookie Thanks for sharing the script.
I used it today, and I had to make some changes. In the latest version of strawberry, apparently there is no longer a songs_fts table.
Additionally, I had an issue. After importing my collection from clementine, strawberry would rescan and generate duplicate entries for all my songs. Thus, for each song, I was seeing two entries in strawberry.
I dug a bit and found the the filetype numbers in strawberry and clementine are different. Additionally, all entries in the songs table in my clementine database had directory_id set to 2 (where it should be 1).
I modified the script you provided to fix both issues.
- The different filetypes. I am not sure if strawberry would eventually correct these values.
- The directory_id (Notice that this was a problem in my database in particular, others may not need my fix
I include the modified script here in case it is useful for anyone
-- "full/path/to" needs to be replaced with the absolute path to your user home directory ATTACH 'full/path/to/.config/Clementine/clementine.db' AS clementine; ATTACH 'full/path/to/.local/share/strawberry/strawberry/strawberry.db' AS strawberry; DELETE FROM strawberry.directories; DELETE FROM strawberry.subdirectories; DELETE FROM strawberry.songs; DELETE FROM strawberry.playlists; DELETE FROM strawberry.playlist_items; INSERT INTO strawberry.directories (path, subdirs) SELECT path, subdirs FROM clementine.directories; INSERT INTO strawberry.subdirectories (directory_id, path, mtime) SELECT directory, path, mtime FROM clementine.subdirectories; INSERT INTO strawberry.songs (ROWID, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, beginning, length, bitrate, samplerate, directory_id, url, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, compilation_detected, compilation_on, compilation_off, compilation_effective, art_automatic, art_manual, effective_albumartist, effective_originalyear, cue_path, rating) SELECT ROWID, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, beginning, length, bitrate, samplerate, directory, filename, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, sampler, forced_compilation_on, forced_compilation_off, effective_compilation, art_automatic, -- SQLFIX: Not sure if an equivalent expression is needed for the 'art_automatic' column, above, too? REPLACE(art_manual, '.config/Clementine/albumcovers','.local/share/strawberry/strawberry/collectionalbumcovers'), effective_albumartist, effective_originalyear, cue_path, rating FROM clementine.songs WHERE unavailable = 0; UPDATE strawberry.songs SET source = 2; UPDATE strawberry.songs SET artist_id = ""; UPDATE strawberry.songs SET album_id = ""; UPDATE strawberry.songs SET song_id = ""; INSERT INTO strawberry.playlists (ROWID, name, last_played, special_type, ui_path, is_favorite, dynamic_playlist_type, dynamic_playlist_data, dynamic_playlist_backend) SELECT ROWID, name, last_played, special_type, ui_path, is_favorite, dynamic_playlist_type, dynamic_playlist_data, dynamic_playlist_backend FROM clementine.playlists WHERE dynamic_playlist_type ISNULL; INSERT INTO strawberry.playlist_items (ROWID, playlist, collection_id, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, beginning, length, bitrate, samplerate, directory_id, url, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, compilation_detected, compilation_on, compilation_off, compilation_effective, art_automatic, art_manual, effective_albumartist, effective_originalyear, cue_path, rating ) SELECT ROWID, playlist, library_id, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, beginning, length, bitrate, samplerate, directory, -- SQLFIX Constraint violation on the insert without this case as strawberry has "NOT NULL" constraint on url column, whereas clementine didn't case when filename IS NULL then "" else filename end, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, sampler, forced_compilation_on, forced_compilation_off, effective_compilation, art_automatic, -- SQLFIX: Not sure if an equivalent expression is needed for the 'art_automatic' column, above, too? REPLACE(art_manual, '.config/Clementine/albumcovers','.local/share/strawberry/strawberry/collectionalbumcovers'), effective_albumartist, effective_originalyear, cue_path, rating FROM clementine.playlist_items WHERE type = 'Library'; UPDATE strawberry.playlist_items SET source = 2; UPDATE strawberry.playlist_items SET type = 2; UPDATE strawberry.playlist_items SET artist_id = ""; UPDATE strawberry.playlist_items SET album_id = ""; UPDATE strawberry.playlist_items SET song_id = ""; -- @chank0 Convert all filetypes to auxiliary values UPDATE strawberry.songs SET filetype=1000 WHERE filetype=0; UPDATE strawberry.songs SET filetype=1001 WHERE filetype=1; UPDATE strawberry.songs SET filetype=1002 WHERE filetype=2; UPDATE strawberry.songs SET filetype=1003 WHERE filetype=3; UPDATE strawberry.songs SET filetype=1004 WHERE filetype=4; UPDATE strawberry.songs SET filetype=1005 WHERE filetype=5; UPDATE strawberry.songs SET filetype=1006 WHERE filetype=6; UPDATE strawberry.songs SET filetype=1007 WHERE filetype=7; UPDATE strawberry.songs SET filetype=1008 WHERE filetype=8; UPDATE strawberry.songs SET filetype=1009 WHERE filetype=9; UPDATE strawberry.songs SET filetype=1010 WHERE filetype=10; UPDATE strawberry.songs SET filetype=1011 WHERE filetype=11; UPDATE strawberry.songs SET filetype=1012 WHERE filetype=12; UPDATE strawberry.songs SET filetype=1013 WHERE filetype=13; UPDATE strawberry.songs SET filetype=1014 WHERE filetype=14; UPDATE strawberry.songs SET filetype=1015 WHERE filetype=15; UPDATE strawberry.songs SET filetype=1016 WHERE filetype=16; UPDATE strawberry.songs SET filetype=1017 WHERE filetype=17; UPDATE strawberry.songs SET filetype=1099 WHERE filetype=99; -- @chank0 And now set the types understood by strawberry UPDATE strawberry.songs SET filetype=0 WHERE filetype=1000; UPDATE strawberry.songs SET filetype=10 WHERE filetype=1001; -- ASF was 1 in clementine, 10 in strawberry UPDATE strawberry.songs SET filetype=2 WHERE filetype=1002; -- FLAC was 2 in clementine, 2 in strawberry UPDATE strawberry.songs SET filetype=9 WHERE filetype=1003; -- MP4 was 3 in clementine, 9 in strawberry UPDATE strawberry.songs SET filetype=12 WHERE filetype=1004; -- MPC was 4 in clementine, 12 in strawberry UPDATE strawberry.songs SET filetype=8 WHERE filetype=1005; -- MPEG was 5 in clementine, 8 in strawberry UPDATE strawberry.songs SET filetype=4 WHERE filetype=1006; -- OGGflac was 6 in clementine, 4 in strawberry UPDATE strawberry.songs SET filetype=7 WHERE filetype=1007; -- OggSpeex was 7 in clementine, 7 in strawberry UPDATE strawberry.songs SET filetype=5 WHERE filetype=1008; -- OggVorbis was 8 in clementine, 5 in strawberry UPDATE strawberry.songs SET filetype=11 WHERE filetype=1009; -- AIFF was 9 in clementine, 11 in strawberry UPDATE strawberry.songs SET filetype=1 WHERE filetype=1010; -- WAV was 10 in clementine, 1 in strawberry UPDATE strawberry.songs SET filetype=13 WHERE filetype=1011; -- Trueaudio was 11 in clementine, 13 in strawberry UPDATE strawberry.songs SET filetype=90 WHERE filetype=1012; -- cdda was 12 in clementine, 90 in strawberry UPDATE strawberry.songs SET filetype=6 WHERE filetype=1013; -- OGGopus was 13 in clementine, 6 in strawberry UPDATE strawberry.songs SET filetype=3 WHERE filetype=1014; -- Wavpack was 14 in clementine, 3 in strawberry UPDATE strawberry.songs SET filetype=22 WHERE filetype=1015; -- Spc was 15 in clementine, 22 in strawberry UPDATE strawberry.songs SET filetype=23 WHERE filetype=1016; -- VGM was 16 in clementine, 23 in strawberry UPDATE strawberry.songs SET filetype=17 WHERE filetype=1017; -- APE was 17 in clementine, 17 in strawberry UPDATE strawberry.songs SET filetype=91 WHERE filetype=1099; -- Stream was 99 in clementine, 91 in strawberry -- @chank0: My clementine DB has directory_id=2 in all songs, but it should be directory=1 -- No one else should need this line. Uncomment only if you understand what you are doing -- UPDATE strawberry.songs SET directory_id=1; DETACH clementine; DETACH strawberry;