@echo off
if exist "turnon_echo" (
  @echo on
)

:: Reset working dir especially when using 'Run as administrator'
@cd /d "%~dp0"

echo This batch file can help you to create a packages for SMPlayer and MPlayer.
echo.
echo This script will temporarily rename the smplayer-build and mplayer directories.
echo Make sure these files ^& directories are not opened when running the script.
echo.
echo 1 - NSIS                          10 - NSIS [32-bit/64-bit]
echo 2 - NSIS [64-bit]                 11 - Portable [32-bit/64-bit]
echo 3 - Portable                      20 - Portable SFX [32-bit/64-bit]
echo 4 - Portable [64-bit]
echo 5 - Without MPlayer
echo 6 - Without MPlayer [64-bit]
echo.

:: Relative directory of all the source files to this script
set TOP_LEVEL_DIR=..

:: Reset in case ran again in same command prompt instance
set ALL_PKG_VER=
set VER_MAJOR=
set VER_MINOR=
set VER_BUILD=
set VER_REVISION=
set VER_REV_CMD=
set MAKENSIS_EXE_PATH=

:: NSIS path
if exist "nsis_path" (
  for /f "tokens=*" %%y in ('type nsis_path') do if exist %%y set MAKENSIS_EXE_PATH="%%y"
)

if not defined MAKENSIS_EXE_PATH (
  for %%x in ("%PROGRAMFILES(X86)%\NSIS\Unicode\makensis.exe" "%PROGRAMFILES%\NSIS\Unicode\makensis.exe") do if exist %%x set MAKENSIS_EXE_PATH=%%x
)

if not defined MAKENSIS_EXE_PATH (
  echo Warning: Unable to locate NSIS in the default path, create the file ^'nsis_path^' with the full correct path
  echo to makensis.exe or the existing ^'nsis_path^' may be incorrect.
  echo.
)

:: Works only in Vista+
where /q where.exe 2>NUL && (
  where /q 7za.exe 2>NUL || (
  echo Warning: 7za.exe not found in path or current directory!
  echo.
  )
)

set SMPLAYER_DIR=%TOP_LEVEL_DIR%\smplayer-build
set SMPLAYER_DIR64=%TOP_LEVEL_DIR%\smplayer-build64
set MPLAYER_DIR=%TOP_LEVEL_DIR%\mplayer
set OUTPUT_DIR=%TOP_LEVEL_DIR%\output
set PORTABLE_EXE_DIR=%TOP_LEVEL_DIR%\portable

:cmdline_parsing
if "%1" == ""               goto reask
for %%w in (1 2 3 4 5 6 10 11 20) do (
  if "%1" == "%%w" (
    set USER_CHOICE=%%w
    goto pkgver
  )
)

echo Unknown option: "%1"
echo.
goto superend

:reask
set USER_CHOICE=
set /P USER_CHOICE="Choose an action: "
echo.

for %%z in (1 2 3 4 5 6 10 11 20) do if "%USER_CHOICE%" == "%%z" goto pkgver
if "%USER_CHOICE%" == ""  goto superend
goto reask

:pkgver
if exist "pkg_version" (
  for /f "tokens=*" %%i in ('type pkg_version') do set ALL_PKG_VER=%%i
  goto parse_version
)

echo Format: VER_MAJOR.VER_MINOR.VER_BUILD[.VER_REVISION]
echo VER_REVISION is optional (set to 0 if blank)
:pkgver_manual
echo.
set ALL_PKG_VER=
set VER_MAJOR=
set VER_MINOR=
set VER_BUILD=
set VER_REVISION=
set VER_REV_CMD=
set /p ALL_PKG_VER="Version: "
echo.

:parse_version
for /f "tokens=1 delims=." %%j in ("%ALL_PKG_VER%")  do set VER_MAJOR=%%j
for /f "tokens=2 delims=." %%k in ("%ALL_PKG_VER%")  do set VER_MINOR=%%k
for /f "tokens=3 delims=." %%l in ("%ALL_PKG_VER%")  do set VER_BUILD=%%l
for /f "tokens=4 delims=." %%m in ("%ALL_PKG_VER%")  do set VER_REVISION=%%m

