Advertisement
netonnit

audio_to_lp4

Apr 5th, 2025 (edited)
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.65 KB | None | 0 0
  1. @echo off
  2. setlocal enabledelayedexpansion
  3.  
  4. :: Set the base path of the batch file
  5. set "BASE_DIR=%~dp0"
  6. set "INPUT_DIR=%BASE_DIR%original"
  7. set "OUTPUT_DIR=%BASE_DIR%lp4converted"
  8. set "LOG_FILE=%BASE_DIR%conversion_log.txt"
  9.  
  10. echo Starting conversion process > "%LOG_FILE%"
  11. echo =========================== >> "%LOG_FILE%"
  12.  
  13. for /f "usebackq delims=" %%F in (`powershell -NoProfile -Command ^
  14. "Get-ChildItem -File -Path '%INPUT_DIR%' -Recurse | Where-Object { $_.Extension -match '\.(flac|mp3|ogg|m4a|alac|aac|wav|wma|opus|aiff|ape)$' } | ForEach-Object { $_.FullName }"`) do (
  15. echo. >> "%LOG_FILE%"
  16. echo Processing: %%~nxF >> "%LOG_FILE%"
  17. echo --------------------------- >> "%LOG_FILE%"
  18.  
  19. :: Extract metadata using ffprobe JSON
  20. set "TEMP_JSON=%TEMP%\meta_%%~nF.json"
  21. ffprobe -v quiet -print_format json -show_format "%%F" > "!TEMP_JSON!"
  22.  
  23. :: Parse metadata using PowerShell
  24. for /f "usebackq delims=" %%a in (`powershell -NoProfile -Command ^
  25. "(Get-Content -Raw '!TEMP_JSON!' | ConvertFrom-Json).format.tags.artist"`) do set "ARTIST=%%a"
  26. for /f "usebackq delims=" %%a in (`powershell -NoProfile -Command ^
  27. "(Get-Content -Raw '!TEMP_JSON!' | ConvertFrom-Json).format.tags.album"`) do set "ALBUM=%%a"
  28. for /f "usebackq delims=" %%a in (`powershell -NoProfile -Command ^
  29. "(Get-Content -Raw '!TEMP_JSON!' | ConvertFrom-Json).format.tags.title"`) do set "TITLE=%%a"
  30. for /f "usebackq delims=" %%a in (`powershell -NoProfile -Command ^
  31. "(Get-Content -Raw '!TEMP_JSON!' | ConvertFrom-Json).format.tags.track"`) do set "TRACK=%%a"
  32.  
  33. :: Extract bit depth using ffprobe
  34. for /f "usebackq delims=" %%b in (`ffprobe -v quiet -select_streams a:0 -show_entries stream=bits_per_sample -of default=nw=1:nk=1 "%%F"`) do set "BITDEPTH=%%b"
  35.  
  36. :: Choose sample format based on bit depth
  37. if "!BITDEPTH!"=="24" (
  38. set "SAMPLEFMT=s32"
  39. ) else (
  40. set "SAMPLEFMT=s16"
  41. )
  42.  
  43. :: Set defaults
  44. if not defined ARTIST set "ARTIST=Unknown_Artist"
  45. if not defined ALBUM set "ALBUM=Unknown_Album"
  46. if not defined TITLE set "TITLE=Unknown_Title"
  47. if not defined TRACK set "TRACK=00"
  48.  
  49. :: Sanitize metadata
  50. call :SanitizeString ARTIST
  51. call :SanitizeString ALBUM
  52. call :SanitizeString TITLE
  53.  
  54. :: Strip "1/13" to just "1"
  55. for /f "tokens=1 delims=/" %%t in ("!TRACK!") do set "TRACK=%%t"
  56. if 1!TRACK! LSS 110 set "TRACK=0!TRACK!"
  57.  
  58. :: Log metadata
  59. echo Artist: !ARTIST! >> "%LOG_FILE%"
  60. echo Album : !ALBUM! >> "%LOG_FILE%"
  61. echo Title : !TITLE! >> "%LOG_FILE%"
  62. echo Track : !TRACK! >> "%LOG_FILE%"
  63. echo BitDepth: !BITDEPTH! → SampleFmt: !SAMPLEFMT! >> "%LOG_FILE%"
  64.  
  65. :: Set final path and filename
  66. set "TARGET_DIR=%OUTPUT_DIR%\!ARTIST!\!ALBUM!"
  67. if not exist "!TARGET_DIR!" mkdir "!TARGET_DIR!"
  68. set "OUTPUT_FILE=!TRACK! - !TITLE!.wav"
  69.  
  70. echo Saving to: !TARGET_DIR!\!OUTPUT_FILE! >> "%LOG_FILE%"
  71.  
  72. :: Convert to WAV using detected bit depth
  73. ffmpeg -y -i "%%F" -sample_fmt !SAMPLEFMT! "!TARGET_DIR!\!OUTPUT_FILE!" >> "%LOG_FILE%" 2>&1
  74.  
  75. :: Encode to ATRAC3 at 66kbps stereo, save .at3 in same folder as .wav
  76. set "ATRAC_FILE=!OUTPUT_FILE:.wav=.at3!"
  77. at3tool.exe -e -br 66 "!TARGET_DIR!\!OUTPUT_FILE!" "!TARGET_DIR!\!ATRAC_FILE!" >> "%LOG_FILE%" 2>&1
  78.  
  79. if exist "!TARGET_DIR!\!ATRAC_FILE!" (
  80. echo Created ATRAC: !TARGET_DIR!\!ATRAC_FILE! >> "%LOG_FILE%"
  81. ) else (
  82. echo ERROR: ATRAC not found at !TARGET_DIR!\!ATRAC_FILE! >> "%LOG_FILE%"
  83. )
  84.  
  85. echo Done converting %%~nxF >> "%LOG_FILE%"
  86. del "!TEMP_JSON!"
  87. )
  88.  
  89. echo.
  90. echo All files processed. See conversion_log.txt for details.
  91.  
  92. :: Ask user if WAV files should be deleted
  93. echo.
  94. set /p DELWAV=Delete all converted WAV files? (y/n):
  95. if /i "%DELWAV%"=="y" (
  96. echo Deleting WAV files...
  97. for /r "%OUTPUT_DIR%" %%W in (*.wav) do del "%%W"
  98. echo WAV files deleted.
  99. ) else (
  100. echo Keeping WAV files.
  101. )
  102.  
  103. :: Ask user if log file should be deleted
  104. echo.
  105. set /p DELLOG=Delete conversion log file? (y/n):
  106. if /i "%DELLOG%"=="y" (
  107. del "%LOG_FILE%"
  108. echo Log file deleted.
  109. ) else (
  110. echo Keeping log file.
  111. )
  112.  
  113. echo.
  114. pause
  115.  
  116. goto :eof
  117.  
  118. :SanitizeString
  119. :: Properly sanitize invalid filename characters in the value of a variable
  120. set "varname=%~1"
  121. call set "value=%%%varname%%%"
  122. setlocal enabledelayedexpansion
  123. set "value=!value:^<=_!"
  124. set "value=!value:^>=_!"
  125. set "value=!value::=_!"
  126. set "value=!value:"=_!"
  127. set "value=!value:/=_!"
  128. set "value=!value:\=_!"
  129. set "value=!value:|=_!"
  130. set "value=!value:?=_!"
  131. for /f "tokens=* delims= " %%x in ("!value!") do set "value=%%x"
  132. endlocal & set "%varname%=%value%"
  133. goto :eof
  134.  
Tags: audio_to_lp4
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement