Daniel Mota / IceBeat

Mi vida en formato CSS3

Estás en la bitácora de IceBeat, una página sobre diseño y desarrollo web.

Sincronizar Subtítulos .srt

Algunas veces no sé porque pero la función del VLC para manipular los segundos de los subtítulos no funciona correctamente, suele ocurrir cuando no están bien sincronizados. La mejor forma es bajarte un programita y alterar la linea de tiempo. No entiendo la razón pero no he encontrado ninguna aplicación web que lo haga así que me he creado una clase en PHP para manipular los archivos .srt

<?php

class Subtitle {

    function Subtitle($srt) {
        $this->name = $srt;
        $this->file = @file_get_contents($srt);
    }

    function time($time=0) {
        $this->time = $time;
        $this->file = preg_replace('!([0-9:]{8}),([0-9]{3}) --> ([0-9:]{8}),([0-9]{3})!e',
                    '$this->sync("\1").",\2 --> ".$this->sync("\3").",\4"', $this->file);
    }

    function sync($time) {
        $time = strtotime($time);
        $time = $time+$this->time;
        return date('H:i:s', $time);
    }

    function save($name='') {
        if($name) $this->name = $name;
        $fp = @fopen($this->name, 'w');
        if(!$fp) return false;
        fwrite($fp, $this->file);
        fclose($fp);
        return true;
    }

}
?>

Su uso es muy fácil, solo tienes que pasar la ruta del archivo e indicar cuantos segundos quieres añadir o quitar, si quieres quitar solo tienes que poner el valor en negativo.

$subs = new Subtitle('subs.srt');
//añadir 5 segundos, quitar -5
$subs->time(5);
//si no le pasas un nuevo nombre reemplaza el archivo
$subs->save();

Lo único que hace es manipular los segundos, consiguiendo que puedas ir sincronizando poco a poco aquellos subtítulos que por cualquier razón no coinciden con el archivo de video bajado.


Estos días he estado ayudando aun amigo para hacer pagos con PayPal, gracias a este tutorial de Rails hemos podido crear una versión en PHP.

Para generar botones encriptados lo primero que tienes que hacer es crear unos certificados, una vez creados tendrás los datos necesarios para cumplimentar las opciones de la clase.

  $config = array(
        'cert_id' => 'xxx',
        'business' => 'seller_xx@xxx.es',
        'openssl' => '/usr/bin/openssl',
        'my_cert' => 'certificates/my-pubcert.pem',
        'my_key' => 'certificates/my-prvkey.pem',
        'paypal_cert' => 'certificates/paypal_cert.pem'
    );
    //iniciamos la clase
$paypal = new PayPal($config);

Luego hay que pasarles las variables necesarias para encriptar el botón, en la documentación de PayPal encuentras todas las variables.

$form = array(
    'cmd' => '_xclick',
     'item_name' => 't-shirt 13',
     'item_number' => '12',
    'amount' => '4500.00'
);

$encrypted = $paypal->encrypt($form);

Una vez encriptado solo tienes que rellenar los datos del formulario, el action y el campo hidden.

    <form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick"/>
<input type="hidden" name="encrypted" value="<?PHP echo $encrypted; ?>"/>
<input type="submit" value="Buy"/>
</form>

Nos queda la parte del IPN (Instant Payment Notification) para saber si la transacción se ha ejecutado con éxito. Es curioso algunas tiendas envían el botón sin encriptar pero si hacen el IPN.

En la clase incluyo el ejemplo para que lo tengáis todo a mano, recordad que en el tutorial escrito en rails tenéis los pasos previos para crear los certificados.

Descargar class.paypal.php.


Remote ID3 función

Ayer echando un vistazo a muxtape, un servicio muy minimalista y sencillo me di cuenta que subiendo la canción ya obtenía el titulo y el arista. La verdad es que me llamo la atención y estuve jugando un poco con las funciones ID3, pero al probar en un archivo remoto me decía que nanai de la china. Estuve buscando y encontré unas clases que usaban fseek y claro tampoco me valían.Al final por phpclassess di con una que buscaba en archivos remoto, pero como ya tenia el gusanillo decidí crear una función.

function ID3($mp3='') {
    //etiquetas ID3
    $ID3 = array(
        'title' => 'TIT2', 
        'artist' => 'TPE1', 
        'album' => 'TALB'
    );
    //miramos si es un archivo mp3
    if(substr($mp3, -3, 3) != 'mp3') return false;
    //abrimos parte del archivo y leemos
    $fp = fopen($mp3, 'r'); 
    $data = fread($fp, 3000); 
    fclose($fp);
    //comprobamos que tiene ID3
    if(substr($data, 0, 3) != 'ID3') return false;
    //parseamos los tags
    foreach($ID3 as $type => $key) {
        //existe el tag?
        if(strpos($data, $key)) {
            //existe entre tags o es el ultimo?
            if(!preg_match('!'.$key.'(.*)[A-Z]{3}[A-Z1-4]{1}!Us', $data, $tag)) $tag = explode($key, $data);
            //algo raro pasa con los caracteres asi que limpiamos
            $info = $tag[1];
            $info = str_replace(' ', '...', $info);
            $info = preg_replace('![^A-Za-z0-9./'()]+!','',$info);
            $info = str_replace('...', ' ', $info);
            $ID3[$type] = $info;
        } else {
            //si no lo encontramos lo borramos
            $ID3[$type] = '';
        }
    }
    //devolvemos el nuevo array
    return $ID3;
}

//print_r(ID3('http://algunaweb.com/mp3.mp3'));

La función devuelve el titulo, el artista y el álbum de la canción, en caso de no poder parsear devuelve false. He tenido bastantes problemas dando con la solución para arreglar un poco los textos, asi que es posible que más de una vez te encuentres con 7 o caracteres extraños.


YouTube.php

Siempre me ha gustado parsear las paginas web, es algo que me encanta, puede ser muy friki pero uso las expresiones como pasatiempo. En uno de los proyectos he tenido que buscar vídeos en youtube, como era una simple búsqueda en vez de usar su API hice una pequeña función.

Devuelve un array con lo mínimo para mostrar: ID, imagen y titulo del vídeo.

function youtube($q='') {
    $videos = array();
    $url = 'http://youtube.com/results?search_query='.urlencode(strtolower($q));
    $pagina = @file_get_contents($url);
    //!<a href="/watch?v=([^"]+)">[s]+<img src="(.*)" class="vimg120" title="(.*)"!Usi
    if(preg_match_all('!<as+href="/watch?v=([^"&]+)"[^<]+<imgs+src="([^"]*)"s+class="vimg120"s+title="([^"]*)"!Usi', $pagina, $info, PREG_SET_ORDER)) {
        foreach($info as $video) {
            $videos[] = array(
            'id' => $video[1],
            'image' => $video[2],
            'text' => $video[3]
            );
        } 
    }
    return $videos;
}

//youtube('chikichiki');

Se puede hacer mas compleja, pero tal como esta cumple su función perfectamente. Si necesitas hacer una busqueda dentro de las categorias puedes añadir en url el parametro search_category.

Actualizado: DrSlump propone una expresión más eficiente :).


class.image

Class.Image es una pequeña clase para la manipulación de imágenes, no tiene nada del otro mundo, solo mi punto de vista de como manipular las imágenes.

Ejemplos de uso:

//Creamos un thumb con 200px de ancho, la altura es automatica.
$thumb = new Image('directorio/imagen.jpg');        
$thumb->width(200);
$thumb->save();

//Crear un thumb al 50%
 $thumb = new Image('directorio/imagen.jpg');        
$thumb->resize(50);
$thumb->save();

//Cortar una porcion de la imegen
 $thumb = new Image('directorio/imagen.jpg');    
 //indicar el punto de corte    
$thumb->crop(0,200);
//luego puedes poner el ancho y el alto que quieras
$thumb->save();

//Añadir o cambiar el nombre, no hace falta indicar la extensión
 $thumb = new Image('directorio/imagen.jpg');  
 $thumb->name('imagen2'); /* o */ $thumb->name($thumb->name().'_thumb');
$thumb->width(200);
$thumb->save();

No tiene muchas complicaciones, calcula el tamaño para no tener que indicarlos, puedes cambiar la ruta del directorio, la calidad, mostrar sin guardar la imagen, incluso cortar y reescalar a la vez.

Descargar class.image.php

Página 1 de 7 · Mostrar 5 más