omdb-cli

Publicado por Pedro Fernandes (última atualização em 19/04/2022)

[ Hits: 492 ]

Homepage: https://github.com/PedroF37

Download omdb-cli

Download 1638553320.omdb-cli (versão 2)




Script que usa a API do site: 'https://www.omdbapi.com', (Open Movie Database), para pegar os dados dos filmes e séries.
Infelizmente, não pega dados dos atores, pois a API do site não tem essa opção.
Mostra na tela do terminal dados como o nome, classificação, atores, sinopse etc.
O script usa o curl para fazer os pedidos na API, e você tem que pegar a chave da API no site. É gratuita.
Pode mudar o nome do script para o que quiser kk, (não sou muito original nos nomes kk), que não vai quebrar o script.

Alguns exemplos de uso:

Pegando dados da melhor série já feita pelo HOMEM! kk, pelo título da série e mostrando sinópse completa:

$ omdb-cli -T Fringe -p full

Chama pelo pelo id do IMDB pedindo sinópse breve:

$ omdb-cli -i tt0407362 -p short

Chama pelo título, ano, sinópse completa e especifica o tipo (filme ou série), para casos em que tem série e filme com o mesmo nome:

$ omdb-cli -T '12 Monkeys' -t series -y 2015 -p full

As únicas opções obrigatórias são a opção -T título ou -i ID, e estas são mutuamente exclusivas, ou seja, ou usa -T ou usa -i.
Se a série ou filme tiver espaços, tem que colocar entre aspas.
Ano são os 4 digitos apenas, "2008" não aceita 02/05/08, 02-05-2008 etc.
Também a opção -p (sinópse) se não especificar por padrao mostra a sinopse breve. Por exemplo, se digitar:
$ omdb-cli -T Fringe
o script vai agir como se tivesse digitado:
$ omdb-cli -T Fringe -p short

A ordem de chamada das opções não interessa, o script ordena tudo.
Por favor, lêr o cabeçallho que contém mais informações do que aqui (algumas delas importantes para o uso do script!)

  



Versões atualizadas deste script

Versão 2 - Enviado por Pedro Fernandes em 03/12/2021

Changelog: Versão 2.0 - 10-10-2021

Script recriado quase do zero, para não usar tanto sed e pipes, e para ficar um pouco mais limpo (que nem a função Usage, que parecia um testamento...)
Adicionado mais testes para pegar erros.

Download 1638553320.omdb-cli


Esconder código-fonte

#!/bin/bash

# ---------------------------------------------------------------------------- #

# SCRIPT    omdb-cli (ou o que quiser chamar em vez disso..)
# AUTOR     Pedro Fernandes
# E-MAIL    [email protected]
# DATA      17-06-2021 - Inicio de script

# ---------------------------------------------------------------------------- #

# DESCRIÇÃO:

# Script que usa a API do site 'https://www.omdbapi.com',
# (Open Movie Database), para pegar os dados dos filmes
# e séries.

# O script mostra na tela algo assim:

# Title           Fringe

# Year            2008–2013

# Runtime         46 min

# Genre           Drama, Mystery, Sci-Fi, Thriller

# Director        N/A

# Writer          J.J. Abrams, Alex Kurtzman, Roberto Orci

# Actors          Anna Torv, Joshua Jackson, Jasika Nicole, John Noble

# Language        English

# Country         USA, Canada

# Awards          Nominated for 3 Primetime Emmys. Another 18 wins & 84 nominations.

# Rating          8.4/10,Metascore:N/A

# Rating          8.4,Source:IMDB

# Type            series

# Total Seasons   5

# Plot

# An F.B.I. agent is forced to work with an institutionalized scientist and his son in order to
# rationalize a brewing storm of unexplained phenomena.


# Alguns filmes e séries mostra classificações de outros sites como o
# Rotten Tomatoes e Metacritic, mas não são todos, o único que mostra sempre
# é do imdb.

# ---------------------------------------------------------------------------- #

# COMO USAR:

# A API tem MUITAS opções para se fazer os pedidos, mas o script
# só usa umas poucas. Nem todas as 'flags' no script correspondem
# ás 'flags' oficiais na API.

# Elas são:

# -T Título     - Especifica o título do filme ou série
# -t tipo       - Especifica se procura por filme ou série. Aceita:
#                 'movie|MOVIE|series|SERIES' apenas, (INGLÊS).
# -i ID         - Especifica o id (ttxxxxxxx) do filme ou série do imdb
# -y ano        - Especifica o ano. No formato '2008'. Não aceita '22/05/2008'
#                 '22-05-2008' '22 05 2008' '22-05-08' etc.
# -p full|short - Especifica se a sinopse é completa ou breve. Aceita
#                 'full|FULL|Full ou short|SHORT|Short' apenas.


# Exemplos de uso:

# Pegando pelo título, ano e especificando sinopse completa:

# $ omdb-cli -T Fringe -y 2008 -p FULL

# Pelo id do IMDB e sinópse breve:

# $ omdb-cli -i tt0407362 -p short

# Série com espaços:

# $ omdb-cli -T 'Sons of Anarchy'

# Especificando o tipo (série ou filme)

# $ omdb-cli -T '12 Monkeys' -t series -p full

# De todas as opções, as únicas obrigatórias são -T e -i, e estas
# são mutuamente exclusivas. Ou seja, ou usa -T Título ou usa -i ID.

# O ID é o método mais 'infalivel' de pegar o filme/série certo, mas,
# também é o mais chato e que faz menos sentido de usar. Se eu tenho
# que ir procurar o ID, então abro logo o navegador e vou ver o filme
# direto no site do imdb! O ID está incuido no sript apenas porque a
# API tem essa opção e para deixar o script mais completo, (que nem
# no meu script 'imdb-cli').

# Também, como nos dois últimos exemplos, se o filme ou série tiver
# espaços, tem que colocar entre aspas.

# A ordem não interessa, o script ordena as opções por si, então,
# pode colocar '-T titulo -p full -y ano', ou '-p full -T titulo -y ano',
# que vai tudo dar no mesmo..

# Por fim, a sinopse, (opção -p), se não especificar a opção, por padrão
# usa '-p short'. Ou seja, se digitar: 'omdb-cli -T fringe' vai mostrar como
# se tivesse digitado: 'omdb-cli -T fringe -p short'.

# ---------------------------------------------------------------------------- #

# NOTAS:

# 1 - Pode acontecer de chamar o script e não funcionar por https.
#     Nesse caso tente chamar o script assim: 'Proto=http omdb-cli ...'

# 2 - O script usa o comando fold, com as opções (-w|--width) e (-s|--space).
#     No meu monitor a largura (opção -w) de 160 fica perfeito e é a largura
#     padrão no script. Tem a variável 'FoldWidth=${FoldWidth:=160}' no inicio
#     do script. Você pode chamar o script: 'FoldWidth=xxx omdb-cli ...' ou,
#     pode mudar o número aqui no script.

# 3 - Pode acontecer de você pedir dados de uma série ou filme e receber o errado.
#     Por exemplo, se você digitar: 'omdb-cli -T MacGyver', vai receber qual?
#     A série antiga ou a nova série que tem o mesmo nome?
#     Nestes casos tem 3 opções:

#     Chamar pelo id do imdb
#     $ omdb-cli -i ttxxxxxxx

#     Especificar o ano
#     $ omdb-cli -T MacGyver -y ano

#     Ou, se uma for série e o outro for filme, como no caso do '12 Monkeys',
#     especificar a opção -t tipo:
#     $ omdb-cli -T '12 Monkeys' -t series

# 4 - O script usa o curl para fazer o pedido na API, então tem que instalar

# 5 - Por fim, você precisa pegar a chave da API no site:
#     'https://www.omdbapi.com'. Tem a opção de chave paga, MAS, tem
#     também a opção de chave gratuita. Basta dar o nome, e-mail e
#     dizer para que quer usar a API.
#     Você coloca a chave na variável: 'Key'

# ---------------------------------------------------------------------------- #

# VERSÃO/CHANGELOG:

# 1.0 - 27-06-2021

### Script completado e testado o melhor possível.
### Caracteres estranhos como '\"..\" e &'
### que aparecem na sinópse para escapar '"' etc,
### detectados e substituídos. Mais caracteres
### que venham a ser achados serão removidos em
### futuras versões se/caso aparecam.

# ---------------------------------------------------------------------------- #

##### PARÂMETROS #####

## Sua chave da API aqui
Key=''

## Aqui você coloca a largura para o comando fold
## para a opção -w. Basta trocar o número.
FoldWidth=${FoldWidth:=160}

## A partir daqui não precisa mexer mais.
ApiKey='&apikey='
UserAgent=$(type -p curl)
Proto=${Proto:-https}
QueryDatabase='://www.omdbapi.com/?'
TitleQuery='t='
IdQuery='i='
StoryLine='&plot='
ReleasedYear='&y='
Category='&type='
Plot=${Plot:-short}
CommandLine=${ApiKey}${Key}

# ---------------------------------------------------------------------------- #

##### FUNÇÕES #####

