Me acostumei a usar o legendas.tv para baixar legendas de filmes e acabei nunca me perguntando se haveria um jeito mais fácil de baixá-las. Hoje fui assistir um filme e, ao entrar no navegador para baixar sua legenda, me deparei com a mensagem de que o site estava fora do ar:
A situação me obrigou a procurar outros sites e outras formas de baixar legendas. Minha primeira ideia foi usar o opensubtitles.org, que já havia usado algumas outras vezes. Chegando lá e procurando pelo filme que eu desejava, vi muitas opções e não estava muito claro que legenda baixar para a versão do filme que eu tinha.
Então resolvi dar uma fuçada na pesquisa avançada do site, onde acabei encontrando uma pesquisa por hash. Hash, em computação, é uma função que “resume” uma informação gigante (tipo um arquivo bem grande) numa informação bem pequena (tipo 16 caracteres) que o represente de forma única (ou quase única). A pesquisa por hash, no caso desse site, consiste em procurar uma legenda utilizando esse “ID” do arquivo (ou seja, não importa seu nome).
Achei a possibilidade tão legal que resolvi fazer um programa para nunca mais precisar abrir o navegador quando eu quiser baixar a legenda de um filme. Escrevi um minúsculo programa em C chamado oshash (de OpenSubtitles Hash) para calcular o hash de um filme de acordo com a especificação do site (que não requer nada, a não ser um compilador de C e a biblioteca padrão) e um script (bem tosco, mas funcional) chamado downloadsubtitle que usa o programa oshash (e pequenos programas que todo mundo tem, tipo grep, sed, wget e unzip) para baixar a legenda.
O funcionamento ficou bem fácil: para baixar uma legenda em qualquer língua, basta você digitar downloadsubtitle arquivo.avi para baixar a legenda do “arquivo.avi” (que já vai ser automaticamente nomeada como “arquivo.srt”). Se você quiser especificar uma língua (por exemplo, português do Brasil), é só digitar downloadsubtitle arquivo.avi pob (pob é o código do português do Brasil). Se você quiser baixar uma legenda em inglês ou espanhol, pode usar downloadsubtitle arquivo.avi eng,esp.
Exemplo de funcionamento
$ ls Amelie [Amélie Poulain].2001.BRRip.x264.AAC[5.1]-VLiS.mkv $ downloadsubtitle Amelie\ \[Amélie\ Poulain\].2001.BRRip.x264.AAC\[5.1\]-VLiS.mkv pob Requested language: pob Movie hash: bcdc90cf4873c09b Subtitle ID: 4642726 Subtitle: Amelie [Amélie Poulain].2001.BRRip.x264.AAC[5.1]-VLiS.srt $ ls Amelie [Amélie Poulain].2001.BRRip.x264.AAC[5.1]-VLiS.mkv Amelie [Amélie Poulain].2001.BRRip.x264.AAC[5.1]-VLiS.srt $
E aí o filme está pronto para você assistir com o mplayer ou com o seu programa favorito.
Código
Este é o código inicial. Está aqui para fins históricos. Não será atualizado. Use a próxima seção (Download) para baixar a última versão, com bugs corrigidos, tratamento de erros e possivelmente novas funcionalidades.
#include <stdio.h> #include <stdlib.h> void usage(char *name) { printf("Usage: %s <file>\n", name); exit(1); } int main(int argc, char *argv[]) { unsigned long long buf[16384], c = 0; FILE *in; int i; if (argc != 2) { usage(argv[0]); } in = fopen(argv[1], "rb"); if (in == NULL) { usage(argv[0]); } fread(buf, 8192, 8, in); fseek(in, -65536, SEEK_END); fread(&buf[8192], 8192, 8, in); for (i = 0; i < 16384; i++) { c+= buf[i]; } c+= ftell(in); fclose(in); printf("%016llx\n", c); return 0; } |
#!/bin/bash usage() { echo "Usage: $0 <file> [lang]" echo "Examples:" echo "$ $0 movie.avi pob # brazilian portuguese" echo "$ $0 movie.avi por,pob # any portuguese" echo "$ $0 movie.avi eng # english" echo "$ $0 movie.avi all # any language" exit } if [ $# -lt 1 ]; then usage elif [ $# -gt 2 ]; then usage fi if [ $# = 2 ]; then lang=$2 else lang="any" fi echo "Requested language: $lang" output=$(echo "$1" | sed 's/\.[^.]*$/.srt/') oshash=$(oshash "$1") echo "Movie hash: $oshash" subid=$(wget "http://www.opensubtitles.org/en/search/sublanguageid-$lang/moviehash-$oshash/rss_2_00" -q -O - \ | grep '<link>.*en/subtitles' | sed 's|.*en/subtitles/||; s|/.*||' | head -n1) echo "Subtitle ID: $subid" wget "http://www.opensubtitles.org/en/subtitleserve/sub/$subid" -q -O - | gunzip > "$output" 2> /dev/null echo "Subtitle: $output" |
Download
Criei um repositório no Github para colocar o código: github.com/tmadeira/downloadsubtitle
Para quem tem git, é possível baixar com git clone https://github.com/tmadeira/downloadsubtitle.git
Para quem não tem, dá pra baixar em ZIP daqui: github.com/tmadeira/downloadsubtitle/archive/master.zip
O programa ainda não está empacotado bonitinho (não tem nem Makefile ou instruções de instalação). Se futuramente vier a ter, este post será atualizado. Em resumo, basta compilar o código em C (digitando gcc oshash.c -o oshash) e colocar os arquivos oshash e downloadsubtitle numa pasta do seu $PATH (por exemplo, /usr/local/bin).
Sugestões e correções são bem-vindas.