mirror of https://github.com/captn3m0/muse-dl.git
97 lines
2.9 KiB
Crystal
97 lines
2.9 KiB
Crystal
require "./parser.cr"
|
|
require "./pdftk.cr"
|
|
require "./fetch.cr"
|
|
require "./book.cr"
|
|
require "./journal.cr"
|
|
require "./util.cr"
|
|
|
|
module Muse::Dl
|
|
VERSION = "1.1.2"
|
|
|
|
class Main
|
|
def self.dl(parser : Parser)
|
|
url = parser.url
|
|
thing = Fetch.get_info(url) if url
|
|
return unless thing
|
|
|
|
if thing.is_a? Muse::Dl::Book
|
|
unless thing.formats.includes? :pdf
|
|
STDERR.puts "Book not available in PDF format, skipping: #{url}"
|
|
return
|
|
end
|
|
# Will have no effect if parser has a custom title
|
|
parser.output = Util.slug_filename "#{thing.title}.pdf"
|
|
|
|
# If file exists and we can't clobber
|
|
if File.exists?(parser.output) && parser.clobber == false
|
|
STDERR.puts "Skipping #{url}, File already exists: #{parser.output}"
|
|
return
|
|
end
|
|
temp_stitched_file = nil
|
|
pdf_builder = Pdftk.new(parser.tmp)
|
|
|
|
# Save each chapter
|
|
thing.chapters.each do |chapter|
|
|
begin
|
|
Fetch.save_chapter(parser.tmp, chapter[0], chapter[1], parser.cookie, parser.bookmarks, parser.strip_first)
|
|
rescue e : Muse::Dl::Errors::MuseCorruptPDF
|
|
STDERR.puts "Got a 'Unable to construct chapter PDF' error from MUSE, skipping: #{url}"
|
|
return
|
|
end
|
|
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)
|
|
|
|
temp_stitched_file.delete if temp_stitched_file
|
|
puts "--dont-strip-first-page was on. Please validate PDF file for any errors." if parser.strip_first
|
|
puts "DL: #{url}. Saved final output to #{parser.output}"
|
|
|
|
# Cleanup the chapter files
|
|
if parser.cleanup
|
|
thing.chapters.each do |c|
|
|
Fetch.cleanup(parser.tmp, c[0])
|
|
end
|
|
end
|
|
elsif thing.is_a? Muse::Dl::Article
|
|
puts(thing)
|
|
end
|
|
end
|
|
|
|
def self.run(args : Array(String))
|
|
parser = Parser.new(args)
|
|
|
|
delay_secs = 1
|
|
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
|
|
puts ex.message
|
|
puts ex.backtrace.join("\n ")
|
|
puts "Error. Skipping book: #{url}. Waiting for #{delay_secs} seconds before continuing."
|
|
sleep(delay_secs)
|
|
if delay_secs < 256
|
|
delay_secs *= 2
|
|
end
|
|
end
|
|
end
|
|
elsif parser.url
|
|
Main.dl parser
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
Muse::Dl::Main.run(ARGV)
|