Last active
February 1, 2024 16:22
-
-
Save ScottJWalter/2d7082f0c2f09f10a3ac7185996c9979 to your computer and use it in GitHub Desktop.
Batch file to bulk import a folder of files into Calibre with more extensive logging. #calibre #windows
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@echo off | |
setlocal enabledelayedexpansion | |
rem The following variables set up the environment | |
set "work_drive=D:" | |
set "dir_in=D:\<folder-to-process>" | |
set "dir_out=D:\<processed-folder>" | |
set "log_file=_import.log" | |
rem ------------------------------ NO CHANGES NEEDED BELOW ------------------------------ | |
rem Tags can be passed as parameters, quoted if there are embedded spaces. | |
rem | |
rem This chunk walks the parameter list, and converts any existing parameters | |
rem into a string: '-T "%1" -T "%2" ...' | |
et argCount=0 | |
for %%x in (%*) do ( | |
set /A argCount+=1 | |
set "argVec[!argCount!]=%%~x" | |
) | |
if "%argCount%"=="0" goto NO_TAGS | |
for /L %%i in (1,1,%argCount%) do set tags=!tags! -T "!argVec[%%i]!" | |
:NO_TAGS | |
rem TODO: Need to check if there's already an instance of Calibre running, in which | |
rem case, don't try to process (wait for next cycle). | |
rem I use a crude way of tagging lines in the output log by prefixing them with 2 askterisks | |
rem and a third character to differentiate the different lines I'm interested in scanning | |
rem for later. The legend is simple: | |
rem | |
rem **+ Marks the start of a batch job | |
rem *** Marks the start of calibredb processing | |
rem **- Marks the end of a batch job | |
echo. >>%dir_out%\%log_file% 2>&1 | |
echo ============================================================ >>%dir_out%\%log_file% 2>&1 | |
echo **+ %DATE% %TIME% - BEGIN ... >>%dir_out%\%log_file% 2>&1 | |
echo **+ Tags: %tags% >>%dir_out%\%log_file% 2>&1 | |
echo ============================================================ >>%dir_out%\%log_file% 2>&1 | |
rem calibredb doesn't provide alot of logging detail during a process, and during | |
rem a batch process, it's even worse. So, instead of giving calibredb a folder | |
rem to process, we spoon feed it one file at a time, so we can get distinct | |
rem import data that we can link to each import. | |
%work_drive% | |
cd %dir_in% | |
for %%i in (*) do ( | |
echo *** Processing "%%i" ... >>%dir_out%\%log_file% 2>&1 | |
calibredb add %tags% --automerge="ignore" "%%i" >>%dir_out%\%log_file% 2>&1 | |
rem once done (one way or another), move the file out of inbound | |
move "%%i" %dir_out%\ >>%dir_out%\%log_file% 2>&1 | |
) | |
echo. >>%dir_out%\%log_file% 2>&1 | |
echo ============================================================ >>%dir_out%\%log_file% 2>&1 | |
echo **- %DATE% %TIME% - END >>%dir_out%\%log_file% 2>&1 | |
echo ============================================================ >>%dir_out%\%log_file% 2>&1 |
Refactored the script to allow for easily changing logfile name
A little tweak to enable tagging. Any parameters passed will be turned into calibre tags. Quote parameters if there are embedded spaces (and probably a good idea if a potential tag has hyphens as well).
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
On Windows 10 (at least), Calibre's own "monitor folder for import" process doesn't work reliably. Typically, it only fires when you first launch the app, and sporadically later on.
Not a problem, as you can use
calibredb
from the commandline. Problem with that is little to no logging information (I can't find a way that calibredb can confirm it did load (or not load) a file ... it's assumed that if it finishes that it did what it was supposed to). I wanted more control and reporting over the import process, and I really only needed the import to run regularly, not instantaneously.So, this is a batch file wrapper around
calibredb
to spoon-feed files, one at a time, to the import process. Plugged into the Task Scheduler, you can dump files all day in %dir_in% and, when the schedule fires, they'll get processed (say, middle of the night ... unless that's when you work).