File size: 3,950 Bytes
cee43ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
window.MANGA_API = (function () {
  var RATE_MSG = 'MangaDex đang giới hạn yêu cầu. Vui lòng thử lại sau';

  var RATING_SAFE = '&contentRating[]=safe&contentRating[]=suggestive';
  var RATING_ALL = RATING_SAFE + '&contentRating[]=erotica&contentRating[]=pornographic';
  var FEED_LIMIT = 100;

  function api(url) {
    function request() {
      return fetch(window.MD_WORKER + url).then(function (r) {
        if (r.status === 404) throw { notFound: true };
        if (r.status === 429) throw { rateLimited: true };
        if (r.status >= 500) throw { serverError: true };
        if (!r.ok) return r.text().then(function (t) { throw new Error('HTTP ' + r.status + (t ? ': ' + t : '')); });
        return r.json();
      });
    }
    return request().catch(function (e) {
      if (!(e && e.rateLimited)) throw e;
      return new Promise(function (resolve) { setTimeout(resolve, 2000); }).then(request);
    });
  }

  function contentRatingParam(nsfw) { return nsfw ? RATING_ALL : RATING_SAFE; }

  function feedUrl(mangaId, lang, nsfw, offset) {
    return '/manga/' + mangaId + '/feed?limit=' + FEED_LIMIT + '&offset=' + offset + '&order[chapter]=asc&includes[]=scanlation_group'
      + (lang && lang !== 'all' ? '&translatedLanguage[]=' + lang : '')
      + contentRatingParam(nsfw);
  }

  function fetchLang(mangaId, lang, nsfw) {
    var all = [];
    var offset = 0;
    function page() {
      return api(feedUrl(mangaId, lang, nsfw, offset)).then(function (j) {
        all = all.concat(j.data || []);
        offset += FEED_LIMIT;
        if (j.data && j.data.length === FEED_LIMIT) return page();
        return all;
      });
    }
    return page();
  }

  function chooseChapters(mangaId, nsfw, want) {
    var w = want || 'vi';
    return fetchLang(mangaId, w, nsfw).then(function (chs) {
      if (chs.length) return { lang: w, chapters: chs };
      if (w === 'vi') {
        return fetchLang(mangaId, 'en', nsfw).then(function (en) {
          if (en.length) return { lang: 'en', chapters: en };
          return fetchLang(mangaId, 'all', nsfw).then(function (all) { return { lang: 'all', chapters: all }; });
        });
      }
      if (w === 'en') {
        return fetchLang(mangaId, 'all', nsfw).then(function (all) { return { lang: 'all', chapters: all }; });
      }
      return { lang: w, chapters: chs };
    });
  }

  function chapterPages(chapterId) {
    return api('/at-home/server/' + chapterId).then(function (j) {
      return {
        base: j.baseUrl,
        hash: j.chapter && j.chapter.hash,
        files: (j.chapter && j.chapter.data) || [],
        saver: (j.chapter && j.chapter.dataSaver) || []
      };
    });
  }

  function pageSrc(base, hash, file, saver) {
    var direct = base + (saver ? '/data-saver/' : '/data/') + hash + '/' + file;
    if (window.MD_WORKER) {
      var workerBase = String(window.MD_WORKER).replace(/\/+$/, '');
      return workerBase + '/img?u=' + encodeURIComponent(direct);
    }
    return direct;
  }

  function langName(l) { return l === 'vi' ? 'Vietsub' : l === 'en' ? 'English' : 'All'; }

  function errorMessage(e) {
    if (e && e.notFound) return 'Content not found.';
    if (e && e.rateLimited) return RATE_MSG;
    if (e && e.serverError) return 'MangaDex đang gặp lỗi tạm thời. Vui lòng thử lại sau.';
    return null;
  }

  function qs(n) { var m = new RegExp('[?&]' + n + '=([^&]*)').exec(location.search); return m ? decodeURIComponent(m[1]) : null; }

  function chapterLabel(ch) {
    var a = ch.attributes || {};
    var s = a.chapter ? 'Chương ' + a.chapter : 'Chương khác';
    if (a.title) s += ': ' + a.title;
    return s;
  }

  return {
    RATE_MSG: RATE_MSG,
    api: api,
    fetchLang: fetchLang,
    chooseChapters: chooseChapters,
    chapterPages: chapterPages,
    pageSrc: pageSrc,
    langName: langName,
    errorMessage: errorMessage,
    qs: qs,
    chapterLabel: chapterLabel
  };
})();