function ErrorExit {

echo ${0##*/}: [email protected] >&2
exit 1

}

function Usage {

clear
cat <<EOF
Uso: ${0##*/} -T TÍTULO | -i ID [OPÇÕES...]

ONDE OPÇÕES SÃO:

-T TÍTULO      Procura pelo Título do filme ou série.
-t tipo        Especifica se procura por filme ou série
               aceita: -t movie | -t series
-i ID          Procura pelo ID do imdb (ttxxxxxxx).
               ID é tt seguido de entre 7 a 8 digitos.
-y ano         Permite especificar o ano do filme ou série.
-p short|full  Especifica se mostra sinopse completa ou breve.
               Por padrão, se opção -p não for usada, a sinopse
               é breve.



Exemplos de Uso:


Consultando pelo título apenas:

$ ${0##*/} -T Fringe

Usando o ID do imdb e a opção -p para especificar sinopse breve:

$ ${0##*/} -i tt0407362 -p short

Especificando título da série, ano e sinopse completa:

$ ${0##*/} -T 'Sons of Anarchy' -y 2008 -p full

Especificando o tipo:

$ ${0##*/} -T '12 Monkeys' -t series


NOTAS:

1 - De todas as opções, as únicas obrigatórias são
    as opções -T ou -i e elas são mutuamente exclusivas.
    Ou seja, ou usa a opção -T ou usa a opção -i,
    mas não as duas juntas.

2 - Se filme ou série tiver espaços, como nos últimos
    exemplos, tem que colocar entre aspas.

3 - Ano do filme ou série são os 4 dígitos (2008), não
    aceita (01-03-2008)|(01/03/2008)|(01 03 2008) nem
    (01 03 08).

4 - Se não funcionar o script, pode ser que o site
    'https://www.omdbapi.com', não esteja aceitando pedidos
    por https. Neste caso, tente chamar o script assim:

    $ Proto=http ${0##*/} ...

5 - Se existir dois filmes ou séries com o mesmo nome,
    possivelmente receberá o filme ou série errado.
    Para resolver esse caso você pode usar um destes
    três métodos:

    1 - Chamar o script usando o ID:
        $ ${0##*/} -i ttxxxxxxxx

    2 - Chamar o script passando o ano do filme ou série:
        $ ${0##*/} -T fringe -y 2008

    3 - Se for o caso de o nome corresponder a uma série e a
        um filme, então pode especificar a opção -t tipo:
        $ ${0##*/} -T '12 Monkeys' -t series

EOF

exit

}

function Parser {

# Limpamos o retorno do pedido.
# Com Kilos atrás de Kilos de sed pipes e gawks...
# Claro que tem os módulos dos tais de pythons
# e esse tal de 'jq', mas não sei usar nenhum dos
# dois, isso é coisa pra programador..
#
clear

sed '
s!\("\)\(,\)\("\)!\1\n\3!g
s/[]{}[]//g
/"Writer"/s/([^)]*)//g
s!\(\\"\)\([^\\"]*\)\(\\"\)!\2!g' |

gawk -v fs='"' '

BEGIN {

    FS=fs
    OFS="<=>"
}

/"Title":/{print $2,$4};
/"Year":/{print $2,$4};
/"Released":/{print $2,$4};
/"Runtime":/{print $2,$4};
/"Genre":/{print $2,$4};
/"Director":/{print $2,$4};
/"Writer":/{print $2,$4};
/"Actors":/{print $2,$4};
/"Language":/{print $2,$4};
/"Country":/{print $2,$4};
/"Awards":/{print $2,$4};
/"Value":/{print "Rating",$0};
/"imdbRating":/{print "Rating",$4",Source:IMDB"};
/"Type":/{print $2,$4};
/"totalSeasons":/{print "Total Seasons",$4};
/"Plot"/{print $2,$4}

' |

sed -n '{
/Plot/{h ; n}
$G ; p}' |

sed '
s/"Value"://g
s!\(Plot\)\(<=>\)!\n\n\1\n\n!
s/"//g
s/&quot;/"/g
s!\(&\)\(amp;\)!\1!g' |

sed '/^\n*$/{N; D}' |

gawk -F"<=>" '{printf "\n%-8s\t\t%-8s\n", $1,$2}' |
fold -w $FoldWidth -s
echo

}

# ---------------------------------------------------------------------------- #

##### VERIFICAÇÕES #####

# Tem que ter pelo menos -T ou -i
[ $# -eq 0 ] && {

ErrorExit Não passou parâmetro/argumento nenhum. Use: ${0##*/} -h para ajuda.

}

# Tem que ter a chave da API
[ -z "$Key" ] &&  {

ErrorExit Não tem chave de API.

}

# Precisamos do curl
[ -z "$UserAgent" ] && {

ErrorExit Necessita do programa curl.

}

# ---------------------------------------------------------------------------- #

##### PEGANDO PARÂMETROS E ARGUMENTOS #####

while getopts :t:i:y:T:p:h Opt
do
    # Dependendo da opção, vai montando o comando.
    # O Título e o ID, são mutuamente exclusivos.
    # Para além disso, ambos têm que vir primeiro na
    # URL: 'https://www.omdbapi.com/?[Ti]='; então eles
    # são inseridos no comando no final do script apenas.
    # Também, a chave da API é o último argumento da URL,
    # então o comando é composto da direta para a esquerda:
    # 'CommandLine=${ChaveAPI}; CommandLine=${Var1}${ChaveAPI}..'

    case "$Opt" in
    T)
        Title=$OPTARG

        # Não pode ter espaços na URL, então, John Wick Chapter 2
        # não passa, mas passa John+Wick+Chapter+2. Atenção,
        # que aqui está contando com que o nome da serie ou filme
        # seja inserido entre aspas. Se não não vai servir de nada!!
        Title=${Title// /+}
        ;;
    i)
        ID=$OPTARG

        # ID tem que ser ttxxxxxxx|ttxxxxxxxx (7 ou 8 digitos)
        [[ "$ID" =~ ^tt[0-9]{7,8}$ ]] && : || {

        ErrorExit ID especificado errado. Use ${0##*/} -h para ajuda.

        }
        ;;
    t)
        Type=$OPTARG

        # Type, tem que ser 'movie|MOVIE|series|SERIES' em Inglês...

        case $Type in

        series|SERIES|movie|MOVIE)
            :
            ;;
       # Vocês aqui no Brasil falam Seriado né?...
        séries|SÉRIES|série|SÉRIE|seriados|SERIADOS|seriado|SERIADO)
            Type='series'
            ;;
        filmes|FILMES|filme|FILME)
            Type='movie'
            ;;
        *)
            ErrorExit Opção -t é 'movie|MOVIE|series|SERIES'
            ;;
        esac

        CommandLine=${Category}${Type}${CommandLine}
        ;;
    y)
        Year=$OPTARG

        # Ano, tem que ser os 4 dígitos apenas do ano (2008),
        # não pode ser '22-01-2008' ou '22/01/2008'. Atenção,
        # que a expressão pega os casos de '22-01-2008' ou
        # '22/01/2008', mas não pega casos de '22-02-08' ou
        # '22 01 2008'.
        Year=${Year//[[:digit:]][[:digit:]][\-\/:]}

        CommandLine=${ReleasedYear}${Year}${CommandLine}
        ;;
    p)
        Plot=$OPTARG

        # Plot (sinopse) suporta 'full|FULL|Full ou |short|SHORT|Short' apenas.

        [[ "$Plot" =~ ^(full|FULL|Full|short|SHORT|Short)$ ]] && : || {

        ErrorExit Opção é: -p 'full|FULL|Full ou short|SHORT|Short'

        }

        CommandLine=${StoryLine}${Plot}${CommandLine}
        ;;
    h)
        Usage
        ;;
    *)
        ErrorExit Opção desconhecida: $Opt Use: ${0##*/} -h para ajuda.
        ;;
    esac
done

# Não pode pegar pelo título e id ao mesmo tempo.
[ -n "$Title" ] && [ -n "$ID" ] && {

ErrorExit Não pode usar -T título e -i ID no mesmo comando.

}

# ---------------------------------------------------------------------------- #

##### EXECUTAMOS O PEDIDO #####


# Se não der certo, tente: $ Proto=http omdb-cli ...

if [ -n "$Title" ]
then
    $UserAgent -s \
    ${Proto}${QueryDatabase}${TitleQuery}${Title}${CommandLine} \
    | Parser

elif [ -n "$ID" ]
then
    $UserAgent -s \
    ${Proto}${QueryDatabase}${IdQuery}${ID}${CommandLine} \
    | Parser

else
    ErrorExit Erro desconhecido.
fi

exit $?

# ---------------------------------------------------------------------------- #

Scripts recomendados

Script que conta quantas barras tem em um diretorio

Script de backup para banco Firebird

Linux Mint 20 Pós Instalação

pdfcon - leitor de PDF em modo texto

Padronização de usuários em vários micros


  

Comentários
[1] Comentário enviado por mauricio123 em 11/12/2021 - 15:39h


Gostei. Se eu tiver tempo dou uma testada nisso.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]

[2] Comentário enviado por sabe nada em 11/12/2021 - 22:07h


[1] Comentário enviado por mauricio123 em 11/12/2021 - 15:39h


Gostei. Se eu tiver tempo dou uma testada nisso.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]


Obrigado.
Se quiser pode pegar a nova versão no meu GitHub.
Ela está mais limpa e não usa tanto sed e pipes kkk. Se bem que a eficiência aqui deste script, vai depender mais da conexão e do pedido na API.


Contribuir com comentário