From dcfd86fdb870b8bb86ce9e4c052d550fe38cd719 Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Thu, 22 Jan 2015 17:23:19 +0900 Subject: [PATCH] Updating readme --- README.md | 108 +++++++++++++++++++++++++++++++++++++++------- index/options.png | Bin 0 -> 21031 bytes 2 files changed, 93 insertions(+), 15 deletions(-) create mode 100644 index/options.png diff --git a/README.md b/README.md index 339f534..c542039 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,96 @@ +# Mangle + +A couple of years ago I received an [Amazon Kindle](http://en.wikipedia.org/wiki/Kindle) gift. I immediately began +playing around with it and reading about certain undocumented features that the Kindle has to offer. After a couple of +hours I discovered it to be the perfect device for reading [Manga](http://en.wikipedia.org/wiki/Manga) is almost always +grayscale, and the aspect ratio fits the Kindle's 600x800 pixel screen almost perfectly. Better yet, the Kindle's +undocumented image viewer actually keeps track of the last image you viewed and thus you are always able to return to +the page you left off on when you power on your Kindle. The device supports several popular image formats (jpeg, png, +gif, etc), and is able to dither and downscale images to fit the screen. + +However... The Kindle's image viewer does have certain shortcomings: + +* The Kindle is very picky about file format; any additional embedded data (thumbnails, comments, possibly even exif + data) can confuse it. As a result, images may not display properly or even not at all (which actually prevents you + from reading the given book, as one bad panel will prevent you from viewing subsequent images). +* The first image that you view in a manga (until the Kindle first writes the "bookmark" file) seems to be arbitrary + even when files are named sequentially. About half the time it will correctly pick the first file in the batch, at + other times it will pick out some other image seemingly at random. +* Normally for Kindle to find your manga scans you have to press Alt+Z on the home screen. I haven't always had luck + with it correctly identifying image directories. At other times, after finding an image directory the Kindle will + appear to hang while trying to access it (forcing you to return to the home screen). +* The Kindle image viewer has no functionality to rotate images. So if there is a horizontally large image (such as + what often happens with dual-page scans), it can be difficult to make out the text because the image is simply + scaled to fit (consequently leaving a lot of wasted space at the bottom of the screen). +* Scanlation images are oftentimes much larger than the 600x800 screen; not only does this make them take more space + on your memory card but it also slows down image loading (the Kindle has to read more data off of the slow SD card + and scale the image). Scanlations often also include color scans of covers and inserts which take up more space than + a grayscale equivalent (which is would be fine for the Kindle's limited display). +* Kindle's image viewer provides no way to sort images (to determine in which order they are shown). This can be very + problematic especially considering that scanlation groups have differing naming conventions, and as a result files + from later chapters may appear before earlier ones when you are reading your manga (spoilers ftl). + +I was annoyed with these issues and thus Mangle was born (the program name is a mix of "Manga" and "Kindle" in case you +haven't figured it out yet; I thought it was pretty clever at the time). Fortunately you can get all the benefits of my +work without really doing anything (and it won't even cost you anything since Mangle is free, +[GPL](http://www.gnu.org/licenses/gpl-3.0.txt) software. With Mangle you can easily: + +* Sort and organize images from different directories; bulk rename feature for output to the Kindle. +* Optionally re-save images in a format Kindle will be sure to understand with no visible quality loss. +* Downsample and rotate images for optimal viewing on Kindle, convert to grayscale to save space and improve contrast. +* Automatically generate book meta-data so that your manga is always properly detected and viewable in-order. + +Here is a recent screenshot showing off some of the export options that you can configure on a per-book basis in Mangle: + +![Mangle options dialog](index/options.png) + +You can also check out what Mangle output looks like on the Kindle on the [action +shots](http://foosoft.net/projects/mangle/action.html) page. + +Mangle is cross platform, and doesn't require an install (it's a standalone executable that you can run from anywhere). +It is also "environmentally friendly" by not messing with your registry or modifying your system in any way. If you +ever want to uninstall it, just delete the executable and you're done. + +## Usage Instructions + +Mangle is pretty easy to use, so this won't be really in-depth. If you have any questions drop me a line though. + +1. Add images to the current book by selecting the "Book | Add | Files" or "Book | Add | Directory" menu items. +2. If certain images are not in the order you want, select them in the window, and select the "Book | Shift | Up" or + "Book | Shift | Down" menu items. +3. Configure the book title and image processing options by selecting "Book | Options"; this will be the title you see + in the Kindle home menu. +4. Create a root-level directory on your SD memory card/Kindle called "pictures" (case might matter). +5. Once you are satisfied with the your images and options select "Book | Export" and select the "pictures" directory + you just created. +6. After the export is complete your new manga books will show up along with all your other books (if they don't for + some reason, press Alt+Z while on the home menu). + +## The Usual Disclaimer + +You probably know how this goes by now... Mess around with your Kindle at your own risk. Honestly, nothing bad is going +to happen; however if something *does* then it's your problem. + +## Running From Source + +Because Mangle is written in Python, a scripting language, it's trivial to get it up and running on the operating system +of your choice. First you should make sure that you have the required dependencies installed: + +* [PyQT4](http://www.riverbankcomputing.com/software/pyqt/download) +* [Python 2.7](http://www.python.org/download/releases/2.7/) +* [Python Imaging Library (PIL)](http://www.pythonware.com/products/pil/) +* [ReportLab](https://pypi.python.org/pypi/reportlab) +* [natsort](https://pypi.python.org/pypi/natsort/3.0.1) +* [py2exe](http://www.py2exe.org/) (optional, for Windows distribution only) + +Now you can fetch the [latest version of the code](https://github.com/FooSoft/mangle/) and run the `mangle.pyw` script +to execute Mangle. + ## Downloads -- [Mangle for Windows](ftp://foosoft.net/releases/mangle/mangle_win.zip) -- [Mangle for MacOS (Old)](ftp://foosoft.net/releases/mangle/mangle_osx.zip) -## For Developers -- [Python 2.7](http://www.python.org/download/releases/2.7/) -- [Python Image Library (PIL)](http://www.pythonware.com/products/pil/) -- [PyQT4](http://www.riverbankcomputing.com/software/pyqt/download) -- [ReportLab](https://pypi.python.org/pypi/reportlab) -- [natsort](https://pypi.python.org/pypi/natsort/3.0.1) -- [py2exe](http://www.py2exe.org/) (optional, for Windows distribution only) +The Windows binary for the latest version of Mangle can be [downloaded +here](http://foosoft.net/projects/mangle/index/mangle_win.zip). Although I don't have the means to make MacOS X releases +myself, I do have the slightly older [MacOS X Package](http://foosoft.net/projects/mangle/index/mangle_osx.zip) built by +Rob White. *Note that I have never used MacOS X and I have no idea what it takes to get Mangle up and running on it so I +cannot answer any questions about that platform*. -## Notice -I'm no longer actively maintaining this project; many of the recent changes -have been contributed by other developers. Significant contributors are: -- [Jan](https://github.com/catmanjan/) -- [Jonathan Leaders](https://github.com/jleaders/) -- [Marek Kubica](https://github.com/Leonidas-from-XIV/) diff --git a/index/options.png b/index/options.png new file mode 100644 index 0000000000000000000000000000000000000000..b4ee2b3e41ded1ca68012f0916dc147d69ebf0f1 GIT binary patch literal 21031 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 literal 0 HcmV?d00001