ebook-cli - gerencia livros digitais entre PC e leitores ebooks

Publicado por Pedro Fernandes (última atualização em 17/03/2021)

[ Hits: 394 ]

Download ebook-cli




Gerencia livros digitais entre PC e leitores ebooks.

Funções que desempenha:

- Cria pasta chamada Biblioteca no PC e no dispositivo ebook-reader
- Copia e remove livros das pastas Biblioteca no PC e ebook-reader
- Lista conteúdo das Bibliotecas do PC e ebook-reader
- Cria pequeno arquivo de configuração na primeira vez que é rodado,
  onde armazena o ponto de montagem do dispositivo (conta com que não mude),
  e o local das pastas Biblioteca.
  Exemplo:
  /home/pedro/Biblioteca --> Pasta no PC
/run/media/pedro/Lev/Biblioteca --> Pasta no dispositivo ebook-reader

  



Esconder código-fonte

#!/bin/bash
#
#
# -------------------------------------------------------- #
#
# ebook-cli:
#
# Gerência livros digitais entre pc e
# leitores ebooks.
#
# -------------------------------------------------------- #
#
# Funções do script:
#
# -Cria pasta para biblioteca de livros
#  no pc e no ebook-reader. Nome: Biblioteca
# -Lista conteúdo da biblioteca de livros
#  no pc e no ebook-reader
# -Copia e remove livros das bibliotecas
# -Cria pequeno arquivo de configuração
#  a primeira vez que é rodado, com registro
#  de ponto de montagem do ebook-reader e
#  local da biblioteca no pc e no ebook-reader.
#  Só volta a criar arquivo de configuração
#  se o usuário deletar o arquivo.
#
# -------------------------------------------------------- #
#
# NOTAS:
#
#
# Limitações do script nesta primeira versão:
#
#
# -Usuário tem que especificar qual paginador (less/most/more)
#  quer usar na variável PAGER na secção de Variáveis Globais
#
# -Script copia e remove livros apenas entre as pastas Biblioteca
#  do pc e do ebook-reader (Usuário tem que copiar manualmente
#  livros para a pasta Biblioteca do pc para depois puder gerênciar
#  os livros entre a pasta no pc e a pasta no ebook-reader)
#
# -O script só aceita UM dispositivo ebook-reader.
#  Para usar outro dispositivo, usuário tem que deletar
#  arquivo de configuração e chamar o script para criar outro.
#
# -Script conta com que dispositivo aparece na saída do
#  comando mount como algo assim: (/dev/sdc on /run/media/pedro/Lev)
#  (Digo isso pois não uso muitas distribuições, não sei se aparece
#  assim em todas...!!)
#
# -------------------------------------------------------- #
#
# Versão:
#
# 0.1 -Inicio do script 25/11/2020
#
#
# Autor: pedro fernandes
# Email: [email protected]
#
#
# -------------------------------------------------------- #


### Variáveis Globais ###


### Configurado por usuário ###


# Coloque o paginador que usa aqui ex: (most|less|more)
# Coloque caminho completo ex: /usr/bin/most
PAGER=""


### Fim de configuração do usuário ###


### Daqui em diante NÃO mexa!! ###


CONFIG="${HOME}/.ebook-cli.conf"              # Arquivo de configuração
PCLIBRARY="${PCLIBRARY:-${HOME}/Biblioteca}"  # Pasta dos livros no pc
DEVICELIBRARY=""                              # Pasta dos livros no ebook-reader
DEVICE=""                                     # Dispositivo ebook-reader



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


### Funções ###


# Chamada por trap, remove
# arquivos temporários
function RemoveTemp {


rm -f "$registry" "$listremove" \
"$listcopy" &> /dev/null
return


}


# Para apagar arquivo de configuração
# caso algo tenha dado errado
function RemoveConfig {


rm -f "$CONFIG"
return


}


function GameOver {


echo "[email protected]" >&2
exit 1


}


function ExitSigInt {


clear
echo "Script interrompido por usuário."
echo "Terminando..."
RemoveTemp


exit 0


}


function Banner {


clear
echo -e "\t\t\t\t\t\t**************************************************"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t*                 ebook-cli                      *"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t*            Gerenciador de Livros CLI           *"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t*                                                *"
echo -e "\t\t\t\t\t\t**************************************************"


return


}


# Aqui as pastas gravadas na função abaixo
# são realmente criadas. Primeiro lê do arquivo
# de configuração. Depois ignora a linha que
# começa com DEVICE, e então tenta criar as pastas.
# Se der errado quer dizer deve ter algum erro
# nas permissões.
# Nesse caso sai do script e deleta arquivo $CONFIG
function CreateFolder {


echo "Aguarde enquanto criamos as pastas"
echo "para guardar seus livros..."


if mkdir "$PCLIBRARY" &> /dev/null && \
   mkdir "$DEVICELIBRARY" &> /dev/null
then
  clear
  echo "Pastas criadas com sucesso no seu pc e ebook-reader!!"
  echo "Pastas chamam-se: Biblioteca. Pode agora passar livros"
  echo "para a pasta Biblioteca do seu pc e chamar o script"
  echo "para gerenciar os livros no pc e no seu ebook-reader."
  echo "Para usar outro dispositivo ebook-reader, basta deletar"
  echo "o arquivo $CONFIG e rodar de novo o script"
  exit 0
else
  clear
  RemoveConfig
  RemoveTemp
  GameOver "Erro ao criar pastas. Revise suas permissões"
fi


}


# Aqui grava em $CONFIG as pastas onde vão ficar os livros
# Grava duas pastas: $PCLIBRARY tem a pasta no pc
# $DEVICELIBRARY tem a pasta que fica no ebook-reader
function RecordConfig {


while read line
do


  if [ "${line%% *}" = "DEVICE" ]
  then
    DEVICE="${line##* }"
    DEVICELIBRARY="${DEVICE}/Biblioteca"
    #
    echo "PCLIBRARY = ${PCLIBRARY}" >> "$CONFIG"
    echo "DEVICELIBRARY = ${DEVICELIBRARY}" >> "$CONFIG"
    CreateFolder
  else
    clear
    RemoveConfig
    RemoveTemp
    GameOver "Erro!! Saindo do script."
  fi


done < "$CONFIG"


}


# O fato de ter digitado número não quer
# dizer que digitou correto. Inclusive pode
# ter pressionado enter apenas e foi aceite.
function ValidChoice {


# Validamos o número escolhido
case "$number" in


  "")
    # Se tiver dado ENTER no case da função abaixo
    # vai corresponder com todos os números.
    # Não pode. Aqui pega esse caso.
    clear
    RemoveTemp
    GameOver "Não digitou nada!! Saindo do script..."
    ;;
  *)
    # Se digitou número certo, então
    # guarda em arquivo de configuração.
    if grep -q "^$number" "$registry"
    then
      sed -n "s/^$number/DEVICE =/p" "$registry" | \
      cut -d ' ' -f 1,2,5 >> "$CONFIG"
      RecordConfig
    else
      # Não deu apenas enter (foi número)
      # mas mesmo assim número não está
      # certo? Sai!!
      clear
      RemoveTemp
      GameOver "Erro!! Número digitado é incorreto. Saindo..."
    fi
    ;;


esac


}


# Aqui escolhe o dispositivo correspondente
# que mostra na listagem da função abaixo.
function ChooseDevice {


# Dá 2 tentativas de digitar número
for try in {1..3}
do


  clear
  echo -e "\n\nPor favor digite o número do dispositivo"
  echo -n "que corresponde ao seu ebook-reader: "
  read number


  case "$number" in


    # Só aceita número, o resto não passa
    # Mas aceita ENTER!!
    *[!0-9]*)
      if [ "$try" -eq 2 ]
      then
        clear
        RemoveTemp
        GameOver "Tentativas esgotadas!!"
        break
      fi
      echo "Erro. Tente de novo"
      ;;
    *)
      # Se estamos aqui, certo ou errado
      # digitou número; (ou enter!!).
      break
      ;;


  esac


