martes, 21 de abril de 2015

[PHP] SoundCloud Downloader

Buenas, he estado algo ocupado esta semana por lo cual no he creado ninguna nueva entrada, pero en esta entrada les pondre el codigo de una clase que creé hace poco, lo unico que tienen que modificar sería la API de su soundcloud, aunque es algo 'tonta' mi clase, espero que a mas de a uno le sea de utilidad.

class.soundcloud.php

 <?php
  /** 
  * Con esta clase puedes obtener enlaces directos desde souncloud usando su API.
  * Con solo asignar la URL ya sea una playlist o un song devolvera los links o solamente el link.
  * Tambien podemos descargar los archivos.
  * 
  * @author arthusu <arthusu@gmail.com> 
  * 
  * @package SoundCloud Downloader
  * 
  * @copyright 2015 arthusu
  */
 class Soundcloud 
 {
  const STREAM = 'http://media.soundcloud.com/stream/';

  const CLIENT_API = 'AquiPonesTuApi';

  /** @var string URL para sacar JSON */
  private $api = 'http://api.soundcloud.com/resolve.json?url=URL&client_id=';

  /** @var string El identificador del SONG */
  private $id;
  /** @var string La URL del SONG o PLAYLIST */
  private $url;
  /** @var array Nombres de los SONGS */
  private $names = array();
  /**  @var string Almacena el JSON retornado */
  private $json;
  /** @var array LINKS */
  private $playlist = array();

  /**
  * Obtiene el/los titulos del Song.
  * 
  * @return array Devuelve los titulos
  */
  public function getTitle(){
   return $this->names;
  } 

  /**
  * Obtiene el JSON de la URL que le asignes, Usamos la API para obtener la informacion.
  * 
  * @param string $url La URL a retornar.
  * 
  * @return void
  */
  public function getURL($url){
   $this->url = $url;
   $this->api = $this->api . self::CLIENT_API;
   $this->json = json_decode(file_get_contents(str_replace("URL", $this->url, $this->api)));

  }

  /**
  * Obtiene el ID del JSON arrojado por la URL, el ID del SONG
  * 
  * @return void
  */
  public function getID(){
   if(!empty($this->json)){
    $this->id = $this->json->{'waveform_url'};
    array_push($this->names,$this->json->{'title'});
    $this->id = substr(parse_url($this->id, PHP_URL_PATH),1,12);
   }
  }

  /**
  * Obtiene el LINK DIRECTO de la SONG 
  * 
  * @see Soundcloud::getID()
  * 
  * @return string Devuelve la URL directa del archivo.
  */
  public function getSong(){
   self::getID();
   return self::STREAM . $this->id;
  }

  /**
  * Obtiene los LINKS DIRECTOS de la PLAYLIST
  * 
  * @see Soundcloud::getID()
  * 
  * @return array devuelve un array de links.
  */
  public function getPlaylist(){
   foreach($this->json as $obj){
    if(is_array($obj)){
     foreach($obj as $arr){
      $this->json = $arr;
      self::getID();
      array_push($this->playlist,self::STREAM . $this->id);
     }
    }
   }
   return $this->playlist;
  }

  /**
  * Descarga el archivo de La URL dada 
  * 
  * @param string $url La URL para descargar el archivo.
  * 
  * @return void
  */
  public function downloadArchive($url){
    header("Content-type: audio/mpeg"); 
    header("Content-Disposition: attachment; filename=\"".uniqid(md5(rand())) .".mp3\""); 
    header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
    header("Expires: 0"); // Fecha en el pasado
    header('Content-Description: File Transfer');
          header('Content-Transfer-Encoding: binary');
          header('Pragma: public');
    readfile($url); 
  }

 }
?>


El siguiente es un ejemplo de uso rapido:

soundcloud_downloader.php


 <?php
 set_time_limit(0);
 require_once('class.soundcloud.php');
 $soundcloud = new SoundCloud();
?>
<title>SoundCloud Downloader</title>
<style type="text/css">
 body{
  width:800px;
  margin-left: auto;
  margin-right: auto;
  text-align: center;
 }
 .right{
  width: 300px;
  padding-left: 10px;
  float:right;
  margin:10px;
  height: 30px;
 }
 .left{
  width: 300px;
  padding-right: 10px;
  float:left;
  margin:10px;
  height: 30px;
 }
 .clear{
  clear: both;
 }
</style>
<div class="clear">
<h1>SoundCloud Downloader</h1>
<form action="" method="post">
 <p>URL: <input type="text" name="url" size="100" /></p>
 <p><input type="submit" name="enviar" /></p>
</form>
</div>
<?php
 
 $playlist = "";

 if(isset($_GET["url"])){
  if(file_exists($_GET['url'])){
   echo "Tramposin";
  }else{
   $soundcloud->downloadArchive($_GET["url"]);
   exit();
  }
 }

 if(isset($_POST['enviar']) && filter_var($_POST['url'], FILTER_VALIDATE_URL)){
  
  $soundcloud->getURL($_POST['url']);

  if(stristr($_POST['url'],"sets")){
   $playlist = "on";
  }else{
   $playlist = "off";
  }
  echo '<table border="1">';
  echo '<tr>';
  switch ($playlist) {
   case 'on':
    echo '<div class="right">';
    foreach($soundcloud->getPlaylist() as $url){
      echo '<a href="?url='.$url.'">Download</a>';
      echo '<audio controls preload>
      <source src="'.$url.'" type="audio/ogg">
      Tu navegador no soporta la etiqueta audio.
      </audio><br /><hr />
      ';
    }
    echo '</div>'; 
    echo '<div class="left">';
    foreach ($soundcloud->getTitle() as $title) {
     echo $title .'<br /><hr />';
    }
    echo '</div>';
    break;
   case 'off':
    $url = $soundcloud->getSong();
    echo '<div class="right">';
    echo '<a href="?url='.$url.'">Download</a>';
    echo ' 
     <audio controls>
     <source src="'.$url.'" type="audio/ogg">
     Tu navegador no soporta la etiqueta audio.
     </audio><hr />
    ';
    echo '</div>'; 
    echo '<div class="left">';
    foreach ($soundcloud->getTitle() as $title) {
     echo $title ."<hr />";
    }
    echo '</div>';
    break;
   default:
     echo "ERROR";
    break;
  }
  echo '</table>';
 }

?>

Y bueno esta no es una entrada explicativa ni nada de eso solo dejare esto aqui y me iré, saludos!.

No hay comentarios:

Publicar un comentario