mangafetcher
Version:
Manga downloader/fetcher for devs
77 lines (62 loc) • 3.38 kB
text/coffeescript
#!/usr/bin/env coffee
fs = require('fs')
request = require('request')
program = require('commander')
async = require('async')
_ = require('lodash')
program
.version('0.0.1')
.usage('-m [manga ex. bleach] -v [volume ex. 30] -e [episode ex. 268]')
.option('-m, --manga <value>', 'Specify manga, currently available are [bleach, sk, sk-f, nisekoi]')
.option('-v, --volume <n>', 'Specify volume')
.option('-e, --episode <n>', 'Specify episode')
.option('-n, --amount [n]', 'Specify amount (optional)')
.parse(process.argv)
##############################################################################
# Image Downloading Functions
##############################################################################
downloadEp = (vol, ep) ->
now = new Date()
pageAmount = program.amount || switch program.manga
when 'sk-f' then 50
when 'nisekoi' then 60
else 30
for i in [0..pageAmount]
do (i) ->
fileName = "#{String('00' + i).slice(-2)}.jpg"
uri = switch program.manga
when 'bleach' then "http://mangafox.me/manga/bleach/v#{String('00' + vol).slice(-2)}/c#{String('000' + ep).slice(-3)}/#{i}.html"
when 'sk' then "http://www.mangahere.com/manga/shaman_king/v#{vol}/c#{ep}/#{i}.html"
when 'sk-f' then "http://www.mangahere.com/manga/shaman_king_flowers/c#{String('000' + ep).slice(-3)}/#{i}.html"
when 'nisekoi' then "http://www.mangahere.com/manga/nisekoi_komi_naoshi/c#{String('000' + ep).slice(-3)}/#{i}.html"
request uri: uri, followRedirect: false, (err, res, body) ->
if !err and res.statusCode == 200
unless fs.existsSync("manga")
fs.mkdirSync("manga")
unless fs.existsSync("manga/#{program.manga}")
fs.mkdirSync("manga/#{program.manga}")
unless fs.existsSync("manga/#{program.manga}/#{vol}-#{ep}")
fs.mkdirSync("manga/#{program.manga}/#{vol}-#{ep}")
pattern = switch program.manga
when 'bleach' then /http:\/\/z.mfcdn.net\/store\/manga\/9\/.+\/compressed\/.+\.jpg"/
when 'sk' then /http:\/\/z.mhcdn.net\/store\/manga\/65\/.+\/compressed\/.+\.jpg/
when 'sk-f' then /http:\/\/z.mhcdn.net\/store\/manga\/6712\/.+\/compressed\/.+\.jpg/
when 'nisekoi' then /http:\/\/z.mhcdn.net\/store\/manga\/8945\/.+\/compressed\/.+\.jpg/
if img = body.match pattern
img_uri = img[0]
img_uri = img_uri.slice(0, -1) if img_uri.match /"$/ # Remove trailing `"`
request.head img_uri, (err2, res2, body2) ->
if res2.headers['content-type'] is 'image/jpeg'
console.log "Downloading #{fileName}"
nowOffset = new Date(now.setMinutes(i))
filePath = "manga/#{program.manga}/#{vol}-#{ep}/#{fileName}"
request(uri: img_uri, timeout: 120 * 1000)
.pipe fs.createWriteStream(filePath)
.on 'finish', -> fs.utimesSync filePath, nowOffset, nowOffset
##############################################################################
# App Kickoff!
##############################################################################
if program.manga and program.volume and program.episode
downloadEp(program.volume, program.episode)
else
console.log 'Error: please specify manga, volume and episode'