done


ValidChoice


}


# Se não tiver arquivo de configuração criado
# função é chamada. Se tiver, não é chamada.
function FindDevice {


echo -e "\n\t\t\t\t\t\tNão foi encontrado arquivo de configuração"
echo -e "\t\t\t\t\t\tIremos criar um para você agora."
echo -e "\t\t\t\t\t\tEste passo é necessário apenas uma vez"
echo -ne "\n\n\t\t\t\t\t\tAperte <ENTER> para continuar: "
read enter


# Acha os dispositivos montados. Númera com o sed
# para usuário digitar o número do dispositivo.
# Podia usar o nl, cat etc... ,
# mas fica mais bonitinho de se ver na tela com o sed!!
local device="$(mount | grep -v '^[^/]' | sed '=' | \
sed 'N; s/\n/ /')"


# Cria arquivo temporário para armazenar saída
# da substituíção acima, para comparar depois
# com escolha do usuário.
local registry="$(mktemp $HOME/tempXXXXXX)"
echo "$device" >> "$registry"


clear
echo -e "Estes são os dispositivos no sistema:\n\n"
sleep 2
$PAGER "$registry"


ChooseDevice


}


function ListContent {


clear
echo "Deseja listar conteúdo de qual biblioteca?"
read -n 1 -p "1. Pc, 2. ebook-reader: " choice


case "$choice" in


  1)
    clear
    ls "$PCLIBRARY" | $PAGER
    ;;
  2)
    clear
    ls "$DEVICELIBRARY" | $PAGER
    ;;
  *)
    clear
    echo "Erro!! Opção inválida."
    RemoveTemp
    sleep 2
    ;;


esac


return


}


function CopyContent {


clear
echo "Os livros que se encontram na Biblioteca:"
sleep 2
clear


local listcopy="$(mktemp $HOME/listcopyXXXXXX)"
ls "$source" | sed '=' | sed 'N; s/\n/: /' > $listcopy


$PAGER  $listcopy


echo -e "\n\nPor favor digite o(s) número(s) que corresponde"
echo "ao(s) livro(s) que quer copiar, um atrás do outro"
echo -n "separados por espaço: "
read books


for item in $(echo $books)
do


  if grep -q "^${item}: " "$listcopy"
  then
    local listcopy2=$(grep "^${item}: " "$listcopy" | \
                      cut -d ' ' -f 2-)
    #
    #
    echo "Copiando item ${item}..."
    echo "cp ${source}/$listcopy2 $target"
    cp -u "${source}/$listcopy2" "$target"
  else
    echo "Erro. Item ${item} não existe na lista"
    echo "Logo não iremos copiar."
    echo "Continuando..."
  fi


done


RemoveTemp
sleep 2


return


}


function RemoveContent {


clear
echo "Os livros que se encontram na Biblioteca:"
sleep 2
clear


local listremove="$(mktemp $HOME/listremoveXXXXXX)"
ls "$target" | sed '=' | sed 'N; s/\n/: /' > $listremove


$PAGER $listremove


echo -e "\n\nPor favor digite o(s) número(s) que corresponde"
echo "ao(s) livro(s) que quer remover, um atrás do outro"
echo -n "separados por espaço: "
read books


for item in $(echo $books)
do


  if grep -q "${item}: " "$listremove"
  then
    local listremove2=$(grep "${item}: " "$listremove" | \
                        cut -d ' ' -f 2-)
    #
    #
    echo "Removendo item ${item}..."
    echo "rm -f ${target}/$listremove2"
    rm -f "${target}/$listremove2"
  else
    echo "Item $item não existe na lista."
    echo "Logo não iremos remover."
    echo "Continuando..."
  fi


done


RemoveTemp
sleep 2


return


}


