X-Git-Url: http://jaekl.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=book.rb;h=6d90c0e2947a0a243b3480758518159e075d8d85;hb=872d620121706ad345b7e667521be1c7326c2e00;hp=aa61930bc357fb89dcc861085eedd38921b1f654;hpb=fffa1ed35ce07fdec65e1aa14a8f637fbdde9b10;p=quanlib.git diff --git a/book.rb b/book.rb index aa61930..6d90c0e 100644 --- a/book.rb +++ b/book.rb @@ -1,8 +1,10 @@ require 'nokogiri' +require 'rubygems' require 'zip' require 'author' +require 'classification' require 'cover' require 'store' @@ -11,6 +13,7 @@ class Book def initialize(store) @author = nil + @classification_id = nil @cover = nil @description = nil @path = nil @@ -20,12 +23,12 @@ class Book @volume = nil end - def loadFromFile(fileName) + def load_from_file!(fileName) @path = fileName - parseFileName!(fileName) + parse_file_name!(fileName) end - def self.canHandle?(fileName) + def self.can_handle?(fileName) if nil == fileName return false end @@ -37,6 +40,10 @@ class Book return true end + if lowerName.end_with?(".pdf") + return true + end + return false end @@ -48,6 +55,14 @@ class Book @author = value end + def classification_id + @classification_id + end + + def classification_id=(value) + @classification_id = value + end + def cover return @cover end @@ -88,6 +103,19 @@ class Book result.push(seriesInfo.join(' ')) end + classification = nil + if nil != @classification_id + classification = @store.load_classification(@classification_id) + end + if nil != classification + if nil != classification.ddc + result.push('Dewey: ' + classification.ddc.to_s) + end + if nil != classification.lcc + result.push('LCC: ' + classification.lcc.to_s) + end + end + return result.join('
') end @@ -142,6 +170,14 @@ class Book @title = value end + def title_grouping + if nil == @path + return nil + end + + return File.basename(@path, '.*') + end + def volume @volume end @@ -204,8 +240,11 @@ class Book end protected - def parseFileName!(fileName) - parts = fileName.split('/') + def parse_file_name!(file_name) + category = nil # e.g., non-fiction, fan-fiction + grouping = '' + + parts = file_name.split('/') (series_code, @volume, @title) = processTitle(parts[-1]) if parts.length > 1 grouping = parts[-2] @@ -214,9 +253,24 @@ class Book @author = Author.new(grouping, reading_order, sort_order) @series_id = @store.get_series(grouping, series_code) end + if parts.length > 2 + category = parts[-3] + end + + lc_file_name = file_name.downcase + if lc_file_name.end_with?(".epub") + scanEpub!(file_name) + elsif lc_file_name.end_with?(".pdf") + scan_pdf!(file_name) + end + + @classification_id = @store.find_classification(@author.grouping, File.basename(file_name, '.*')) - if fileName.downcase.end_with?(".epub") - scanEpub!(fileName) + # TODO: Fix horrible hard-coded strings and paths + if ('01_nonfic' == category) && (nil == classification_id) + open(Store.unclassified_csv, 'a') do |fd| + fd.puts('"' + grouping.to_s + '","' + path + '"') + end end end @@ -243,6 +297,25 @@ class Book end end + protected + def scan_pdf!(file_name) + #puts 'Scanning "' + file_name.to_s + '"...' + + pdf_path = File.expand_path(file_name).to_s + if ! pdf_path.end_with?('.pdf') + puts 'Unexpected internal error: path "' + file_name.to_s + '" does not end with ".pdf".' + return + end + + jpeg_path = pdf_path[0..-5] + '.jpeg' + if File.file?(jpeg_path) + File.open(jpeg_path, 'r') do |is| + @cover = Cover.new(is, jpeg_path, 'image/jpeg') + end + end + end + + protected def scanOpf!(zipfile, opfPath) coverId = nil