UNPKG

instagram-publisher

Version:

Publish Instagram Images, Image Slideshows, Video Reels & Stories via NodeJS

1,677 lines 65.1 kB
import { existsSync, readFileSync, writeFileSync } from 'fs';

function _regeneratorRuntime() {
  _regeneratorRuntime = function () {
    return exports;
  };
  var exports = {},
    Op = Object.prototype,
    hasOwn = Op.hasOwnProperty,
    defineProperty = Object.defineProperty || function (obj, key, desc) {
      obj[key] = desc.value;
    },
    $Symbol = "function" == typeof Symbol ? Symbol : {},
    iteratorSymbol = $Symbol.iterator || "@@iterator",
    asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator",
    toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  function define(obj, key, value) {
    return Object.defineProperty(obj, key, {
      value: value,
      enumerable: !0,
      configurable: !0,
      writable: !0
    }), obj[key];
  }
  try {
    define({}, "");
  } catch (err) {
    define = function (obj, key, value) {
      return obj[key] = value;
    };
  }
  function wrap(innerFn, outerFn, self, tryLocsList) {
    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,
      generator = Object.create(protoGenerator.prototype),
      context = new Context(tryLocsList || []);
    return defineProperty(generator, "_invoke", {
      value: makeInvokeMethod(innerFn, self, context)
    }), generator;
  }
  function tryCatch(fn, obj, arg) {
    try {
      return {
        type: "normal",
        arg: fn.call(obj, arg)
      };
    } catch (err) {
      return {
        type: "throw",
        arg: err
      };
    }
  }
  exports.wrap = wrap;
  var ContinueSentinel = {};
  function Generator() {}
  function GeneratorFunction() {}
  function GeneratorFunctionPrototype() {}
  var IteratorPrototype = {};
  define(IteratorPrototype, iteratorSymbol, function () {
    return this;
  });
  var getProto = Object.getPrototypeOf,
    NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);
  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
  function defineIteratorMethods(prototype) {
    ["next", "throw", "return"].forEach(function (method) {
      define(prototype, method, function (arg) {
        return this._invoke(method, arg);
      });
    });
  }
  function AsyncIterator(generator, PromiseImpl) {
    function invoke(method, arg, resolve, reject) {
      var record = tryCatch(generator[method], generator, arg);
      if ("throw" !== record.type) {
        var result = record.arg,
          value = result.value;
        return value && "object" == typeof value && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) {
          invoke("next", value, resolve, reject);
        }, function (err) {
          invoke("throw", err, resolve, reject);
        }) : PromiseImpl.resolve(value).then(function (unwrapped) {
          result.value = unwrapped, resolve(result);
        }, function (error) {
          return invoke("throw", error, resolve, reject);
        });
      }
      reject(record.arg);
    }
    var previousPromise;
    defineProperty(this, "_invoke", {
      value: function (method, arg) {
        function callInvokeWithMethodAndArg() {
          return new PromiseImpl(function (resolve, reject) {
            invoke(method, arg, resolve, reject);
          });
        }
        return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
      }
    });
  }
  function makeInvokeMethod(innerFn, self, context) {
    var state = "suspendedStart";
    return function (method, arg) {
      if ("executing" === state) throw new Error("Generator is already running");
      if ("completed" === state) {
        if ("throw" === method) throw arg;
        return doneResult();
      }
      for (context.method = method, context.arg = arg;;) {
        var delegate = context.delegate;
        if (delegate) {
          var delegateResult = maybeInvokeDelegate(delegate, context);
          if (delegateResult) {
            if (delegateResult === ContinueSentinel) continue;
            return delegateResult;
          }
        }
        if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) {
          if ("suspendedStart" === state) throw state = "completed", context.arg;
          context.dispatchException(context.arg);
        } else "return" === context.method && context.abrupt("return", context.arg);
        state = "executing";
        var record = tryCatch(innerFn, self, context);
        if ("normal" === record.type) {
          if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue;
          return {
            value: record.arg,
            done: context.done
          };
        }
        "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg);
      }
    };
  }
  function maybeInvokeDelegate(delegate, context) {
    var methodName = context.method,
      method = delegate.iterator[methodName];
    if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
    var record = tryCatch(method, delegate.iterator, context.arg);
    if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel;
    var info = record.arg;
    return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel);
  }
  function pushTryEntry(locs) {
    var entry = {
      tryLoc: locs[0]
    };
    1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
  }
  function resetTryEntry(entry) {
    var record = entry.completion || {};
    record.type = "normal", delete record.arg, entry.completion = record;
  }
  function Context(tryLocsList) {
    this.tryEntries = [{
      tryLoc: "root"
    }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);
  }
  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];
      if (iteratorMethod) return iteratorMethod.call(iterable);
      if ("function" == typeof iterable.next) return iterable;
      if (!isNaN(iterable.length)) {
        var i = -1,
          next = function next() {
            for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;
            return next.value = undefined, next.done = !0, next;
          };
        return next.next = next;
      }
    }
    return {
      next: doneResult
    };
  }
  function doneResult() {
    return {
      value: undefined,
      done: !0
    };
  }
  return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", {
    value: GeneratorFunctionPrototype,
    configurable: !0
  }), defineProperty(GeneratorFunctionPrototype, "constructor", {
    value: GeneratorFunction,
    configurable: !0
  }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) {
    var ctor = "function" == typeof genFun && genFun.constructor;
    return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
  }, exports.mark = function (genFun) {
    return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
  }, exports.awrap = function (arg) {
    return {
      __await: arg
    };
  }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
    return this;
  }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
    void 0 === PromiseImpl && (PromiseImpl = Promise);
    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
    return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
      return result.done ? result.value : iter.next();
    });
  }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () {
    return this;
  }), define(Gp, "toString", function () {
    return "[object Generator]";
  }), exports.keys = function (val) {
    var object = Object(val),
      keys = [];
    for (var key in object) keys.push(key);
    return keys.reverse(), function next() {
      for (; keys.length;) {
        var key = keys.pop();
        if (key in object) return next.value = key, next.done = !1, next;
      }
      return next.done = !0, next;
    };
  }, exports.values = values, Context.prototype = {
    constructor: Context,
    reset: function (skipTempReset) {
      if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);
    },
    stop: function () {
      this.done = !0;
      var rootRecord = this.tryEntries[0].completion;
      if ("throw" === rootRecord.type) throw rootRecord.arg;
      return this.rval;
    },
    dispatchException: function (exception) {
      if (this.done) throw exception;
      var context = this;
      function handle(loc, caught) {
        return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught;
      }
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i],
          record = entry.completion;
        if ("root" === entry.tryLoc) return handle("end");
        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc"),
            hasFinally = hasOwn.call(entry, "finallyLoc");
          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
            if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
          } else {
            if (!hasFinally) throw new Error("try statement without catch or finally");
            if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
          }
        }
      }
    },
    abrupt: function (type, arg) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
          var finallyEntry = entry;
          break;
        }
      }
      finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
      var record = finallyEntry ? finallyEntry.completion : {};
      return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
    },
    complete: function (record, afterLoc) {
      if ("throw" === record.type) throw record.arg;
      return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
    },
    finish: function (finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
      }
    },
    catch: function (tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;
          if ("throw" === record.type) {
            var thrown = record.arg;
            resetTryEntry(entry);
          }
          return thrown;
        }
      }
      throw new Error("illegal catch attempt");
    },
    delegateYield: function (iterable, resultName, nextLoc) {
      return this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      }, "next" === this.method && (this.arg = undefined), ContinueSentinel;
    }
  }, exports;
}
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  try {
    var info = gen[key](arg);
    var value = info.value;
  } catch (error) {
    reject(error);
    return;
  }
  if (info.done) {
    resolve(value);
  } else {
    Promise.resolve(value).then(_next, _throw);
  }
}
function _asyncToGenerator(fn) {
  return function () {
    var self = this,
      args = arguments;
    return new Promise(function (resolve, reject) {
      var gen = fn.apply(self, args);
      function _next(value) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
      }
      function _throw(err) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
      }
      _next(undefined);
    });
  };
}
function _extends() {
  _extends = Object.assign ? Object.assign.bind() : function (target) {
    for (var i = 1; i < arguments.length; i++) {
      var source = arguments[i];
      for (var key in source) {
        if (Object.prototype.hasOwnProperty.call(source, key)) {
          target[key] = source[key];
        }
      }
    }
    return target;
  };
  return _extends.apply(this, arguments);
}

var MAX_CAPTION_LENGTH = 2200;
var MIN_SLIDESHOW_IMAGES = 2;
var MAX_SLIDESHOW_IMAGES = 10;
var VALID_VIDEO_ASPECT_RATIOS = ['1:1', '16:9', '9:16'];
var VALID_VIDEO_EXTENSION = ['mp4'];
var COOKIES_FILE_PATH = 'cookies.json';
var BASE_URL = 'https://i.instagram.com';

var MIN_2_IMAGES_ERR = '[InstagramPublisher] - Minimum 2 images required';
var MAX_10_IMAGES_ERR = '[InstagramPublisher] - Maximum 10 images allowed';
var IMAGES_NOT_FOUND_ERR = '[InstagramPublisher] - Not all images found';
var THUMBNAIL_NOT_FOUND_ERR = '[InstagramPublisher] - Thumbnail image not found';
var THUMBNAIL_NOT_JPG_ERR = '[InstagramPublisher] - Thumbnail image is not .jpg';
var VIDEO_NOT_FOUND_ERR = '[InstagramPublisher] - Video not found';
var IMAGES_NOT_JPG_ERR = '[InstagramPublisher] - Only .jpg images are allowed';
var IMAGES_WRONG_ASPECT_RATIO_ERR = '[InstagramPublisher] - Not all images have 1:1 aspect ratio';
var LOGIN_ERR = '[InstagramPublisher] - Invalid credentials';
var LOGIN_ERR_COOKIES = '[InstagramPublisher] - No coookies found after login';
var CAPTION_TOO_LONG_ERR = '[InstagramPublisher] - Caption should not exceed 2200 characters';
var INVALID_VIDEO_FORMAT = '[InstagramPublisher] - Only .mp4 video files are supported';
var INVALID_VIDEO_ASPECT_RATIO = "[InstagramPublisher] - Only '1:1', '16:9', '9:16' video aspect ratios are supported";
var LOCATION_NOT_FOUND = "[InstagramPublisher] - Location not found";

function validateCookies() {
  var exists = existsSync(COOKIES_FILE_PATH);
  // check expiration date
  if (exists) {
    var cookies = JSON.parse(readFileSync(COOKIES_FILE_PATH, 'utf8'));
    var expirationDate = new Date(cookies.find(function (c) {
      return c.key === 'sessionid';
    }).expires);
    return new Date() < expirationDate;
  }
  return false;
}
function sleep(_x) {
  return _sleep.apply(this, arguments);
}
function _sleep() {
  _sleep = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(milliseconds) {
    return _regeneratorRuntime().wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          _context.next = 2;
          return new Promise(function (resolve) {
            return setTimeout(resolve, milliseconds);
          });
        case 2:
        case "end":
          return _context.stop();
      }
    }, _callee);
  }));
  return _sleep.apply(this, arguments);
}

var request = /*#__PURE__*/require('request-promise-native');
var HTTP_CLIENT = /*#__PURE__*/function () {
  function HTTP_CLIENT() {}
  HTTP_CLIENT.setHeaders = function setHeaders() {
    HTTP_CLIENT.request = request;
    var requestOptions = {
      baseUrl: BASE_URL,
      uri: '',
      json: true,
      headers: {
        'User-Agent': this.useragent,
        'Accept-Language': 'en-US',
        'X-Instagram-AJAX': 1,
        'X-Requested-With': 'XMLHttpRequest',
        Referer: BASE_URL,
        origin: BASE_URL
      }
    };
    if (validateCookies() && requestOptions.headers !== undefined) {
      var cookies = JSON.parse(readFileSync(COOKIES_FILE_PATH, 'utf-8'));
      var csrftoken = cookies.filter(function (c) {
        return c.key === 'csrftoken';
      })[0].value;
      this.csrftoken = csrftoken.toString();
      requestOptions.headers['X-CSRFToken'] = csrftoken;
      this.cookies = cookies.map(function (c) {
        return c.key + "=" + c.value;
      }).join(';');
      requestOptions.headers.Cookie = this.cookies;
    }
    HTTP_CLIENT.request = request.defaults(requestOptions);
  };
  return HTTP_CLIENT;
}();
HTTP_CLIENT.request = request;
HTTP_CLIENT.cookies = '';
HTTP_CLIENT.useragent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1';
HTTP_CLIENT.csrftoken = '';

var request$1 = /*#__PURE__*/require('request-promise-native');
function getLocation(_x) {
  return _getLocation.apply(this, arguments);
}
function _getLocation() {
  _getLocation = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(location) {
    var headers, response;
    return _regeneratorRuntime().wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          headers = {
            'x-asbd-id': '198387',
            'x-ig-app-id': '936619743392459',
            'User-Agent': HTTP_CLIENT.useragent,
            Cookie: HTTP_CLIENT.cookies,
            'X-CSRFToken': HTTP_CLIENT.csrftoken,
            origin: BASE_URL,
            Referer: BASE_URL
          };
          _context.t0 = JSON;
          _context.next = 4;
          return request$1({
            url: BASE_URL + "/api/v1/location_search/?search_query=" + location,
            method: 'GET',
            headers: headers
          });
        case 4:
          _context.t1 = _context.sent;
          response = _context.t0.parse.call(_context.t0, _context.t1);
          return _context.abrupt("return", response);
        case 7:
        case "end":
          return _context.stop();
      }
    }, _callee);
  }));
  return _getLocation.apply(this, arguments);
}

var sizeOf = /*#__PURE__*/require('image-size');
function uploadPhoto(_x) {
  return _uploadPhoto.apply(this, arguments);
}
function _uploadPhoto() {
  _uploadPhoto = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(image_path) {
    var upload_id, request_1_headers, image_file, image_size, request_2_headers, response;
    return _regeneratorRuntime().wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          upload_id = Date.now();
          request_1_headers = {
            'access-control-request-method': 'POST',
            'access-control-request-headers': 'content-type,offset,x-asbd-id,x-entity-length,x-entity-name,x-entity-type,x-ig-app-id,x-instagram-ajax,x-instagram-rupload-params'
          };
          _context.next = 4;
          return HTTP_CLIENT.request({
            uri: "/rupload_igphoto/fb_uploader_" + upload_id,
            method: 'OPTIONS',
            headers: request_1_headers
          });
        case 4:
          image_file = readFileSync(image_path);
          image_size = sizeOf(image_file);
          request_2_headers = {
            'x-instagram-rupload-params': JSON.stringify({
              media_type: 1,
              upload_id: upload_id,
              upload_media_height: image_size.height,
              upload_media_width: image_size.width
            }),
            'x-entity-name': "fb_uploader_" + upload_id,
            offset: 0,
            origin: BASE_URL,
            'x-entity-length': image_file.byteLength,
            'Content-Length': image_file.byteLength,
            'Content-Type': 'image/jpeg',
            'x-entity-type': 'image/jpeg'
          }; // upload video file
          _context.t0 = JSON;
          _context.next = 10;
          return HTTP_CLIENT.request({
            uri: "/rupload_igphoto/fb_uploader_" + upload_id,
            headers: request_2_headers,
            method: 'POST',
            json: false,
            body: image_file
          });
        case 10:
          _context.t1 = _context.sent;
          response = _context.t0.parse.call(_context.t0, _context.t1);
          return _context.abrupt("return", response);
        case 13:
        case "end":
          return _context.stop();
      }
    }, _callee);
  }));
  return _uploadPhoto.apply(this, arguments);
}

var sizeOf$1 = /*#__PURE__*/require('image-size');
function validateCaption(caption) {
  if (caption.length > MAX_CAPTION_LENGTH) {
    throw new Error(CAPTION_TOO_LONG_ERR);
  }
}
function validateImageExists(image_path, isThumbnail) {
  if (isThumbnail === void 0) {
    isThumbnail = false;
  }
  try {
    sizeOf$1(image_path);
  } catch (error) {
    throw new Error(isThumbnail ? THUMBNAIL_NOT_FOUND_ERR : IMAGES_NOT_FOUND_ERR);
  }
}
function validateImageAspectRatio(image) {
  if (image.height !== image.width) {
    throw new Error(IMAGES_WRONG_ASPECT_RATIO_ERR);
  }
}
function validateImageJPG(image, isThumbnail) {
  if (isThumbnail === void 0) {
    isThumbnail = false;
  }
  if (image.type !== 'jpg') {
    throw new Error(isThumbnail ? THUMBNAIL_NOT_JPG_ERR : IMAGES_NOT_JPG_ERR);
  }
}
function validateVideoExists(video_path) {
  if (!existsSync(video_path)) {
    throw new Error(VIDEO_NOT_FOUND_ERR);
  }
}
function validateVideoMp4(video_path) {
  var video_extension = video_path.split('.')[video_path.split('.').length - 1];
  if (!VALID_VIDEO_EXTENSION.find(function (e) {
    return e === video_extension;
  })) {
    throw new Error(INVALID_VIDEO_FORMAT);
  }
}

var sizeOf$2 = /*#__PURE__*/require('image-size');
function createImageSlideshowHandler(_x) {
  return _createImageSlideshowHandler.apply(this, arguments);
}
function _createImageSlideshowHandler() {
  _createImageSlideshowHandler = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
    var _ref$images, images, _ref$caption, caption, location, verbose, photosUploaded, errors, idx, photo, uploadResponse, createSlideshowResponse;
    return _regeneratorRuntime().wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          _ref$images = _ref.images, images = _ref$images === void 0 ? [] : _ref$images, _ref$caption = _ref.caption, caption = _ref$caption === void 0 ? '' : _ref$caption, location = _ref.location, verbose = _ref.verbose;
          _validateImages(images);
          validateCaption(caption);
          photosUploaded = [];
          errors = []; // upload photos
          idx = 0;
        case 6:
          if (!(idx < images.length)) {
            _context.next = 21;
            break;
          }
          photo = images[idx];
          _context.prev = 8;
          _context.next = 11;
          return uploadPhoto(photo);
        case 11:
          uploadResponse = _context.sent;
          photosUploaded.push(uploadResponse);
          _context.next = 18;
          break;
        case 15:
          _context.prev = 15;
          _context.t0 = _context["catch"](8);
          errors.push("[InstagramPublisher/createSlideshow] - Photo " + photo + " not uploaded");
        case 18:
          idx++;
          _context.next = 6;
          break;
        case 21:
          if (!(photosUploaded.length > 0)) {
            _context.next = 27;
            break;
          }
          _context.next = 24;
          return _saveSlideshow({
            photosUploaded: photosUploaded,
            caption: caption,
            location: location
          });
        case 24:
          createSlideshowResponse = _context.sent;
          if (verbose) console.info("[InstagramPublisher] - Image Slideshow Created: " + createSlideshowResponse.status);
          return _context.abrupt("return", {
            succeeded: createSlideshowResponse.status === 'ok',
            code: createSlideshowResponse.media.code
          });
        case 27:
          return _context.abrupt("return", {
            succeeded: false,
            code: ''
          });
        case 28:
        case "end":
          return _context.stop();
      }
    }, _callee, null, [[8, 15]]);
  }));
  return _createImageSlideshowHandler.apply(this, arguments);
}
function _saveSlideshow(_x2) {
  return _saveSlideshow2.apply(this, arguments);
}
function _saveSlideshow2() {
  _saveSlideshow2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2) {
    var photosUploaded, caption, location, payload, locationData, requestHeaders, uploadResponse;
    return _regeneratorRuntime().wrap(function _callee2$(_context2) {
      while (1) switch (_context2.prev = _context2.next) {
        case 0:
          photosUploaded = _ref2.photosUploaded, caption = _ref2.caption, location = _ref2.location;
          payload = {
            caption: caption,
            children_metadata: [].concat(photosUploaded),
            client_sidecar_id: Date.now().toString(),
            disable_comments: '0',
            like_and_view_counts_disabled: false,
            source_type: 'library'
          };
          if (!location) {
            _context2.next = 14;
            break;
          }
          _context2.prev = 3;
          _context2.next = 6;
          return getLocation(location);
        case 6:
          locationData = _context2.sent;
          payload.location = {
            lat: locationData.venues[0].lat,
            lng: locationData.venues[0].lng,
            facebook_places_id: locationData.venues[0].external_id
          };
          payload.geotag_enabled = 'true';
          _context2.next = 14;
          break;
        case 11:
          _context2.prev = 11;
          _context2.t0 = _context2["catch"](3);
          throw new Error(LOCATION_NOT_FOUND);
        case 14:
          requestHeaders = {
            'x-asbd-id': '198387',
            'x-ig-app-id': '936619743392459'
          };
          _context2.next = 17;
          return HTTP_CLIENT.request({
            uri: "/api/v1/media/configure_sidecar/",
            method: 'POST',
            json: payload,
            headers: requestHeaders
          });
        case 17:
          uploadResponse = _context2.sent;
          return _context2.abrupt("return", uploadResponse);
        case 19:
        case "end":
          return _context2.stop();
      }
    }, _callee2, null, [[3, 11]]);
  }));
  return _saveSlideshow2.apply(this, arguments);
}
function _validateImages(images) {
  if (images.length < MIN_SLIDESHOW_IMAGES) {
    throw new Error(MIN_2_IMAGES_ERR);
  }
  if (images.length > MAX_SLIDESHOW_IMAGES) {
    throw new Error(MAX_10_IMAGES_ERR);
  }
  images.map(function (img) {
    return validateImageExists(img);
  });
  var _images = images.map(sizeOf$2);
  _images.map(function (img) {
    return validateImageJPG(img);
  });
  _images.map(validateImageAspectRatio);
}

var _require = /*#__PURE__*/require('tough-cookie'),
  Cookie = _require.Cookie;
function login(_x) {
  return _login.apply(this, arguments);
}
function _login() {
  _login = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
    var email, password, verbose, value, createEncPassword, res, cookies, loginRes, cookiesJSON;
    return _regeneratorRuntime().wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          email = _ref.email, password = _ref.password, verbose = _ref.verbose; // Get CSRFToken from cookie before login
          _context.next = 3;
          return HTTP_CLIENT.request('/', {
            resolveWithFullResponse: true
          }).then(function (res) {
            var pattern = new RegExp(/(csrf_token\\":\\")[\w]+/);
            var matches = res.body.match(pattern);
            value = matches[0].substring(15);
          });
        case 3:
          // Provide CSRFToken for login or challenge request
          HTTP_CLIENT.request = HTTP_CLIENT.request.defaults({
            headers: {
              'X-CSRFToken': value
            }
          });
          // Temporary work around for https://github.com/jlobos/instagram-web-api/issues/118
          createEncPassword = function createEncPassword(pwd) {
            return "#PWD_INSTAGRAM_BROWSER:0:" + Date.now() + ":" + pwd;
          }; // Login
          _context.next = 7;
          return HTTP_CLIENT.request.post('/accounts/login/ajax/', {
            resolveWithFullResponse: true,
            form: {
              username: email,
              enc_password: createEncPassword(password)
            }
          });
        case 7:
          res = _context.sent;
          if (res.headers['set-cookie']) {
            _context.next = 10;
            break;
          }
          throw new Error(LOGIN_ERR_COOKIES);
        case 10:
          cookies = res.headers['set-cookie'];
          loginRes = res.body;
          if (loginRes.authenticated) {
            _context.next = 14;
            break;
          }
          throw new Error(LOGIN_ERR);
        case 14:
          if (verbose) console.info("[InstagramPublisher] - Authenticated: " + res.body.authenticated);
          // save to cookies.json
          cookies.push('ig_cb=1');
          cookiesJSON = cookies.map(Cookie.parse).map(function (c) {
            return c.toJSON();
          });
          writeFileSync(COOKIES_FILE_PATH, JSON.stringify(cookiesJSON));
          return _context.abrupt("return", loginRes.authenticated);
        case 19:
        case "end":
          return _context.stop();
      }
    }, _callee);
  }));
  return _login.apply(this, arguments);
}

function uploadVideo(_x) {
  return _uploadVideo.apply(this, arguments);
}
function _uploadVideo() {
  _uploadVideo = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
    var video_path, video_height, video_width, video_duration, _ref$is_reel, is_reel, upload_id, request_1_headers, video_file, request_3_headers, response;
    return _regeneratorRuntime().wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          video_path = _ref.video_path, video_height = _ref.video_height, video_width = _ref.video_width, video_duration = _ref.video_duration, _ref$is_reel = _ref.is_reel, is_reel = _ref$is_reel === void 0 ? false : _ref$is_reel;
          upload_id = Date.now();
          request_1_headers = {
            'access-control-request-method': 'GET',
            'access-control-request-headers': 'x-asbd-id,x-ig-app-id',
            origin: BASE_URL
          };
          _context.next = 5;
          return HTTP_CLIENT.request({
            uri: is_reel ? "/rupload_igvideo/feed_" + upload_id : "/rupload_igvideo/fb_uploader_" + upload_id,
            method: 'OPTIONS',
            headers: request_1_headers
          });
        case 5:
          video_file = readFileSync(video_path);
          request_3_headers = is_reel ? {
            'x-instagram-rupload-params': JSON.stringify({
              'client-passthrough': '1',
              is_igtv_video: false,
              is_sidecar: '0',
              is_unified_video: false,
              media_type: 2,
              for_album: false,
              upload_id: upload_id,
              upload_media_duration_ms: Number(Number(video_duration).toFixed(3)) * 1000,
              upload_media_height: video_height,
              upload_media_width: video_width,
              video_transform: null,
              video_format: 'video/mp4',
              is_clips_video: true,
              uses_original_audio: true,
              audio_type: 'original_sounds'
            }),
            'x-entity-name': "feed_" + upload_id,
            offset: 0,
            origin: BASE_URL,
            'x-entity-length': video_file.byteLength,
            'Content-Length': video_file.byteLength
          } : {
            'x-instagram-rupload-params': JSON.stringify({
              'client-passthrough': '1',
              is_igtv_video: true,
              is_sidecar: '0',
              is_unified_video: '1',
              media_type: 2,
              for_album: false,
              video_format: '',
              upload_id: upload_id,
              upload_media_duration_ms: Number(Number(video_duration).toFixed(3)) * 1000,
              upload_media_height: video_height,
              upload_media_width: video_width,
              video_transform: null
            }),
            'x-entity-name': "fb_uploader_" + upload_id,
            offset: 0,
            origin: BASE_URL,
            'x-entity-length': video_file.byteLength,
            'Content-Length': video_file.byteLength
          }; // upload video file
          _context.t0 = JSON;
          _context.next = 10;
          return HTTP_CLIENT.request({
            uri: is_reel ? "/rupload_igvideo/feed_" + upload_id : "/rupload_igvideo/fb_uploader_" + upload_id,
            headers: request_3_headers,
            method: 'POST',
            json: false,
            body: video_file
          });
        case 10:
          _context.t1 = _context.sent;
          response = _context.t0.parse.call(_context.t0, _context.t1);
          return _context.abrupt("return", _extends({}, response, {
            upload_id: upload_id.toString()
          }));
        case 13:
        case "end":
          return _context.stop();
      }
    }, _callee);
  }));
  return _uploadVideo.apply(this, arguments);
}