# Aqui escolhe de onde quer
# copiar livros
function ChooseCopyContent {


local source=""
local target=""


clear
echo "Deseja copiar de onde para onde?"
echo "1. pc para ebook"
echo "2. ebook para pc"
echo -en "Digite a opção: "
read -n 1 opcao


case "$opcao" in


  1)
    source="$PCLIBRARY"
    target="$DEVICELIBRARY"
    CopyContent
    ;;
  2)
    source="$DEVICELIBRARY"
    target="$PCLIBRARY"
    CopyContent
    ;;
  *)
    clear
    echo "Erro!! Opção inválida"
    sleep 2
    ;;


esac


return


}


# Aqui escolhe de onde quer
# remover livros
function ChooseRemoveContent {


local target=""


clear
echo "Deseja remover de onde."
echo "1. Biblioteca do pc"
echo "2. Biblioteca do Ebook-reader"
echo -en "Escolha a opção: "
read -n 1 opcao


case "$opcao" in


  1)
    target="$PCLIBRARY"
    RemoveContent
    ;;
  2)
    target="$DEVICELIBRARY"
    RemoveContent
    ;;
  *)
    clear
    echo "Erro!! Opção invávida"
    sleep 2
    ;;


esac


return


}


# Menu de apresentação e de escolha
function Menu {


while true
do

  clear
  Banner
  echo -e "\n\t\t\t\t\t\t\tBem Vindo(a) ao ebook-cli!!\n\n"
  echo -e "\t\t\t\t\t\t\tPor favor escolha o que quer fazer\n\n"
  echo -e "\t\t\t\t\t\t1. Listar conteúdo das Biblotecas de livros"
  echo -e "\t\t\t\t\t\t2. Copiar livros das Bibliotecas"
  echo -e "\t\t\t\t\t\t3. Remover livros das Bibliotecas"
  echo -e "\t\t\t\t\t\t0. Saír do script sem executar nenhuma ação\n\n\n"
  echo -en "\n\n\t\t\t\t\tPor favor digite sua opção: "
  read -n 1 opcao


  case "$opcao" in


    1)
      ListContent
      ;;
    2)
      ChooseCopyContent
      ;;
    3)
      ChooseRemoveContent
      ;;
    0)
      clear
      echo "Terminando script."
      echo "Obrigado por usar o ebook-cli!!"
      break
      ;;
    *)
      clear
      RemoveTemp
      GameOver "Erro!! Opção inválida. Saindo..."
      break
      ;;


  esac


done


}


# Aqui lê do arquivo de configuração
# Torna os dados do arquivo
# disponiveis para o script
function ReadConfig {


# Aqui faz backup do descritor 0 (STDIN)
exec 6<&0
exec 0< "$CONFIG"


while read line
do


  # Se removendo tudo da direita em $line,
  # depois do espaço sobrar:
  case "${line%% *}" in


    DEVICE)
      # $DEVICE= Tudo o que está
      # em $line menos DEVICE =
      DEVICE="${line##* }"
      ;;
    PCLIBRARY)
      PCLIBRARY="${line##* }"
      ;;
    DEVICELIBRARY)
      DEVICELIBRARY="${line##* }"
      ;;
    *)
      :
      ;;


  esac


done


# Restaura STDIN (0) para ser usado
# no script
exec 0<&6


Menu


}


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


# Começa aqui




# Limpando a sujeira
trap ExitSigInt SIGINT
trap RemoveTemp EXIT


# Testa se já tem arquivo de configuração
# Se tem chama função ReadConfig. Senão
# chama função FindDevice. Esta depois
# chama as outras.
if [ -e "$CONFIG" -a -s "$CONFIG" ]
then
  ReadConfig
else
  Banner
  FindDevice
fi


exit $?


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

Scripts recomendados

usando a lixeira em modo texto

Uebevert - All in 1

Atualizando o KDE

Medir tempo de acesso a internet no log do Squid

Instalação de programas em Debian-like


  

Comentários
[1] Comentário enviado por mauricio123 em 17/03/2021 - 21:53h


Bacana.

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

[2] Comentário enviado por sabe nada em 24/03/2021 - 19:34h


[1] Comentário enviado por mauricio123 em 17/03/2021 - 21:53h


Bacana.

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


Obrigado amigo. Feliz que tenha gostado!



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts