Utilitário para acertar legendas de filmes baixados

Aqui é o lugar para bater papo e trocar idéias sobre os mais variados assuntos

Moderador: Moderadores

Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Utilitário para acertar legendas de filmes baixados

Mensagem por billy1943 »

Como tenho certeza de que muitos dos colegas baixam filmes pela internet e algumas vezes, como eu, não encontram as legendas em português para o filme baixado.
Algumas legendas demoram para serem disponibilizadas e outras nunca aparecem no OpenSubtitles (melhor site de legendas).

O que fazer então ?

a) baixar a legenda em inglês (essa sempre existe)
b) incumbir o Google Tradutor de vertê-la para o português (não sai aquela maravilha de tradução, mas quebra o galho)
c) aí vem a pior parte: o tradutor bagunça a linha de sincronismo onde está a hora, minuto, segundo e milésimo de segundo que a legenda inicia e também onde ela termina

Assim, desenvolvi o pequeno utilitário que funciona tanto em Clipper como em Xharbour, para sanar a tediosa tarefa de corrigir as centenas de linhas que possam estar erradas, pois se
estiverem, o filme não utiliza a legenda pois descobre o erro e não a carrega.

O fonte é auto-explicativo, mas se houver dúvidas, é só "gritar", ...

Código: Selecionar todos

#include "inkey.ch"
****************************************************************************
*  Finalidade: acertar a linha de sincronismo que nos arquivos de legenda  *
*              (SRT) tem de ter o seguinte formato:                        *
*              HH:MM:SS,LLL --> HH:MM:SS,LLL     onde:                     *
*              HH = hora, MM = minuto, SS = segundo e LLL = milesimos seg  *
*                                                                          *
*  Obs: se houver algum erro nessas linhas, a legenda pode nao ser carrega-*
*       da junto com o arquivo de video (AVI, MKV, MP4, etc.)              *
*  Arquivo a ser utilizado = LEGENDAS.DBF com somente 1 campo alfa de nome *
*  CAMPO1 com 150 bytes                                                    *
****************************************************************************
local telin := savescreen() 
local xentrada := xsaida := space(40)
local saida, aa := chr(13) + chr(10)
local lenc, xtempo, xcampo, xcampo2, pos_seta
local inicio_hora, inicio_minu, inicio_segu, inicio_mile
local finali_hora, finali_minu, finali_segu, finali_mile
setcolor("w+/b,g+/n,,,bg+/b")
clear

do while .t.

   @ 08,15 say "Acertar arquivos de legenda - Linha de sincronismo"
   @ 10,5 say "Arquivo - Entrada: " get xentrada valid ! empty(xentrada)
   read
   
   if lastkey() == K_ESC
      restscreen(,,,,telin)
      return
   endif

   if ! file(xentrada) 
      @ 24,0 say " Arquivo de entrada nÆo existe. "
      loop
   endif

   @ 11,5 say "Arquivo - Sa¡da..: " get xsaida valid ! empty(xsaida) .and. ;
          alltrim(xsaida) <> alltrim(xentrada)
   read
   exit

enddo

xentrada := alltrim(xentrada)
xsaida   := alltrim(xsaida)
saida    := fcreate(xsaida)
@ 24,0

if (saida != -1)
    @ 24,0 say "Aguarde! Gerando o Arquivo Remessa " 
    inkey(2)
    @ 24,0
else
    @ 24,0 say "Erro ao abrir o arquivo de remessa. Tecle <ENTER>"
    inkey(0)
    restscreen(,,,,telin)
    return
endif

select 0
use legendas alias leg exclusive

if lastrec() > 0
   zap
endif

append from &xentrada. sdf
go top

do while ! eof()

   lenc := len(alltrim(campo1))
 
   if lenc < 28                                  // n£mero da linha
      fwrite(saida,(alltrim(campo1) + aa ))
      dbskip()
      loop
   endif

   pos_seta := at("->",campo1)

   if pos_seta == 0                             // linha do texto 
      fwrite(saida,(alltrim(campo1) + aa ))
      dbskip()
      loop
   endif

   if len(alltrim(campo1)) > 30                // nÆo ‚ linha de texto
      fwrite(saida,(alltrim(campo1) + aa ))
      dbskip()
      loop
   endif
 
   xtempo := substr(campo1,1,30)               // linha do sincronismo
   xcampo := ""

   for nx := 1 to 30
       if substr(xtempo,nx,1) $ "1234567890"
          xcampo += substr(xtempo,nx,1)
       endif
   next

   inicio_hora := substr(xcampo, 1,2)
   inicio_minu := substr(xcampo, 3,2)
   inicio_segu := substr(xcampo, 5,2)
   inicio_mile := substr(xcampo, 7,3)
   finali_hora := substr(xcampo,10,2)
   finali_minu := substr(xcampo,12,2)
   finali_segu := substr(xcampo,14,2)
   finali_mile := substr(xcampo,16,3)

   xcampo2 := inicio_hora + ":" + inicio_minu + ":" + inicio_segu + "," + inicio_mile
   xcampo2 += " --> "
   xcampo2 += finali_hora + ":" + finali_minu + ":" + finali_segu + "," + finali_mile
   
   fwrite(saida,(alltrim(xcampo2) + aa ))
   dbskip()

enddo

fwrite(saida,chr(26))
close leg
fclose(saida)
clear 
restscreen(,,,,telin)
return 
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Responder