Created
April 27, 2020 02:46
-
-
Save fernandomayer/6d65083ebee039b2b3214a97f4a2524a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
##====================================================================== | |
## 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 | |
## [email protected], 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 = "[email protected]", | |
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