Script PHP para descargar canciones de Bandcamp

agosto 17, 2014
1 Star2 Stars3 Stars4 Stars5 Stars (2 votos, promedio: 5,00 de 5)
Cargando…

Os dejamos un pequeño script muy útil realizado por Skyflare para descargar canciones o álbumes de bandcamp.

ejemplo de canción: http://inspiredfligh…-always-takes-2
ejemplo de album: http://inspiredfligh…all-want-to-fly
ejemplo de uso: http://prntscr.com/2010i0

Por qué no hacerlo multihilo? multiproceso?
Por compatibilidad + es un script básico y posiblemente lo utilicen cuatro. lol.

Cambios:
– Añadida la posibilidad de descargar albumes completos.
– Cambio del auto-replace por compatibilidad con ‘ ‘ en vez de ‘_’.
– Cambio el tiempo de espera de 3 a 1 cuando la canción ha terminado de descargar.

<?php
set_time_limit(0);

if(!isset($argv[1]))
	exit("Usage: php downloader.php {TRACK_URL}\nEG: php downloader.php \"http://inspiredflight.bandcamp.com/track/it-always-takes-2\"");
	
if(!is_dir("downloads"))
	mkdir("downloads");
chdir("downloads");

$songs = array();

preg_match("/\/album\/([^.]+)/i", $argv[1], $album);
if(count($album) == 0) {
	$songs[substr($argv[1], strrpos($argv[1], 'track/') + 6)] = $argv[1];
} else {
	$alname = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), ' ', $album[1]);
	if(!is_dir($alname)) mkdir($alname);
	chdir($alname);
	$album = file_get_contents($argv[1]);
	$album = substr($album, strpos($album, "trackinfo :") + 13);
	$album = substr($album, 0, strpos($album, "],"));
	$album = json_decode('[' . $album . ']');
	foreach($album as $i => $u)
		$songs[$u->title] = substr($argv[1], 0, strrpos($argv[1], '/album/')) . $u->title_link;
}

print "Working Directory: " . getcwd() . PHP_EOL;


foreach($songs as $i => $u) {
	try {
		/* Get song information */
			$file = @file_get_contents($u);
			if($file === false)
				throw new Exception("We couldn't find a song at \"{$u[1]}\".");
			$trim  = substr($file, strpos($file, "trackinfo:") + 12);
			$trim  = substr($trim, 0, strpos($trim, "],"));
			$song  = json_decode($trim);
			print "Attempting to download: {$song->title}" . PHP_EOL;
			/* I know the title is in $i, but it's lowercased. */
			$song->title = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), ' ', $song->title);
		/* Get song download URL */
			$links = array_values((array) $song->file);
				$socket = fsockopen(substr($links[0], 7, strpos($links[0], '/', 7) - 7), 80);
				$write  = "GET " . (substr($links[0], strpos($links[0], "/d"))) . " HTTP/1.1\r\n";
				$write .= "Host: " . substr($links[0], 7, strpos(substr($links[0], 7), "/")) . "\r\n\r\n";
				fwrite($socket, $write);
				$header = fread($socket, 1204);
				fclose($socket);
		/* Download song */
			$dnld = substr($header, strpos($header, "Location: ") + 10);
			$dnld = substr($dnld, 0, strpos($dnld, "\r"));
				$socket = fsockopen(substr($dnld, 7, strpos($dnld, '/', 7) - 7), 80);
				$write  = "GET " . substr($dnld, strpos($dnld, "/", 7)) . " HTTP/1.1\r\n";
				$write .= "Host: " . substr($dnld, 7, strpos(substr($dnld, 7), "/")) . "\r\n\r\n";
				fwrite($socket, $write);
				touch("./{$song->title}.mp3");
				list($read, $null, $data, $clen, $fhandle) = array(array($socket), null, "", 0, fopen("./{$song->title}.mp3", "w"));
				$len = fread($read[0], 1204);
				$len = substr($len, strpos($len, "Content-L") + 16);
				$len = substr($len, 0, strpos($len, "\r"));
				while(@stream_select($read, $null, $null, 1) > 0) {
					$data = fread($read[0], 2048);
					if($data == "") break;
					fwrite($fhandle, $data);
					$clen += strlen($data);
					print "\rDownloaded " . number_format($clen / $len * 100, 2) . "%";
				}
		/* END fun stuffs */
		print PHP_EOL . "Download complete";
		print PHP_EOL . "Downloaded song was saved to " . getcwd() . str_repeat(PHP_EOL, 3);
	} catch(Exception $e) { print $e->getMessage(); }
}
print PHP_EOL . "Press Enter to continue."; fgets(STDIN);
exit;
?>

2 pensamientos en “Script PHP para descargar canciones de Bandcamp

  1. paolo

    pues no quiero molestar pero soy nuevo en scripts y eso, pero me llamo mucho la atención de poder descargar álbumes enteros sin tener que descargar musica por musica en bandcamp, pues no se utilizar este método asi que no se si ustedes me podrían explicar mejor como utilizar este y aplicarlo para descargar álbumes por doquier XP.
    Muchas gracias por la comprensión

    1. Hackeando el GenomaHackeando el Genoma Autor

      Hola Paolo, Para usar un código script, en este caso PHP necesitarás tener instalado un servidor web que pueda ejecutar PHP, una vez instalado simplemente puedes ejecutar el script accediendo al archivo mediante el navegador o mediante la linea de comandos:

      $ php ruta_al_archivo.php
      

      Espero que te sirva, un saludo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *