Fecha actual Jue Jun 27, 2019 7:06 am

Reproductor de Streams ShoutCast de NullSoft en PHP (Radio en Internet)

Programas creados por nosotros.

Usuarios leyendo este tema: Ninguno

Reproductor de Streams ShoutCast de NullSoft en PHP (Radio en Internet)

Notapor ~ » Lun Feb 18, 2013 6:22 am

NOTA: Si hay alguna petición o algo en particular que debería agregar a este programa, o consultas sobre cualquier duda, por favor hacerlas saber en este tema.

Estos son ejemplos de listas de reproducción actualmente corriendo en este sito web, que usan el presente programa. Es recomendable abrirlos con VLC Media Player, o un reproductor capaz de abrir URLs. En VLC se usa la opción "Abrir">"Volcado de Red", o Ctrl+N:

Sin títulos (también para escuchar en Firefox y Chrome):
Conet Project
Música Variada
Sonic 3D Blast
Chi No Rondo
Radio Jacaro

Con títulos (puede producir baches de sonido si no se soportan):
Conet Project
Música Variada
Sonic 3D Blast
Chi No Rondo
Radio Jacaro


Para correr este programa simplemente necesitamos copiar el código fuente en un archivo PHP en nuestro servidor.

Después de eso, necesitamos un archivo de texto que contenga 2 renglones por archivo, con una ruta relativa o absoluta de archivo, y una cadena de texto ASCII de 7 bits (solo con caracteres ingleses), y así sucesivamente:

Ejemplo de Archivo (por ejemplo en C:/canciones.txt)
Código: Seleccionar todo
C:/Musica/Rhapsody.mp3
[Nombre de Artista] - [Nombre de Cancion]



Lo siguiente que necesitamos es correr el script. Por defecto el script genera los títulos de las canciones desde el archivo de texto plano de lista de reproducción, si lo corremos así:

http://localhost/SHOUTcast_radio.php

Sin embargo eso provoca baches en el sonido si el programa (tal como un navegador web, como Chrome) no soporta streaming de títulos. Para desactivar el streaming de títulos, corremos el programa así:

http://localhost/SHOUTcast_radio.php?use_stream_titles=no

También podemos especificar un nombre de lista de reproducción:

http://localhost/SHOUTcast_radio.php?playlist=nombre_lista_reproduccion

Esto apuntará a un archivo de texto diferente al predeterminado.


A continuación está el código fuente completo del programa. Por ahora no es capaz de servir el mismo streaming a todos los clientes ni de streaming en vivo, sino que cada cliente obtiene simplemente una canción al azar cada vez que comienza a reproducir la radio. Así que por ahora es bueno solo para streaming de listas de reproducción aleatorias (como si fuera un reproductor local, pero desde Internet).

El script también usa el protocolo HTTP en lugar del protocolo ICY puro (afortunadamente el protocolo ICY está diseñado para degradarse con gracia y funcionar sobre HTTP puro si no se soporta ICY nativo).

IMPORTANTE: Antes que nada debemos configurar las variables $SongsListDir y $SongsListFile en el código fuente para que apunte a nuestro directorio de listas de reproducción de archivos de texto plano de lista de reproducción, y a la lista de reproducción por defecto, cuyo formato explicamos al inicio de esta página.


Código Fuente Inicial
Código: Seleccionar todo
<?php
 //Aquí configuramos la ruta relativa o absoluta
 //a un archivo de texto plano que contiene las rutas,
 //también absolutas o relativas, de cada archivo MP3,
 //y también los títulos escritos con ASCII de 7 bits
 //(es decir solo caracteres de Inglés):
 ///
 //Ruta relativa, o...
 ///
  //$SongsListDir="";

 //Ruta absoluta:
 ///
   $SongsListDir="C:/";

 //Lista por defecto de reproducción
 //de texto plano:
 ///
   $SongsListFile="canciones.txt";


