Kodi Move Sources

Update paths of latest MyMusic table of Music MySQL DB:

mysql -u kodi -p
use MyMusic82
UPDATE path SET strPath = REPLACE(strPath,'smb://my_nas/old_share', 'smb://my_nas/new_share');
exit

Update paths of latest MyVideo table of Movies/TV/MusicVideos MySQL DB:

mysql -u kodi -p
use MyVideos119
UPDATE path SET strPath = REPLACE(strPath,'smb://my_nas/old_share', 'smb://my_nas/new_share');
UPDATE movie SET c22 = REPLACE(c22,'smb://my_nas/old_share', 'smb://my_nas/new_share');
UPDATE episode SET c18 = REPLACE(c18,'smb://my_nas/old_share', 'smb://my_nas/new_share');
UPDATE art SET url = REPLACE(url,'smb://my_nas/old_share', 'smb://my_nas/new_share');
UPDATE tvshow SET c16 = REPLACE(c16,'smb://my_nas/old_share', 'smb://my_nas/new_share');
UPDATE files SET strFilename = REPLACE(strFilename,'smb://my_nas/old_share', 'smb://my_nas/new_share');
exit

Update paths of latest Textures13.db SQLite DB:

cd .kodi/userdata/Database
sqlite3 Textures13.db
UPDATE path SET url = REPLACE(url,'nfs://192.168.1.6/volume3/tv','nfs://192.168.1.6/volume5/tv');
UPDATE path SET texture = REPLACE(texture,'nfs://192.168.1.6/volume3/tv','nfs://192.168.1.6/volume5/tv');
.quit

Adjust favourites

vi .kodi/userdata/favourites.xml

Adjust source

vi .kodi/userdata/sources.xml

Note: Restart kodi after source adjustment!

https://kodi.wiki/view/HOW-TO:Update_SQL_databases_when_files_move

kodimovesource.sh
#!/bin/bash
dbhost="localhost"
dbuser="kodi"
dbpassword="kodi"
kodihome="/home/kodi"

if [[ $# -lt 2 ]] || [[ $# -gt 2 ]]
then
    echo "Usage: ${0##*/} old_path new_path"
    echo "Escape special characters in paths or enclose in double quotes"
    exit 0
fi

echo -e "Updating Kodi media sources \nfrom '$1' \nto '$2'"
read -r -p "Are you sure? [y/N] " response
response=${response,,}    # tolower
if [[ ! "$response" =~ ^(yes|y)$ ]]
then
    exit 0
fi

#find highest numeric MyVideos / MyMusic db
videodb=$(mysql -h$dbhost -u$dbuser -p$dbpassword -e "show databases like 'MyVideos%';" 2>/dev/null | sort -g -r | head -1)
audiodb=$(mysql -h$dbhost -u$dbuser -p$dbpassword -e "show databases like 'MyMusic%';" 2>/dev/null | sort -g -r | head -1)
texturedb=$(ls $kodihome/.kodi/userdata/Database/Textures* | sort -g -r | head -1)

echo "Databases to adjust: $videodb $audiodb "$(basename $texturedb)" ..."

# Escaping paths for MySQL/SQLite3 inserts
printf -v from "%q" "$1"
printf -v to "%q" "$2"

# updating databases
echo "Updating mysql databases from '$1' to '$2' ..."
#exit 0
mysql -h$dbhost -u$dbuser -p$dbpassword 2>/dev/null <<EOF
use $videodb
UPDATE ignore path SET strPath = REPLACE(strPath,'$from', '$to');
UPDATE ignore movie SET c22 = REPLACE(c22,'$from', '$to');
UPDATE ignore episode SET c18 = REPLACE(c18,'$from', '$to');
UPDATE ignore art SET url = REPLACE(url,'$from', '$to');
UPDATE ignore tvshow SET c16 = REPLACE(c16,'$from', '$to');
UPDATE ignore files SET strFilename = REPLACE(strFilename,'$from', '$to');
use $audiodb
UPDATE ignore path SET strPath = REPLACE(strPath,'$from', '$to');
EOF

echo "Updating sqlite database from '$1' to '$2' ..."
sqlite3 $texturedb <<EOF
UPDATE path SET url = REPLACE(url,"$1","$2o");
UPDATE path SET texture = REPLACE(texture,"$1","$2");
EOF

echo "Updating sources.xml file from '$1' to '$2' ..."
# updating sources file (using pipe separator avoiding forward slash issues)
sed -i "s|$1|$2|g" $kodihome/.kodi/userdata/sources.xml

echo "Updating favourites.xml file from '$1' to '$2' ..."
# updating sources file (using pipe separator avoiding forward slash issues)
sed -i "s|$1|$2|g" $kodihome/.kodi/userdata/favourites.xml

echo "Kodi restart is required to apply new sources and paths"
read -r -p "Restart Kodi now? [y/N] " response
response=${response,,}    # tolower
if [[ "$response" =~ ^(yes|y)$ ]]
then
    service kodi restart
    echo "Kodi restarted."
fi

echo "All done"

example moving folders while ignoring A/An/The at the start and adjusting the Kodi paths with above bash script (comment out the verification prompts in the script to automate):

#Move based on First letter of movie name, excluding 'A ' or 'An ' or 'The '
for i in {0..9} {A..Z}; do mv -v /volume5/downloads/_NEW_MOVIES/{A\ ,An\ ,A.,An.,The\ ,The.}$i* /volume2/allmovies/$i;done
#remaining after A/An/The processed
for i in {0..9} {A..Z}; do mv -v /volume5/downloads/_NEW_MOVIES/$i* /volume2/allmovies/$i;done


for i in {0..9} {A..Z}; do ~/kodimovesource.sh "/volume5/downloads/_NEW_MOVIES/A $i" "/volume2/allmovies/$i/A $i"; done
for i in {0..9} {A..Z}; do ~/kodimovesource.sh "/volume5/downloads/_NEW_MOVIES/A.$i" "/volume2/allmovies/$i/A.$i"; done
for i in {0..9} {A..Z}; do ~/kodimovesource.sh "/volume5/downloads/_NEW_MOVIES/An $i" "/volume2/allmovies/$i/An $i"; done
for i in {0..9} {A..Z}; do ~/kodimovesource.sh "/volume5/downloads/_NEW_MOVIES/An.$i" "/volume2/allmovies/$i/An.$i"; done
for i in {0..9} {A..Z}; do ~/kodimovesource.sh "/volume5/downloads/_NEW_MOVIES/The $i" "/volume2/allmovies/$i/The $i"; done
for i in {0..9} {A..Z}; do ~/kodimovesource.sh "/volume5/downloads/_NEW_MOVIES/The.$i" "/volume2/allmovies/$i/The.$i"; done

#remaining after A/An/The processed
for i in {0..9} {A..Z}; do ~/kodimovesource.sh "/volume5/downloads/_NEW_MOVIES/$i" "/volume2/allmovies/$i/$i"; done