muse-dl/src/muse-dl.cr

101 lines
3.0 KiB
Crystal
Raw Normal View History

2020-03-28 19:29:47 +00:00
require "./parser.cr"
require "./pdftk.cr"
require "./fetch.cr"
2020-03-28 19:51:36 +00:00
require "./book.cr"
2020-03-28 22:22:57 +00:00
require "./journal.cr"
2020-03-29 14:04:51 +00:00
require "./util.cr"
2020-03-28 21:07:14 +00:00
2020-03-28 19:29:47 +00:00
module Muse::Dl
2020-04-05 13:28:28 +00:00
VERSION = "1.1.2"
2020-03-28 19:29:47 +00:00
2020-03-28 21:07:14 +00:00
class Main
2020-03-29 19:21:09 +00:00
def self.dl(parser : Parser)
url = parser.url
thing = Fetch.get_info(url) if url
return unless thing
2020-03-28 22:22:57 +00:00
if thing.is_a? Muse::Dl::Book
2020-03-31 20:05:59 +00:00
unless thing.formats.includes? :pdf
STDERR.puts "Book not available in PDF format, skipping: #{url}"
return
end
2020-03-29 14:04:51 +00:00
# Will have no effect if parser has a custom title
parser.output = Util.slug_filename "#{thing.title}.pdf"
2020-03-29 18:38:10 +00:00
# If file exists and we can't clobber
if File.exists?(parser.output) && parser.clobber == false
2020-04-05 13:27:24 +00:00
STDERR.puts "Skipping #{url}, File already exists: #{parser.output}"
return
2020-03-28 22:22:57 +00:00
end
2020-03-29 18:38:10 +00:00
temp_stitched_file = nil
2020-03-29 12:21:01 +00:00
pdf_builder = Pdftk.new(parser.tmp)
2020-03-29 18:38:10 +00:00
unless parser.input_pdf
# Save each chapter
thing.chapters.each do |chapter|
begin
Fetch.save_chapter(parser.tmp, chapter[0], chapter[1], parser.cookie, parser.bookmarks)
rescue e : Muse::Dl::Errors::MuseCorruptPDF
STDERR.puts "Got a 'Unable to construct chapter PDF' error from MUSE, skipping: #{url}"
return
end
2020-03-29 18:38:10 +00:00
end
chapter_ids = thing.chapters.map { |c| c[0] }
# Stitch the PDFs together
temp_stitched_file = pdf_builder.stitch chapter_ids
pdf_builder.add_metadata(temp_stitched_file, parser.output, thing)
else
x = parser.input_pdf
pdf_builder.add_metadata(File.open(x), parser.output, thing) if x
end
temp_stitched_file.delete if temp_stitched_file
2020-04-05 13:28:02 +00:00
puts "DL: #{url}. Saved final output to #{parser.output}"
2020-04-03 19:47:31 +00:00
# Cleanup the chapter files
if parser.cleanup
thing.chapters.each do |c|
Fetch.cleanup(parser.tmp, c[0])
end
end
2020-03-28 22:22:57 +00:00
end
2020-03-28 21:07:14 +00:00
end
2020-03-29 19:21:09 +00:00
def self.run(args : Array(String))
parser = Parser.new(args)
delay_secs = 1
2020-03-29 19:21:09 +00:00
input_list = parser.input_list
if input_list
File.each_line input_list do |url|
begin
# TODO: Change this to nil
parser.reset_output_file
parser.url = url.strip
# Ask the download process to not quit the process, and return instead
Main.dl parser
if delay_secs >= 2
delay_secs /= 2
end
rescue ex : Muse::Dl::Errors::DownloadError
puts ex
puts "Download error. Skipping book: #{url}. Waiting for #{delay_secs} seconds before continuing."
# Sleep to prevent hammering the server.
sleep(delay_secs)
delay_secs *= 2
rescue ex
puts ex
puts "Non-download error. Skipping book: #{url}."
sleep(1)
end
2020-03-29 19:21:09 +00:00
end
elsif parser.url
Main.dl parser
end
end
2020-03-28 21:07:14 +00:00
end
2020-03-28 19:29:47 +00:00
end
2020-03-28 21:14:48 +00:00
Muse::Dl::Main.run(ARGV)