var request$2 = /*#__PURE__*/require('request-promise-native');
function uploadVideoThumbnail(_x) {
  return _uploadVideoThumbnail.apply(this, arguments);
}
function _uploadVideoThumbnail() {
  _uploadVideoThumbnail = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
    var image_path, video_upload_id, video_height, video_width, _ref$is_reel, is_reel, request_4_headers, image_file, options;
    return _regeneratorRuntime().wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          image_path = _ref.image_path, video_upload_id = _ref.video_upload_id, video_height = _ref.video_height, video_width = _ref.video_width, _ref$is_reel = _ref.is_reel, is_reel = _ref$is_reel === void 0 ? false : _ref$is_reel;
          request_4_headers = {
            'access-control-request-method': 'POST',
            'access-control-request-headers': 'content-type,offset,x-asbd-id,x-entity-length,x-entity-name,x-entity-type,x-ig-app-id,x-instagram-ajax,x-instagram-rupload-params',
            origin: BASE_URL
          };
          _context.next = 4;
          return HTTP_CLIENT.request({
            uri: is_reel ? "/rupload_igphoto/feed_" + video_upload_id : "/rupload_igphoto/fb_uploader_" + video_upload_id,
            method: 'OPTIONS',
            headers: request_4_headers
          });
        case 4:
          image_file = readFileSync(image_path);
          options = {
            method: 'POST',
            url: is_reel ? BASE_URL + "/rupload_igphoto/feed_" + video_upload_id : BASE_URL + "/rupload_igphoto/fb_uploader_" + video_upload_id,
            headers: {
              'User-Agent': HTTP_CLIENT.useragent,
              Cookie: HTTP_CLIENT.cookies,
              origin: BASE_URL,
              'Content-Type': 'image/jpeg',
              'Content-Length': image_file.byteLength,
              'x-instagram-rupload-params': "{\"media_type\":2,\"upload_id\":\"" + video_upload_id + "\",\"upload_media_height\":" + video_height + ",\"upload_media_width\":" + video_width + "}",
              'x-entity-length': image_file.byteLength,
              'x-entity-type': 'image/jpeg',
              'x-entity-name': is_reel ? "feed_" + video_upload_id : "fb_uploader_" + video_upload_id,
              offset: 0
            },
            body: image_file
          };
          _context.t0 = JSON;
          _context.next = 9;
          return request$2(options);
        case 9:
          _context.t1 = _context.sent;
          return _context.abrupt("return", _context.t0.parse.call(_context.t0, _context.t1));
        case 11:
        case "end":
          return _context.stop();
      }
    }, _callee);
  }));
  return _uploadVideoThumbnail.apply(this, arguments);
}

var ffprobe = /*#__PURE__*/require('ffprobe');
var ffprobeStatic = /*#__PURE__*/require('ffprobe-static');
var request$3 = /*#__PURE__*/require('request-promise-native');
var sizeOf$3 = /*#__PURE__*/require('image-size');
function createSingleVideoHandler(_x) {
  return _createSingleVideoHandler.apply(this, arguments);
}
function _createSingleVideoHandler() {
  _createSingleVideoHandler = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
    var video_path, thumbnail_path, caption, is_reel, location, verbose, video_info, _video_info$streams$f, duration, width, height, display_aspect_ratio, is_display_aspect_ratio_missing, video_uploaded, retry_count, processed, uploaded_res;
    return _regeneratorRuntime().wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          video_path = _ref.video_path, thumbnail_path = _ref.thumbnail_path, caption = _ref.caption, is_reel = _ref.is_reel, location = _ref.location, verbose = _ref.verbose;
          validateCaption(caption);
          validateImageExists(thumbnail_path, true);
          validateImageJPG(sizeOf$3(thumbnail_path), true);
          validateVideoExists(video_path);
          validateVideoMp4(video_path);
          // Retrieve video data
          _context.next = 8;
          return ffprobe(video_path, {
            path: ffprobeStatic.path
          });
        case 8:
          video_info = _context.sent;
          _video_info$streams$f = video_info['streams'].filter(function (i) {
            return i.codec_type === 'video';
          })[0], duration = _video_info$streams$f.duration, width = _video_info$streams$f.width, height = _video_info$streams$f.height, display_aspect_ratio = _video_info$streams$f.display_aspect_ratio; // Display Aspect Ratio is frequently listed as N/A in ffprobe, which manifests
          // as undefined here.
          is_display_aspect_ratio_missing = display_aspect_ratio == null;
          if (!(!is_display_aspect_ratio_missing && !VALID_VIDEO_ASPECT_RATIOS.find(function (a) {
            return a === display_aspect_ratio;
          }))) {
            _context.next = 13;
            break;
          }
          throw new Error(INVALID_VIDEO_ASPECT_RATIO);
        case 13:
          _context.prev = 13;
          _context.next = 16;
          return uploadVideo({
            video_duration: duration,
            video_height: height,
            video_width: width,
            video_path: video_path,
            is_reel: is_reel
          });
        case 16:
          video_uploaded = _context.sent;
          _context.next = 19;
          return uploadVideoThumbnail({
            video_height: height,
            video_width: width,
            image_path: thumbnail_path,
            video_upload_id: video_uploaded.upload_id,
            is_reel: is_reel
          });
        case 19:
          if (verbose) console.info("[InstagramPublisher] - Processing video..");
          _context.next = 22;
          return sleep(15000);
        case 22:
          retry_count = 0;
          processed = false;
          uploaded_res = {
            status: 'failed',
            media: {
              code: '',
              upload_id: '',
              status: '',
              pk: ''
            }
          }; // Retry every 15 seconds until video is processed
        case 25:
          if (!(retry_count < 5 && processed === false)) {
            _context.next = 42;
            break;
          }
          if (!is_reel) {
            _context.next = 32;
            break;
          }
          _context.next = 29;
          return _publishReel({
            caption: caption,
            upload_id: video_uploaded.upload_id,
            location: location
          });
        case 29:
          _context.t0 = _context.sent;
          _context.next = 35;
          break;
        case 32:
          _context.next = 34;
          return _publishVideo({
            caption: caption,
            upload_id: video_uploaded.upload_id,
            location: location
          });
        case 34:
          _context.t0 = _context.sent;
        case 35:
          uploaded_res = _context.t0;
          processed = uploaded_res.status === 'ok';
          retry_count++;
          _context.next = 40;
          return sleep(15000);
        case 40:
          _context.next = 25;
          break;
        case 42:
          if (verbose) {
            console.info(is_reel ? "[InstagramPublisher] - Reel created: " + processed : "[InstagramPublisher] - Video post created: " + processed);
          }
          return _context.abrupt("return", {
            succeeded: processed,
            code: uploaded_res.media.code
          });
        case 46:
          _context.prev = 46;
          _context.t1 = _context["catch"](13);
          throw new Error("[InstagramPublisher] - Failed to create video - " + _context.t1);
        case 49:
        case "end":
          return _context.stop();
      }
    }, _callee, null, [[13, 46]]);
  }));
  return _createSingleVideoHandler.apply(this, arguments);
}
function _publishVideo(_x2) {
  return _publishVideo2.apply(this, arguments);
}
function _publishVideo2() {
  _publishVideo2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2) {
    var caption, upload_id, location, formData, locationData, options;
    return _regeneratorRuntime().wrap(function _callee2$(_context2) {
      while (1) switch (_context2.prev = _context2.next) {
        case 0:
          caption = _ref2.caption, upload_id = _ref2.upload_id, location = _ref2.location;
          formData = {
            source_type: 'library',
            caption: caption,
            upload_id: upload_id,
            disable_comments: '0',
            like_and_view_counts_disabled: '0',
            igtv_share_preview_to_feed: '1',
            is_unified_video: '1',
            video_subtitles_enabled: '0'
          };
          if (!location) {
            _context2.next = 14;
            break;
          }
          _context2.prev = 3;
          _context2.next = 6;
          return getLocation(location);
        case 6:
          locationData = _context2.sent;
          formData.location = JSON.stringify({
            lat: locationData.venues[0].lat,
            lng: locationData.venues[0].lng,
            facebook_places_id: locationData.venues[0].external_id
          });
          formData.geotag_enabled = true;
          _context2.next = 14;
          break;
        case 11:
          _context2.prev = 11;
          _context2.t0 = _context2["catch"](3);
          throw new Error(LOCATION_NOT_FOUND);
        case 14:
          options = {
            method: 'POST',
            url: 'https://www.instagram.com/igtv/configure_to_igtv/',
            headers: {
              'User-Agent': HTTP_CLIENT.useragent,
              Cookie: HTTP_CLIENT.cookies,
              'X-CSRFToken': HTTP_CLIENT.csrftoken,
              origin: BASE_URL,
              'Content-Type': 'application/x-www-form-urlencoded',
              Referer: BASE_URL,
              'x-requested-with': 'XMLHttpRequest'
            },
            form: _extends({}, formData)
          };
          _context2.t1 = JSON;
          _context2.next = 18;
          return request$3(options);
        case 18:
          _context2.t2 = _context2.sent;
          return _context2.abrupt("return", _context2.t1.parse.call(_context2.t1, _context2.t2));
        case 20:
        case "end":
          return _context2.stop();
      }
    }, _callee2, null, [[3, 11]]);
  }));
  return _publishVideo2.apply(this, arguments);
}
function _publishReel(_x3) {
  return _publishReel2.apply(this, arguments);
}
function _publishReel2() {
  _publishReel2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref3) {
    var caption, upload_id, location, options_1, formData, locationData, options;
    return _regeneratorRuntime().wrap(function _callee3$(_context3) {
      while (1) switch (_context3.prev = _context3.next) {
        case 0:
          caption = _ref3.caption, upload_id = _ref3.upload_id, location = _ref3.location;
          options_1 = {
            method: 'OPTIONS',
            url: 'https://i.instagram.com/api/v1/media/configure_to_clips/',
            headers: {
              authority: 'i.instagram.com',
              accept: '*/*',
              'accept-language': 'en-US,en-GB;q=0.9,en;q=0.8',
              'access-control-request-headers': 'x-asbd-id,x-csrftoken,x-ig-app-id,x-ig-www-claim,x-instagram-ajax',
              'access-control-request-method': 'POST',
              origin: 'https://www.instagram.com',
              referer: 'https://www.instagram.com/',
              'sec-fetch-dest': 'document',
              'sec-fetch-mode': 'cors',
              'sec-fetch-site': 'same-site',
              'User-Agent': HTTP_CLIENT.useragent,
              'x-frame-options': 'SAMEORIGIN'
            }
          };
          _context3.next = 4;
          return request$3(options_1);
        case 4:
          formData = {
            upload_id: upload_id,
            caption: caption,
            retry_timeout: 12,
            clips_uses_original_audio: 1,
            uses_original_audio: 1,
            original_audio: 1,
            audio: 1,
            clips_audio: 1,
            clips_with_audio: 1,
            with_audio: 1,
            enable_audio: 1,
            clips_enable_audio: 1,
            clips_audio_enable: 1,
            audio_enable: 1,
            audio_type: 'original_sounds'
          };
          if (!location) {
            _context3.next = 17;
            break;
          }
          _context3.prev = 6;
          _context3.next = 9;
          return getLocation(location);
        case 9:
          locationData = _context3.sent;
          formData.location = JSON.stringify({
            lat: locationData.venues[0].lat,
            lng: locationData.venues[0].lng,
            facebook_places_id: locationData.venues[0].external_id
          });
          formData.geotag_enabled = true;
          _context3.next = 17;
          break;
        case 14:
          _context3.prev = 14;
          _context3.t0 = _context3["catch"](6);
          throw new Error(LOCATION_NOT_FOUND);
        case 17:
          options = {
            method: 'POST',
            url: 'https://i.instagram.com/api/v1/media/configure_to_clips/',
            headers: {
              'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 Instagram 231.0.0.18.113',
              Cookie: HTTP_CLIENT.cookies,
              'X-CSRFToken': HTTP_CLIENT.csrftoken,
              origin: BASE_URL,
              'Content-Type': 'application/x-www-form-urlencoded',
              Referer: BASE_URL,
              'x-ig-app-id': '1217981644879628',
              'x-asbd-id': '198387',
              'x-frame-options': 'SAMEORIGIN'
            },
            form: _extends({}, formData)
          };
          _context3.t1 = JSON;
          _context3.next = 21;
          return request$3(options);
        case 21:
          _context3.t2 = _context3.sent;
          return _context3.abrupt("return", _context3.t1.parse.call(_context3.t1, _context3.t2));
        case 23:
        case "end":
          return _context3.stop();
      }
    }, _callee3, null, [[6, 14]]);
  }));
  return _publishReel2.apply(this, arguments);
}

var sizeOf$4 = /*#__PURE__*/require('image-size');
var request$4 = /*#__PURE__*/require('request-promise-native');
function createSingleImageHandler(_x) {
  return _createSingleImageHandler.apply(this, arguments);
}
function _createSingleImageHandler() {
  _createSingleImageHandler = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
    var image_path, caption, verbose, location, image, request_1_headers, request_2_headers, upload_img_res, formData, locationData, final_res;
    return _regeneratorRuntime().wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          image_path = _ref.image_path, caption = _ref.caption, verbose = _ref.verbose, location = _ref.location;
          validateCaption(caption);
          validateImageExists(image_path);
          image = sizeOf$4(image_path);
          validateImageJPG(image);
          request_1_headers = {
            'access-control-request-method': 'POST',
            'access-control-request-headers': 'x-asbd-id,x-csrftoken,x-ig-app-id,x-ig-www-claim,x-instagram-ajax'
          };
          _context.next = 8;
          return HTTP_CLIENT.request({
            uri: "/api/v1/media/configure",
            method: 'OPTIONS',
            headers: request_1_headers
          });
        case 8:
          request_2_headers = {
            'x-asbd-id': '198387',
            'x-ig-app-id': '936619743392459',
            'Content-Type': 'application/x-www-form-urlencoded',
            'User-Agent': HTTP_CLIENT.useragent,
            Cookie: HTTP_CLIENT.cookies,
            'X-CSRFToken': HTTP_CLIENT.csrftoken,
            origin: BASE_URL,
            Referer: BASE_URL
          };
          _context.next = 11;
          return uploadPhoto(image_path);
        case 11:
          upload_img_res = _context.sent;
          formData = {
            source_type: 'library',
            caption: caption,
            upload_id: upload_img_res.upload_id,
            disable_comments: '0',
            like_and_view_counts_disabled: '0',
            igtv_share_preview_to_feed: '1',
            is_unified_video: '1',
            video_subtitles_enabled: '0'
          };
          if (!location) {
            _context.next = 25;
            break;
          }
          _context.prev = 14;
          _context.next = 17;
          return getLocation(location);
        case 17:
          locationData = _context.sent;
          formData.location = JSON.stringify({
            lat: locationData.venues[0].lat,
            lng: locationData.venues[0].lng,
            facebook_places_id: locationData.venues[0].external_id
          });
          formData.geotag_enabled = true;
          _context.next = 25;
          break;
        case 22:
          _context.prev = 22;
          _context.t0 = _context["catch"](14);
          throw new Error(LOCATION_NOT_FOUND);
        case 25:
          _context.t1 = JSON;
          _context.next = 28;
          return request$4({
            url: BASE_URL + "/api/v1/media/configure/",
            method: 'POST',
            headers: request_2_headers,
            form: _extends({}, formData)
          });
        case 28:
          _context.t2 = _context.sent;
          final_res = _context.t1.parse.call(_context.t1, _context.t2);
          if (verbose) console.info("[InstagramPublisher] - Image Post Created: " + final_res.status);
          return _context.abrupt("return", {
            succeeded: final_res.status === 'ok',
            code: final_res.media.code
          });
        case 32:
        case "end":
          return _context.stop();
      }
    }, _callee, null, [[14, 22]]);
  }));
  return _createSingleImageHandler.apply(this, arguments);
}

var request$5 = /*#__PURE__*/require('request-promise-native');
function createStory(_x) {
  return _createStory.apply(this, arguments);
}
function _createStory() {
  _createStory = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
    var upload_id, options;
    return _regeneratorRuntime().wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          upload_id = _ref.upload_id;
          options = {
            method: 'POST',
            url: 'https://www.instagram.com/api/v1/web/create/configure_to_story/',
            headers: {
              'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 Instagram 231.0.0.18.113',
              Cookie: HTTP_CLIENT.cookies,
              'X-CSRFToken': HTTP_CLIENT.csrftoken,
              origin: BASE_URL,
              'Content-Type': 'application/x-www-form-urlencoded',
              Referer: BASE_URL,
              'x-ig-app-id': '1217981644879628',
              'x-asbd-id': '198387',
              'x-frame-options': 'SAMEORIGIN'
            },
            form: {
              upload_id: upload_id
            }
          };
          _context.t0 = JSON;
          _context.next = 5;
          return request$5(options);
        case 5:
          _context.t1 = _context.sent;
          return _context.abrupt("return", _context.t0.parse.call(_context.t0, _context.t1));
        case 7:
        case "end":
          return _context.stop();
      }
    }, _callee);
  }));
  return _createStory.apply(this, arguments);
}

var sizeOf$5 = /*#__PURE__*/require('image-size');
function createImageStoryHandler(_x) {
  return _createImageStoryHandler.apply(this, arguments);
}
function _createImageStoryHandler() {
  _createImageStoryHandler = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
    var image_path, verbose, image, request_1_headers, upload_img_res, final_res;
    return _regeneratorRuntime().wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          image_path = _ref.image_path, verbose = _ref.verbose;
          validateImageExists(image_path);
          image = sizeOf$5(image_path);
          validateImageJPG(image);
          request_1_headers = {
            'access-control-request-method': 'POST',
            'access-control-request-headers': 'x-asbd-id,x-csrftoken,x-ig-app-id,x-ig-www-claim,x-instagram-ajax'
          };
          _context.next = 7;
          return HTTP_CLIENT.request({
            uri: "/api/v1/media/configure",
            method: 'OPTIONS',
            headers: request_1_headers
          });
        case 7:
          _context.next = 9;
          return uploadPhoto(image_path);
        case 9:
          upload_img_res = _context.sent;
          _context.next = 12;
          return createStory({
            upload_id: upload_img_res.upload_id
          });
        case 12:
          final_res = _context.sent;
          if (verbose) console.info("[InstagramPublisher] - Image Story Created: " + final_res.status);
          return _context.abrupt("return", {
            succeeded: final_res.status === 'ok',
            code: final_res.media.pk
          });
        case 15:
        case "end":
          return _context.stop();
      }
    }, _callee);
  }));
  return _createImageStoryHandler.apply(this, arguments);
}

var InstagramPublisher = /*#__PURE__*/function () {
  function InstagramPublisher(_ref) {
    var email = _ref.email,
      password = _ref.password,
      _ref$verbose = _ref.verbose,
      verbose = _ref$verbose === void 0 ? false : _ref$verbose;
    /** @internal */
    this._email = '';
    /** @internal */
    this._password = '';
    /** @internal */
    this._verbose = false;
    this._email = email;
    this._password = password;
    this._verbose = verbose;
    HTTP_CLIENT.setHeaders();
    if (validateCookies() && this._verbose) {
      console.info("[InstagramPublisher] - Authenticated: true (cached)");
    }
  }
  var _proto = InstagramPublisher.prototype;
  _proto.createSingleImage = /*#__PURE__*/function () {
    var _createSingleImage = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref2) {
      var image_path, _ref2$caption, caption, location;
      return _regeneratorRuntime().wrap(function _callee$(_context) {
        while (1) switch (_context.prev = _context.next) {
          case 0:
            image_path = _ref2.image_path, _ref2$caption = _ref2.caption, caption = _ref2$caption === void 0 ? '' : _ref2$caption, location = _ref2.location;
            if (validateCookies()) {
              _context.next = 5;
              break;
            }
            _context.next = 4;
            return login({
              email: this._email,
              password: this._password,
              verbose: this._verbose
            });
          case 4:
            HTTP_CLIENT.setHeaders();
          case 5:
            _context.next = 7;
            return createSingleImageHandler({
              image_path: image_path,
              caption: caption,
              location: location,
              verbose: this._verbose
            });
          case 7:
            return _context.abrupt("return", _context.sent);
          case 8:
          case "end":
            return _context.stop();
        }
      }, _callee, this);
    }));
    function createSingleImage(_x) {
      return _createSingleImage.apply(this, arguments);
    }
    return createSingleImage;
  }();
  _proto.createImageSlideshow = /*#__PURE__*/function () {
    var _createImageSlideshow = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref3) {
      var _ref3$images, images, _ref3$caption, caption, location;
      return _regeneratorRuntime().wrap(function _callee2$(_context2) {
        while (1) switch (_context2.prev = _context2.next) {
          case 0:
            _ref3$images = _ref3.images, images = _ref3$images === void 0 ? [] : _ref3$images, _ref3$caption = _ref3.caption, caption = _ref3$caption === void 0 ? '' : _ref3$caption, location = _ref3.location;
            if (validateCookies()) {
              _context2.next = 5;
              break;
            }
            _context2.next = 4;
            return login({
              email: this._email,
              password: this._password,
              verbose: this._verbose
            });
          case 4:
            HTTP_CLIENT.setHeaders();
          case 5:
            _context2.next = 7;
            return createImageSlideshowHandler({
              images: images,
              caption: caption,
              location: location,
              verbose: this._verbose
            });
          case 7:
            return _context2.abrupt("return", _context2.sent);
          case 8:
          case "end":
            return _context2.stop();
        }
      }, _callee2, this);
    }));
    function createImageSlideshow(_x2) {
      return _createImageSlideshow.apply(this, arguments);
    }
    return createImageSlideshow;
  }();
  _proto.createSingleVideo = /*#__PURE__*/function () {
    var _createSingleVideo = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref4) {
      var video_path, thumbnail_path, caption, location;
      return _regeneratorRuntime().wrap(function _callee3$(_context3) {
        while (1) switch (_context3.prev = _context3.next) {
          case 0:
            video_path = _ref4.video_path, thumbnail_path = _ref4.thumbnail_path, caption = _ref4.caption, location = _ref4.location;
            if (validateCookies()) {
              _context3.next = 5;
              break;
            }
            _context3.next = 4;
            return login({
              email: this._email,
              password: this._password,
              verbose: this._verbose
            });
          case 4:
            HTTP_CLIENT.setHeaders();
          case 5:
            _context3.next = 7;
            return createSingleVideoHandler({
              video_path: video_path,
              thumbnail_path: thumbnail_path,
              caption: caption,
              is_reel: false,
              location: location,
              verbose: this._verbose
            });
          case 7:
            return _context3.abrupt("return", _context3.sent);
          case 8:
          case "end":
            return _context3.stop();
        }
      }, _callee3, this);
    }));
    function createSingleVideo(_x3) {
      return _createSingleVideo.apply(this, arguments);
    }
    return createSingleVideo;
  }();
  _proto.createReel = /*#__PURE__*/function () {
    var _createReel = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(_ref5) {
      var video_path, thumbnail_path, caption, location;
      return _regeneratorRuntime().wrap(function _callee4$(_context4) {
        while (1) switch (_context4.prev = _context4.next) {
          case 0:
            video_path = _ref5.video_path, thumbnail_path = _ref5.thumbnail_path, caption = _ref5.caption, location = _ref5.location;
            if (validateCookies()) {
              _context4.next = 5;
              break;
            }
            _context4.next = 4;
            return login({
              email: this._email,
              password: this._password,
              verbose: this._verbose
            });
          case 4:
            HTTP_CLIENT.setHeaders();
          case 5:
            _context4.next = 7;
            return createSingleVideoHandler({
              video_path: video_path,
              thumbnail_path: thumbnail_path,
              caption: caption,
              is_reel: true,
              location: location,
              verbose: this._verbose
            });
          case 7:
            return _context4.abrupt("return", _context4.sent);
          case 8:
          case "end":
            return _context4.stop();
        }
      }, _callee4, this);
    }));
    function createReel(_x4) {
      return _createReel.apply(this, arguments);
    }
    return createReel;
  }();
  _proto.createImageStory = /*#__PURE__*/function () {
    var _createImageStory = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(_ref6) {
      var image_path;
      return _regeneratorRuntime().wrap(function _callee5$(_context5) {
        while (1) switch (_context5.prev = _context5.next) {
          case 0:
            image_path = _ref6.image_path;
            if (validateCookies()) {
              _context5.next = 5;
              break;
            }
            _context5.next = 4;
            return login({
              email: this._email,
              password: this._password,
              verbose: this._verbose
            });
          case 4:
            HTTP_CLIENT.setHeaders();
          case 5:
            _context5.next = 7;
            return createImageStoryHandler({
              image_path: image_path,
              verbose: this._verbose
            });
          case 7:
            return _context5.abrupt("return", _context5.sent);
          case 8:
          case "end":
            return _context5.stop();
        }
      }, _callee5, this);
    }));
    function createImageStory(_x5) {
      return _createImageStory.apply(this, arguments);
    }
    return createImageStory;
  }();
  return InstagramPublisher;
}();
module.exports = InstagramPublisher;

export default InstagramPublisher;
//# sourceMappingURL=instagram-publisher.esm.js.map