[BATCH] Randomizar listas m3u

Iniciado por morgothic, 14 Octubre 2012, 17:16 PM

0 Miembros y 1 Visitante están viendo este tema.

morgothic

Hola! Es la primera vez que escribo en el foro, así que saludos a tod@s!

Os pido ayuda a vosotros dado que no tengo idea de programación :$

Os expongo brevemente el caso. Desde hace tiempo juego a Guild Wars 2 y en éste la música llega a ser bastante repetitiva. Existe la opción de crear hasta 8 listas de reproducción diferentes, cada una para una situación (Ambiente, batalla, noche, etc). Hasta ahí todo bien, lo que ocurre es que el juego no te randomiza las listas, simplemente las reproduce una y otra vez desde el principio cada vez que accedes al juego.

Tras mucho investigar, hacer pruebas y tal, la única opción que se me ocurrió fue añadir algún código al .m3u que randomizara directamente los temas sin necesidad de marcar "Shuffle" en los reproductores, pero me ha sido imposible lograrlo, quizá no da esa opción el m3u...

Consultando por el foro ví un post de EleKtro H@cker en el cual comentaba algo sobre Randomizar lineas en un txt:

Código (dos) [Seleccionar]
@Echo OFF
Setlocal enabledelayedexpansion

Set Carpeta=%~n0

Echo #EXTM3U>"%Temp%\Lista Winamp.tmp"
For /F "Tokens=*" %%$ in ('Dir /B /S "%CARPETA%" ^| Findstr /R ".aif .flac .m4a .mid .mp3 .ogg .wav .wma"') do (Echo  !Random!!Random!!Random!;%%$>>"%Temp%\Lista Winamp.tmp")

Echo #EXTM3U>"%Temp%\Lista Winamp.m3u"
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\Lista Winamp.tmp" ^| Sort ') do (Echo  %%a>>"%Temp%\Lista Winamp.m3u")
Start /B C:"\Program Files (x86)\Winamp\winamp.exe" "%Temp%\Lista Winamp.m3u"

Exit


Aún no estoy seguro si debería investigar por este camino, si me podría funcionar... ¿Creéis que es posible hacer algun ejecutable para arrancarlo antes del juego y que modifique las listas rápida y facilmente?

Gracias a todos y disculpad mi ignorancia.

Eleкtro

#1
Hola de nuevo xD

Hombre, ese código lo que hace es listar todos los archivos de música de un directorio, y añadirlos en un m3u (randomizando los archivos en las lineas), y creo que lo que tú quieres es desorganizar las lineas que ya contiene un archivo m3u, así que habría que hacerle algún pequeño retoque:

CORREGIDO:
@Echo OFF
Title Randomizador de listas de reproduccion M3U (by Elektro H@cker^)

PUSHD "C:\CARPETA DE LAS LISTAS"

Echo [ Procesando listas... ] | MORE
FOR /R %%@ IN (*.M3U) DO (
Echo [+] %%~nx@
Echo #EXTM3U>"%Temp%\%%~n@.tmp"
Echo #EXTM3U>"%Temp%\%%~n@.m3u"
FOR /F "TOKENS=*" %%# IN ('TYPE "%%@" ^| FINDSTR /V /I "#EXTM3U #EXTINF"') DO (
CALL ECHO %%Random%%%%Random%%%%Random%%;%%#>>"%Temp%\%%~n@.tmp")
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\%%~n@.tmp" ^| Sort') do (Echo %%a>>"%Temp%\%%~n@.m3u")
(Move /Y "%Temp%\%%~n@.m3u" "%%@" >NUL && (Echo OK!) || (Echo ERROR... & Pause)) | MORE
)

REM Con este comando ejecutas el juego directamente...
REM Start /B /D "C:\Carpeta del Guild Wars 2\" "guildwars2.exe"

PAUSE&EXIT




EDITO: No necesitas convertirlo a EXE ni nada, ejecuta el bat y el bat ya se encarga de ejecutar luego el juego. puedes crear un acceso directo del bat al escritorio para ponerle un icono bonito como el del guild wars...

Saludos








morgothic

Hola! He editado el código para ponerle las rutas a carpetas y tal:

@Echo OFF
Title Randomizador de listas de reproduccion M3U (by Elektro H@cker^)

PUSHD "C:\Guild Wars 2\Music"

Echo [ Procesando listas... ] | MORE
FOR /R %%@ IN (*.M3U) DO (
Echo [+] %%~nx@
Echo #EXTM3U>"%Temp%\%%~n@.tmp"
Echo #EXTM3U>"%Temp%\%%~n@.m3u"
FOR /F "TOKENS=*" %%# IN ('TYPE "%%@" ^| FINDSTR /V /I "#EXTM3U #EXTINF"') DO (
CALL ECHO %%Random%%%%Random%%%%Random%%!!%%#>>"%Temp%\%%~n@.tmp")
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\%%~n@.tmp" ^| Sort') do (Echo %%a>>"%Temp%\%%~n@.m3u")
(Move /Y "%Temp%\%%~n@.m3u" "%%@" >NUL && (Echo OK!) || (Echo ERROR... & Pause)) | MORE
)

REM Con este comando ejecutas el juego directamente...
REM Start /B /D "C:\Guild Wars 2\" "Gw2.exe"

PAUSE&EXIT


Al ejecutarlo me borra el contenido de todas las listas, me las devuelve vacías. Esto es lo que vería en una lista normal en el bloc de notas:

#EXTM3U
#EXTINF:141,Two Steps From Hell (310 985-1 - From The Abyss
C:\Guild Wars 2\Music\MainMenu\1-06 From The Abyss.mp3
#EXTINF:156,Two Steps From Hell (310 985-1 - Born Of Ash
C:\Guild Wars 2\Music\MainMenu\1-13 Born Of Ash.mp3
#EXTINF:208,Midnight Syndicate - Living Walls
C:\Guild Wars 2\Music\MainMenu\22 - Living Walls.mp3


Y al ejecutar el .bat, tan sólo me devuelve una sóla linea con #EXTM3U

La música la tengo en carpetas ordenadas y todas las listas a parte en una única carpeta, te lo digo como info, pero no creo que tenga nada que ver. Qué me puede estar fallando?

Gracias! Aaag! Casi está!! jajaja (llevo 3 días buscando una solución para esto y ahora siento que está a punto! muy muy agradecido EleKtro H@cker)

Eleкtro

Hola,

Al pegar el código en el foro con la etiqueta de BATCH me ha insertado dos caracteres de exclamación !!
Código (dos) [Seleccionar]
%%Random%%;%%#
Es un error del plugin del foro, ya lo he puesto sin etiquetas, ahora puedes copiarlo que funciona bien.

saludos








morgothic

BRAVO!!!!!!!! 1k gracias! Funciona a la perfección! Las listas cambian perfectamente, pero no ejecuta el gw2.exe. Cuando lo ejecuto, me indica que no encuentra la ruta o algo así:

El nombre de archivo, directorio o etiqueta del volumen no es válido

Y la ruta que pongo está correcta, es la del juego:

REM Start /B /D "C:\Guild Wars 2\" "Gw2.exe" ??????

Bueno, de todas maneras, ya me has ayudado infinitamente, buscaré algo de info del comando REM he intentaré hacerlo yo.

Muchas gracias por todo y nada, empezaré a tocar un poco de python y ruby a ver que tal ;)

Novlucker

REM se utiliza para comentar código, debes de quitarlo si quieres que se ejecute el start :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

morgothic

XDD ok ................  :¬¬ (i'm so nooooob)

morgothic

Una cosa más...

No reparé en una cosa!

Con respecto al randomizador: Rula correctamente en cuanto al winamp, media player, etc respecta, pero el juego no lee esos m3u. Me explico:

Así se ve en el bloc de notas antes de ejecutar el bat:
#EXTM3U
#EXTINF:0,1-02 Super Strength 2.mp3
MainMenu\1-02 Super Strength 2.mp3

#EXTINF:0,1-06 From The Abyss.mp3
MainMenu\1-06 From The Abyss.mp3

#EXTINF:0,1-11 The Summoning orc.mp3
MainMenu\1-11 The Summoning orc.mp3

#EXTINF:0,1-13 Born Of Ash.mp3
MainMenu.... etc etc etc


Y así tras ejecutarlo:
#EXTM3U
MainMenu\1-13 Born Of Ash.mp3
MainMenu\12 Fill My Heart (No Choir).mp3
MainMenu\1-02 Super Strength 2.mp3
MainMenu\1-11 The Su... etc etc etc


¿Cómo puedo conseguir que el ejecutable me escriba también los #EXTINF? Sería algo así como "#EXTINF:0," donde el 0 representa la longitud de la pista en segundos (0 = toda la pista) y el nombre de la pista

Eleкtro

Entonces prueba así:

@Echo OFF
Title Randomizador de listas de reproduccion M3U (by Elektro H@cker^)

Echo [ Procesando listas... ] | MORE
FOR /R %%@ IN (*.M3U) DO (
Echo [+] %%~nx@
Echo #EXTM3U|MORE>"%Temp%\%%~n@.tmp"
Echo #EXTM3U|MORE>"%Temp%\%%~n@.m3u"
FOR /F "TOKENS=*" %%# IN ('TYPE "%%@" ^| FINDSTR /V /I "#EXTM3U MAINMENU"') DO (
CALL ECHO %%Random%%%%Random%%%%Random%%;%%#>>"%Temp%\%%~n@.tmp")
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\%%~n@.tmp" ^| Sort') do (
Echo %%a>>"%Temp%\%%~n@.m3u"
For /F "Tokens=2* Delims=," %%A in ('echo %%a') do (Echo MainMenu\%%A|MORE>>"%Temp%\%%~n@.m3u"))
(Move /Y "%Temp%\%%~n@.m3u" "%%@" >NUL && (Echo OK!) || (Echo ERROR... & Pause)) | MORE
)
Start /B /D "C:\Guild Wars 2\" "Gw2.exe"
PAUSE&EXIT



output:
#EXTM3U

#EXTINF:0,1-13 Born Of Ash.mp3
MainMenu\1-13 Born Of Ash.mp3

#EXTINF:0,1-02 Super Strength 2.mp3
MainMenu\1-02 Super Strength 2.mp3

#EXTINF:0,1-11 The Summoning orc.mp3
MainMenu\1-11 The Summoning orc.mp3

#EXTINF:0,1-06 From The Abyss.mp3
MainMenu\1-06 From The Abyss.mp3








morgothic

Buenos días a todos!

Para finalizar con este post, pudiendo darlo por resuelto anotaré aquí todo el código fuente. La idea de que con esa última formula que anotó EleKtro H@cker una de las playlist quedase perfecta me llevó a copiarla y cambiar el nombre también para las otras carpetas. Quizá haya una manera mas sencilla de programarlo todo, pero esta sin duda funciona a la perfección.

@Echo OFF
color 0c
Title Randomizador de listas de reproduccion M3U (by Elektro H@cker^)

PUSHD "C:\Guild Wars 2\Music"

Echo [ Procesando listas... ] | MORE
FOR /D %%@ IN (MAINMENU.M3U) DO (
Echo [+] %%~nx@
Echo #EXTM3U|MORE>"%Temp%\%%~n@.tmp"
Echo #EXTM3U|MORE>"%Temp%\%%~n@.m3u"
FOR /F "TOKENS=*" %%# IN ('TYPE "%%@" ^| FINDSTR /V /I "#EXTM3U MAINMENU"') DO (
CALL ECHO %%Random%%%%Random%%%%Random%%;%%#>>"%Temp%\%%~n@.tmp")
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\%%~n@.tmp" ^| Sort') do (
Echo %%a>>"%Temp%\%%~n@.m3u"
For /F "Tokens=2* Delims=," %%A in ('echo %%a') do (Echo MainMenu\%%A|MORE>>"%Temp%\%%~n@.m3u"))
(Move /Y "%Temp%\%%~n@.m3u" "%%@" >NUL && (Echo OK!) || (Echo ERROR... & Pause)) | MORE
)
FOR /D %%@ IN (AMBIENT.M3U) DO (
Echo [+] %%~nx@
Echo #EXTM3U|MORE>"%Temp%\%%~n@.tmp"
Echo #EXTM3U|MORE>"%Temp%\%%~n@.m3u"
FOR /F "TOKENS=*" %%# IN ('TYPE "%%@" ^| FINDSTR /V /I "#EXTM3U AMBIENT"') DO (
CALL ECHO %%Random%%%%Random%%%%Random%%;%%#>>"%Temp%\%%~n@.tmp")
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\%%~n@.tmp" ^| Sort') do (
Echo %%a>>"%Temp%\%%~n@.m3u"
For /F "Tokens=2* Delims=," %%A in ('echo %%a') do (Echo Ambient\%%A|MORE>>"%Temp%\%%~n@.m3u"))
(Move /Y "%Temp%\%%~n@.m3u" "%%@" >NUL && (Echo OK!) || (Echo ERROR... & Pause)) | MORE
)
FOR /D %%@ IN (BATTLE.M3U) DO (
Echo [+] %%~nx@
Echo #EXTM3U|MORE>"%Temp%\%%~n@.tmp"
Echo #EXTM3U|MORE>"%Temp%\%%~n@.m3u"
FOR /F "TOKENS=*" %%# IN ('TYPE "%%@" ^| FINDSTR /V /I "#EXTM3U BATTLE"') DO (
CALL ECHO %%Random%%%%Random%%%%Random%%;%%#>>"%Temp%\%%~n@.tmp")
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\%%~n@.tmp" ^| Sort') do (
Echo %%a>>"%Temp%\%%~n@.m3u"
For /F "Tokens=2* Delims=," %%A in ('echo %%a') do (Echo BATTLE\%%A|MORE>>"%Temp%\%%~n@.m3u"))
(Move /Y "%Temp%\%%~n@.m3u" "%%@" >NUL && (Echo OK!) || (Echo ERROR... & Pause)) | MORE
)
FOR /D %%@ IN (BOSSBATTLE.M3U) DO (
Echo [+] %%~nx@
Echo #EXTM3U|MORE>"%Temp%\%%~n@.tmp"
Echo #EXTM3U|MORE>"%Temp%\%%~n@.m3u"
FOR /F "TOKENS=*" %%# IN ('TYPE "%%@" ^| FINDSTR /V /I "#EXTM3U BOSSBATTLE"') DO (
CALL ECHO %%Random%%%%Random%%%%Random%%;%%#>>"%Temp%\%%~n@.tmp")
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\%%~n@.tmp" ^| Sort') do (
Echo %%a>>"%Temp%\%%~n@.m3u"
For /F "Tokens=2* Delims=," %%A in ('echo %%a') do (Echo BOSSBATTLE\%%A|MORE>>"%Temp%\%%~n@.m3u"))
(Move /Y "%Temp%\%%~n@.m3u" "%%@" >NUL && (Echo OK!) || (Echo ERROR... & Pause)) | MORE
)
FOR /D %%@ IN (CITY.M3U) DO (
Echo [+] %%~nx@
Echo #EXTM3U|MORE>"%Temp%\%%~n@.tmp"
Echo #EXTM3U|MORE>"%Temp%\%%~n@.m3u"
FOR /F "TOKENS=*" %%# IN ('TYPE "%%@" ^| FINDSTR /V /I "#EXTM3U CITY"') DO (
CALL ECHO %%Random%%%%Random%%%%Random%%;%%#>>"%Temp%\%%~n@.tmp")
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\%%~n@.tmp" ^| Sort') do (
Echo %%a>>"%Temp%\%%~n@.m3u"
For /F "Tokens=2* Delims=," %%A in ('echo %%a') do (Echo CITY\%%A|MORE>>"%Temp%\%%~n@.m3u"))
(Move /Y "%Temp%\%%~n@.m3u" "%%@" >NUL && (Echo OK!) || (Echo ERROR... & Pause)) | MORE
)
FOR /D %%@ IN (CRAFTING.M3U) DO (
Echo [+] %%~nx@
Echo #EXTM3U|MORE>"%Temp%\%%~n@.tmp"
Echo #EXTM3U|MORE>"%Temp%\%%~n@.m3u"
FOR /F "TOKENS=*" %%# IN ('TYPE "%%@" ^| FINDSTR /V /I "#EXTM3U CRAFTING"') DO (
CALL ECHO %%Random%%%%Random%%%%Random%%;%%#>>"%Temp%\%%~n@.tmp")
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\%%~n@.tmp" ^| Sort') do (
Echo %%a>>"%Temp%\%%~n@.m3u"
For /F "Tokens=2* Delims=," %%A in ('echo %%a') do (Echo CRAFTING\%%A|MORE>>"%Temp%\%%~n@.m3u"))
(Move /Y "%Temp%\%%~n@.m3u" "%%@" >NUL && (Echo OK!) || (Echo ERROR... & Pause)) | MORE
)
FOR /D %%@ IN (NIGHTTIME.M3U) DO (
Echo [+] %%~nx@
Echo #EXTM3U|MORE>"%Temp%\%%~n@.tmp"
Echo #EXTM3U|MORE>"%Temp%\%%~n@.m3u"
FOR /F "TOKENS=*" %%# IN ('TYPE "%%@" ^| FINDSTR /V /I "#EXTM3U NIGHTTIME"') DO (
CALL ECHO %%Random%%%%Random%%%%Random%%;%%#>>"%Temp%\%%~n@.tmp")
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\%%~n@.tmp" ^| Sort') do (
Echo %%a>>"%Temp%\%%~n@.m3u"
For /F "Tokens=2* Delims=," %%A in ('echo %%a') do (Echo NIGHTTIME\%%A|MORE>>"%Temp%\%%~n@.m3u"))
(Move /Y "%Temp%\%%~n@.m3u" "%%@" >NUL && (Echo OK!) || (Echo ERROR... & Pause)) | MORE
)
FOR /D %%@ IN (UNDERWATER.M3U) DO (
Echo [+] %%~nx@
Echo #EXTM3U|MORE>"%Temp%\%%~n@.tmp"
Echo #EXTM3U|MORE>"%Temp%\%%~n@.m3u"
FOR /F "TOKENS=*" %%# IN ('TYPE "%%@" ^| FINDSTR /V /I "#EXTM3U UNDERWATER"') DO (
CALL ECHO %%Random%%%%Random%%%%Random%%;%%#>>"%Temp%\%%~n@.tmp")
For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\%%~n@.tmp" ^| Sort') do (
Echo %%a>>"%Temp%\%%~n@.m3u"
For /F "Tokens=2* Delims=," %%A in ('echo %%a') do (Echo UNDERWATER\%%A|MORE>>"%Temp%\%%~n@.m3u"))
(Move /Y "%Temp%\%%~n@.m3u" "%%@" >NUL && (Echo OK!) || (Echo ERROR... & Pause)) | MORE
)

call "C:\Guild Wars 2\Gw2.exe"

exit


Un poco largo todo, no? Pero funciona perfectamente. De nuevo gracias a todos por ayudarme y un saludo!