Skip to content

Instantly share code, notes, and snippets.

@fernandomayer
Created April 27, 2020 02:46
Show Gist options
  • Save fernandomayer/6d65083ebee039b2b3214a97f4a2524a to your computer and use it in GitHub Desktop.
Save fernandomayer/6d65083ebee039b2b3214a97f4a2524a to your computer and use it in GitHub Desktop.
##======================================================================
## Script para baixar os livros disponibilizados gratuitamente pela
## Springer
## https://www.springernature.com/gp/librarians/news-events/all-news-articles/industry-news-initiatives/free-access-to-textbooks-for-institutions-affected-by-coronaviru/17855960
## 2020-04-03 FP Mayer
##======================================================================
##======================================================================
## Importa lista de livros
library(gdata)
da <- read.xls("Free+English+textbooks.xlsx", stringsAsFactors = FALSE,
na.strings = c("", " "))
str(da)
dim(da)
names(da)
##======================================================================
## Seleciona títulos por área
unique(da$English.Package.Name)
areas <- c(
"Mathematics and Statistics",
"Computer Science",
"Religion and Philosophy"
)
db <- subset(da, English.Package.Name %in% areas)
dim(db)
names(db)
## Ordena por titulo e ano
db <- db[order(db$Book.Title, db$Copyright.Year), ]
row.names(db) <- NULL
## Verifica se existe algum titulo duplicado
any(duplicated(db$Book.Title))
db[which(duplicated(db$Book.Title)), c("Book.Title", "Copyright.Year")]
db[which(duplicated(db$Book.Title, fromLast = TRUE)),
c("Book.Title", "Copyright.Year")]
## Remove versoes mais antigas
db <- db[!duplicated(db$Book.Title, fromLast = TRUE), ]
dim(db)
row.names(db) <- NULL
## Arruma nomes dos livros. Caracteres estranhos e espacos devem ser
## removidos, pois esse nome formara o nome dos arquivos
unique(db$Book.Title)
## Cria novo nome
db$Book.Title2 <- db$Book.Title
## Troca espacos por underline
db$Book.Title2 <- gsub(" ", "_", db$Book.Title2)
## Remove vírgulas
db$Book.Title2 <- gsub(",", "", db$Book.Title2)
## Remove dois pontos
db$Book.Title2 <- gsub(":", "", db$Book.Title2)
## Remove apóstrofe
db$Book.Title2 <- gsub("'", "", db$Book.Title2)
## Remove arroba
db$Book.Title2 <- gsub("@", "", db$Book.Title2)
## Remove barra
db$Book.Title2 <- gsub("/", "-", db$Book.Title2)
## Remove underline no final (alguns ficaram)
db$Book.Title2 <- gsub("_$", "", db$Book.Title2)
## A coluna OpenURL contém o ISBN do livro, e possui o seguinte formato
## "http://link.springer.com/openurl?genre=book&isbn=978-3-662-56233-8"
## Mas depois de resolvida no navegador, ela se transforma em
## https://link.springer.com/book/10.1007%2F978-3-662-56233-8
## A versão em PDF possui o seguinte caminho
## https://link.springer.com/content/pdf/10.1007%2F978-3-662-56233-8.pdf
## E a versão em EPUB tem o caminho
## https://link.springer.com/download/epub/10.1007%2F978-3-662-56233-8.epub
## Assim, de maneira geral, os links são
## https://link.springer.com/content/pdf/10.1007%2F<ISBN>.pdf
## https://link.springer.com/download/epub/10.1007%2F<ISBN>.epub
## Cria arquivo para armazenar o log dos erros
file.create("try-log.txt")
## Cria contador (apenas para mostrar na tela)
k <- 0
## Baixa tudo de uma vez
for(i in seq_along(db$Book.Title)) {
k <- k + 1
print(sprintf("===== [%s/%s] %s =====", k,
length(db$Book.Title), db$Book.Title[i]))
tryCatch(download.file(
url = paste0("https://link.springer.com/content/pdf/10.1007%2F",
db$Electronic.ISBN[i], ".pdf"),
destfile = paste0(db$Book.Title2[i], ".pdf")),
error = function(e) {
write(paste(db$Book.Title[i], "\n", as.character(e)),
"try-log.txt", append = TRUE)
},
warning = function(e) {
write(paste(db$Book.Title[i], "\n", as.character(e)),
"try-log.txt", append = TRUE)}
)
tryCatch(download.file(
url = paste0("https://link.springer.com/download/epub/10.1007%2F",
db$Electronic.ISBN[i], ".epub"),
destfile = paste0(db$Book.Title2[i], ".epub")),
error = function(e) {
write(paste(db$Book.Title[i], "\n", as.character(e)),
"try-log.txt", append = TRUE)
},
warning = function(e) {
write(paste(db$Book.Title[i], "\n", as.character(e)),
"try-log.txt", append = TRUE)}
)
}
## Numero de arquivos PDF baixados
fpdf <- dir(pattern = "*.pdf")
length(fpdf)
## Numero de arquivos EPUB baixados
fepub <- dir(pattern = "*.epub")
length(fepub)
## Numero original
nrow(db)
## Alguns arquivos foram criados com tamanho zero, por um dos dois
## motivos:
## 1. A URL não segue esse padrão
## 2. O arquivo (geralmente EPUB) não existe mesmo
## Então identifica e apaga os arquivos com tamanho zero
## EPUB zero
iepub <- names(which(sapply(fepub, file.size) == 0L))
length(iepub)
## Esses realmente não existem, então podem ser removidos
file.remove(iepub)
## PDF zero
ipdf <- names(which(sapply(fpdf, file.size) == 0L))
length(ipdf)
## Abre os que estão faltando
browseURL(db[db$Book.Title2 %in% gsub(".pdf$", "", ipdf[1]), "OpenURL"])
browseURL(db[db$Book.Title2 %in% gsub(".pdf$", "", ipdf[2]), "OpenURL"])
## (Os links realmente não seguem o mesmo padrão)
## (Baixados manualmente e incluídos aqui)
## Verifica se tem mais algum de tamanho zero
any(sapply(fpdf, file.size) == 0L)
##======================================================================
## Convertendo EPUB para AZW3 (formato Kindle)
## Necessário ter instalado o Calibre
## convert <-
## 'for book in *.epub; do
## echo "----------------------------------------"
## echo "Converting $book"
## echo "----------------------------------------"
## ebook-convert "$book" "$(basename "$book" .epub).azw3"
## done'
## O problema com o AZW3 é que ele não é enviado pelo email do Kindle,
## por isso vou converter para MOBI que é o formato aceito
convert <-
'for book in *.epub; do
echo "----------------------------------------"
echo "Converting $book"
echo "----------------------------------------"
ebook-convert "$book" "$(basename "$book" .epub).mobi"
done'
system(convert)
##----------------------------------------------------------------------
## Emvia para email do Kindle
library(mailR)
## Arquivos mobi
fmobi <- dir(pattern = "*.mobi")
length(fmobi)
## O Gmail só anexa arquivos até 25 Mb, então verifica os tamanhos
fsmobi <- file.size(fmobi)/1e6
## Arquivos menores de 25 Mb que podem ser enviados
fsmobi.send <- fmobi[fsmobi < 25]
length(fsmobi.send)
## Verifica quais ficaram
fsmobi.nsend <- fmobi[fsmobi >= 25]
length(fsmobi.nsend)
## Envia tudo
## O email @kindle.com tem que ser alterado para algum termo diferente
## do próprio nome ou algo parecido. Mandando para
## fernandomayer@kindle.com, recebo um email por envio solicitando
## liberação. Criando um email qualquer esse email não é enviado e vai
## direto para a nuvem e para o dispositivo.
for(i in seq_along(fsmobi.send)) {
send.mail(
from = "fernandomayer@gmail.com",
to = "<email>@kindle.com",
subject = "",
body = "A",
smtp = list(host.name = "smtp.gmail.com",
port = 587,
user.name = "usuarioGmail",
passwd = "senhaGmail",
ssl = TRUE),
authenticate = TRUE,
send = TRUE,
attach.files = fsmobi.send[i],
debug = TRUE
)
}
## Envia os arquivos maiores que nao podem ir por email. Estes só
## estarão disponíveis no dispositivo, e não estarão na nuvem
file.copy(from = fsmobi.nsend,
to = "/run/media/mayer/Kindle/documents/")
## find . -size 0 -print | grep pdf
## ls *.pdf | wc -l
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment