Pacote Ubuntu: cclive

O pacote cclive, para download de vídeos do YouTube na linha de comando, é uma reescrita do clive mais eficiente, com menor consumo de memória e menos dependências. Para instalar:

$ sudo apt-get install cclive

E para usar:

$ cclive http://www.youtube.com/watch?v=8fvTxv46ano

Isso vai baixar o vídeo na pasta atual. Simples e indolor. Mas qual a vantagem de usar a linha de comando em relação a uma extensão no navegador, onde você não precisa digitar comandos? Com a linha de comando é possível automatizar as tarefas. Criei um script que recebe um nome de usuário do YouTube e baixa os últimos 15 vídeos publicados. Chamei o arquivo de massclive. Veja o código fonte:

mkdir -p $1

lynx --dump http://www.youtube.com/user/$1/feed | \
  grep youtube.com/watch | \
  sed -e "s/.* //" | \
  sed -e "s/&.*//" | \
  sort -u | \
  while read url
  do
    cclive -c --output-dir $1 $url
  done

E você pode usar assim:

$ ./massclive maninthearenatv

Pequena dica de Python: mesclando listas

Essa é bem legal. Temos três listas:

>>> a=[1,2,3]
>>> b=[4,5,6]
>>> c=['a','b','c']

Veja:

>>> zip(a,b,c)
[(1, 4, 'a'), (2, 5, 'b'), (3, 6, 'c')]

Simples e útil, não? E se as listas tiverem tamanhos diferentes?

>>> c=['a','b']
>>> zip(a,b,c)
[(1, 4, 'a'), (2, 5, 'b')]

O resultado será truncado para o tamanho da menor lista. Se você quiser, pode obter um comportamento diferente com map, assim:

>>> map(None,a,b,c)
[(1, 4, 'a'), (2, 5, 'b'), (3, 6, None)]

Veja um truque que eu costumava usar bastante com zip:

>>> colors=['Azul','Vermelho','Amarelo','Verde','Branco']
>>> for i in zip(range(len(colors)),colors):
...   print '%i. %s' % i
... 
0. Azul
1. Vermelho
2. Amarelo
3. Verde
4. Branco

Até que eu descobri enumerate():

>>> for i in enumerate(colors):
...   print '%i. %s' % i
... 
0. Azul
1. Vermelho
2. Amarelo
3. Verde
4. Branco

Pequena dica de Python: any e all

Python tem duas funções muito interessantes: any e all. A função any recebe uma lista (ou outro objeto interável) e retorna True se algum dos elementos for avaliado como True. Já all só retorna True se todos os elementos forem avaliados como True. Veja:

>>> everybody=[1,2,3,4]
>>> anybody=[0,1,0,2]
>>> nobody=[0,0,0,0]
>>> any(everybody)
True
>>> any(nobody)
False
>>> any(anybody)
True
>>> all(everybody)
True
>>> all(nobody)
False
>>> all(anybody)
False

Sem segredos, certo? Mas essas duas funções junto com os generators permite uma sintaxe muito interessante:

>>> v=[10,12,25,14]
>>> any(n>20 for n in v)
True
>>> all(n>20 for n in v)
False

Veja um exemplo disso num código real:

if all(v<100 for v in values):
    msg='Para usar seu cupom de desconto, pelo menos '+
        'um dos produtos deve custar mais de R$ 100,00.'

E numa classe real:

class Form:
    # ...
    def validates(self):
        return not any(field.error for field in self.fields)

Módulo Python: gzip

O módulo gzip nos permite ler e escrever em arquivos .gz sem nenhum trabalho. Veja:

>>> import gzip
>>> f=gzip.open('teste.txt.gz','w')
>>> f.write('Hello!\n')
7
>>> f.close()
>>> 
$ gunzip teste.txt.gz 
$ cat teste.txt 
Hello!
$ gzip teste.txt 
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gzip
>>> print gzip.open('teste.txt.gz').read()
Hello!

Pequena dica de Python: __missing__

A partir do Python 2.5, ao estender dicionários, você pode dar a suas classes um método __missing_, que será executado toda vez que você tentar acessar um índice inexistente. Veja:

class Counter(dict):
    def __missing__(self, key):
        self[key]=0
        return self[key]

Veja funcionando:

>>> votos=['john','paul','john','john','ringo',
...        'george','paul','ringo','ringo','john',
...        'paul','john','george','paul','paul',
...        'john','paul','john','ringo','paul']
>>> c=Counter()
>>> for v in votos:
...     c[v]+=1
... 
>>> c
{'ringo': 4, 'paul': 7, 'john': 7, 'george': 2}

Extraindo o áudio MP3 de um vídeo com ffmpeg

Gosto bastante de alguns videopodcasts, como o Roda e Avisa e o Man in the Arena. Mas o tempo que tenho para ouví-los é quando estou dirigindo. Nesse momento, o fato de serem em vídeo não significam nada. Tê-los em MP3 é muito mais prático para mim, que assim consigo ouví-los no som do carro.

Para baixar os vídeos tenho usado o Easy YouTube Video Downloader. Meu próximo projeto pessoal é automatizar isso de alguma maneira, quem sabe com Miro.

Depois, para extrair apenas o áudio, em MP3, faço:

ffmpeg -i entrada_video.mp4 -vn saida_audio.mp3

Simples e rápido. E fácil de automatizar.

Dica de Python: iPython

A maioria dos programadores Python gasta bastante tempo no shell interativo. É onde fazemos debugging e testamos novos módulos. É também nossa calculadora (piada interna, quem lê, entenda.) Muitos programadores não conhecem o iPython, uma versão “vitaminada” do shell interativo. No site há versões para download para Windows e em formato de Python-EGG. Para instalá-lo no Ubuntu, você pode usar os repositórios do APT. Use:

sudo apt-get install ipython

Depois disso, é só chamar ipython no terminal ao invés de python quando quiser usar o shell interativo. Mesmo que você não conheça os truques do iPython, já deve achar muito útil usá-lo. Vai ter um formato de output mais fácil de ler que o do shell interativo padrão, prompts coloridos e autocompletar (pressione TAB)

Além disso, há alguns recursos fáceis de usar no iPython que realmente vale a pena conhecer. Experimento digitar, por exemplo:

import glob
glob?

Experimente também:

glob??

O iPython tem muito mais, mas o que já descrevemos aqui deve ser suficiente par quem vai usá-lo pela primeira vez.

notify-send: Notificações do Gnome em seu shell script

Você pode disparar notificações do Gnome a partir de um terminal usando o programa notify-send. No Ubuntu, para instalar, faça:

sudo apt-get install notify-osd

Feito isso, você pode chamar:

notify-send "Hello world"

Gnome notify-send

Cada notificação pode ter um título e um texto. Você passa os dois como parâmetros, assim:

notify-send "Hello again..." "Here goes the message"

Gnome notify-send

Você também pode incluir um ícone em suas notificações, usando o parâmetro -i, assim:

notify-send -i /home/elcio/Imagens/alerta.png "And again..." "Now with an icon."

Gnome notify-send

Além de incluir suas imagens, você pode usar os ícones do Gnome:

notify-send -i important "And again..." "Did I get some importance?"

Gnome notify-send

Para obter uma lista dos ícones disponíveis, dê uma olhada no diretório /usr/share/icons/gnome/48×48.