/*******
**
**
** Reproductor/Servidor de Radio SHOUTcast en PHP
** -----------------------------------------------
**
** Fecha: Lunes, Febrero 18, 2012, 07:04:31 AM
**
**
** Está descargando este tutorial y recursos asociados
** de:
**
**
** http://devel.no-ip.org/
**
** Este paquete fue publicado por primera vez en el Internet
** y EN ESPAÑOL en:
**
** http://devel.no-ip.org/forum/viewtopic.php?t=477
** http://devel.no-ip.org/projects/webengines/PD_PHP_SHOUTcast/
**
**
** Usted debería ser capaz de encontrar registros sobre ello en
** la mayoría de motores de búsqueda y en http://www.archive.org/
**
**
** Este paquete está por defecto bajo una licencia de dominio público.
** Puede hacer lo que desee con esto.
**
**
**
** Si por alguna razón el concepto de "dominio público" no es
** legalmente reconocido en su país o jurisdicción, este paquete
** ha de estar bajo la siguiente licencia:
**
**
**
** http://creativecommons.org/publicdomain/zero/1.0/deed.es_ES
**
**
**
** Creative Commons 0 1.0 Universal (CC0 1.0)
**
**
** Esta es la equivalente legal al Dominio Público.
**
**
**
** ****************************************************************************
** * Se concede el permiso de usar, modificar y/o redistribuír a voluntad.    *
** *                                                                          *
** * Esto incluye eliminar noticias de autoría, reutilización de partes de    *
** * código en otro software (dando o no dando crédito), y/o crear un         *
** * producto comercial basado en este.                                       *
** *                                                                          *
** * Este permiso no es revocable por el autor.                               *
** *                                                                          *
** * Este software se provee tal como es. Use bajo su propio riesgo. No hay   *
** * ninguna garantía, expresada o implícita, y al utilizar este software     *
** * usted acepta que el o los autores no pueden ser hechos responsables por  *
** * ninguna pérdida de datos, pérdida de servicio, u otros daños, sean estos *
** * incidentales o consecuenciales. Su única opción además de aceptar estos  *
** * términos es: No utilizar este software.                                  *
** *                                                                          *
** ****************************************************************************
**
**
** Si por alguna razón elige no usar una licencia de
** dominio público, debe usar la siguiente licencia
** ISC (Internet Systems Consortium, o Consorcio
** de Sistemas de Internet):
**
**
**
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
**
** ****************************************************************************
** * Permiso para usar, copiar, modificar y/o distribuír este software para   *
** * cualquier propósito con o sin remuneración es concedido, siempre que     *
** * la noticia anterior de copyright y esta noticia de permiso aparezca en   *
** * todas las copias.                                                        *
** *                                                                          *
** * EL SOFTWARE SE PROVEE "TAL COMO ES" Y EL AUTOR RENUNCIA A TODA GARANTÍA  *
** * RELACIONADA AL SOFTWARE INCLUYENDO TODAS LAS GARANTÍAS IMPLÍCITAS DE     *
** * COMERCIABILIDAD Y CONVENIENCIA. EN NINGÚN EVENTO PODRÁ EL AUTOR HACERSE  *
** * RESPONSABLE POR NINGÚN DAÑO ESPECIAL, DIRECTO, INDIRECTO O CONSECUENCIAL *
** * O NINGÚN OTRO DAÑO QUE RESULTE EN PÉRDIDAS DE USO, DATOS O GANANCIAS, YA *
** * SEA EN UNA ACCIÓN O CONTRATO, NEGLIGENCIA U OTRA ACCIÓN EXTRACONTRACTUAL,*
** * QUE SE PRODUZCA POR O EN CONEXIÓN CON EL USO O RENDIMIENTO DE ESTE       *
** * SOFTWARE.                                                                *
** ****************************************************************************
**
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
**
**
**
**
** NOTICIA: Todo derecho de autor emitido fuera de los términos
**          de licencia anteriores, o intentos de privatizar este
**          software, serán ignorados por todos, incluso para trabajos
**          derivados que constituyan una simple copia de esta base
**          del código central. Puede por supuesto usar sus propios
**          algoritmos así como los que se presentan aquí, y
**          copiarlos y utilizarlos libremente en otros productos, pero
**          dejando este paquete de código fuente original libre.
**          Esto es para preservar la naturaleza libre de este paquete
**          de software en su forma original. Hasta al menos Febrero
**          de 2013, el autor de este software planea darle desarrollo
**          continuado a este paquete de software. Usted está invitado
**          a contribuír con modificaciones y mejoras públicas.
**
**          Como un producto genérico de uso público, esta implementación
**          no puede ser patentada.
**
**          Usted debería descargar y usar este software solamente si
**          acepta los términos de esta licencia.
**
**
**
*******/

 ob_end_clean();

 $MetaTitle=TRUE;

 set_time_limit(0);

 if(strcmp($_GET["use_stream_titles"],"no")===0)
  $MetaTitle=FALSE;



 if(
    isset($_GET["playlist"]) &&
    strpos($_GET["playlist"],"/")===FALSE &&
    strpos($_GET["playlist"],"\\")==FALSE
  )
 {
  $SongsListFile=$SongsListDir.$_GET["playlist"].".txt";
 }
  else
   $SongsListFile=$SongsListDir.$SongsListFile;




function getFileSize($filename)
{
 $getFileSize__h1=NULL;
 $getFileSize__toRet=0;

 if($getFileSize__h1=fopen($filename,"r"))
 {
  fseek($getFileSize__h1, 0, SEEK_END);
  $getFileSize__toRet=ftell($getFileSize__h1);
  fclose($getFileSize__h1);
 }

 return $getFileSize__toRet;
}



function CreateStreamTitle($title, $done)
{
 if($done)return "\0";

 $R="StreamTitle='".$title."';StreamUrl='';";

// $sz=strlen($R)%16;
 $sz=strlen($R)&0x0F;


 $zeros="";

// $lines16=(strlen($R)/16)|0;
 $lines16=(strlen($R)>>4);
 if($sz!=0)
 {
  for($z=0;$z<16-$sz;$z++)
  {
   $zeros=$zeros."\0";
  }
  $lines16++;
 }

 $R=chr($lines16).$R.$zeros;

 return $R;
}


function flusher()
{
 flush();
 print "";
 flush();
 flush();
}


function pad_buffer($buff, $desired_sz)
{
 $buffsz=strlen($buff);
 $pad=$desired_sz-$buffsz;

 if($pad!=0)
 {
  for($p=0;$p<$pad;$p++)
  {
   $buff=$buff."\0";
   //$buff=$buff.chr(mt_rand(1, 255));
  }
 }

 return $buff;
}
















header("icy-notice1:<BR>This stream requires <a href=\"http://www.winamp.com/\">Winamp</a><BR>");
header("icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>");
header("icy-name:Radio Devel");
header("icy-genre:Musica");
//if($MetaTitle)header("icy-metadata:1");
header("icy-url:http://devel.cable-modem.org/conet");
header("content-type:audio/mpeg");
header("icy-pub:1");
if($MetaTitle)header("icy-metaint:32768");
header("icy-br:64");
header('Pragma: no-cache');
header('Cache-Control: no-cache, no-store, max-age=0');
header( $_ENV['SERVER_PROTOCOL']." 200 OK", true, 200 );


$offst=0;


$zsong=file_get_contents($SongsListFile);

if(strlen($zsong)<=0)
{
 //Activar esta línea si se desea causar un mensaje de error
 //en el reproductor, en lugar de simplemente terminar de inmediato
 //si se especificó una lista de reproducción no existente:
 ///
 //header( $_ENV['SERVER_PROTOCOL']." 404 Not Found", true, 404 );
 return;
}

$zsong=str_replace("\r\n", "\n", $zsong);
$zsong=str_replace("\r", "\n", $zsong);

$songs_list=explode("\n", $zsong);



//$rand_song=(mt_rand(0,count($songs_list)/2-1));
//$f1=$songs_list[$rand_song*2];
$rand_song=(mt_rand(0,(count($songs_list)>>1)-1));
$f1=$songs_list[$rand_song<<1];
$fzize=getFileSize($f1)-$offst;
//$intpart=(($fzize/32768)|0);
//$floatpart=$fzize-($intpart*32768);
$intpart=($fzize>>15);
$floatpart=$fzize-($intpart<<15);










if($floatpart!=0)$intpart++;

$file1=fopen($f1, "rb");

$title_sent=0;


//$SongTitle=$songs_list[$rand_song*2+1];
$SongTitle=$songs_list[($rand_song<<1)+1];
$intpart_bak=$intpart;
while(1)
{
  $title_sent=FALSE;
  while($intpart>0)
  {
    ob_start();
    $v=(pad_buffer(fread($file1, 32768), 32768));

    print $v;
    if($MetaTitle)
    {
      $v=CreateStreamTitle($SongTitle, $title_sent);flush();
      print $v;
    }


    $title_sent=TRUE;
    $intpart--;
    ob_end_flush();
    flush();
  }

 fclose($file1);
 //$rand_song=(mt_rand(0,(count($songs_list)/2)-1));
 //$f1=$songs_list[$rand_song*2];
 $rand_song=(mt_rand(0,(count($songs_list)>>1)-1));
 $f1=$songs_list[$rand_song<<1];
 $fzize=getFileSize($f1)-$offst;
// $intpart=(($fzize/32768)|0);
// $floatpart=$fzize-($intpart*32768);
 $intpart=($fzize>>15);
 $floatpart=$fzize-($intpart<<15);
 if($floatpart!=0)$intpart++;
 $file1=fopen($f1, "rb");
 //$SongTitle=$songs_list[($rand_song*2)+1];
 $SongTitle=$songs_list[($rand_song<<1)+1];
}

 //El mero hecho de que hayamos pedido una lista de reproducción
 //válida en un parámetro de URL, significa que ya hemos servido
 //una aplicación web válida, y por lo tanto debemos detenernos
 //aquí (sin error 404), aunque normalmente el script siempre
 //se interrumpirá en el bucle principal.
 ///
  return;
?>

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2945
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Reproductor de Streams ShoutCast de NullSoft en PHP

Notapor ~ » Lun Feb 18, 2013 7:40 am

Otros parámetros a agregar en el futuro son:

disable_random_playing=yes
start_song=N
songs_to_play=N
repeat_current=yes
playlist_name=String
start_file_offset=N
end_file_offset=N
start_file_time=N
end_file_time=N
fadein=N
fadeout=N
silence=N
volume=N
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2945
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Reproductor de Streams ShoutCast de NullSoft en PHP

Notapor ~ » Lun May 20, 2013 12:02 am

ZIP PHP_SHOUTcast_Player-2013-05-19.zip

Este archivo contiene la versión anterior implementada de este script, y también una primera y segunda prueba que implementan la capacidad inicial de servir un stream de audio "en vivo", lo cual logran al posicionarse constantemente en la porción de audio más al final del archivo, y leer el contenido que se acumula en un archivo MP3 mientras no se alcance EOF. También detecta si hay una brecha considerable entre la posición actual del archivo y el tamaño total del archivo, en cuyo caso actualiza la posición para posicionarse nuevamente muy cerca del final del archivo, para dar el efecto de streaming de audio en vivo y el efecto de multicast.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2945
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Reproductor de Streams ShoutCast de NullSoft en PHP

Notapor ~ » Lun May 27, 2013 6:48 pm

Código de la última versión:

Código: Seleccionar todo
<?php
 //Aquí configuramos la ruta relativa o absoluta
 //a un archivo de texto plano que contiene las rutas,
 //también absolutas o relativas, de cada archivo MP3,
 //y también los títulos escritos con ASCII de 7 bits
 //(es decir solo caracteres de Inglés):
 ///
 //Ruta relativa, o...
 ///
  //$SongsListDir="";

 //Ruta absoluta:
 ///
   $SongsListDir="C:/";

 //Lista por defecto de reproducción
 //de texto plano:
 ///
   $SongsListFile="conet.txt";


/*******
**
**
** Reproductor/Servidor de Radio SHOUTcast en PHP
** -----------------------------------------------
**
** Fecha: Lunes, Febrero 18, 2012, 07:04:31 AM
**
**
** Está descargando este tutorial y recursos asociados
** de:
**
**
** http://devel.no-ip.org/
**
** Este paquete fue publicado por primera vez en el Internet
** y EN ESPAÑOL en:
**
** http://devel.no-ip.org/forum/viewtopic.php?t=477
** http://devel.no-ip.org/projects/webengines/PD_PHP_SHOUTcast/
**
**
** Usted debería ser capaz de encontrar registros sobre ello en
** la mayoría de motores de búsqueda y en http://www.archive.org/
**
**
** Este paquete está por defecto bajo una licencia de dominio público.
** Puede hacer lo que desee con esto.
**
**
**
** Si por alguna razón el concepto de "dominio público" no es
** legalmente reconocido en su país o jurisdicción, este paquete
** ha de estar bajo la siguiente licencia:
**
**
**
** http://creativecommons.org/publicdomain/zero/1.0/deed.es_ES
**
**
**
** Creative Commons 0 1.0 Universal (CC0 1.0)
**
**
** Esta es la equivalente legal al Dominio Público.
**
**
**
** ****************************************************************************
** * Se concede el permiso de usar, modificar y/o redistribuír a voluntad.    *
** *                                                                          *
** * Esto incluye eliminar noticias de autoría, reutilización de partes de    *
** * código en otro software (dando o no dando crédito), y/o crear un         *
** * producto comercial basado en este.                                       *
** *                                                                          *
** * Este permiso no es revocable por el autor.                               *
** *                                                                          *
** * Este software se provee tal como es. Use bajo su propio riesgo. No hay   *
** * ninguna garantía, expresada o implícita, y al utilizar este software     *
** * usted acepta que el o los autores no pueden ser hechos responsables por  *
** * ninguna pérdida de datos, pérdida de servicio, u otros daños, sean estos *
** * incidentales o consecuenciales. Su única opción además de aceptar estos  *
** * términos es: No utilizar este software.                                  *
** *                                                                          *
** ****************************************************************************
**
**
** Si por alguna razón elige no usar una licencia de
** dominio público, debe usar la siguiente licencia
** ISC (Internet Systems Consortium, o Consorcio
** de Sistemas de Internet):
**
**
**
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
**
** ****************************************************************************
** * Permiso para usar, copiar, modificar y/o distribuír este software para   *
** * cualquier propósito con o sin remuneración es concedido, siempre que     *
** * la noticia anterior de copyright y esta noticia de permiso aparezca en   *
** * todas las copias.                                                        *
** *                                                                          *
** * EL SOFTWARE SE PROVEE "TAL COMO ES" Y EL AUTOR RENUNCIA A TODA GARANTÍA  *
** * RELACIONADA AL SOFTWARE INCLUYENDO TODAS LAS GARANTÍAS IMPLÍCITAS DE     *
** * COMERCIABILIDAD Y CONVENIENCIA. EN NINGÚN EVENTO PODRÁ EL AUTOR HACERSE  *
** * RESPONSABLE POR NINGÚN DAÑO ESPECIAL, DIRECTO, INDIRECTO O CONSECUENCIAL *
** * O NINGÚN OTRO DAÑO QUE RESULTE EN PÉRDIDAS DE USO, DATOS O GANANCIAS, YA *
** * SEA EN UNA ACCIÓN O CONTRATO, NEGLIGENCIA U OTRA ACCIÓN EXTRACONTRACTUAL,*
** * QUE SE PRODUZCA POR O EN CONEXIÓN CON EL USO O RENDIMIENTO DE ESTE       *
** * SOFTWARE.                                                                *
** ****************************************************************************
**
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
**
**
**
**
** NOTICIA: Todo derecho de autor emitido fuera de los términos
**          de licencia anteriores, o intentos de privatizar este
**          software, serán ignorados por todos, incluso para trabajos
**          derivados que constituyan una simple copia de esta base
**          del código central. Puede por supuesto usar sus propios
**          algoritmos así como los que se presentan aquí, y
**          copiarlos y utilizarlos libremente en otros productos, pero
**          dejando este paquete de código fuente original libre.
**          Esto es para preservar la naturaleza libre de este paquete
**          de software en su forma original. Hasta al menos Febrero
**          de 2013, el autor de este software planea darle desarrollo
**          continuado a este paquete de software. Usted está invitado
**          a contribuír con modificaciones y mejoras públicas.
**
**          Como un producto genérico de uso público, esta implementación
**          no puede ser patentada.
**
**          Usted debería descargar y usar este software solamente si
**          acepta los términos de esta licencia.
**
**
**
*******/

 ob_end_clean();

 $MetaTitle=TRUE;

 set_time_limit(0);


 $StreamMode=$_GET["StreamMode"];
 $isLiveRadio=FALSE;
 if(strcmp($StreamMode,"LiveRadio")===0) $isLiveRadio=TRUE;



 if(strcmp($_GET["use_stream_titles"],"no")===0)
  $MetaTitle=FALSE;



 if(
    isset($_GET["playlist"]) &&
    strpos($_GET["playlist"],"/")===FALSE &&
    strpos($_GET["playlist"],"\\")==FALSE
  )
 {
  $SongsListFile=$SongsListDir.$_GET["playlist"].".txt";
 }
  else
   $SongsListFile=$SongsListDir.$SongsListFile;




function getFileSize($filename)
{
 $getFileSize__h1=NULL;
 $getFileSize__toRet=0;

 if($getFileSize__h1=fopen($filename,"r"))
 {
  fseek($getFileSize__h1, 0, SEEK_END);
  $getFileSize__toRet=ftell($getFileSize__h1);
  fclose($getFileSize__h1);
 }

 return $getFileSize__toRet;
}



function CreateStreamTitle($title, $done)
{
 if($done)return "\0";

 $R="StreamTitle='".$title."';StreamUrl='';";

// $sz=mb_strlen($R)%16;
 $sz=mb_strlen($R)&0x0F;


 $zeros="";

// $lines16=(mb_strlen($R)/16)|0;
 $lines16=(mb_strlen($R)>>4);
 if($sz!=0)
 {
  for($z=0;$z<16-$sz;$z++)
  {
   $zeros=$zeros."\0";
  }
  $lines16++;
 }

 $R=chr($lines16).$R.$zeros;

 return $R;
}


function flusher()
{
 flush();
 print "";
 flush();
 flush();
}


function pad_buffer($buff, $desired_sz)
{
 $buffsz=mb_strlen($buff);
 $pad=$desired_sz-$buffsz;

 if($pad!=0)
 {
  for($p=0;$p<$pad;$p++)
  {
   $buff=$buff."\0";
   //$buff=$buff.chr(mt_rand(1, 255));
  }
 }

 return $buff;
}
















header("icy-notice1:<BR>This stream requires <a href=\"http://www.winamp.com/\">Winamp</a><BR>");
header("icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>");
header("icy-name:Radio Devel");
header("icy-genre:Musica");
//if($MetaTitle)header("icy-metadata:1");
header("icy-url:http://devel.cable-modem.org/conet");
header("content-type:audio/mpeg");
header("icy-pub:1");
if($MetaTitle)header("icy-metaint:32768");
header("icy-br:64");
header('Pragma: no-cache');
header('Cache-Control: no-cache, no-store, max-age=0');
header( $_ENV['SERVER_PROTOCOL']." 200 OK", true, 200 );
//header( "HTTP/1.0 200 OK", true, 200 );


$offst=0;


$zsong=file_get_contents($SongsListFile);

if(mb_strlen($zsong)<=0)
{
 //Activar esta línea si se desea causar un mensaje de error
 //en el reproductor, en lugar de simplemente terminar de inmediato
 //si se especificó una lista de reproducción no existente:
 ///
 //header( $_ENV['SERVER_PROTOCOL']." 404 Not Found", true, 404 );
 return;
}

$zsong=str_replace("\r\n", "\n", $zsong);
$zsong=str_replace("\r", "\n", $zsong);

$songs_list=explode("\n", $zsong);



//$rand_song=(mt_rand(0,count($songs_list)/2-1));
//$f1=$songs_list[$rand_song*2];
$rand_song=(mt_rand(0,(count($songs_list)>>1)-1));
$f1=$songs_list[$rand_song<<1];
$fzize=getFileSize($f1)-$offst;
//$intpart=(($fzize/32768)|0);
//$floatpart=$fzize-($intpart*32768);
$intpart=($fzize>>15);
$floatpart=$fzize-($intpart<<15);










if($floatpart!=0)$intpart+=4;

$file1=fopen($f1, "rb");

$title_sent=0;
$v=" ";

//This line is to always position very near the end
//of the stream, and should only be used for a "Live Stream".
//
//For some reason, it currently seems to cause the CPU load
//to increase too much:
//
///
 if($isLiveRadio && $fzize-65536>0)
 {
  fseek($file1, $fzize-65536);
//  flush();
 }

$emptycount=0;

//$SongTitle=$songs_list[$rand_song*2+1];
$SongTitle=$songs_list[($rand_song<<1)+1];
$intpart_bak=$intpart;
while(1)
{
  $title_sent=FALSE;
  //while($intpart>0)
  //while(mb_strlen($v)!==0)
  //while(ftell($file1)<getFileSize($f1))

  do
  {
    $cccc=ftell($file1);

    if(!feof($file1))
    $v=fread($file1, 32768);
//    flush();

   //If we paused, try to get to the most up to date
   //stream position:
   ///
    if($isLiveRadio && abs($cccc-getFileSize($f1))>65536)
    {
     fseek($file1,getFileSize($f1)-32768);
    }


   //This line is intended to make padding unnecessary
   //and to rewind a little bit so that we can give time
   //and make zero-padding unnecessary:
   ///
     if($isLiveRadio && mb_strlen($v)<32768)
     {
      if(mb_strlen($v)===0){$emptycount++;if($emptycount>=1);break;}
       //fseek($file1, 0);
      else
       //fseek($file1, $cccc-65536);
//       fseek($file1, $cccc-32768);
       fseek($file1, $cccc-32768);
     }




   //This is to continuously update the
   //size of the file. It needs more work,
   //because as it is, it will stall because
   //the count of integer parts is useless.
   //This code fragment should probably be used only
   //if a "Live Stream" is actually requested:
   ///
    if($isLiveRadio)
    {
     $fzize=getFileSize($f1)-$offst;
    }



    ob_start();
    //$v=(pad_buffer(fread($file1, 32768), 32768));

    if(mb_strlen($v)<32768)
    {
     print pad_buffer($v, 32768);
//     flush();
    }
     else
     {
      print $v;
//      flush();
     }


    if($MetaTitle)
    {
      $t=CreateStreamTitle($SongTitle, $title_sent);flush();  //This flush is extremely important!
      print $t;
//      flush();
    }


    $title_sent=TRUE;
    if(!$isLiveRadio) $intpart--;
    ob_end_flush();
//    flush();

   if(feof($file1))$emptycount++;
  }
  while(!feof($file1)/* && (!$isLiveRadio && $intpart!=0)*//*$isLiveRadio || $emptycount<1*/);


 $emptycount=0;

// flush();
 fclose($file1);
// flush();

 $v=" ";







 $zsong=file_get_contents($SongsListFile);

 if(mb_strlen($zsong)<=0)
 {
  //Activar esta línea si se desea causar un mensaje de error
  //en el reproductor, en lugar de simplemente terminar de inmediato
  //si se especificó una lista de reproducción no existente:
  ///
  //header( $_ENV['SERVER_PROTOCOL']." 404 Not Found", true, 404 );
  return;
 }

 $zsong=str_replace("\r\n", "\n", $zsong);
 $zsong=str_replace("\r", "\n", $zsong);

 $songs_list=explode("\n", $zsong);

 //$rand_song=(mt_rand(0,(count($songs_list)/2)-1));
 //$f1=$songs_list[$rand_song*2];
 $rand_song=(mt_rand(0,(count($songs_list)>>1)-1));
 $f1=$songs_list[$rand_song<<1];
 $fzize=getFileSize($f1)-$offst;
// $intpart=(($fzize/32768)|0);
// $floatpart=$fzize-($intpart*32768);
 $intpart=($fzize>>15);
 $floatpart=$fzize-($intpart<<15);
 if($floatpart!=0)$intpart+=4;
 $file1=fopen($f1, "rb");
 //$SongTitle=$songs_list[($rand_song*2)+1];
 $SongTitle=$songs_list[($rand_song<<1)+1];



//This line is to always position very near the end
//of the stream, and should only be used for a "Live Stream".
//
//For some reason, it currently seems to cause the CPU load
//to increase too much:
//
///
 if($isLiveRadio && $fzize-65536>0)
 {
  fseek($file1, $fzize-65536);
//  flush();
 }



}

 //El mero hecho de que hayamos pedido una lista de reproducción
 //válida en un parámetro de URL, significa que ya hemos servido
 //una aplicación web válida, y por lo tanto debemos detenernos
 //aquí (sin error 404), aunque normalmente el script siempre
 //se interrumpirá en el bucle principal.
 ///
  return;
?>
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2945
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Reproductor de Streams ShoutCast de NullSoft en PHP

Notapor ~ » Vie Ago 09, 2013 1:19 pm

Necesito ya sea agregar un archivo MP3 con silencio para que ese silencio sea saltado al iniciar el stream en lugar de potencialmente saltar una parte de la canción inicial, o mejorar profundamente el código para que no haya ningún salto ni al inicio ni entre algunas canciones.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2945
Registrado: Sab Nov 10, 2012 1:04 pm

Reproductor de Streams ShoutCast de NullSoft en PHP (Versión 2° Cumpleaños 2014-02-18, 00:06)

Notapor ~ » Mar Feb 18, 2014 12:11 am

Lo nuevo en esta versión es que se garantiza que una canción no se repetirá más de una vez sino hasta que cada una de las canciones de la lista de reproducción se haya reproducido. Esto da considerablemente más aleatoriedad y variedad a la reproducción, cuando todas las versiones anteriores frecuentemente reproducían una misma canción muchas veces antes de recorrer toda la lista de reproducción, muchas veces incluso dos veces consecutivas.

Además esta versión ha sido creada exactamente 2 años después de la edición del código original de este script, en el 2012:

Código: Seleccionar todo
<?php
 //Aquí configuramos la ruta relativa o absoluta
 //a un archivo de texto plano que contiene las rutas,
 //también absolutas o relativas, de cada archivo MP3,
 //y también los títulos escritos con ASCII de 7 bits
 //(es decir solo caracteres de Inglés):
 ///
 //Ruta relativa, o...
 ///
  //$SongsListDir="";

 //Ruta absoluta:
 ///
   $SongsListDir="C:/SHOUTcast_playlists/MP3/";

 //Lista por defecto de reproducción
 //de texto plano:
 ///
   $SongsListFile="conet.txt";


/*******
**
**
** Reproductor/Servidor de Radio SHOUTcast en PHP
** -----------------------------------------------
**
** Fecha: Martes, Febrero 18, 2014, 00:06:31 AM
**
**
** Está descargando este tutorial y recursos asociados
** de:
**
**
** http://devel.no-ip.org/
**
** Este paquete fue publicado por primera vez en el Internet
** y EN ESPAÑOL en:
**
** http://devel.no-ip.org/forum/viewtopic.php?t=477
** http://devel.no-ip.org/projects/webengines/PD_PHP_SHOUTcast/
**
**
** Usted debería ser capaz de encontrar registros sobre ello en
** la mayoría de motores de búsqueda y en http://www.archive.org/
**
**
** Este paquete está por defecto bajo una licencia de dominio público.
** Puede hacer lo que desee con esto.
**
**
**
** Si por alguna razón el concepto de "dominio público" no es
** legalmente reconocido en su país o jurisdicción, este paquete
** ha de estar bajo la siguiente licencia:
**
**
**
** http://creativecommons.org/publicdomain/zero/1.0/deed.es_ES
**
**
**
** Creative Commons 0 1.0 Universal (CC0 1.0)
**
**
** Esta es la equivalente legal al Dominio Público.
**
**
**
** ****************************************************************************
** * Se concede el permiso de usar, modificar y/o redistribuír a voluntad.    *
** *                                                                          *
** * Esto incluye eliminar noticias de autoría, reutilización de partes de    *
** * código en otro software (dando o no dando crédito), y/o crear un         *
** * producto comercial basado en este.                                       *
** *                                                                          *
** * Este permiso no es revocable por el autor.                               *
** *                                                                          *
** * Este software se provee tal como es. Use bajo su propio riesgo. No hay   *
** * ninguna garantía, expresada o implícita, y al utilizar este software     *
** * usted acepta que el o los autores no pueden ser hechos responsables por  *
** * ninguna pérdida de datos, pérdida de servicio, u otros daños, sean estos *
** * incidentales o consecuenciales. Su única opción además de aceptar estos  *
** * términos es: No utilizar este software.                                  *
** *                                                                          *
** ****************************************************************************
**
**
** Si por alguna razón elige no usar una licencia de
** dominio público, debe usar la siguiente licencia
** ISC (Internet Systems Consortium, o Consorcio
** de Sistemas de Internet):
**
**
**
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
** ::INICIA LICENCIA ISC
**
** ****************************************************************************
** * Permiso para usar, copiar, modificar y/o distribuír este software para   *
** * cualquier propósito con o sin remuneración es concedido, siempre que     *
** * la noticia anterior de copyright y esta noticia de permiso aparezca en   *
** * todas las copias.                                                        *
** *                                                                          *
** * EL SOFTWARE SE PROVEE "TAL COMO ES" Y EL AUTOR RENUNCIA A TODA GARANTÍA  *
** * RELACIONADA AL SOFTWARE INCLUYENDO TODAS LAS GARANTÍAS IMPLÍCITAS DE     *
** * COMERCIABILIDAD Y CONVENIENCIA. EN NINGÚN EVENTO PODRÁ EL AUTOR HACERSE  *
** * RESPONSABLE POR NINGÚN DAÑO ESPECIAL, DIRECTO, INDIRECTO O CONSECUENCIAL *
** * O NINGÚN OTRO DAÑO QUE RESULTE EN PÉRDIDAS DE USO, DATOS O GANANCIAS, YA *
** * SEA EN UNA ACCIÓN O CONTRATO, NEGLIGENCIA U OTRA ACCIÓN EXTRACONTRACTUAL,*
** * QUE SE PRODUZCA POR O EN CONEXIÓN CON EL USO O RENDIMIENTO DE ESTE       *
** * SOFTWARE.                                                                *
** ****************************************************************************
**
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
** ::TERMINA LICENCIA ISC
**
**
**
**
** NOTICIA: Todo derecho de autor emitido fuera de los términos
**          de licencia anteriores, o intentos de privatizar este
**          software, serán ignorados por todos, incluso para trabajos
**          derivados que constituyan una simple copia de esta base
**          del código central. Puede por supuesto usar sus propios
**          algoritmos así como los que se presentan aquí, y
**          copiarlos y utilizarlos libremente en otros productos, pero
**          dejando este paquete de código fuente original libre.
**          Esto es para preservar la naturaleza libre de este paquete
**          de software en su forma original. Hasta al menos Febrero
**          de 2013, el autor de este software planea darle desarrollo
**          continuado a este paquete de software. Usted está invitado
**          a contribuír con modificaciones y mejoras públicas.
**
**          Como un producto genérico de uso público, esta implementación
**          no puede ser patentada.
**
**          Usted debería descargar y usar este software solamente si
**          acepta los términos de esta licencia.
**
**
**
*******/

 ob_end_clean();

 $MetaTitle=TRUE;

 set_time_limit(0);


 $played_songs=array();


 $StreamMode=$_GET["StreamMode"];
 $isLiveRadio=FALSE;
 if(strcmp($StreamMode,"LiveRadio")===0) $isLiveRadio=TRUE;



 if(strcmp($_GET["use_stream_titles"],"no")===0)
  $MetaTitle=FALSE;



 if(
    isset($_GET["playlist"]) &&
    strpos($_GET["playlist"],"/")===FALSE &&
    strpos($_GET["playlist"],"\\")==FALSE
  )
 {
  $SongsListFile=$SongsListDir.$_GET["playlist"].".txt";
 }
  else
   $SongsListFile=$SongsListDir.$SongsListFile;




function getFileSize($filename)
{
 $getFileSize__h1=NULL;
 $getFileSize__toRet=0;

 if($getFileSize__h1=fopen($filename,"r"))
 {
  fseek($getFileSize__h1, 0, SEEK_END);
  $getFileSize__toRet=ftell($getFileSize__h1);
  fclose($getFileSize__h1);
 }

 return $getFileSize__toRet;
}


function getHFileSize($filehandle)
{
 $getFileSize__toRet=0;

  $orig=ftell($filehandle);

  fseek($filehandle, 0, SEEK_END);
  $getFileSize__toRet=ftell($filehandle);

  fseek($filehandle, $orig, SEEK_SET);

 return $getFileSize__toRet;
}







function CreateStreamTitle($title, $done)
{
 if($done)return "\0";

 $R="StreamTitle='".$title."';StreamUrl='';";

// $sz=strlen($R)%16;
 $sz=strlen($R)&0x0F;


 $zeros="";

// $lines16=(strlen($R)/16)|0;
 $lines16=(strlen($R)>>4);
 if($sz!=0)
 {
  for($z=0;$z<16-$sz;$z++)
  {
   $zeros=$zeros."\0";
  }
  $lines16++;
 }

 $R=chr($lines16).$R.$zeros;

 return $R;
}


function flusher()
{
 flush();
 print "";
 flush();
 flush();
}


function pad_buffer($buff, $desired_sz)
{
 $buffsz=strlen($buff);
 $pad=$desired_sz-$buffsz;

 if($pad!=0)
 {
  for($p=0;$p<$pad;$p++)
  {
   $buff=$buff."\0";
//   $buff=$buff."\170";
//   $buff=$buff."\85";
   //$buff=$buff.chr(mt_rand(1, 255));
  }
 }

 return $buff;
}
















header("icy-notice1:<BR>This stream requires <a href=\"http://www.winamp.com/\">Winamp</a><BR>");
header("icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>");
header("icy-name:Radio Devel");
header("icy-genre:Musica");
//if($MetaTitle)header("icy-metadata:1");
header("icy-url:http://devel.cable-modem.org/conet");
header("content-type:audio/mpeg");
header("icy-pub:1");
if($MetaTitle)header("icy-metaint:32768");
header("icy-br:64");
header('Pragma: no-cache');
header('Cache-Control: no-cache, no-store, max-age=0');
header( $_ENV['SERVER_PROTOCOL']." 200 OK", true, 200 );
//header( "HTTP/1.0 200 OK", true, 200 );


$offst=0;


$zsong=file_get_contents($SongsListFile);

if(strlen($zsong)<=0)
{
 //Activar esta línea si se desea causar un mensaje de error
 //en el reproductor, en lugar de simplemente terminar de inmediato
 //si se especificó una lista de reproducción no existente:
 ///
 //header( $_ENV['SERVER_PROTOCOL']." 404 Not Found", true, 404 );
 return;
}

$zsong=str_replace("\r\n", "\n", $zsong);
$zsong=str_replace("\r", "\n", $zsong);

$songs_list=explode("\n", $zsong);



//$rand_song=(mt_rand(0,count($songs_list)/2-1));
//$f1=$songs_list[$rand_song*2];
//$rand_song=(mt_rand(0,(count($songs_list)>>1)-1));


///INIT: Randomize and avoid repetitions
///INIT: Randomize and avoid repetitions
///INIT: Randomize and avoid repetitions

$rand_song=(mt_rand(0,(count($songs_list)>>1)-1));
$rrcnt=0;
for($rrx=0;$rrx<10;$rrx++)
{
 if($played_songs[$rand_song]===TRUE || $rand_song===$last_rand_song)
 {
  $rand_song=(mt_rand(0,(count($songs_list)>>1)-1));
 }
  else break;
}

if($played_songs[$rand_song]===TRUE)
{
 for($zr=0;$zr<=(count($songs_list)>>1)-1;$zr++)
 {
  if($played_songs[$zr]!==TRUE)
  {
   $played_songs[$zr]=TRUE;
   $rand_song=$zr;
   break;
  }
   else
   {
    $rrcnt++;
    if($rrcnt===((count($songs_list)>>1)-1))
    {
     $played_songs=array();
     $rand_song=(mt_rand(0,(count($songs_list)>>1)-1));
     $played_songs[$rand_song]=TRUE;
     $rrcnt=0;
     break;
    }
   }
 }
}
 else
 {
  $played_songs[$rand_song]=TRUE;
 }

$last_rand_song=$rand_song;

///END:  Randomize and avoid repetitions
///END:  Randomize and avoid repetitions
///END:  Randomize and avoid repetitions


$f1=$songs_list[$rand_song<<1];


$offst=getFileSize($f1)-$offst;
$fzize=getFileSize($f1)-45000;
if($fzize<0)$fzize=$offst;
//$intpart=(($fzize/32768)|0);
//$floatpart=$fzize-($intpart*32768);
$intpart=($fzize>>15);
$floatpart=$fzize-($intpart<<15);










if($floatpart!=0)$intpart++;

$file1=fopen($f1, "rb");

$title_sent=0;
$v=" ";

//This line is to always position very near the end
//of the stream, and should only be used for a "Live Stream".
//
//For some reason, it currently seems to cause the CPU load
//to increase too much:
//
///
// if($isLiveRadio && $fzize-65536>0)
 if($isLiveRadio)
 {
  fseek($file1, $fzize);
//  flush();
 }

$emptycount=0;

//$SongTitle=$songs_list[$rand_song*2+1];
$SongTitle=$songs_list[($rand_song<<1)+1];
$intpart_bak=$intpart;
while(1)
{
  $title_sent=FALSE;
  //while($intpart>0)
  //while(strlen($v)!==0)
  //while(ftell($file1)<getFileSize($f1))

  while((!feof($file1) && $isLiveRadio) || (!$isLiveRadio && $intpart>0)/*$isLiveRadio || $emptycount<1*/)
  {
   $cccc=ftell($file1);

//   if($isLiveRadio)
//   if(getHFileSize($file1)<$fzize || (getHFileSize($file1)-ftell($file1))>=131072 || ftell($file1)>=getHFileSize($file1))
//   {
//    $offst=getHFileSize($file1)-$offst;
//    $fzize=getHFileSize($file1)-32768;
//    if($fzize<0)$fzize=$offst;
//
//    fseek($file1, $fzize);
//   }


   //If we paused, try to get to the most up to date
   //stream position:
   ///
    if($isLiveRadio && abs(getHFileSize($file1)-$cccc)>(65536+32768))
    {
     fseek($file1, getHFileSize($file1)-45000);
     $cccc=ftell($file1);
//     usleep(50000);
    }



/*
    $cccc=ftell($file1);

    if(!feof($file1))
    $v=fread($file1, 32768);
//    flush();

   //If we paused, try to get to the most up to date
   //stream position:
   ///
    if($isLiveRadio && abs($cccc-getFileSize($f1))>65536)
    {
     fseek($file1,getFileSize($f1)-32768);
    }


   //This line is intended to make padding unnecessary
   //and to rewind a little bit so that we can give time
   //and make zero-padding unnecessary:
   ///
     if($isLiveRadio && strlen($v)<32768)
     {
      if(strlen($v)===0){$emptycount++;if($emptycount>=1);break;}
       //fseek($file1, 0);
      else
       //fseek($file1, $cccc-65536);
//       fseek($file1, $cccc-32768);
       fseek($file1, $cccc-32768);
     }




   //This is to continuously update the
   //size of the file. It needs more work,
   //because as it is, it will stall because
   //the count of integer parts is useless.
   //This code fragment should probably be used only
   //if a "Live Stream" is actually requested:
   ///
    if($isLiveRadio)
    {
     $fzize=getFileSize($f1)-$offst;
    }


*/
    $v=fread($file1, 32768);
    if($isLiveRadio && strlen($v)<32768){fseek($file1, $cccc);/*sleep(1);*/usleep(50000);continue;}

    ob_start();

//    $v=fread($file1, 32768);
//    if($isLiveRadio && strlen($v)<32768){ob_end_flush();fseek($file1, $cccc);continue;}

    //$v=(pad_buffer(fread($file1, 32768), 32768));

//   $v=(pad_buffer(fread($file1, 32768), 32768));

//   else
   {
    if(strlen($v)<32768)
    {
     print pad_buffer($v, 32768);
     //flush();
    }
     else
     {
      print $v;
      //flush();
     }
   }

//    print $v;
    if($MetaTitle)
    {
      print CreateStreamTitle($SongTitle, $title_sent);flush();  //This flush is extremely important!
      //print $t;
//      flush();
    }


    $title_sent=TRUE;
    if(!$isLiveRadio) $intpart--;
//    $intpart--;
    ob_end_flush();
    flush();
//    sleep(1);

   //if(feof($file1))$emptycount++;
   if(!isLiveRadio)usleep(50000);
  }


 $emptycount=0;

// flush();
 fclose($file1);
// flush();

 $v=" ";







 $zsong=file_get_contents($SongsListFile);

 if(strlen($zsong)<=0)
 {
  //Activar esta línea si se desea causar un mensaje de error
  //en el reproductor, en lugar de simplemente terminar de inmediato
  //si se especificó una lista de reproducción no existente:
  ///
  //header( $_ENV['SERVER_PROTOCOL']." 404 Not Found", true, 404 );
  return;
 }

 $zsong=str_replace("\r\n", "\n", $zsong);
 $zsong=str_replace("\r", "\n", $zsong);

 $songs_list=explode("\n", $zsong);

 //$rand_song=(mt_rand(0,(count($songs_list)/2)-1));
 //$f1=$songs_list[$rand_song*2];
// $rand_song=(mt_rand(0,(count($songs_list)>>1)-1));



///INIT: Randomize and avoid repetitions
///INIT: Randomize and avoid repetitions
///INIT: Randomize and avoid repetitions

$rand_song=(mt_rand(0,(count($songs_list)>>1)-1));
$rrcnt=0;
for($rrx=0;$rrx<10;$rrx++)
{
 if($played_songs[$rand_song]===TRUE || $rand_song===$last_rand_song)
 {
  $rand_song=(mt_rand(0,(count($songs_list)>>1)-1));
 }
  else break;
}

if($played_songs[$rand_song]===TRUE)
{
 for($zr=0;$zr<=(count($songs_list)>>1)-1;$zr++)
 {
  if($played_songs[$zr]!==TRUE)
  {
   $played_songs[$zr]=TRUE;
   $rand_song=$zr;
   break;
  }
   else
   {
    $rrcnt++;
    if($rrcnt===((count($songs_list)>>1)-1))
    {
     $played_songs=array();
     $rand_song=(mt_rand(0,(count($songs_list)>>1)-1));
     $played_songs[$rand_song]=TRUE;
     $rrcnt=0;
     break;
    }
   }
 }
}
 else
 {
  $played_songs[$rand_song]=TRUE;
 }

$last_rand_song=$rand_song;
///END:  Randomize and avoid repetitions
///END:  Randomize and avoid repetitions
///END:  Randomize and avoid repetitions




 $f1=$songs_list[$rand_song<<1];
 $fzize=getFileSize($f1)-45000;
 if($fzize<0)$fzize=$offst;
// $intpart=(($fzize/32768)|0);
// $floatpart=$fzize-($intpart*32768);
 $intpart=($fzize>>15);
 $floatpart=$fzize-($intpart<<15);
 if($floatpart!=0)$intpart++;
 $file1=fopen($f1, "rb");
 //$SongTitle=$songs_list[($rand_song*2)+1];
 $SongTitle=$songs_list[($rand_song<<1)+1];



//This line is to always position very near the end
//of the stream, and should only be used for a "Live Stream".
//
//For some reason, it currently seems to cause the CPU load
//to increase too much:
//
///
// if($isLiveRadio && $fzize-65536>0)
 if($isLiveRadio)
 {
  fseek($file1, $fzize);
//  flush();
 }



}

 //El mero hecho de que hayamos pedido una lista de reproducción
 //válida en un parámetro de URL, significa que ya hemos servido
 //una aplicación web válida, y por lo tanto debemos detenernos
 //aquí (sin error 404), aunque normalmente el script siempre
 //se interrumpirá en el bucle principal.
 ///
  return;
?>
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2945
Registrado: Sab Nov 10, 2012 1:04 pm


Volver a Programas

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 9 invitados


cron