Pixiv animated image downloader (and gif convert)

A small script to download the new png animated image in pixiv

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Pixiv animated image downloader (and gif convert)
// @namespace   http://mfish.twbbs.org/
// @include     http://www.pixiv.net/member_illust.php?mode=medium&illust_id=*
// @include     https://www.pixiv.net/member_illust.php?mode=medium&illust_id=*
// @require     https://cdn.staticfile.org/jquery/1.11.1/jquery.min.js
// @require     https://greasyfork.org/scripts/2350-filesaver-js/code/filesaverjs.js?version=6255
// @require     https://cdn.staticfile.org/jszip/2.3.0/jszip.min.js
// @require     https://greasyfork.org/scripts/2963-gif-js/code/gifjs.js?version=8462
// @version     1.0.4
// @grant       GM_registerMenuCommand
// @grant       GM_openInTab
// @description A small script to download the new png animated image in pixiv
// ==/UserScript==

// Generated by CommonJS Everywhere 0.9.7
;(function (global) {
  function require(file, parentModule) {
    if ({}.hasOwnProperty.call(require.cache, file))
      return require.cache[file];
    var resolved = require.resolve(file);
    if (!resolved)
      throw new Error('Failed to resolve module ' + file);
    var module$ = {
        id: file,
        require: require,
        filename: file,
        exports: {},
        loaded: false,
        parent: parentModule,
        children: []
      };
    if (parentModule)
      parentModule.children.push(module$);
    var dirname = file.slice(0, file.lastIndexOf('/') + 1);
    require.cache[file] = module$.exports;
    resolved.call(module$.exports, module$, module$.exports, dirname, file);
    module$.loaded = true;
    return require.cache[file] = module$.exports;
  }
  require.modules = {};
  require.cache = {};
  require.resolve = function (file) {
    return {}.hasOwnProperty.call(require.modules, file) ? require.modules[file] : void 0;
  };
  require.define = function (file, fn) {
    require.modules[file] = fn;
  };
  var process = function () {
      var cwd = '/';
      return {
        title: 'browser',
        version: 'v0.10.26',
        browser: true,
        env: {},
        argv: [],
        nextTick: global.setImmediate || function (fn) {
          setTimeout(fn, 0);
        },
        cwd: function () {
          return cwd;
        },
        chdir: function (dir) {
          cwd = dir;
        }
      };
    }();
  require.define('/pixiv_helper.coffee', function (module, exports, __dirname, __filename) {
    var Button, Deferer, Downloader, EventEmitter, Extracter, Gifcreater, GifFrames, ImageCreater, lib, main, Menu, Modal, Util;
    EventEmitter = require('events', module).EventEmitter;
    Modal = require('/view/modal.js', module);
    Menu = require('/view/menu.coffee', module);
    Button = require('/view/downloadButton.coffee', module);
    Util = require('/util.js', module);
    lib = {
      $: jQuery,
      JSZip: JSZip,
      GIF: GIF,
      GIF_worker_URL: GIF_worker_URL,
      saveAs: saveAs
    };
    Deferer = function (super$) {
      extends$(Deferer, super$);
      function Deferer() {
        this.all = 0;
        this.counted = 0;
      }
      Deferer.prototype.add = function () {
        return this.all++;
      };
      Deferer.prototype.count = function () {
        this.counted++;
        this.emit('progress', {
          all: this.all,
          fired: this.counted
        });
        if (this.counted === this.all)
          return this.emit('done');
      };
      return Deferer;
    }(EventEmitter);
    ImageCreater = function (super$1) {
      extends$(ImageCreater, super$1);
      function ImageCreater(param$, param$1) {
        if (null == param$)
          param$ = Deferer;
        this.Deferer = param$;
        if (null == param$1)
          param$1 = lib.$;
        this.$ = param$1;
        this.locked = false;
      }
      ImageCreater.prototype.create = function (blobs) {
        var file, imgElement, imgURL;
        if (this.locked === true) {
          console.log('incorrect invoke');
          return false;
        }
        this.locked = true;
        console.log('image create start');
        this.deferer = new this.Deferer;
        for (var i$ = 0, length$ = blobs.length; i$ < length$; ++i$) {
          file = blobs[i$];
          imgURL = Util.getUrl(file.blob);
          imgElement = document.createElement('img');
          imgElement.src = imgURL;
          file.image = imgElement;
          this.deferer.add();
          this.$(imgElement).on('load', function (this$) {
            return function () {
              this$.deferer.count();
              return true;
            };
          }(this));
        }
        this.deferer.on('done', function (this$) {
          return function () {
            this$.emit('done', blobs);
            this$.deferer.removeAllListeners('done');
            this$.deferer = null;
            this$.removeAllListeners('done');
            this$.locked = false;
            return true;
          };
        }(this));
        return true;
      };
      return ImageCreater;
    }(EventEmitter);
    GifFrames = function () {
      function GifFrames(param$) {
        if (null == param$)
          param$ = [];
        this.frames = param$;
      }
      GifFrames.prototype.add = function (imgElement, delay) {
        this.frames.push({
          image: imgElement,
          delay: delay
        });
        return true;
      };
      return GifFrames;
    }();
    Gifcreater = function (super$2) {
      extends$(Gifcreater, super$2);
      function Gifcreater(param$, param$1) {
        if (null == param$)
          param$ = lib.GIF;
        this.Gif = param$;
        if (null == param$1)
          param$1 = lib.GIF_worker_URL;
        this.Gif_worker_path = param$1;
        this.locked = false;
        this.cachedFrames = [];
        this.cachedGif = [];
      }
      Gifcreater.prototype.render = function (gifFrames, size) {
        var frame, index;
        if (this.locked === true) {
          console.log('incorrect invoke');
          return false;
        }
        index = this.cachedFrames.indexOf(gifFrames);
        if (index >= 0) {
          this.emit('finished', this.cachedGif[index]);
          this.removeAllListeners('finished');
          return true;
        }
        this.locked = true;
        console.log('Gif create start');
        this.gif = new this.Gif({
          workers: 2,
          quality: 10,
          workerScript: this.Gif_worker_path,
          width: size[0],
          height: size[1]
        });
        for (var i$ = 0, length$ = gifFrames.length; i$ < length$; ++i$) {
          frame = gifFrames[i$];
          this.gif.addFrame(frame.image, { delay: frame.delay });
        }
        this.gif.on('progress', function (this$) {
          return function (p) {
            return this$.emit('progress', p);
          };
        }(this));
        this.gif.on('finished', function (this$) {
          return function (blob) {
            this$.emit('finished', blob);
            try {
              this$.gif.removeAllListeners('finished');
            } catch (e$) {
            }
            try {
              this$.gif.removeAllListeners('progress');
            } catch (e$1) {
            }
            try {
              this$.removeAllListeners('finished');
            } catch (e$2) {
            }
            try {
              this$.gremoveAllListeners('progress');
            } catch (e$3) {
            }
            this$.cachedFrames.push(gifFrames);
            this$.cachedGif.push(blob);
            this$.gif = null;
            return this$.locked = false;
          };
        }(this));
        this.gif.render();
        return true;
      };
      return Gifcreater;
    }(EventEmitter);
    Extracter = function (super$3) {
      extends$(Extracter, super$3);
      function Extracter(param$) {
        if (null == param$)
          param$ = lib.JSZip;
        this.JSZip = param$;
        this.locked = false;
        this.zippedFiles = [];
        this.unzippedFiles = [];
      }
      Extracter.prototype.extract = function (param$) {
        var index;
        this.blob = param$;
        if (this.locked === true) {
          console.log('incorrect invoke');
          return false;
        }
        console.log('extract start');
        index = this.zippedFiles.indexOf(this.blob);
        if (index >= 0) {
          console.log('emit ' + this.emit('done', this.unzippedFiles[index]));
          this.removeAllListeners('done');
          return true;
        }
        this.locked = true;
        this.fileReader = new FileReader;
        this.fileReader.onload = function (this$) {
          return function () {
            var result = this$.fileReader.result, rv;
            try {
              rv = new Uint8Array(result);
              result = rv instanceof Uint8Array ? rv : new unsafeWindow.Uint8Array(result);
              if (!(result instanceof Uint8Array)) {
                var global = (new Function('return this;'))();
                global.Uint8Array = unsafeWindow.Uint8Array;
                if (global.console) {
                  (console.warn || console.error || console.log || function () {}).bind(console) (
                    'A terrible workaround is used to bypass the firefox sandbox issue!', 
                    'Please view https://github.com/greasemonkey/greasemonkey/issues/2034 for information'
                  );
                }
              }
            } catch (e) {
              console.log(e);
            }
            return this$._onArrayBufferLoaded(result);
          };
        }(this);
        return this.fileReader.readAsArrayBuffer(this.blob);
      };
      Extracter.prototype._onArrayBufferLoaded = function (arrBuffer) {
        var arrayBuffer_file, blob, file, fileName, files, MIME, temp;
        this.zip = new this.JSZip(arrBuffer);
        files = this.zip.file(/\d+.(?:jpg|png|gif)/i);
        temp = [];
        for (var i$ = 0, length$ = files.length; i$ < length$; ++i$) {
          file = files[i$];
          if (file.dir)
            break;
          fileName = file.name;
          MIME = Util.getMIME(fileName);
          arrayBuffer_file = file.asArrayBuffer();
          blob = new Blob([arrayBuffer_file], { type: MIME });
          temp.push({
            blob: blob,
            fileName: fileName,
            mime: MIME
          });
        }
        this.zippedFiles.push(this.blob);
        this.unzippedFiles.push(temp);
        console.log('emit ' + this.emit('done', temp));
        this.blob = null;
        this.removeAllListeners('done');
        this.zip = null;
        this.fileReader = null;
        this.locked = false;
        return true;
      };
      return Extracter;
    }(EventEmitter);
    Downloader = function (super$4) {
      extends$(Downloader, super$4);
      function Downloader() {
        this._cachedURL = [];
        this._cache = {};
        this.locked = false;
      }
      Downloader.prototype.download = function (url) {
        if (this.locked) {
          console.log('incorrect invoke');
          return false;
        }
        if (in$(url, this._cachedURL)) {
          this.emit('success', this._cache[url]);
          this.removeAllListeners('success');
          return true;
        }
        this.locked = true;
        console.log('download start');
        this.req = new XMLHttpRequest;
        this.req.open('GET', url, true);
        this.req.responseType = 'blob';
        this.req.onload = function (this$) {
          return function (e) {
            var blob;
            blob = this$.req.response;
            if (null != blob) {
              this$._cachedURL.push(url);
              this$._cache[url] = blob;
              this$.emit('success', blob);
              this$.removeAllListeners('success');
            } else {
              this$.emit('fail', url);
            }
            this$.locked = false;
            return true;
          };
        }(this);
        this.req.send(null);
        return true;
      };
      return Downloader;
    }(EventEmitter);
    main = function (global, $, util, saveAs) {
      var downloader, downloadPicture, extracter, getTitle, gifCreater, imageCreater, showGif, showPic;
      Modal.hook($);
      Menu.hook($);
      downloader = new Downloader;
      extracter = new Extracter;
      imageCreater = new ImageCreater;
      gifCreater = new Gifcreater;
      getTitle = function () {
        return global.pixiv.context.illustTitle;
      };
      downloadPicture = function (size) {
        var title, url;
        title = getTitle();
        switch (size) {
        case 'small':
          url = global.pixiv.context.ugokuIllustData.src;
          break;
        case 'full':
          url = global.pixiv.context.ugokuIllustFullscreenData.src;
          break;
        default:
          throw new Error('unknown size');
        }
        downloader.on('success', function (blob) {
          console.log(blob);
          return saveAs(blob, '' + title + '.zip');
        });
        return console.log(downloader.download(url));
      };
      showPic = function (size) {
        var title, url;
        title = getTitle();
        switch (size) {
        case 'small':
          url = global.pixiv.context.ugokuIllustData.src;
          break;
        case 'full':
          url = global.pixiv.context.ugokuIllustFullscreenData.src;
          break;
        default:
          throw new Error('unknown size');
        }
        downloader.on('success', function (blob) {
          Modal.clear();
          Modal.show();
          extracter.on('done', function (files) {
            imageCreater.on('done', function (files) {
              var file;
              Modal.clear();
              for (var i$ = 0, length$ = files.length; i$ < length$; ++i$) {
                file = files[i$];
                Modal.modalContent.append($('<p></p>').text(file.fileName));
                Modal.modalContent.append(file.image);
              }
              return true;
            });
            imageCreater.create(files);
            return true;
          });
          extracter.extract(blob);
          return true;
        });
        console.log(downloader.download(url));
        return true;
      };
      showGif = function (size, useDownload) {
        var delays, imageSize, title, url;
        title = getTitle();
        delays = global.pixiv.context.ugokuIllustData.frames.slice(0);
        switch (size) {
        case 'small':
          url = global.pixiv.context.ugokuIllustData.src;
          imageSize = global.pixiv.context.ugokuIllustData.size.slice(0);
          break;
        case 'full':
          url = global.pixiv.context.ugokuIllustFullscreenData.src;
          imageSize = global.pixiv.context.illustSize.slice(0);
          break;
        default:
          throw new Error('unknown size');
        }
        downloader.on('success', function (blob) {
          if (!useDownload) {
            Modal.clear();
            Modal.show();
          }
          extracter.on('done', function (files) {
            console.log('extract done');
            imageCreater.on('done', function (files) {
              var delay, file;
              imageSize = [
                files[0].image.clientWidth || files[0].image.width,
                files[0].image.clientHeight || files[0].image.height
              ];
              Modal.clear();
              for (var i$ = 0, length$ = files.length; i$ < length$; ++i$) {
                file = files[i$];
                for (var i$1 = 0, length$1 = delays.length; i$1 < length$1; ++i$1) {
                  delay = delays[i$1];
                  if (file.fileName === delay.file) {
                    file.delay = delay.delay;
                    break;
                  }
                }
              }
              console.log(files);
              console.log(delays);
              if (!useDownload) {
                gifCreater.on('finished', function (blob) {
                  var img;
                  Modal.clear();
                  url = Util.getUrl(blob);
                  img = document.createElement('img');
                  img.src = url;
                  Modal.modalContent.append(img);
                  return true;
                });
                gifCreater.on('progress', function (p) {
                  Modal.modalContent.html('progressing<br>' + Math.floor(p * 100) + '%');
                  return true;
                });
              } else {
                gifCreater.on('finished', function (blob) {
                  saveAs(blob, '' + title + '.gif');
                  return true;
                });
              }
              gifCreater.render(files, imageSize);
              return true;
            });
            imageCreater.create(files);
            return true;
          });
          console.log(extracter);
          extracter.extract(blob);
          return true;
        });
        console.log(downloader.download(url));
        return true;
      };
      if (global.pixiv.context.ugokuIllustData) {
        GM_registerMenuCommand('\u4E0B\u8F09\u52D5\u5716', function () {
          return Menu.show();
        });
        Button.hook($);
        Button.on('click', function () {
          return Menu.show();
        });
      }
      return Menu.on('run', function (data) {
        switch (data.size) {
        case 'mini':
          switch (data.type) {
          case 'gif':
            switch (data.action) {
            case 'download':
              return showGif('small', true);
            case 'view':
              return showGif('small');
            }
          case 'frame':
            switch (data.action) {
            case 'download':
              return downloadPicture('small');
            case 'view':
              return showPic('small');
            }
          }
        case 'full':
          if (!global.pixiv.context.ugokuIllustFullscreenData) {
            alert('\u672A\u767B\u5165\u662F\u7121\u6CD5\u4E0B\u8F09\u5168\u5716\u7684\u6B50');
            return true;
          }
          switch (data.type) {
          case 'gif':
            switch (data.action) {
            case 'download':
              return showGif('full', true);
            case 'view':
              return showGif('full');
            }
          case 'frame':
            switch (data.action) {
            case 'download':
              return downloadPicture('full');
            case 'view':
              return showPic('full');
            }
          }
        }
      });
    };
    console.log(lib);
    main(unsafeWindow, lib.$, Util, lib.saveAs);
    function isOwn$(o, p) {
      return {}.hasOwnProperty.call(o, p);
    }
    function extends$(child, parent) {
      for (var key in parent)
        if (isOwn$(parent, key))
          child[key] = parent[key];
      function ctor() {
        this.constructor = child;
      }
      ctor.prototype = parent.prototype;
      child.prototype = new ctor;
      child.__super__ = parent.prototype;
      return child;
    }
    function in$(member, list) {
      for (var i = 0, length = list.length; i < length; ++i)
        if (i in list && list[i] === member)
          return true;
      return false;
    }
  });
  require.define('/util.js', function (module, exports, __dirname, __filename) {
    var mimeTypes = {
        'a': 'application/octet-stream',
        'ai': 'application/postscript',
        'aif': 'audio/x-aiff',
        'aifc': 'audio/x-aiff',
        'aiff': 'audio/x-aiff',
        'au': 'audio/basic',
        'avi': 'video/x-msvideo',
        'bat': 'text/plain',
        'bin': 'application/octet-stream',
        'bmp': 'image/x-ms-bmp',
        'c': 'text/plain',
        'cdf': 'application/x-cdf',
        'csh': 'application/x-csh',
        'css': 'text/css',
        'dll': 'application/octet-stream',
        'doc': 'application/msword',
        'dot': 'application/msword',
        'dvi': 'application/x-dvi',
        'eml': 'message/rfc822',
        'eps': 'application/postscript',
        'etx': 'text/x-setext',
        'exe': 'application/octet-stream',
        'gif': 'image/gif',
        'gtar': 'application/x-gtar',
        'h': 'text/plain',
        'hdf': 'application/x-hdf',
        'htm': 'text/html',
        'html': 'text/html',
        'jpe': 'image/jpeg',
        'jpeg': 'image/jpeg',
        'jpg': 'image/jpeg',
        'js': 'application/x-javascript',
        'ksh': 'text/plain',
        'latex': 'application/x-latex',
        'm1v': 'video/mpeg',
        'man': 'application/x-troff-man',
        'me': 'application/x-troff-me',
        'mht': 'message/rfc822',
        'mhtml': 'message/rfc822',
        'mif': 'application/x-mif',
        'mov': 'video/quicktime',
        'movie': 'video/x-sgi-movie',
        'mp2': 'audio/mpeg',
        'mp3': 'audio/mpeg',
        'mp4': 'video/mp4',
        'mpa': 'video/mpeg',
        'mpe': 'video/mpeg',
        'mpeg': 'video/mpeg',
        'mpg': 'video/mpeg',
        'ms': 'application/x-troff-ms',
        'nc': 'application/x-netcdf',
        'nws': 'message/rfc822',
        'o': 'application/octet-stream',
        'obj': 'application/octet-stream',
        'oda': 'application/oda',
        'pbm': 'image/x-portable-bitmap',
        'pdf': 'application/pdf',
        'pfx': 'application/x-pkcs12',
        'pgm': 'image/x-portable-graymap',
        'png': 'image/png',
        'pnm': 'image/x-portable-anymap',
        'pot': 'application/vnd.ms-powerpoint',
        'ppa': 'application/vnd.ms-powerpoint',
        'ppm': 'image/x-portable-pixmap',
        'pps': 'application/vnd.ms-powerpoint',
        'ppt': 'application/vnd.ms-powerpoint',
        'pptx': 'application/vnd.ms-powerpoint',
        'ps': 'application/postscript',
        'pwz': 'application/vnd.ms-powerpoint',
        'py': 'text/x-python',
        'pyc': 'application/x-python-code',
        'pyo': 'application/x-python-code',
        'qt': 'video/quicktime',
        'ra': 'audio/x-pn-realaudio',
        'ram': 'application/x-pn-realaudio',
        'ras': 'image/x-cmu-raster',
        'rdf': 'application/xml',
        'rgb': 'image/x-rgb',
        'roff': 'application/x-troff',
        'rtx': 'text/richtext',
        'sgm': 'text/x-sgml',
        'sgml': 'text/x-sgml',
        'sh': 'application/x-sh',
        'shar': 'application/x-shar',
        'snd': 'audio/basic',
        'so': 'application/octet-stream',
        'src': 'application/x-wais-source',
        'swf': 'application/x-shockwave-flash',
        't': 'application/x-troff',
        'tar': 'application/x-tar',
        'tcl': 'application/x-tcl',
        'tex': 'application/x-tex',
        'texi': 'application/x-texinfo',
        'texinfo': 'application/x-texinfo',
        'tif': 'image/tiff',
        'tiff': 'image/tiff',
        'tr': 'application/x-troff',
        'tsv': 'text/tab-separated-values',
        'txt': 'text/plain',
        'ustar': 'application/x-ustar',
        'vcf': 'text/x-vcard',
        'wav': 'audio/x-wav',
        'wiz': 'application/msword',
        'wsdl': 'application/xml',
        'xbm': 'image/x-xbitmap',
        'xlb': 'application/vnd.ms-excel',
        'xls': 'application/vnd.ms-excel',
        'xlsx': 'application/vnd.ms-excel',
        'xml': 'text/xml',
        'xpdl': 'application/xml',
        'xpm': 'image/x-xpixmap',
        'xsl': 'application/xml',
        'xwd': 'image/x-xwindowdump',
        'zip': 'application/zip'
      };
    function last(arr) {
      var l = arr.length;
      return arr[l - 1];
    }
    function getMIME(name) {
      return mimeTypes[getFileExtension(name)] || '';
    }
    function getFileExtension(name) {
      return last(name.split('.'));
    }
    function getUrl(blob, name) {
      return URL.createObjectURL(blob);
    }
    module.exports = {
      getMIME: getMIME,
      getFileExtension: getFileExtension,
      getUrl: getUrl
    };
  });
  require.define('/view/downloadButton.coffee', function (module, exports, __dirname, __filename) {
    var botton, buttonCss, buttonHTML, EventEmitter;
    EventEmitter = require('events', module).EventEmitter;
    buttonHTML = '\r\n<button class="mmis-botton" title="\u4E0B\u8F09"></button>';
    buttonCss = '\r\n.wrapper .mmis-botton {\r\n  position: absolute;\r\n  right: 42px;\r\n  top: 5px;\r\n  background: rgba(153, 153, 153, 0.5);\r\n  color: #f9f9f9;\r\n  box-sizing: content-box;\r\n  border: 0px;\r\n  padding: 6px 6px 6px 6px;\r\n  margin: 0px;\r\n  width: 20px;\r\n  height: 20px;\r\n  border-radius: 5px;\r\n  line-height: 20px;\r\n  font-size: 20px;\r\n  font-weight: bold;\r\n  text-align: center;\r\n  -webkit-transition: background-color, opacity 0.2s;\r\n  -moz-transition: background-color, opacity 0.2s;\r\n  -o-transition: background-color, opacity 0.2s;\r\n  -ms-transition: background-color, opacity 0.2s;\r\n  transition: background-color, opacity 0.2s;\r\n  opacity: 0;\r\n  display: block;\r\n}\r\n.wrapper .mmis-botton:hover {\r\n  background-color: rgba(153,153,153,0.75);\r\n}\r\n\r\n.wrapper .mmis-botton::after {\r\n  content: "\u2193";\r\n  display: inline;\r\n}\r\n._ugoku-illust-player-container:hover .mmis-botton {\r\n  opacity: 1;\r\n}';
    botton = function (super$) {
      extends$(botton, super$);
      function botton() {
        this.$ = null;
        this.inited = false;
      }
      botton.prototype.hook = function (jQuery) {
        if (this.inited)
          return false;
        this.$ = jQuery;
        this.inited = true;
        this.$('head').append(this.$('<style>').html(buttonCss));
        this.button = $(buttonHTML);
        this.$('.works_display>._ugoku-illust-player-container>.wrapper').append(this.button);
        return this.button.on('click', function (this$) {
          return function () {
            return this$.emit('click');
          };
        }(this));
      };
      return botton;
    }(EventEmitter);
    module.exports = new botton;
    function isOwn$(o, p) {
      return {}.hasOwnProperty.call(o, p);
    }
    function extends$(child, parent) {
      for (var key in parent)
        if (isOwn$(parent, key))
          child[key] = parent[key];
      function ctor() {
        this.constructor = child;
      }
      ctor.prototype = parent.prototype;
      child.prototype = new ctor;
      child.__super__ = parent.prototype;
      return child;
    }
    function in$(member, list) {
      for (var i = 0, length = list.length; i < length; ++i)
        if (i in list && list[i] === member)
          return true;
      return false;
    }
  });
  require.define('events', function (module, exports, __dirname, __filename) {
    if (!process.EventEmitter)
      process.EventEmitter = function () {
      };
    var EventEmitter = exports.EventEmitter = process.EventEmitter;
    var isArray = typeof Array.isArray === 'function' ? Array.isArray : function (xs) {
        return Object.prototype.toString.call(xs) === '[object Array]';
      };
    var defaultMaxListeners = 10;
    EventEmitter.prototype.setMaxListeners = function (n) {
      if (!this._events)
        this._events = {};
      this._events.maxListeners = n;
    };
    EventEmitter.prototype.emit = function (type) {
      if (type === 'error') {
        if (!this._events || !this._events.error || isArray(this._events.error) && !this._events.error.length) {
          if (arguments[1] instanceof Error) {
            throw arguments[1];
          } else {
            throw new Error("Uncaught, unspecified 'error' event.");
          }
          return false;
        }
      }
      if (!this._events)
        return false;
      var handler = this._events[type];
      if (!handler)
        return false;
      if (typeof handler == 'function') {
        switch (arguments.length) {
        case 1:
          handler.call(this);
          break;
        case 2:
          handler.call(this, arguments[1]);
          break;
        case 3:
          handler.call(this, arguments[1], arguments[2]);
          break;
        default:
          var args = Array.prototype.slice.call(arguments, 1);
          handler.apply(this, args);
        }
        return true;
      } else if (isArray(handler)) {
        var args = Array.prototype.slice.call(arguments, 1);
        var listeners = handler.slice();
        for (var i = 0, l = listeners.length; i < l; i++) {
          listeners[i].apply(this, args);
        }
        return true;
      } else {
        return false;
      }
    };
    EventEmitter.prototype.addListener = function (type, listener) {
      if ('function' !== typeof listener) {
        throw new Error('addListener only takes instances of Function');
      }
      if (!this._events)
        this._events = {};
      this.emit('newListener', type, listener);
      if (!this._events[type]) {
        this._events[type] = listener;
      } else if (isArray(this._events[type])) {
        if (!this._events[type].warned) {
          var m;
          if (this._events.maxListeners !== undefined) {
            m = this._events.maxListeners;
          } else {
            m = defaultMaxListeners;
          }
          if (m && m > 0 && this._events[type].length > m) {
            this._events[type].warned = true;
            console.error('(node) warning: possible EventEmitter memory ' + 'leak detected. %d listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.', this._events[type].length);
            console.trace();
          }
        }
        this._events[type].push(listener);
      } else {
        this._events[type] = [
          this._events[type],
          listener
        ];
      }
      return this;
    };
    EventEmitter.prototype.on = EventEmitter.prototype.addListener;
    EventEmitter.prototype.once = function (type, listener) {
      var self = this;
      self.on(type, function g() {
        self.removeListener(type, g);
        listener.apply(this, arguments);
      });
      return this;
    };
    EventEmitter.prototype.removeListener = function (type, listener) {
      if ('function' !== typeof listener) {
        throw new Error('removeListener only takes instances of Function');
      }
      if (!this._events || !this._events[type])
        return this;
      var list = this._events[type];
      if (isArray(list)) {
        var i = list.indexOf(listener);
        if (i < 0)
          return this;
        list.splice(i, 1);
        if (list.length == 0)
          delete this._events[type];
      } else if (this._events[type] === listener) {
        delete this._events[type];
      }
      return this;
    };
    EventEmitter.prototype.removeAllListeners = function (type) {
      if (type && this._events && this._events[type])
        this._events[type] = null;
      return this;
    };
    EventEmitter.prototype.listeners = function (type) {
      if (!this._events)
        this._events = {};
      if (!this._events[type])
        this._events[type] = [];
      if (!isArray(this._events[type])) {
        this._events[type] = [this._events[type]];
      }
      return this._events[type];
    };
  });
  require.define('/view/menu.coffee', function (module, exports, __dirname, __filename) {
    var EventEmitter, menu, menuCss, menuHTML;
    EventEmitter = require('events', module).EventEmitter;
    menuHTML = '\r\n<div class="mmis_selection_box">\r\n    <form>\r\n        <fieldset>\r\n            <legend>\u5C3A\u5BF8</legend>\r\n            <input id="size_mini" type="radio" name ="size" value ="mini" checked>\r\n            <label for="size_mini">\u7E2E\u5716</label>\r\n            <input id="size_full" type="radio" name ="size" value ="full">\r\n            <label for="size_full">\u5168\u5716</label>\r\n        </fieldset>\r\n        <fieldset>\r\n            <legend>\u683C\u5F0F</legend>\r\n            <input id="type_frame" type="radio" name ="type" value ="frame" checked>\r\n            <label for="type_frame">\u55AE\u683C</label>\r\n            <input id="type_gif" type="radio" name ="type" value ="gif">\r\n            <label for="type_gif">gif</label>\r\n        </fieldset>\r\n        <fieldset>\r\n            <legend>\u52D5\u4F5C</legend>\r\n            <input id="action_download" type="radio" name ="action" value ="download" checked>\r\n            <label for="action_download">\u4E0B\u8F09</label>\r\n            <input id="action_view" type="radio" name ="action" value ="view">\r\n            <label for="action_view">\u700F\u89BD</label>\r\n        </fieldset>\r\n    </form>\r\n    <div class="botton_wrap">\r\n        <button data-action="run">\r\n            \u57F7\u884C\r\n        </button>\r\n        <button data-action="cancel">\r\n            \u53D6\u6D88\r\n        </button>\r\n    </div>\r\n</div>';
    menuCss = '\r\n.mmis_selection_box {\r\n  display :none;\r\n  z-index: 99999;\r\n  width: 200px;\r\n  height: 280px;\r\n  border: 5px solid #eeeeee;\r\n  border-radius: 10px;\r\n  background: white;\r\n  position: fixed;\r\n  text-align: center;\r\n  left: 50%;\r\n  top: 50%;\r\n  font-size: 18px;\r\n  margin: -145px 0px 0px -105px;\r\n  line-height: 25px;\r\n}\r\n.mmis_selection_box fieldset,\r\n.mmis_selection_box input,\r\n.mmis_selection_box buttom,\r\n.mmis_selection_box div {\r\n  margin: 0px;\r\n  border: 0px;\r\n  padding: 0px;\r\n}\r\n.mmis_selection_box fieldset {\r\n  margin: 0.5em;\r\n  padding: 0.5em;\r\n  border: 1px solid #dddddd;\r\n  border-radius: 10px;\r\n}\r\n.mmis_selection_box fieldset label {\r\n  display: inline-block;\r\n  width: 3em;\r\n  cursor: pointer;\r\n}\r\n.mmis_selection_box .botton_wrap {\r\n  margin: 0.5em;\r\n}\r\n.mmis_selection_box .botton_wrap button {\r\n  display: block;\r\n  width: 50%;\r\n  text-align: center;\r\n  float: left;\r\n}';
    menu = function (super$) {
      extends$(menu, super$);
      function menu() {
        this.$ = null;
        this.inited = false;
      }
      menu.prototype.hook = function (jQuery) {
        if (this.inited)
          return false;
        this.$ = jQuery;
        this.inited = true;
        this.$('head').append($('<style>').text(menuCss));
        this.menu = $(menuHTML);
        this.$('body').append(this.menu);
        this.menu.on('click', 'button[data-action="cancel"]', function (this$) {
          return function (e) {
            this$.hide();
            return true;
          };
        }(this));
        this.menu.on('click', 'button[data-action="run"]', function (this$) {
          return function (e) {
            var data;
            this$.hide();
            data = {
              size: this$.menu.find('input[name="size"]:checked').val(),
              type: this$.menu.find('input[name="type"]:checked').val(),
              action: this$.menu.find('input[name="action"]:checked').val()
            };
            this$.emit('run', data);
            return true;
          };
        }(this));
        return true;
      };
      menu.prototype.show = function () {
        if (!this.inited)
          return false;
        this.menu.fadeIn();
        return true;
      };
      menu.prototype.hide = function () {
        if (!this.inited)
          return false;
        this.menu.fadeOut();
        return true;
      };
      return menu;
    }(EventEmitter);
    module.exports = new menu;
    function isOwn$(o, p) {
      return {}.hasOwnProperty.call(o, p);
    }
    function extends$(child, parent) {
      for (var key in parent)
        if (isOwn$(parent, key))
          child[key] = parent[key];
      function ctor() {
        this.constructor = child;
      }
      ctor.prototype = parent.prototype;
      child.prototype = new ctor;
      child.__super__ = parent.prototype;
      return child;
    }
    function in$(member, list) {
      for (var i = 0, length = list.length; i < length; ++i)
        if (i in list && list[i] === member)
          return true;
      return false;
    }
  });
  require.define('/view/modal.js', function (module, exports, __dirname, __filename) {
    var loadPlugin = function ($) {
      var defaultOption = { stat: 'on' };
      function off(el) {
        el = $(el);
        el.find('.modal').slideUp(500, function () {
          el.fadeOut(200);
        });
      }
      function on(el) {
        el = $(el);
        el.find('.modal').hide();
        el.fadeIn(200, function () {
          el.find('.modal').slideDown(500);
        });
      }
      $.fn.modal = function modal(option) {
        option = option || {};
        $.extend(option, defaultOption);
        var _modal = $(this);
        if (!_modal.is('.inited')) {
          _modal.on('click', function (e) {
            if ($(e.target).is('.mmis1000-modal .exit')) {
              off(_modal);
            }
            if ($(e.target).is('.mmis1000-modal')) {
              off(_modal);
            }
          });
          _modal.addClass('inited');
        }
        switch (option.stat) {
        case 'on':
          on(_modal);
          break;
        case 'off':
          off(_modal);
          break;
        default:
          on(_modal);
        }
      };
    };
    var modal_css = '.mmis1000-modal{background:rgba(128,128,128,0.5);bottom:0;display:none;left:0;overflow:hidden;position:fixed;right:0;top:0;z-index:99999}' + '.mmis1000-modal .modal{background:#fff;border-radius:10px;bottom:25px;left:25px;position:absolute;right:25px;top:25px}' + '.mmis1000-modal .modal .head{border-bottom-color:#ddd;border-bottom-style:solid;border-bottom-width:2px;height:30px;left:0;padding-left:5px;position:absolute;right:0;top:0}' + '.mmis1000-modal .modal .head .text{color:#666;font-size:20px;line-height:30px}' + '.mmis1000-modal .modal .head .exit{background:red;border-radius:4px;color:#fff;cursor:pointer;font-size:20px;height:20px;line-height:20px;position:absolute;right:5px;text-align:center;top:5px;width:20px}' + '.mmis1000-modal .modal .content-wrapper{bottom:10px;left:0;overflow:auto;position:absolute;right:0;top:32px}' + '.mmis1000-modal .modal .content-wrapper .content{font-size:18px;left:10px;position:absolute;right:10px;text-align:center;top:10px}' + '.mmis1000-modal .modal .content-wrapper .content img{max-width:100%}';
    var modalContent = [
        "<div id='test' class='mmis1000-modal'>",
        "<div class='modal'>",
        "<div class='head'>",
        "<span class='text'>\u6AA2\u8996</span>",
        "<div class='exit'>",
        'X',
        '</div>',
        '</div>',
        "<div class='content-wrapper'>",
        "<div class='content'>",
        '</div>',
        '</div>',
        '</div>',
        '</div>'
      ].join('');
    var modal = {
        hook: function ($) {
          if (this.$) {
            return;
          }
          this.$ = $;
          loadPlugin($);
          $('head').append($('<style></style>').html(modal_css));
          this.modal = $(modalContent);
          this.modalContent = this.modal.find('.content');
          $('body').append(this.modal);
        },
        show: function () {
          this.$(this.modal).modal();
        },
        hide: function () {
          this.$(this.modal).modal({ stat: off });
        },
        clear: function () {
          this.modalContent.find('*').remove();
          this.modalContent.text('');
        }
      };
    module.exports = modal;
  });
  global.pixiv_helper = require('/pixiv_helper.coffee');
}.call(this, this));
//# sourceMappingURL=pixiv_helper.js.map 
// pixiv_helper.js   https://github.com/mmis1000/Pixiv_Helper