magicshelf 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/Gemfile +6 -0
- data/Procfile +4 -0
- data/README.md +38 -0
- data/Rakefile +16 -0
- data/bin/console +14 -0
- data/bin/magicconvert +40 -0
- data/bin/server +8 -0
- data/bin/setup +7 -0
- data/config.ru +6 -0
- data/lib/magicshelf.rb +33 -0
- data/lib/magicshelf/dirchanger.rb +22 -0
- data/lib/magicshelf/dirrenamer.rb +30 -0
- data/lib/magicshelf/dirstructureflattener.rb +25 -0
- data/lib/magicshelf/epubgenerator.rb +86 -0
- data/lib/magicshelf/exception.rb +4 -0
- data/lib/magicshelf/executionpipe.rb +105 -0
- data/lib/magicshelf/filecleaner.rb +19 -0
- data/lib/magicshelf/fileextractor.rb +48 -0
- data/lib/magicshelf/filemover.rb +24 -0
- data/lib/magicshelf/filenamevalidator.rb +31 -0
- data/lib/magicshelf/fileserver.rb +103 -0
- data/lib/magicshelf/kindlegenwrapper.rb +33 -0
- data/lib/magicshelf/kindlestrip.rb +250 -0
- data/lib/magicshelf/kindlestripper.rb +25 -0
- data/lib/magicshelf/makeitvertical.rb +41 -0
- data/lib/magicshelf/mobitask.rb +58 -0
- data/lib/magicshelf/tempdiropener.rb +18 -0
- data/lib/magicshelf/version.rb +3 -0
- data/magicshelf.gemspec +37 -0
- data/public/css/index.css +29 -0
- data/public/css/pure-min.css +11 -0
- data/server_config.yml.sample +2 -0
- data/views/generate_mobi.erb +62 -0
- data/views/index.erb +51 -0
- metadata +290 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'magicshelf/exception'
|
2
|
+
require 'magicshelf/kindlestrip'
|
3
|
+
|
4
|
+
module MagicShelf
|
5
|
+
class KindleStripperError < Error; end
|
6
|
+
|
7
|
+
class KindleStripper
|
8
|
+
attr_accessor :inputfile, :outputfile
|
9
|
+
|
10
|
+
def enter()
|
11
|
+
MagicShelf.logger.debug('enter KindleStripper')
|
12
|
+
|
13
|
+
# check parameters
|
14
|
+
raise MagicShelf::EpubGeneratorError.new("inputfile is not set") if @inputfile == nil
|
15
|
+
raise MagicShelf::EpubGeneratorError.new("outputfile is not set") if @outputfile == nil
|
16
|
+
|
17
|
+
yield
|
18
|
+
end
|
19
|
+
|
20
|
+
def process()
|
21
|
+
stripped_file = SectionStripper.strip(@inputfile, @outputfile)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'magicshelf/exception'
|
2
|
+
require 'rmagick'
|
3
|
+
|
4
|
+
module MagicShelf
|
5
|
+
class MakeItVerticalError < Error; end
|
6
|
+
|
7
|
+
class MakeItVertical
|
8
|
+
attr_accessor :workdir, :erase_original
|
9
|
+
def initialize()
|
10
|
+
@erase_original = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def enter()
|
14
|
+
yield
|
15
|
+
end
|
16
|
+
|
17
|
+
def process()
|
18
|
+
@workdir ||= Dir.pwd
|
19
|
+
Dir.glob(File.join(@workdir,'**/*')).select{|f|File.file?(f)}.each do |f|
|
20
|
+
begin
|
21
|
+
img = Magick::Image.read(f).first
|
22
|
+
rescue Magick::ImageMagickError, RuntimeError => ex
|
23
|
+
MagicShelf.logger.info("#{f} is not an image file. skipped.")
|
24
|
+
end
|
25
|
+
next if img.nil?
|
26
|
+
if img.columns > img.rows
|
27
|
+
img.rotate!(90)
|
28
|
+
newfile = File.join(File.dirname(f), File.basename(f,'.*') + '-rotate' + File.extname(f))
|
29
|
+
img.write(newfile)
|
30
|
+
MagicShelf.logger.info("#{f} is rotated and saved to #{newfile}.")
|
31
|
+
if @erase_original
|
32
|
+
FileUtils.remove(f)
|
33
|
+
MagicShelf.logger.info("#{f} is erased.")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'resque'
|
2
|
+
require 'redis'
|
3
|
+
require 'magicshelf'
|
4
|
+
require 'magicshelf/executionpipe'
|
5
|
+
|
6
|
+
module MagicShelf
|
7
|
+
module MobiTask
|
8
|
+
@queue = :default
|
9
|
+
|
10
|
+
# Runs a subprocess and applies handlers for stdout and stderr
|
11
|
+
# TODO make this function to a redis task and run it background
|
12
|
+
# Params:
|
13
|
+
# +inputfile+:: must be fullpath to the input file
|
14
|
+
# +title+:: book title
|
15
|
+
# +booktype+:: book type: must be one of ["comic", "novelimage", "novel", "ltr"]
|
16
|
+
# +outputfile+:: must be fullpath to the output file
|
17
|
+
def self.perform(params)
|
18
|
+
inputfile = params['inputfile']
|
19
|
+
title = params['title']
|
20
|
+
author = params['author']
|
21
|
+
booktype = params['booktype']
|
22
|
+
outputfile = params['outputfile']
|
23
|
+
MagicShelf.logger.info("generate_mobi with params: #{params}")
|
24
|
+
|
25
|
+
MagicShelf::ExecutionPipe.new.enter { |params,&block|
|
26
|
+
Dir.mktmpdir("magicshelf") do |dir|
|
27
|
+
params[:workdir] = dir
|
28
|
+
block.call
|
29
|
+
end
|
30
|
+
}.pipe(MagicShelf::FileExtractor.new,:workdir => [:destdir]) { |this|
|
31
|
+
this.inputfile = File.expand_path(inputfile)
|
32
|
+
}.enter(:destdir => [:workdir]) {|params, &block|
|
33
|
+
Dir.chdir(params[:workdir]) do
|
34
|
+
block.call
|
35
|
+
end
|
36
|
+
}.pipe(MagicShelf::DirRenamer.new, :workdir => [:workdir]) { |this|
|
37
|
+
}.pipe(MagicShelf::FileNameValidator.new, :workdir => [:workdir]) { |this|
|
38
|
+
}.pipe(MagicShelf::MakeItVertical.new, :workdir => [:workdir]) { |this|
|
39
|
+
}.pipe(MagicShelf::EpubGenerator.new, :workdir => [:workdir]) { |this|
|
40
|
+
this.title = title
|
41
|
+
this.creator = author
|
42
|
+
this.book_type = booktype
|
43
|
+
this.outputfile = 'test.epub'
|
44
|
+
}.pipe(MagicShelf::KindleGenWrapper.new, :outputfile => [:inputfile]) { |this|
|
45
|
+
this.outputfile = 'test.mobi'
|
46
|
+
}.process(:inputfile => [:file,:inputfile], :outputfile => [:outputfile]) { |params|
|
47
|
+
FileUtils.remove(params[:file])
|
48
|
+
}.pipe(MagicShelf::KindleStripper.new, :outputfile => [:inputfile]) { |this|
|
49
|
+
this.outputfile = File.expand_path('test_strip.mobi')
|
50
|
+
}.pipe(MagicShelf::FileCleaner.new, :inputfile => [:file], :outputfile => [:outputfile]) { |this|
|
51
|
+
}.pipe(MagicShelf::FileMover.new, :outputfile => [:inputfile]) { |this|
|
52
|
+
this.outputfile = File.expand_path(outputfile)
|
53
|
+
}.execute
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'magicshelf/exception'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
module MagicShelf
|
5
|
+
class TempDirOpenerError < Error; end
|
6
|
+
|
7
|
+
class TempDirOpener
|
8
|
+
def enter
|
9
|
+
Dir.mktmpdir("magicshelf_tempdir") {|dir|
|
10
|
+
@workdir = dir
|
11
|
+
yield
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def process
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/magicshelf.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'magicshelf/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "magicshelf"
|
8
|
+
spec.version = MagicShelf::VERSION
|
9
|
+
spec.authors = ["Shohei Fujii"]
|
10
|
+
spec.email = ["fujii.shohei@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Access and get your e-book from kindle anywhere}
|
13
|
+
spec.description = %q{zip/rar to mobi (via epub) converter and serve files from web interface}
|
14
|
+
spec.homepage = ""
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|sandbox|)/}) }
|
17
|
+
spec.bindir = "bin"
|
18
|
+
spec.executables = "magicconvert"
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "pry"
|
24
|
+
spec.add_development_dependency "pry-doc"
|
25
|
+
spec.add_development_dependency "pry-rescue"
|
26
|
+
spec.add_development_dependency "shotgun"
|
27
|
+
spec.add_development_dependency "foreman"
|
28
|
+
spec.add_development_dependency "test-unit", "~> 3.1.2"
|
29
|
+
|
30
|
+
spec.add_dependency "gepub", '~> 0.7.0beta2'
|
31
|
+
spec.add_dependency "resque"
|
32
|
+
spec.add_dependency "ruby-filemagic"
|
33
|
+
spec.add_dependency "rubyzip"
|
34
|
+
spec.add_dependency "sinatra-contrib"
|
35
|
+
spec.add_dependency "naturally", '~> 1.4.0'
|
36
|
+
spec.add_dependency "rmagick"
|
37
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
div#page-title{
|
2
|
+
text-align: center;
|
3
|
+
}
|
4
|
+
div.sortby-selection-menu {
|
5
|
+
background-color: #000;
|
6
|
+
}
|
7
|
+
.pure-menu-link{
|
8
|
+
color: #eee;
|
9
|
+
}
|
10
|
+
|
11
|
+
table#file_list {
|
12
|
+
width: 100%;
|
13
|
+
}
|
14
|
+
.pure-table td, .pure-table th{
|
15
|
+
padding: .1em .1em .4em;
|
16
|
+
}
|
17
|
+
|
18
|
+
td#file {
|
19
|
+
width: 50%;
|
20
|
+
}
|
21
|
+
td#buttons {
|
22
|
+
width: 20%;
|
23
|
+
}
|
24
|
+
td#mtime {
|
25
|
+
width: 30%;
|
26
|
+
}
|
27
|
+
a.file-button {
|
28
|
+
padding: .2em .3em;
|
29
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
/*!
|
2
|
+
Pure v0.6.0
|
3
|
+
Copyright 2014 Yahoo! Inc. All rights reserved.
|
4
|
+
Licensed under the BSD License.
|
5
|
+
https://github.com/yahoo/pure/blob/master/LICENSE.md
|
6
|
+
*/
|
7
|
+
/*!
|
8
|
+
normalize.css v^3.0 | MIT License | git.io/normalize
|
9
|
+
Copyright (c) Nicolas Gallagher and Jonathan Neal
|
10
|
+
*/
|
11
|
+
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-flex;-webkit-flex-flow:row wrap;display:-ms-flexbox;-ms-flex-flow:row wrap;-ms-align-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class *="pure-u"]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-5-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-2-24,.pure-u-3-24,.pure-u-4-24,.pure-u-5-24,.pure-u-6-24,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}.pure-button{display:inline-block;zoom:1;line-height:normal;white-space:nowrap;vertical-align:middle;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button{font-family:inherit;font-size:100%;padding:.5em 1em;color:#444;color:rgba(0,0,0,.8);border:1px solid #999;border:0 rgba(0,0,0,0);background-color:#E6E6E6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:hover,.pure-button:focus{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#1a000000', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:-webkit-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:-moz-linear-gradient(top,rgba(0,0,0,.05) 0,rgba(0,0,0,.1));background-image:-o-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;border-color:#000\9}.pure-button[disabled],.pure-button-disabled,.pure-button-disabled:hover,.pure-button-disabled:focus,.pure-button-disabled:active{border:0;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:alpha(opacity=40);-khtml-opacity:.4;-moz-opacity:.4;opacity:.4;cursor:not-allowed;box-shadow:none}.pure-button-hidden{display:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;vertical-align:middle;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=text]:focus,.pure-form input[type=password]:focus,.pure-form input[type=email]:focus,.pure-form input[type=url]:focus,.pure-form input[type=date]:focus,.pure-form input[type=month]:focus,.pure-form input[type=time]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=week]:focus,.pure-form input[type=number]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=color]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;border-color:#129FEA}.pure-form input:not([type]):focus{outline:0;border-color:#129FEA}.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus,.pure-form input[type=checkbox]:focus{outline:thin solid #129FEA;outline:1px auto #129FEA}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=text][disabled],.pure-form input[type=password][disabled],.pure-form input[type=email][disabled],.pure-form input[type=url][disabled],.pure-form input[type=date][disabled],.pure-form input[type=month][disabled],.pure-form input[type=time][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=week][disabled],.pure-form input[type=number][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=color][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background-color:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form textarea:focus:invalid,.pure-form select:focus:invalid{color:#b94a48;border-color:#e9322d}.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus,.pure-form input[type=checkbox]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{height:2.25em;border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=text],.pure-form-stacked input[type=password],.pure-form-stacked input[type=email],.pure-form-stacked input[type=url],.pure-form-stacked input[type=date],.pure-form-stacked input[type=month],.pure-form-stacked input[type=time],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=week],.pure-form-stacked input[type=number],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=color],.pure-form-stacked input[type=file],.pure-form-stacked select,.pure-form-stacked label,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned textarea,.pure-form-aligned select,.pure-form-aligned .pure-help-inline,.pure-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 11em}.pure-form input.pure-input-rounded,.pure-form .pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input,.pure-form .pure-group textarea{display:block;padding:10px;margin:0 0 -1px;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus,.pure-form .pure-group textarea:focus{z-index:3}.pure-form .pure-group input:first-child,.pure-form .pure-group textarea:first-child{top:1px;border-radius:4px 4px 0 0;margin:0}.pure-form .pure-group input:first-child:last-child,.pure-form .pure-group textarea:first-child:last-child{top:1px;border-radius:4px;margin:0}.pure-form .pure-group input:last-child,.pure-form .pure-group textarea:last-child{top:-2px;border-radius:0 0 4px 4px;margin:0}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form .pure-help-inline,.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=text],.pure-group input[type=password],.pure-group input[type=email],.pure-group input[type=url],.pure-group input[type=date],.pure-group input[type=month],.pure-group input[type=time],.pure-group input[type=datetime],.pure-group input[type=datetime-local],.pure-group input[type=week],.pure-group input[type=number],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=color]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0}.pure-form .pure-help-inline,.pure-form-message-inline,.pure-form-message{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-list,.pure-menu-item{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-link,.pure-menu-heading{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-separator{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-allow-hover:hover>.pure-menu-children,.pure-menu-active>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.5em;content:"\25B8";font-size:small}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{content:"\25BE"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;padding:.5em 0}.pure-menu-horizontal.pure-menu-scrollable::-webkit-scrollbar{display:none}.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#fff}.pure-menu-link,.pure-menu-disabled,.pure-menu-heading{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:hover,.pure-menu-link:focus{background-color:#eee}.pure-menu-selected .pure-menu-link,.pure-menu-selected .pure-menu-link:visited{color:#000}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8">
|
5
|
+
<link rel="stylesheet" type="text/css" href="/css/pure-min.css">
|
6
|
+
<link rel="stylesheet" type="text/css" href="/css/index.css">
|
7
|
+
<title><%= page_title %></title>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<form class="pure-form pure-form-aligned" method="post">
|
11
|
+
<fieldset>
|
12
|
+
<div class="pure-control-group">
|
13
|
+
<label for="inputfile">Input File</label>
|
14
|
+
<input id="inputfile" type="text" placeholder='<%= path %>' readonly>
|
15
|
+
</div>
|
16
|
+
<div class="pure-control-group">
|
17
|
+
<label for="title">Book Title</label>
|
18
|
+
<input id="title" name="title" type="text" placeholder="title" required>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<div class="pure-control-group">
|
22
|
+
<label for="author">Book Author</label>
|
23
|
+
<input id="author" name="author" type="text" placeholder="author">
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<div class="pure-control-group">
|
27
|
+
<label for="outputfile">Output Filename (optional)</label>
|
28
|
+
<input id="outputfile" name="outputfile" type="text" placeholder="filename.mobi" value="">
|
29
|
+
</div>
|
30
|
+
|
31
|
+
<div class="pure-control-group">
|
32
|
+
<label for="booktype">Book Type</label>
|
33
|
+
<form class="pure-form">
|
34
|
+
<label for="booktype-comic" class="pure-radio">
|
35
|
+
<input id="booktype-comic" type="radio" name="booktype" value="comic" checked>
|
36
|
+
comic
|
37
|
+
</label>
|
38
|
+
|
39
|
+
<label for="booktype-novel" class="pure-radio">
|
40
|
+
<input id="booktype-novel" type="radio" name="booktype" value="novel">
|
41
|
+
novel
|
42
|
+
</label>
|
43
|
+
|
44
|
+
<label for="booktype-novelimage" class="pure-radio">
|
45
|
+
<input id="booktype-novelimage" type="radio" name="booktype" value="novelimage">
|
46
|
+
novelimage
|
47
|
+
</label>
|
48
|
+
|
49
|
+
<label for="booktype-ltr" class="pure-radio">
|
50
|
+
<input id="booktype-ltr" type="radio" name="booktype" value="ltr">
|
51
|
+
ltr
|
52
|
+
</label>
|
53
|
+
</form>
|
54
|
+
</div>
|
55
|
+
|
56
|
+
<div class="pure-controls">
|
57
|
+
<button type="submit" class="pure-button pure-button-primary">Generate Mobi</button>
|
58
|
+
</div>
|
59
|
+
</fieldset>
|
60
|
+
</form>
|
61
|
+
</body>
|
62
|
+
</html>
|
data/views/index.erb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8">
|
5
|
+
<link rel="stylesheet" type="text/css" href="/css/pure-min.css">
|
6
|
+
<link rel="stylesheet" type="text/css" href="/css/index.css">
|
7
|
+
<title><%= page_title %></title>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<div id="page-title"><h2><%= page_title %></h2></div>
|
11
|
+
<div class="sortby-selection-menu pure-menu pure-menu-horizontal">
|
12
|
+
<ul class="pure-menu-list">
|
13
|
+
<li class="pure-menu-item"><a href="/files/<%= path %>?sort_by=title" class="pure-menu-link">Title</a></li>
|
14
|
+
<li class="pure-menu-item"><a href="/files/<%= path %>?sort_by=title_reverse" class="pure-menu-link">Title(reverse)</a></li>
|
15
|
+
<li class="pure-menu-item"><a href="/files/<%= path %>?sort_by=date" class="pure-menu-link">Date</a></li>
|
16
|
+
<li class="pure-menu-item"><a href="/files/<%= path %>?sort_by=date_reverse" class="pure-menu-link">Date(reverse)</a></li>
|
17
|
+
<% if upperpath %>
|
18
|
+
<li class="pure-menu-item">
|
19
|
+
<%= '<a href="/files/' + upperpath + '?sort_by=' + sort_type + '" class="pure-menu-link">../</a>' %>
|
20
|
+
</li>
|
21
|
+
<% end %>
|
22
|
+
</ul>
|
23
|
+
</div>
|
24
|
+
<table id="file_list" class="pure-table">
|
25
|
+
<thead>
|
26
|
+
<tr>
|
27
|
+
<td>File/Directory</td>
|
28
|
+
<td>Button</td>
|
29
|
+
<td>Last Modified</td>
|
30
|
+
</tr>
|
31
|
+
</thead>
|
32
|
+
<tbody>
|
33
|
+
<% files_withmtime.each_with_index do |(f, mtime),index| %>
|
34
|
+
<tr>
|
35
|
+
<% if File.file? f %>
|
36
|
+
<td class="file"><%= "<a href='/get_file/#{f}'>#{File.basename(f)}</a>" %></td>
|
37
|
+
<% else %>
|
38
|
+
<td class="directory"><%= "<a href='/files/#{f}?sort_by=#{sort_type}'>#{f}/</a>" %></td>
|
39
|
+
<% end %>
|
40
|
+
<td class='buttons'>
|
41
|
+
<%= "<a class='file-button pure-button' href='/generate_mobi/#{f}'>Generate</a>" %>
|
42
|
+
</td>
|
43
|
+
<td class="mtime"><%= mtime %></td>
|
44
|
+
</tr>
|
45
|
+
<% end %>
|
46
|
+
</tbody>
|
47
|
+
</table>
|
48
|
+
|
49
|
+
</body>
|
50
|
+
</html>
|
51
|
+
|
metadata
ADDED
@@ -0,0 +1,290 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: magicshelf
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Shohei Fujii
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-08-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry-doc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry-rescue
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: shotgun
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: foreman
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: test-unit
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 3.1.2
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 3.1.2
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: gepub
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.7.0beta2
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.7.0beta2
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: resque
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: ruby-filemagic
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: rubyzip
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: sinatra-contrib
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: naturally
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: 1.4.0
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: 1.4.0
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: rmagick
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - ">="
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
223
|
+
description: zip/rar to mobi (via epub) converter and serve files from web interface
|
224
|
+
email:
|
225
|
+
- fujii.shohei@gmail.com
|
226
|
+
executables:
|
227
|
+
- magicconvert
|
228
|
+
extensions: []
|
229
|
+
extra_rdoc_files: []
|
230
|
+
files:
|
231
|
+
- ".gitignore"
|
232
|
+
- Gemfile
|
233
|
+
- Procfile
|
234
|
+
- README.md
|
235
|
+
- Rakefile
|
236
|
+
- bin/console
|
237
|
+
- bin/magicconvert
|
238
|
+
- bin/server
|
239
|
+
- bin/setup
|
240
|
+
- config.ru
|
241
|
+
- lib/magicshelf.rb
|
242
|
+
- lib/magicshelf/dirchanger.rb
|
243
|
+
- lib/magicshelf/dirrenamer.rb
|
244
|
+
- lib/magicshelf/dirstructureflattener.rb
|
245
|
+
- lib/magicshelf/epubgenerator.rb
|
246
|
+
- lib/magicshelf/exception.rb
|
247
|
+
- lib/magicshelf/executionpipe.rb
|
248
|
+
- lib/magicshelf/filecleaner.rb
|
249
|
+
- lib/magicshelf/fileextractor.rb
|
250
|
+
- lib/magicshelf/filemover.rb
|
251
|
+
- lib/magicshelf/filenamevalidator.rb
|
252
|
+
- lib/magicshelf/fileserver.rb
|
253
|
+
- lib/magicshelf/kindlegenwrapper.rb
|
254
|
+
- lib/magicshelf/kindlestrip.rb
|
255
|
+
- lib/magicshelf/kindlestripper.rb
|
256
|
+
- lib/magicshelf/makeitvertical.rb
|
257
|
+
- lib/magicshelf/mobitask.rb
|
258
|
+
- lib/magicshelf/tempdiropener.rb
|
259
|
+
- lib/magicshelf/version.rb
|
260
|
+
- magicshelf.gemspec
|
261
|
+
- public/css/index.css
|
262
|
+
- public/css/pure-min.css
|
263
|
+
- server_config.yml.sample
|
264
|
+
- views/generate_mobi.erb
|
265
|
+
- views/index.erb
|
266
|
+
homepage: ''
|
267
|
+
licenses: []
|
268
|
+
metadata: {}
|
269
|
+
post_install_message:
|
270
|
+
rdoc_options: []
|
271
|
+
require_paths:
|
272
|
+
- lib
|
273
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
274
|
+
requirements:
|
275
|
+
- - ">="
|
276
|
+
- !ruby/object:Gem::Version
|
277
|
+
version: '0'
|
278
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
279
|
+
requirements:
|
280
|
+
- - ">="
|
281
|
+
- !ruby/object:Gem::Version
|
282
|
+
version: '0'
|
283
|
+
requirements: []
|
284
|
+
rubyforge_project:
|
285
|
+
rubygems_version: 2.4.5
|
286
|
+
signing_key:
|
287
|
+
specification_version: 4
|
288
|
+
summary: Access and get your e-book from kindle anywhere
|
289
|
+
test_files: []
|
290
|
+
has_rdoc:
|