Update renamer script for new db schema (#283)

* Update renamer for new db schema

* Update Readme and delegate finding new names to library scan

---------

Co-authored-by: HornyLupus <29715030+HornyLupus@users.noreply.github.com>
This commit is contained in:
HornyLupus
2024-06-01 18:46:25 -04:00
committed by GitHub
parent a0d3bacae7
commit 25ce987367
3 changed files with 34 additions and 33 deletions

View File

@@ -16,13 +16,14 @@ Using metadata from your database (SQLITE) to rename your file.
- I recommend make a copy of your database. (Use "backup" in Stash Settings)
- You need to set your Database path ([Line 9](Stash_Sqlite_Renamer.py#L9))
- Replace things between [Line 270 - 301](Stash_Sqlite_Renamer.py#L270)
- Replace things between [Line 309 - 333](Stash_Sqlite_Renamer.py#L309)
- Run a library scan to detect the new file names to the db
## First Run
Set `USE_DRY` to True ([Line 13](Stash_Sqlite_Renamer.py#L13)), by doing this nothing will be changed.
- This will create a file `renamer_dryrun.txt` that show how the path/file will be changed.
You can uncomment the break ([Line 254](Stash_Sqlite_Renamer.py#L254)), so it will stop after the first file.
You can uncomment the break ([Line 293](Stash_Sqlite_Renamer.py#L293)), so it will stop after the first file.
## Filename template
Available: `$date` `$performer` `$title` `$studio` `$height`

View File

@@ -135,13 +135,16 @@ def makeFilename(scene_info, query):
return new_filename
def edit_db(query_filename, optionnal_query=None):
query = "SELECT id,path,title,date,studio_id,height from scenes;"
if optionnal_query is not None:
query = "SELECT id,path,title,date,studio_id,height from scenes {};".format(
optionnal_query
)
cursor.execute(query)
def edit_db(query_filename, optional_query=""):
scene_query = """
SELECT s.id,f.basename,d.path,s.title,s.date,s.studio_id,vf.height
FROM scenes AS s
LEFT JOIN scenes_files AS sf ON s.id = sf.scene_id
LEFT JOIN files AS f ON sf.file_id = f.id
LEFT JOIN folders AS d ON f.parent_folder_id = d.id
LEFT JOIN video_files AS vf ON f.id = vf.file_id
"""
cursor.execute(f'{scene_query} {optional_query};')
record = cursor.fetchall()
if len(record) == 0:
logPrint("[Warn] There is no scene to change with this query")
@@ -154,14 +157,14 @@ def edit_db(query_filename, optionnal_query=None):
progressbar_Index += 1
scene_ID = str(row[0])
# Fixing letter (X:Folder -> X:\Folder)
current_path = re.sub(r"^(.):\\*", r"\1:\\", str(row[1]))
current_directory = os.path.dirname(current_path)
current_filename = os.path.basename(current_path)
file_extension = os.path.splitext(current_path)[1]
scene_title = str(row[2])
scene_date = str(row[3])
scene_Studio_id = str(row[4])
file_height = str(row[5])
current_filename = str(row[1])
current_directory = str(row[2])
current_path = os.path.join(current_directory, current_filename)
file_extension = os.path.splitext(current_filename)[1]
scene_title = str(row[3])
scene_date = str(row[4])
scene_Studio_id = str(row[5])
file_height = str(row[6])
# By default, title contains extensions.
scene_title = re.sub(file_extension + "$", "", scene_title)
@@ -189,6 +192,9 @@ def edit_db(query_filename, optionnal_query=None):
logPrint("[DEBUG] Scene information: {}".format(scene_info))
# Create the new filename
new_filename = makeFilename(scene_info, query_filename) + file_extension
if "None" in new_filename:
logPrint("[Error] Information missing for new filename, ID: {}".format(scene_ID))
continue
# Remove illegal character for Windows ('#' and ',' is not illegal you can remove it)
new_filename = re.sub('[\\/:"*?<>|#,]+', "", new_filename)
@@ -231,7 +237,7 @@ def edit_db(query_filename, optionnal_query=None):
# Looking for duplicate filename
cursor.execute(
"SELECT id FROM scenes WHERE path LIKE ? AND NOT id=?;",
"SELECT sf.scene_id FROM scenes_files AS sf LEFT JOIN files AS f ON sf.file_id = f.id WHERE f.basename LIKE ? AND NOT sf.scene_id=?;",
["%" + new_filename, scene_ID],
)
dupl_check = cursor.fetchall()
@@ -255,8 +261,8 @@ def edit_db(query_filename, optionnal_query=None):
# THIS PART WILL EDIT YOUR DATABASE, FILES (be careful and know what you do)
#
# Windows Rename
if os.path.isfile(current_path) == True:
if DRY_RUN == False:
if DRY_RUN == False:
if os.path.isfile(current_path) == True:
os.rename(current_path, new_path)
if os.path.isfile(new_path) == True:
logPrint("[OS] File Renamed! ({})".format(current_filename))
@@ -265,13 +271,6 @@ def edit_db(query_filename, optionnal_query=None):
"{}|{}|{}\n".format(scene_ID, current_path, new_path),
file=open("rename_log.txt", "a", encoding="utf-8"),
)
# Database rename
cursor.execute(
"UPDATE scenes SET path=? WHERE id=?;", [new_path, scene_ID]
)
sqliteConnection.commit()
logPrint("[SQLITE] Datebase Updated!")
else:
logPrint(
"[OS] File failed to rename ? ({})".format(current_filename)
@@ -281,14 +280,14 @@ def edit_db(query_filename, optionnal_query=None):
file=open("renamer_fail.txt", "a", encoding="utf-8"),
)
else:
logPrint("[DRY_RUN][OS] File should be renamed")
print(
"{} -> {}\n".format(current_path, new_path),
file=open("renamer_dryrun.txt", "a", encoding="utf-8"),
logPrint(
"[OS] File don't exist in your Disk/Drive ({})".format(current_path)
)
else:
logPrint(
"[OS] File don't exist in your Disk/Drive ({})".format(current_path)
logPrint("[DRY_RUN][OS] File should be renamed")
print(
"{} -> {}\n".format(current_path, new_path),
file=open("renamer_dryrun.txt", "a", encoding="utf-8"),
)
logPrint("\n")
# break

View File

@@ -0,0 +1 @@
progressbar2~=4.4.2