sábado, 17 de septiembre de 2011

YouTube Searcher: Busca Videoclips de Música

Descripción:

Este script lista los videos de artistas (música) que están alojados en YouTube.

El listado de videos contempla el ID, nombre y duración de dichos videos.

Este script se puede complementar con otro script llamado "YouTube Downloader", el cual requiere del ID del video para descargarlo.

Enjoy!

#!/usr/bin/perl
use strict;
use HTTP::Lite;
use HTML::Entities;

#####################################################
#
# Desarrollado por: Zort
# Fecha: 16 de Septiembre de 2011
#
# Descripcion:
#   Este script lista los videos de artistas (musica) que
# estan alojados en YouTube.
#   El listado de videos contempla el ID, nombre y duracion
# de dichos videos.
#   Este script se puede complementar con otro script llamado
# "YouTube Downloader", el cual requiere del ID del video
# para descargarlo.
#
# Anexo:
#   Se omitieron todos los acentos en el codigo, para que no se
# vean caracteres erroneos en el caso de que el equipo donde
# se corra este codigo permita ver solo caracteres gringos.
#
#####################################################

my $artist = $ARGV[0];
$artist =~ s/^ +//;
$artist =~ s/ +$//;
$artist =~ s/ /_/g;

die "Usage: $0 artist\n\n" if ($artist eq '');

my $http = HTTP::Lite->new;
$http->http11_mode(1);

my $req = $http->request('http://www.youtube.com/artist/' . $artist);

if ($http->status() != 200) {
    print "No se pudo traer la pagina\n";
    exit;
}

# Getting the body page
my @body = split(/\n/, $http->body());

my $videos        = '';
my $artist_name   = '';
my $searching     = 0;
my $song_id       = 0;
my $song_duration = 0;
my $song_name     = 0;
foreach my $line (@body) {

    if ($line =~ /<h1>YouTube Mix for ([^<]*)</) {
        $artist_name = $1;
    }
    elsif ($line =~ /<h1>(Released in [0-9]+)/) {
        $videos .= "$1\n";
    }
    elsif ($line =~ / id="artist-videos" /) {
        $searching = 1;
    }
    elsif ($searching) {
        if ($line =~ /<li id="album-track-([^"]*)"/) {
            $song_id = $1;
        }
        elsif ($line =~ /<span class="album-track-duration">([^<]*)</) {
            $song_duration = $1;
        }
        elsif ($line =~ /<span class="description album-track-name">([^<]*)</) {
            $song_name = $1;
            $videos .= "  $song_id - " . decode_entities($song_name) . " ($song_duration)\n";
        }
    }
}

print "\n";
print 'Videos de "' . decode_entities($artist_name) . '":';
print "\n\n";
print $videos;

exit;

YouTube Downloader: Descarga Videos de YouTube

Yap, por fin salió!

Este script sirve para descargar videos de YouTube por CLI ;)

Lo único que tienen que hacer es ejecutar el script y pasarle como argumento el ID del video, luego el script preguntará el formato y resolución y... listo!

Enjoy!

#!/usr/bin/perl
use strict;
use HTTP::Lite;
use Data::Dumper;

#####################################################
#
# Desarrollado por: Zort
# Fecha: 16 de Septiembre de 2011
#
# Descripcion:
#   Este script descarga un video de YouTube especificado por
# el ID, el cual es entregado como parametro en la ejecucion.
#   A su vez, es posible elegir el formato y la resolucion
# del video segun la disponibilidad de YouTube de entregar el
# video con dichas caracteristicas.
#
# Anexo:
#   Se omitieron todos los acentos en el codigo, para que no se
# vean caracteres erroneos en el caso de que el equipo donde
# se corra este codigo permita ver solo caracteres gringos.
#   Se ha detectado que en ciertas ocasiones no se descarga
# el video. En estos casos se debe intentar nuevamente.
#
#####################################################

my $debug = 0;
my $video_id = $ARGV[0];

die "Usage: $0 video_id\n\n" if ($video_id eq '');

my $http = HTTP::Lite->new;
$http->http11_mode(1);

my $req = $http->request("http://www.youtube.com/get_video_info?video_id=$video_id&eurl=http%3A%2F%2Flocalhost%2F&hl=en_US")
    or die "Unable to get document: $!";

&showResponse($http) if ($debug);

if ($http->status() != 200) {
    print "The return code is not valid!\n";
    exit;
}

my $seconds        = 0;
my $fmt_stream_map = '';
my $fmt_list       = '';
my $title          = '';
my $token          = '';
my $formats        = ();

my @infos = split(/&/, $http->body());
foreach my $info (@infos) {

    my ($name, $value) = split(/=/, $info);

    $seconds        = $value            if ($name eq 'length_seconds');
    $fmt_stream_map = urlDecode($value) if ($name eq 'url_encoded_fmt_stream_map');
    $fmt_list       = urlDecode($value) if ($name eq 'fmt_list');
    $title          = urlDecode($value) if ($name eq 'title');
    $token          = $value            if ($name eq 'token');
}

my @formats_list = split(/,/, $fmt_list);
foreach my $format_list (@formats_list) {

    $format_list =~ /^([^\/]+)\/([^\/]+)\//;
    $formats->{$1}->{'resolution'} = $2;
}

my @formats_map = split(/,/, $fmt_stream_map);
foreach my $format_map (@formats_map) {

    my $url           = '';
    my $quality       = '';
    my $fallback_host = '';
    my $type          = '';
    my $itag          = '';

    my @variables = split(/&/, $format_map);
    foreach my $variable (@variables) {

        my ($name, $value) = split(/=/, $variable);

        $url           = urlDecode($value) if ($name eq 'url');
        $quality       = urlDecode($value) if ($name eq 'quality');
        $fallback_host = urlDecode($value) if ($name eq 'fallback_host');
        $type          = urlDecode($value) if ($name eq 'type');
        $itag          = $value            if ($name eq 'itag');
    }

    $formats->{$itag}->{'url'}           = $url;
    $formats->{$itag}->{'quality'}       = $quality;
    $formats->{$itag}->{'fallback_host'} = $fallback_host;
    $formats->{$itag}->{'type'}          = $type;
}

print "Titulo: $title\n";
print "Formatos:\n";
foreach my $format (sort { $formats->{$a}->{'type'} cmp $formats->{$b}->{'type'} } keys %{$formats}) {
    print " - (" . sprintf("%2d", $format) . ") " . $formats->{$format}->{'type'} . " (" . $formats->{$format}->{'quality'} . ") [" . $formats->{$format}->{'resolution'} . "]\n";
}
print "Opcion: ";
my $option = <STDIN>;
chomp($option);
print "Descargando numero $option...\n";
$http->reset();
$req = $http->request($formats->{$option}->{'url'});

my $output = $title;
$output .= '.mp4' if ($formats->{$option}->{'type'} =~ /video\/mp4/);
$output .= '.flv' if ($formats->{$option}->{'type'} =~ /video\/x-flv/);
$output .= '.webm' if ($formats->{$option}->{'type'} =~ /video\/webm/);

open(FH, '>', $output);
binmode(FH);
print FH $http->body();
close(FH);
print "Done!\n";
print "Archivo: '$output'\n";

   


#################
##  FUNCTIONS  ##
#################

sub showResponse() {

    my $http = shift;

    my $status     = $http->status();
    my $status_msg = $http->status_message();
    my @headers    = $http->headers_array();

    $status_msg =~ s/[\n\r]//g;

    print "Return Code:\n";
    print "    $status ($status_msg)\n";
    print "Headers:\n";
    foreach my $header (@headers) {
        print "    $header\n";
    }
    print "---------------------------\n";

    return 0;
}

sub urlDecode() {

    $_ = shift;

    s/\+/ /g;
    s/\%([0-9A-F]{2})/@{[chr hex $1]}/g;

    return $_;
}

lunes, 25 de julio de 2011

[iPhone] Más espacio para la partición del sistema

Precaución: Solo para usuarios experimentados!

Esto fue probado en un iPhone 3G[s] con iOS4.3.2 y obviamente funcionó (o sino no lo hubiese escrito aquí)

Entren a una terminal/consola bajo usuario root y escriban lo siguiente:
(Recuerden que existe iproxy para traer el puerto 22 del iPhone a linux usando el USB)

cd /System/Library
mv Audio /private/var/stash/
ln -s /private/var/stash/Audio
mv Fonts /private/var/stash/
ln -s /private/var/stash/Fonts
cp -R TextInput /private/var/stash/
cd TextInput
rm -r *
cp -R /private/var/stash/TextInput/TextInput_en.bundle .
cp -R /private/var/stash/TextInput/TextInput_emoji.bundle .

Liberó cerca de 154MB ;)

miércoles, 20 de abril de 2011

[iPhone] Acceso directo a canales on-line de TVN, Canal13 y MEGA desde Springboard

Les voy a enseñar un truquillo para agregar accesos directos en el Springboard del iPhone para reproducir los canales de televisión on-line de TVN, Canal13 o MEGA y así no tener que darse la vuelta entrando al sitio y dándole clic al botoncillo de transmición on-line. Aquí va:

A través de Safari, entren a un sitio cualquiera para crear un acceso directo en el Springboard (ojala que sea de TVN, Canal13 o MEGA, así les va a quedar de inmediato con el ícono del canal de televisión, sino ya les diré bien abajo como cambiarle el ícono)





Luego, mediante SSH o MobileTerminal entren al iPhone y situence dentro del directorio:

/var/mobile/Library/WebClips/

En este directorio se almacenan los accesos directos que se crean en el Springboard mediante Safari.

Cada directorio que se encuentre aquí corresponde a un acceso directo, por lo que debe existir por lo menos uno (el que acabamos de crear). El tema complicado es dar con el que queremos, ya que los nombres no son muy descriptivos.

Para ello debemos entrar a cada uno de estos directorios (lo sé... no es la manera más bonita :P ), abrir el archivo Info.plist y leer el valor que tiene la llave "Title" para saber si es nuestro acceso directo recién creado.

Cuando lo encuentren, modifíquenle el valor del campo "URL" por los siguientes:

Para TVN:
http://190.196.11.204:1935/envivo/envivo.stream/playlist.m3u8
Para Canal13:
http://movil.ztreaming.com/13m/grpz13m.sdp/playlist.m3u8
Para MEGA:
http://edge1.ztreaming.com/mega/megaJaeRa1xing.sdp/playlist.m3u8

Guarden el archivo y listo!!


* Ojo: Los link deben escribirse en una sola línea, no en dos como se ven acá.


Anexo: Cambio de Icono

Para cambiarle el ícono solo basta con entrar el archivo Info.plist, cambiar los valores de "IconIsScreenShotBased" y "IconIsPrecomposed" a "false" y guardar el archivo. Luego, cambiar el ícono que está en el mismo directorio por el que queramos que se muestre. Fácil no?

Saludos!!

martes, 14 de diciembre de 2010

Programillas para el iPhone

tsocks
Cydia Source: http://sid77.slackware.it/iPhone/
(Si está caido... instalar a mano -> Acá)


Perl 5
Cydia Source: http://coredev.nl/cydia


bigbosshackertools
Cydia Source: BigBoss
Excelente recopilaci&oacuten de las mejores aplicaciones para la CLI.

Ej: adv-cmds, apt, basic-cmds, bootstrap-cmds, bzip2, class-dump, coreutils, developer-cmds, diskdev-cmds, file-cmds, gawk, gdb, git, gzip, iokittools, less, make, nano, network-cmds, ldid, openssh, rsync, shell-cmds, system-cmds, com.ericasadun.utilities, top, uikittools, findutils, inetutils, diffutils, lsof, subversion, vim, xar, tar, patch, unrar, unzip, wget, whois, xml2, zip, p7zip

adv-cmds: finger, fingerd, last, lsvfs, md, ps
basic-cmds: msg, uudecode, uuencode, write
bootstrap-cmds: Bootstrap Commands
coreutils: core set of Unix shell utilities from GNU
developer-cmds: ctags, error, hexdump, rpcgen, unifdef
diskdev-cmds: mount, quota, fsck, fstyp, fdisk, tunefs
file-cmds: chflags, compress, ipcrm, ipcs, pax
iokittools: ioalloccount, ioclasscount, ioreg
network-cmds: arp, ifconfig, netstat, route, traceroute
shell-cmds: killall, mktemp, renice, time, which
system-cmds: iostat, login, passwd, sync, sysctl
com.ericasadun.utilities: Info.
uikittools: UIKit Tools
findutils: indexes and searches filesystems
inetutils: ftp, inetd, ping, rlogin, telnet, tftp
diffutils: compare two files for differences

sábado, 20 de noviembre de 2010

Datos para escribir y hablar mejor ;)

Dado que siempre el chilenito tiene problemas con ciertas palabras y sintaxis a la hora de hablar o escribir, aquí les paso dos definiciones de nuestros mayores errores:

Solecismo.- Es de varias naturalezas:
a) Cuando en una frase "sobran" (decir, por ejemplo Debes de obedecer a tu papá, en vez de Debes obedecer a tu papá, recordando que ambas formas existen, pero con significados distintos) o "faltan" palabras (Voy ir, en vez de Voy a ir).
b) Cuando en una palabra “sobran" (trajistes, hicistes, pudistes, comprastes, etc., en vez de trajiste,hiciste, pudiste, compraste) o "faltan" letras (gasolinera en vez de gasolinería).
c) Cuando se emplea un dativo como acusativo (le vi en vez de lo vi o de la vi).
d) Cuando, sin justificación, se comprime el lenguaje (deja veo), o cuando se usan unos verbos por otros (no te hagas el occiso).

Pleonasmo.- Es la repetición, sin sentido, de un mismo concepto con palabras sinónimas o con frases análogas. Ejemplos: "Subir para arriba, bajar para abajo, salir para afuera, lapsos de tiempo, los problemas difíciles de una ciudad no tienen soluciones fáciles.


...con esto ya saben como llamarlas por lo menos ;)

jueves, 9 de septiembre de 2010

GetLyric: Buscador de Letras de Canciones

Bueno, aquí se viene otro código más...

Este entrega la letra (o lyric) de una cierta canción!

Como funciona:
Fácil, solo tienen que correr el Escri por linea de comando (usa Perl) y pasarle como parámetro el nombre del artista y el nombre de la canción.
El script buscará la letra en dos sitios distintos (en caso de que falle el primero, se utiliza el segundo ;) ) y si dá con él entonces lo mostrará por pantalla, sino, se queda callado y termina la ejecución del script corta y fome :P

Yap, espero que en este código no se me haya quedado una password o algo por el estilo (información sensible) ya que últimamente he cometido ese tipo de errores (pero gracias a Dios que tengo buenos amigos ;) )

Bueno, ahí está el código... Enjoy!

#!/usr/bin/perl
use strict;
use LWP::UserAgent;
use HTML::Entities;


if (($ARGV[0] eq '') || ($ARGV[1] eq '')) {

    print "GetLyric 1.0 ( http://wischv.blogspot.com/ )\n";
    print "Autor: Walter Schmidt\n";
    print "Usage: $0 \"Artist\" \"Song\"\n";
    exit;
}

#################################################


#my $artist = '311';
#my $song   = 'Do You Right';
my $artist = $ARGV[0];
my $song   = $ARGV[1];


my $lyric = '';
if ($lyric = get_lyric_lyricsplugin($artist, $song)) {
    print $lyric;
}
elsif ($lyric = get_lyric_songlyrics($artist, $song)) {
    print $lyric;
}


#################
##  FUNCIONES  ##
#################

sub get_lyric_songlyrics {

    my $body;
    my $artist_song = lc($_[0] . '/' . $_[1]);
    $artist_song =~ s/' / /g; # Livin' And Rockin' => livin-and-rockin
    $artist_song =~ s/'$//g;  # Livin' And Rockin' => livin-and-rockin
    $artist_song =~ s/'$//g;  # Livin' And Rockin' => livin-and-rockin
    $artist_song =~ s/[\?\&\.' ]/-/g; # It's Alright => it-s-alright
    $artist_song =~ s/[^a-zA-Z0-9\-\/]//g;
    # El exceso de '-' (Ej: '---') son limpiados por el server

    my $ua = new LWP::UserAgent;
    my $resource = $ua->get("http://www.songlyrics.com/$artist_song-lyrics/");

    if ($resource->is_success) {

        $body = $resource->content;
        $body =~ s/[^[:print:]]//g;
        $body =~ /(<p id="songLyricsDiv".*)<p id="songLyricsSmallDiv"/i;
        my $lyric = $1;

        decode_entities($lyric);

        $lyric =~ s/<br \/>/\n/g; # Convierte los <br /> en <ENTER>'s
        $lyric =~ s/<[^>]*>//g;   # Elimina los TAGs de HTML existentes
        $lyric =~ s/\n\[ [^\n]+ are found on www.songlyrics.com \]//g; # Elimina los mensajes de Songlyric
        $lyric =~ s/ +/ /g;    # Elimina el exceso de espacios entre las palabras
        $lyric =~ s/^\s+//g;   # Elimina los espacios y <ENTER>'s del comienzo del Lyric
        $lyric =~ s/\n +/\n/g; # Elimina los espacios del comienzo de cada linea
        $lyric =~ s/ +\n/\n/g; # Elimina los espacios del final de cada linea
        $lyric =~ s/\n+$/\n/g; # Elimina el exceso de <ENTER> al final del Lyric

        return $lyric;
    }
    else {

        #print $resource->status_line . "\n";
        return 0;
    }
}


sub get_lyric_lyricsplugin {

    my $artist = shift;
    my $song   = shift;

    my $site   = 'http://www.lyricsplugin.com';
    my $ua = new LWP::UserAgent;
    my $resource = $ua->get("$site/wmplayer03/plugin/?title=$song&artist=$artist");


    if ($resource->is_success) {

        my $body = $resource->content;
        $body =~ /javascript:getContent\('([^']*)', '([^']*)', '([^']*)', '([^']*)'\)/;

        $resource = $ua->get("$site/wmplayer03/plugin/content.php?artist=$1&title=$2&timestamp=$3&hash=$4", 'Referer' => "http://www.lyricsplugin.com/wmplayer03/plugin/?title=$2&artist=$1");

        if ($resource->is_success) {

            my $lyric = '';
            my $lyric_flag = 0;
            foreach my $line (split /\n/, $resource->content) {

                last if (($line =~ /<\/div>/) && ($lyric_flag));
                if ($lyric_flag) {

                    $line =~ s/\r//;
                    $line =~ s/<br \/>/\n/;
                    $lyric .= $line;
                }
                $lyric_flag = 1 if ($line =~ /<div id="lyrics">/);
            }

            return ($lyric eq '') ? 0 : $lyric . "\n";
        }
        else {

            #print $resource->status_line . "\n";
            return 0;
        }
    }
    else {

        #print $resource->status_line . "\n";
        return 0;
    }
}