echo %VER_MAJOR%|findstr /r /c:"^[0-9][0-9]*$" >nul
if errorlevel 1 (
  echo Invalid version string. VER_MAJOR is not defined or is not a number [#.x.x]
  goto pkgver_manual & ver>nul
)

echo %VER_MINOR%|findstr /r /c:"^[0-9][0-9]*$" >nul
if errorlevel 1 (
  echo Invalid version string. VER_MINOR is not defined or is not a number [x.#.x]
  goto pkgver_manual & ver>nul
)
echo %VER_BUILD%|findstr /r /c:"^[0-9][0-9]*$" >nul
if errorlevel 1 (
  echo Invalid version string. VER_BUILD is not defined or is not a number [x.x.#]
  goto pkgver_manual & ver>nul
)

if defined VER_REVISION (
  echo %VER_REVISION%|findstr /r /c:"^[0-9][0-9]*$" >nul
  if errorlevel 1 (
    echo Invalid version string. VER_REVISION is not a number [x.x.x.#]
    goto pkgver_manual & ver>nul
  ) else (
    set VER_REV_CMD=/DVER_REVISION=%VER_REVISION% & ver>nul
  )
) else (
  set VER_REV_CMD=
)

if not defined VER_REVISION (
  set PORTABLE_PKG_VER=%ALL_PKG_VER%.0
) else (
  set PORTABLE_PKG_VER=%ALL_PKG_VER%
)

if "%USER_CHOICE%" == "1"  goto nsispkg
if "%USER_CHOICE%" == "2"  goto nsispkg64
if "%USER_CHOICE%" == "3"  goto portable
if "%USER_CHOICE%" == "4"  goto portable64
if "%USER_CHOICE%" == "5"  goto nomplayer
if "%USER_CHOICE%" == "6"  goto nomplayer64
if "%USER_CHOICE%" == "10"  goto nsispkg
if "%USER_CHOICE%" == "11"  goto portable
if "%USER_CHOICE%" == "20"  goto portablesfx
:: Should not happen
goto end

:nsispkg

echo --- SMPlayer NSIS Package [32-bit] ---
echo.

if exist %TOP_LEVEL_DIR%\smplayer-build (
  %MAKENSIS_EXE_PATH% /V3 /DVER_MAJOR=%VER_MAJOR% /DVER_MINOR=%VER_MINOR% /DVER_BUILD=%VER_BUILD% %VER_REV_CMD% %TOP_LEVEL_DIR%\smplayer.nsi
)

if not "%USER_CHOICE%" == "10"  goto end

:nsispkg64
echo --- SMPlayer NSIS Package [64-bit] ---
echo.

if exist %TOP_LEVEL_DIR%\smplayer-build64 (
  %MAKENSIS_EXE_PATH% /V3 /DVER_MAJOR=%VER_MAJOR% /DVER_MINOR=%VER_MINOR% /DVER_BUILD=%VER_BUILD% %VER_REV_CMD% /DWIN64 %TOP_LEVEL_DIR%\smplayer.nsi
)

goto end

:portable
echo --- SMPlayer Portable Package [32-bit] ---
echo.

if not exist %SMPLAYER_DIR% (
  echo SMPlayer sources missing.
  goto end
)

REM Check for portable exes
if not exist "%PORTABLE_EXE_DIR%\smplayer-portable.exe" (
  echo SMPlayer portable EXE not found!
  goto end
)

REM if not exist "%PORTABLE_EXE_DIR%\smtube-portable.exe" (
REM  echo Warning: SMTube portable EXE not found!
REM )

if exist "%SMPLAYER_DIR%\QtCore4.dll" (
  set PORTABLE_DIR_NAME=smplayer-portable-%PORTABLE_PKG_VER%-Qt4
) else (
  set PORTABLE_DIR_NAME=smplayer-portable-%PORTABLE_PKG_VER%
)

ren "%SMPLAYER_DIR%" "%PORTABLE_DIR_NAME%"
set SMPLAYER_PORTABLE_DIR="%TOP_LEVEL_DIR%\%PORTABLE_DIR_NAME%"

if not exist "%SMPLAYER_PORTABLE_DIR%" (
  echo Oops! Unable to find renamed directory, make sure no files are opened.
  goto end
)

echo Backing up files...

ren "%SMPLAYER_PORTABLE_DIR%\smplayer.exe" smplayer.bak
REM ren "%SMPLAYER_PORTABLE_DIR%\smtube.exe" smtube.bak

echo Creating screenshots dir...

mkdir "%SMPLAYER_PORTABLE_DIR%\screenshots"

echo Creating smplayer.ini...

echo [%%General]> "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"
echo screenshot_directory=.\\screenshots>> "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"
echo.>> "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"
echo [smplayer]>> "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"
echo check_if_upgraded=false>> "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"

echo Creating smplayer_orig.ini...

echo [%%General]> "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"
echo screenshot_directory=.\\screenshots>> "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"
echo.>> "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"
echo [smplayer]>> "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"
echo check_if_upgraded=false>> "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"

REM echo Creating mplayer config...

REM echo ^<cachedir^>../fontconfig^</cachedir^>> "%SMPLAYER_PORTABLE_DIR%\mplayer\fonts\local.conf"

echo Copying portable .exe...

copy /y "%PORTABLE_EXE_DIR%\smplayer-portable.exe" "%SMPLAYER_PORTABLE_DIR%\smplayer.exe"
REM copy /y "%PORTABLE_EXE_DIR%\smtube-portable.exe" "%SMPLAYER_PORTABLE_DIR%\smtube.exe"

echo Finalizing package...
7za a -t7z "%OUTPUT_DIR%\%PORTABLE_DIR_NAME%.7z" "%SMPLAYER_PORTABLE_DIR%" -xr!*.bak* -xr!qxtcore.dll -xr!mplayer64.exe -xr!mencoder.exe -xr!mencoder64.exe -xr!mplayer64.exe.debug -xr!mencoder64.exe.debug -xr!mplayer.exe.debug -xr!mencoder.exe.debug -xr!gdb.exe -xr!gdb64.exe -xr!vfw2menc.exe -xr!buildinfo -xr!buildinfo64 -xr!buildinfo-mencoder-32 -xr!buildinfo-mencoder-debug-32 -xr!buildinfo-mplayer-32 -xr!buildinfo-mplayer-debug-32 -xr!buildinfo-mencoder-64 -xr!buildinfo-mencoder-debug-64 -xr!buildinfo-mplayer-64 -xr!buildinfo-mplayer-debug-64 -xr!mpv64.exe -xr!mpv64.com -xr!d3dcompiler_43-64.dll -xr!libaacs64.dll -xr!libbdplus64.dll -mx9 >nul

echo.
echo Restoring source folder(s) back to its original state...
echo.
rmdir "%SMPLAYER_PORTABLE_DIR%\screenshots"
del "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"
del "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"
del "%SMPLAYER_PORTABLE_DIR%\smplayer.exe"
REM del "%SMPLAYER_PORTABLE_DIR%\smtube.exe"
REM del "%SMPLAYER_PORTABLE_DIR%\mplayer\fonts\local.conf"
ren "%SMPLAYER_PORTABLE_DIR%\smplayer.bak" smplayer.exe
REM ren "%SMPLAYER_PORTABLE_DIR%\smtube.bak" smtube.exe
ren "%SMPLAYER_PORTABLE_DIR%" smplayer-build

if not "%USER_CHOICE%" == "11"  goto end

:portable64
echo --- SMPlayer Portable Package [64-bit] ---
echo.

if not exist %SMPLAYER_DIR64% (
  echo SMPlayer sources missing.
  goto end
)

REM Check for portable exes
if not exist "%PORTABLE_EXE_DIR%\smplayer-portable64.exe" (
  echo SMPlayer portable EXE not found!
  goto end
)

REM if not exist "%PORTABLE_EXE_DIR%\smtube-portable64.exe" (
REM  echo Warning: SMTube portable EXE not found!
REM )

set PORTABLE_DIR_NAME=smplayer-portable-%PORTABLE_PKG_VER%-x64

ren "%SMPLAYER_DIR64%" "%PORTABLE_DIR_NAME%"
set SMPLAYER_PORTABLE_DIR="%TOP_LEVEL_DIR%\%PORTABLE_DIR_NAME%"

if not exist "%SMPLAYER_PORTABLE_DIR%" (
  echo Oops! Unable to find renamed directory, make sure no files are opened.
  goto end
)

echo Backing up files...

ren "%SMPLAYER_PORTABLE_DIR%\smplayer.exe" smplayer.bak
REM ren "%SMPLAYER_PORTABLE_DIR%\smtube.exe" smtube.bak
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\mplayer.exe" mplayer.exe.bak32
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\libaacs.dll" libaacs.dll.bak32
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\libbdplus.dll" libbdplus.dll.bak32
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\mplayer64.exe" mplayer.exe
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\libaacs64.dll" libaacs.dll
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\libbdplus64.dll" libbdplus.dll

if exist "%SMPLAYER_PORTABLE_DIR%\mpv\fonts" (
  ren "%SMPLAYER_PORTABLE_DIR%\mpv\fonts" fonts.bak32
)
if exist "%SMPLAYER_PORTABLE_DIR%\mpv\mpv" (
  ren "%SMPLAYER_PORTABLE_DIR%\mpv\mpv" mpv.bak32
)

ren "%SMPLAYER_PORTABLE_DIR%\mpv\mpv.exe" mpv.exe.bak32
ren "%SMPLAYER_PORTABLE_DIR%\mpv\mpv.com" mpv.com.bak32
ren "%SMPLAYER_PORTABLE_DIR%\mpv\d3dcompiler_43.dll" d3dcompiler_43.dll.bak32
ren "%SMPLAYER_PORTABLE_DIR%\mpv\mpv64.exe" mpv.exe
ren "%SMPLAYER_PORTABLE_DIR%\mpv\mpv64.com" mpv.com
ren "%SMPLAYER_PORTABLE_DIR%\mpv\d3dcompiler_43-64.dll" d3dcompiler_43.dll

echo Creating screenshots dir...

mkdir "%SMPLAYER_PORTABLE_DIR%\screenshots"

echo Creating smplayer.ini...

echo [%%General]> "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"
echo screenshot_directory=.\\screenshots>> "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"
echo.>> "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"
echo [smplayer]>> "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"
echo check_if_upgraded=false>> "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"

echo Creating smplayer_orig.ini...

echo [%%General]> "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"
echo screenshot_directory=.\\screenshots>> "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"
echo.>> "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"
echo [smplayer]>> "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"
echo check_if_upgraded=false>> "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"

REM echo Creating mplayer config...

REM echo ^<cachedir^>../fontconfig^</cachedir^>> "%SMPLAYER_PORTABLE_DIR%\mplayer\fonts\local.conf"

echo Copying portable .exe...

copy /y "%PORTABLE_EXE_DIR%\smplayer-portable64.exe" "%SMPLAYER_PORTABLE_DIR%\smplayer.exe"
REM copy /y "%PORTABLE_EXE_DIR%\smtube-portable64.exe" "%SMPLAYER_PORTABLE_DIR%\smtube.exe"

echo Finalizing package...
7za a -t7z "%OUTPUT_DIR%\%PORTABLE_DIR_NAME%.7z" "%SMPLAYER_PORTABLE_DIR%" -xr!*.bak* -xr!qxtcore.dll -xr!mencoder.exe -xr!mencoder64.exe  -xr!mplayer64.exe.debug -xr!mencoder64.exe.debug -xr!mplayer.exe.debug -xr!mencoder.exe.debug -xr!gdb.exe -xr!gdb64.exe -xr!vfw2menc.exe -xr!codecs -xr!buildinfo -xr!buildinfo64 -xr!buildinfo-mencoder-32 -xr!buildinfo-mencoder-debug-32 -xr!buildinfo-mplayer-32 -xr!buildinfo-mplayer-debug-32 -xr!buildinfo-mencoder-64 -xr!buildinfo-mencoder-debug-64 -xr!buildinfo-mplayer-64 -xr!buildinfo-mplayer-debug-64 -mx9 >nul

echo.
echo Restoring source folder(s) back to its original state...
echo.
rmdir "%SMPLAYER_PORTABLE_DIR%\screenshots"
del "%SMPLAYER_PORTABLE_DIR%\smplayer.ini"
del "%SMPLAYER_PORTABLE_DIR%\smplayer_orig.ini"
del "%SMPLAYER_PORTABLE_DIR%\smplayer.exe"
REM del "%SMPLAYER_PORTABLE_DIR%\smtube.exe"
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\mplayer.exe" mplayer64.exe
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\libaacs.dll" libaacs64.dll
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\libbdplus.dll" libbdplus64.dll
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\mplayer.exe.bak32" mplayer.exe
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\libaacs.dll.bak32" libaacs.dll
ren "%SMPLAYER_PORTABLE_DIR%\mplayer\libbdplus.dll.bak32" libbdplus.dll
REM del "%SMPLAYER_PORTABLE_DIR%\mplayer\fonts\local.conf"
ren "%SMPLAYER_PORTABLE_DIR%\smplayer.bak" smplayer.exe
REM ren "%SMPLAYER_PORTABLE_DIR%\smtube.bak" smtube.exe

ren "%SMPLAYER_PORTABLE_DIR%\mpv\mpv.exe" mpv64.exe
ren "%SMPLAYER_PORTABLE_DIR%\mpv\mpv.com" mpv64.com
ren "%SMPLAYER_PORTABLE_DIR%\mpv\d3dcompiler_43.dll" d3dcompiler_43-64.dll
ren "%SMPLAYER_PORTABLE_DIR%\mpv\mpv.exe.bak32" mpv.exe
ren "%SMPLAYER_PORTABLE_DIR%\mpv\mpv.com.bak32" mpv.com
ren "%SMPLAYER_PORTABLE_DIR%\mpv\d3dcompiler_43.dll.bak32" d3dcompiler_43.dll

if exist "%SMPLAYER_PORTABLE_DIR%\mpv\fonts.bak32" (
  ren "%SMPLAYER_PORTABLE_DIR%\mpv\fonts.bak32" fonts
)
if exist "%SMPLAYER_PORTABLE_DIR%\mpv\mpv.bak32" (
  ren "%SMPLAYER_PORTABLE_DIR%\mpv\mpv.bak32" mpv
)

ren "%SMPLAYER_PORTABLE_DIR%" smplayer-build64

goto end

:portablesfx

if exist %PORTABLE_EXE_DIR%\smplayer-portable.exe (
  if exist %TOP_LEVEL_DIR%\smplayer-build (
  %MAKENSIS_EXE_PATH% /V3 /DVER_MAJOR=%VER_MAJOR% /DVER_MINOR=%VER_MINOR% /DVER_BUILD=%VER_BUILD% %VER_REV_CMD% %TOP_LEVEL_DIR%\smportable.nsi
  )
)

if exist %PORTABLE_EXE_DIR%\smplayer-portable64.exe (
  if exist %TOP_LEVEL_DIR%\smplayer-build64 (
  %MAKENSIS_EXE_PATH% /V3 /DVER_MAJOR=%VER_MAJOR% /DVER_MINOR=%VER_MINOR% /DVER_BUILD=%VER_BUILD% %VER_REV_CMD% /DWIN64 %TOP_LEVEL_DIR%\smportable.nsi
  )
)

goto end

:nomplayer
echo --- Creating SMPlayer w/o MPlayer Package [32-bit] ---
echo.

ren %SMPLAYER_DIR% smplayer-%ALL_PKG_VER%
set SMPLAYER_NOMP_DIR=%TOP_LEVEL_DIR%\smplayer-%ALL_PKG_VER%

::
echo Finalizing package...
7za a -t7z %OUTPUT_DIR%\smplayer-%ALL_PKG_VER%_without_mplayer.7z %SMPLAYER_NOMP_DIR% -xr!mplayer -mx9 >nul

ren %SMPLAYER_NOMP_DIR% smplayer-build

echo.
echo Restoring source folder(s) back to its original state....

goto end

:nomplayer64
echo --- Creating SMPlayer w/o MPlayer Package [64-bit] ---
echo.

ren %SMPLAYER_DIR64% smplayer-%ALL_PKG_VER%-x64
set SMPLAYER_NOMP_DIR=%TOP_LEVEL_DIR%\smplayer-%ALL_PKG_VER%-x64

::
echo Finalizing package...
7za a -t7z %OUTPUT_DIR%\smplayer-%ALL_PKG_VER%-x64_without_mplayer.7z %SMPLAYER_NOMP_DIR% -xr!mplayer -mx9 >nul

ren %SMPLAYER_NOMP_DIR% smplayer-build64

echo.
echo Restoring source folder(s) back to its original state....

goto end

:end

timeout /t 10

:superend
set ALL_PKG_VER=
set VER_MAJOR=
set VER_MINOR=
set VER_BUILD=
set VER_REVISION=
