Skip to content

Instantly share code, notes, and snippets.

@scarletcafe
Created December 26, 2024 01:34
Show Gist options
  • Save scarletcafe/bf73e2e2ba58651d39f2e2a8a3a9f250 to your computer and use it in GitHub Desktop.
Save scarletcafe/bf73e2e2ba58651d39f2e2a8a3a9f250 to your computer and use it in GitHub Desktop.
Discord sounds (as of canary build 355878)

There are limited time event sound packs that Discord makes available (and default) during various seasons.

After the time period has finished, the sound packs are no longer selectable and for all intents and purposes unobtainable to end users.

I think this is a shame so I have exerted some small effort to figure out how these packs are looked up so I can archive their contents. Fortunately, at least for the time being, it appears Discord keeps the old sound data on their servers. But it might not always be the case.

Within the client bundle (viewable within the client or archived consistently at Discord-Datamining) there are a number of lookup tables.

Because of the nature of webpack (and due to the size of the file) I can't link you to where they are specifically since they're subject to change, but I can show you what they look like so you can find them yourself in the future.

The first is code to do with selection and mapping of the sound packs. This is how Discord knows that when you need deafen using the WINTER_HOLIDAY soundpack that it has to request winter_deafen.mp3:

Pack lookup [1]
        var i, a = r(47120);
        var s = r(653041);
        var o = r(433517),
          l = r(388032);
        ! function(e) {
          e.CLASSIC = "classic", e.RETRO = "retro", e.BUBBLE = "bop", e.DUCKY = "ducky", e.LOFI = "lofi", e.ASMR = "asmr", e.DISCODO = "discodo", e.HALLOWEEN = "halloween", e.WINTER_HOLIDAY = "winter_holiday"
        }(i || (i = {}));
        let u = "custom_notification_sounds_asmr",
          c = "custom_notification_sounds_discodo";

        function d() {
          let e = !(arguments.length > 0) || void 0 === arguments[0] || arguments[0],
            n = f(e);
          return [{
            value: "classic",
            label: l.intl.string(l.t.p3Hg5e),
            description: l.intl.string(l.t["4iA55u"]),
            requirePremium: !1
          }, {
            value: "retro",
            label: l.intl.string(l.t.Rrwrnp),
            description: l.intl.string(l.t["zKG+ur"]),
            requirePremium: !0
          }, {
            value: "lofi",
            label: l.intl.string(l.t.aEsrnp),
            description: l.intl.string(l.t.fMUEj4),
            requirePremium: !0
          }, {
            value: "ducky",
            label: l.intl.string(l.t["4TOv0t"]),
            description: l.intl.string(l.t["1kbe6e"]),
            requirePremium: !0
          }, {
            value: "bop",
            label: l.intl.string(l.t.s5Qo8P),
            description: l.intl.string(l.t.I39onp),
            requirePremium: !0
          }, ...n]
        }

        function f(e) {
          if (!e) return [];
          let n = [];
          return o.K.get(c, !1) && n.push({
            value: "discodo",
            label: "DISCODO",
            description: "๑(◕‿◕)๑",
            requirePremium: !0
          }), o.K.get(u, !1) && n.push({
            value: "asmr",
            label: l.intl.string(l.t["3SJZKC"]),
            description: l.intl.formatToMarkdownString(l.t.MZlgQE, {}),
            requirePremium: !0
          }), n
        }
      },
      716364: function(e, n, r) {
        "use strict";
        r.d(n, {
          c: function() {
            return l
          }
        });
        var i = r(570140),
          a = r(626135),
          s = r(474873),
          o = r(981631);

        function l(e, n) {
          a.default.track(o.rMx.SOUNDPACK_UPDATED, {
            soundpack: e,
            previous_soundpack: s.Z.getSoundpack()
          }), i.Z.dispatch({
            type: "SET_SOUNDPACK",
            soundpack: e,
            forExperimentId: n
          })
        }
      },
      474873: function(e, n, r) {
        "use strict";
        var i, a = r(442837),
          s = r(570140),
          o = r(871465);

        function l(e, n, r) {
          return n in e ? Object.defineProperty(e, n, {
            value: r,
            enumerable: !0,
            configurable: !0,
            writable: !0
          }) : e[n] = r, e
        }
        let u = {
          soundpack: o.YC.CLASSIC,
          lastSoundpackExperimentId: null
        };

        function c(e) {
          let {
            soundpack: n,
            forExperimentId: r
          } = e;
          u = {
            soundpack: n,
            lastSoundpackExperimentId: void 0 !== r ? r : u.lastSoundpackExperimentId
          }
        }
        class d extends(i = a.ZP.PersistedStore) {
          initialize(e) {
            null != e && (u = e, !Object.values(o.YC).includes(u.soundpack) && (u.soundpack = o.YC.CLASSIC))
          }
          getState() {
            return u
          }
          getSoundpack() {
            return u.soundpack
          }
          getLastSoundpackExperimentId() {
            return u.lastSoundpackExperimentId
          }
        }
        l(d, "displayName", "SoundpackStore"), l(d, "persistKey", "SoundpackStore"), n.Z = new d(s.Z, {
          SET_SOUNDPACK: c
        })
      },
      135906: function(e, n, r) {
        "use strict";
        r.d(n, {
          Z: function() {
            return s
          }
        });
        var i = r(871465);
        let a = {
          [i.YC.CLASSIC]: {
            discodo: "discodo",
            message1: "message1",
            deafen: "deafen",
            undeafen: "undeafen",
            mute: "mute",
            unmute: "unmute",
            disconnect: "disconnect",
            ptt_start: "ptt_start",
            ptt_stop: "ptt_stop",
            user_join: "user_join",
            user_leave: "user_leave",
            user_moved: "user_moved",
            call_calling: "call_calling",
            call_ringing: "call_ringing",
            stream_started: "stream_started",
            stream_ended: "stream_ended",
            stream_user_joined: "stream_user_joined",
            stream_user_left: "stream_user_left",
            poggermode_enabled: "poggermode_enabled",
            poggermode_applause: "poggermode_applause",
            poggermode_achievement_unlock: "poggermode_achievement_unlock",
            stage_waiting: "stage_waiting"
          },
          [i.YC.RETRO]: {
            message1: "bit_message1"
          },
          [i.YC.BUBBLE]: {
            message1: "bop_message1"
          },
          [i.YC.DUCKY]: {
            message1: "ducky_message1"
          },
          [i.YC.LOFI]: {
            message1: "lofi_message1"
          },
          [i.YC.ASMR]: {
            message1: "asmr_message1"
          },
          [i.YC.DISCODO]: {
            message1: "discodo"
          },
          [i.YC.HALLOWEEN]: {
            call_calling: "halloween_call_calling",
            call_ringing: "halloween_call_ringing",
            message1: "halloween_message1",
            deafen: "halloween_deafen",
            undeafen: "halloween_undeafen",
            mute: "halloween_mute",
            unmute: "halloween_unmute",
            disconnect: "halloween_disconnect",
            user_join: "halloween_user_join",
            user_leave: "halloween_user_leave"
          },
          [i.YC.WINTER_HOLIDAY]: {
            call_calling: "winter_call_calling",
            call_ringing: "winter_call_ringing",
            deafen: "winter_deafen",
            undeafen: "winter_undeafen",
            mute: "winter_mute",
            unmute: "winter_unmute",
            disconnect: "winter_disconnect",
            user_join: "winter_user_join",
            user_leave: "winter_user_leave"
          }
        };

You can probably locate this quite easily because I imagine Discord won't change the identifiers for their sounds, so looking for undeafen or similar will find it quickly.

This function handles fetching the correct sound pack:

Sound pack fetch [2]
        function _(e) {
          var n;
          let r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 1,
            i = arguments.length > 2 ? arguments[2] : void 0,
            a = arguments.length > 3 ? arguments[3] : void 0;
          if (u.Z.disableSounds) return;
          let s = (0, l.Z)(null != a ? a : o.Z.getSoundpack());
          null == s && c.log("Unable to find sound for pack name: ".concat(a));
          let d = f(null !== (n = s[e]) && void 0 !== n ? n : e, e, r);
          return null != i ? d.playWithListener().then(e => {
            e && i()
          }) : d.play(), d
        }

This class is responsible for concatting .mp3 and looking up the actual sound:

Audio preparation [3]
        class b {
          get volume() {
            return this._volume
          }
          set volume(e) {
            this._volume = e, this._ensureAudio().then(n => n.volume = e)
          }
          loop() {
            this._ensureAudio().then(e => {
              e.loop = !0, e.play()
            })
          }
          play() {
            this._ensureAudio().then(e => {
              e.loop = !1, e.play()
            })
          }
          pause() {
            null != this._audio && this._audio.then(e => e.pause())
          }
          stop() {
            this._destroyAudio()
          }
          playWithListener() {
            return new Promise((e, n) => {
              this._ensureAudio().then(r => {
                (null == r.duration || 0 === r.duration) && n("sound has no duration"), r.play(), setTimeout(() => {
                  e(!0)
                }, r.duration)
              })
            })
          }
          _destroyAudio() {
            null != this._audio && (this._audio.then(e => {
              e.pause(), e.src = ""
            }), this._audio = null)
          }
          _ensureAudio() {
            var e;
            return this._audio = null !== (e = this._audio) && void 0 !== e ? e : new Promise((e, n) => {
              let i = new Audio;
              i.src = r(451343)("./".concat(this.name, ".mp3")), i.onloadeddata = () => {
                i.volume = Math.min(f.Z.getOutputVolume() / 100 * this._volume, 1), _.isPlatformEmbedded && i.setSinkId(m), e(i)
              }, i.onerror = () => n(Error("could not play audio")), i.onended = () => this._destroyAudio(), i.load()
            }), this._audio
          }
          constructor(e, n, r) {
            h(this, "name", void 0), h(this, "_volume", void 0), h(this, "_audio", void 0), this.name = e, this._volume = r
          }
        }

Finally, there is a table that maps the final names into webpack IDs:

Webpack filename lookup [4]
      451343: function(e, n, r) {
        var i = {
          "./activity_end.mp3": "90152",
          "./activity_launch.mp3": "12790",
          "./activity_user_join.mp3": "9907",
          "./activity_user_left.mp3": "852674",
          "./asmr_message1.mp3": "212326",
          "./bit_message1.mp3": "383471",
          "./bop_message1.mp3": "447995",
          "./call_calling.mp3": "646188",
          "./call_ringing.mp3": "563705",
          "./call_ringing_beat.mp3": "271527",
          "./call_ringing_snow_halation.mp3": "988363",
          "./call_ringing_snowsgiving.mp3": "36644",
          "./clip_error.mp3": "45594",
          "./clip_save.mp3": "121420",
          "./ddr-down.mp3": "87962",
          "./ddr-left.mp3": "255237",
          "./ddr-right.mp3": "856163",
          "./ddr-up.mp3": "722237",
          "./deafen.mp3": "585389",
          "./discodo.mp3": "361510",
          "./disconnect.mp3": "554771",
          "./ducky_message1.mp3": "514266",
          "./halloween_call_calling.mp3": "297898",
          "./halloween_call_ringing.mp3": "612363",
          "./halloween_deafen.mp3": "57814",
          "./halloween_defean.mp3": "819098",
          "./halloween_disconnect.mp3": "382472",
          "./halloween_message1.mp3": "772637",
          "./halloween_mute.mp3": "539716",
          "./halloween_undeafen.mp3": "257130",
          "./halloween_undefean.mp3": "107848",
          "./halloween_unmute.mp3": "432915",
          "./halloween_user_join.mp3": "43351",
          "./halloween_user_leave.mp3": "928044",
          "./hang_status_select.mp3": "685673",
          "./highfive_clap.mp3": "696730",
          "./highfive_whistle.mp3": "656602",
          "./human_man.mp3": "129538",
          "./lofi_message1.mp3": "560091",
          "./mention1.mp3": "76795",
          "./mention2.mp3": "512911",
          "./mention3.mp3": "169601",
          "./message1.mp3": "874289",
          "./message2.mp3": "790990",
          "./message3.mp3": "30171",
          "./mute.mp3": "612104",
          "./overlayunlock.mp3": "983425",
          "./poggermode_achievement_unlock.mp3": "670191",
          "./poggermode_applause.mp3": "874878",
          "./poggermode_enabled.mp3": "733804",
          "./poggermode_message_send.mp3": "273303",
          "./ptt_start.mp3": "256104",
          "./ptt_stop.mp3": "320349",
          "./reconnect.mp3": "481734",
          "./robot_man.mp3": "19585",
          "./stage_waiting.mp3": "617510",
          "./stream_ended.mp3": "307334",
          "./stream_started.mp3": "911368",
          "./stream_user_joined.mp3": "195129",
          "./stream_user_left.mp3": "828660",
          "./success.mp3": "499353",
          "./undeafen.mp3": "939891",
          "./unmute.mp3": "360394",
          "./user_join.mp3": "377100",
          "./user_leave.mp3": "351645",
          "./user_moved.mp3": "426354",
          "./vibing_wumpus.mp3": "778184",
          "./winter_call_calling.mp3": "848069",
          "./winter_call_ringing.mp3": "870980",
          "./winter_deafen.mp3": "525773",
          "./winter_disconnect.mp3": "718528",
          "./winter_mute.mp3": "199012",
          "./winter_undeafen.mp3": "411069",
          "./winter_unmute.mp3": "293885",
          "./winter_user_join.mp3": "586680",
          "./winter_user_leave.mp3": "597453"
        };

        function a(e) {
          return r(s(e))
        }

        function s(e) {
          if (!r.o(i, e)) {
            var n = Error("Cannot find module '" + e + "'");
            throw n.code = "MODULE_NOT_FOUND", n
          }
          return i[e]
        }
        a.keys = function() {
          return Object.keys(i)
        }, a.resolve = s, e.exports = a, a.id = "451343"
      },

Note that this 451343 is the from the r(451343) in _ensureAudio above. Since _ensureAudio is not mangled this is probably the quickest way to locate this table through webpack changes.

Function a(e) is called here where e is a string containing the path into the lookup table (e.g. ./ptt_start.mp3). The r(s(e)) calls s from the block, which just pulls the value from the i table (e.g. "256104" in this case), then passes that into r which is the __webpack_require__ function completing the path (see below).

Then towards the middle of the file there is an absolutely gargantuan list of webpack IDs to actual asset paths:

Webpack IDs to asset relative paths [5]
      90152: function(e, n, r) {
        "use strict";
        e.exports = r.p + "37530244cdcd5141095b.mp3"
      },
      12790: function(e, n, r) {
        "use strict";
        e.exports = r.p + "267f72c6f838aac3be94.mp3"
      },
      9907: function(e, n, r) {
        "use strict";
        e.exports = r.p + "74c606872cea9803e310.mp3"
      },
      852674: function(e, n, r) {
        "use strict";
        e.exports = r.p + "99bd2585703114d2df64.mp3"
      },
      212326: function(e, n, r) {
        "use strict";
        e.exports = r.p + "d04d1ee13ab2d7d04e97.mp3"
      },
      383471: function(e, n, r) {
        "use strict";
        e.exports = r.p + "fd9f21c60424f7bbe603.mp3"
      },
      447995: function(e, n, r) {
        "use strict";
        e.exports = r.p + "f9b3c218d2bac00a50a5.mp3"
      },
      646188: function(e, n, r) {
        "use strict";
        e.exports = r.p + "11b68eb8f243b5f6c8d7.mp3"
      },
      563705: function(e, n, r) {
        "use strict";
        e.exports = r.p + "986703daecf955ce3ce3.mp3"
      },
      271527: function(e, n, r) {
        "use strict";
        e.exports = r.p + "3b3a2f5f29b9cb656efb.mp3"
      },
      988363: function(e, n, r) {
        "use strict";
        e.exports = r.p + "99b1d8a6fe0b95e99827.mp3"
      },
      36644: function(e, n, r) {
        "use strict";
        e.exports = r.p + "54527e70cf0ddaeff76f.mp3"
      },
      45594: function(e, n, r) {
        "use strict";
        e.exports = r.p + "4185e05ac87668c95db7.mp3"
      },
      121420: function(e, n, r) {
        "use strict";
        e.exports = r.p + "f96b272b4140be6ce8a9.mp3"
      },
      87962: function(e, n, r) {
        "use strict";
        e.exports = r.p + "60b2fa578027733f07b2.mp3"
      },
      255237: function(e, n, r) {
        "use strict";
        e.exports = r.p + "6a2283291b8468b5dcbc.mp3"
      },
      856163: function(e, n, r) {
        "use strict";
        e.exports = r.p + "ede3b86253bb4aa1615b.mp3"
      },
      722237: function(e, n, r) {
        "use strict";
        e.exports = r.p + "89547833e1e1ebb138a4.mp3"
      },
      585389: function(e, n, r) {
        "use strict";
        e.exports = r.p + "763976e8bc7c745f1bbb.mp3"
      },
      361510: function(e, n, r) {
        "use strict";
        e.exports = r.p + "c9bfe03395cf2616891f.mp3"
      },
      554771: function(e, n, r) {
        "use strict";
        e.exports = r.p + "f8070dce2f844ed5cce8.mp3"
      },
      514266: function(e, n, r) {
        "use strict";
        e.exports = r.p + "7732a4c7760789c64269.mp3"
      },
      297898: function(e, n, r) {
        "use strict";
        e.exports = r.p + "0950a7ea4f1dd037870b.mp3"
      },
      612363: function(e, n, r) {
        "use strict";
        e.exports = r.p + "1b883b366ae11a303b82.mp3"
      },
      57814: function(e, n, r) {
        "use strict";
        e.exports = r.p + "c4aedda3b528df50221c.mp3"
      },
      819098: function(e, n, r) {
        "use strict";
        e.exports = r.p + "c4aedda3b528df50221c.mp3"
      },
      382472: function(e, n, r) {
        "use strict";
        e.exports = r.p + "ca7d2e46cb5a16819aff.mp3"
      },
      772637: function(e, n, r) {
        "use strict";
        e.exports = r.p + "e386c839fb98675c6a79.mp3"
      },
      539716: function(e, n, r) {
        "use strict";
        e.exports = r.p + "ee7fdadf4c714eed6254.mp3"
      },
      257130: function(e, n, r) {
        "use strict";
        e.exports = r.p + "045e5b9608df1607e0cf.mp3"
      },
      107848: function(e, n, r) {
        "use strict";
        e.exports = r.p + "0a3d90cd04942aa5ac0d.mp3"
      },
      432915: function(e, n, r) {
        "use strict";
        e.exports = r.p + "260c581568eacca03f7e.mp3"
      },
      43351: function(e, n, r) {
        "use strict";
        e.exports = r.p + "80cf806f45467a5898cd.mp3"
      },
      928044: function(e, n, r) {
        "use strict";
        e.exports = r.p + "f407ad88a1dc40541769.mp3"
      },
      685673: function(e, n, r) {
        "use strict";
        e.exports = r.p + "6f82a1ced41ffba7e474.mp3"
      },
      696730: function(e, n, r) {
        "use strict";
        e.exports = r.p + "b6765c41e5305ed3ccbf.mp3"
      },
      656602: function(e, n, r) {
        "use strict";
        e.exports = r.p + "ea499ca7cb948b4e89f3.mp3"
      },
      129538: function(e, n, r) {
        "use strict";
        e.exports = r.p + "ba335c8e058cf0edef0c.mp3"
      },
      560091: function(e, n, r) {
        "use strict";
        e.exports = r.p + "8fd01840800c5b8d5d40.mp3"
      },
      76795: function(e, n, r) {
        "use strict";
        e.exports = r.p + "72d6195de7af6f6c522f.mp3"
      },
      512911: function(e, n, r) {
        "use strict";
        e.exports = r.p + "5746c97822ddd998ecaa.mp3"
      },
      169601: function(e, n, r) {
        "use strict";
        e.exports = r.p + "90268f54ea2962dd9a9d.mp3"
      },
      874289: function(e, n, r) {
        "use strict";
        e.exports = r.p + "70ae9d5bc54e4e0954f9.mp3"
      },
      790990: function(e, n, r) {
        "use strict";
        e.exports = r.p + "94d97da9d3ca65ca5c48.mp3"
      },
      30171: function(e, n, r) {
        "use strict";
        e.exports = r.p + "647a0cfe7a004fa8b20d.mp3"
      },
      612104: function(e, n, r) {
        "use strict";
        e.exports = r.p + "ad1365b07daf20cf62d5.mp3"
      },
      983425: function(e, n, r) {
        "use strict";
        e.exports = r.p + "cf5424f20c2a9c65b6bc.mp3"
      },
      670191: function(e, n, r) {
        "use strict";
        e.exports = r.p + "156fff4a60f8bd215dd9.mp3"
      },
      874878: function(e, n, r) {
        "use strict";
        e.exports = r.p + "07ff9c560f9ba1c99cc8.mp3"
      },
      733804: function(e, n, r) {
        "use strict";
        e.exports = r.p + "73eaa6460d4bdb9dcd4d.mp3"
      },
      273303: function(e, n, r) {
        "use strict";
        e.exports = r.p + "7e01b5cb50d9d1941f16.mp3"
      },
      256104: function(e, n, r) {
        "use strict";
        e.exports = r.p + "369f4aaf35687b9f986d.mp3"
      },
      320349: function(e, n, r) {
        "use strict";
        e.exports = r.p + "b843a42563e5f3144483.mp3"
      },
      481734: function(e, n, r) {
        "use strict";
        e.exports = r.p + "da2dc3239ecd9ab74be1.mp3"
      },
      19585: function(e, n, r) {
        "use strict";
        e.exports = r.p + "76ff191944dd58f4835f.mp3"
      },
      617510: function(e, n, r) {
        "use strict";
        e.exports = r.p + "e23b4d3cf753989097f4.mp3"
      },
      307334: function(e, n, r) {
        "use strict";
        e.exports = r.p + "9b12ba39365fff66dd95.mp3"
      },
      911368: function(e, n, r) {
        "use strict";
        e.exports = r.p + "d954d7bfa51d58a25610.mp3"
      },
      195129: function(e, n, r) {
        "use strict";
        e.exports = r.p + "e9fa25653b507623acbd.mp3"
      },
      828660: function(e, n, r) {
        "use strict";
        e.exports = r.p + "0fdb31ebfdaf7e86e7ff.mp3"
      },
      499353: function(e, n, r) {
        "use strict";
        e.exports = r.p + "1cc608397adb2bb151de.mp3"
      },
      939891: function(e, n, r) {
        "use strict";
        e.exports = r.p + "2f7089b0d3e66e7d6d67.mp3"
      },
      360394: function(e, n, r) {
        "use strict";
        e.exports = r.p + "80f50a0752b5cd6028ac.mp3"
      },
      377100: function(e, n, r) {
        "use strict";
        e.exports = r.p + "93034ac8d9eba50e3354.mp3"
      },
      351645: function(e, n, r) {
        "use strict";
        e.exports = r.p + "fea7a918aecf33a04116.mp3"
      },
      426354: function(e, n, r) {
        "use strict";
        e.exports = r.p + "e490f52f12a18334ae94.mp3"
      },
      778184: function(e, n, r) {
        "use strict";
        e.exports = r.p + "38b1c58d275e828aa9b6.mp3"
      },
      848069: function(e, n, r) {
        "use strict";
        e.exports = r.p + "7b945e7be3f86c5b7c82.mp3"
      },
      870980: function(e, n, r) {
        "use strict";
        e.exports = r.p + "e087eb83aaa4c43a44bc.mp3"
      },
      525773: function(e, n, r) {
        "use strict";
        e.exports = r.p + "9bb77985afdb60704817.mp3"
      },
      718528: function(e, n, r) {
        "use strict";
        e.exports = r.p + "ec5d85405877c27caeda.mp3"
      },
      199012: function(e, n, r) {
        "use strict";
        e.exports = r.p + "6d7616e08466ab9f1c6d.mp3"
      },
      411069: function(e, n, r) {
        "use strict";
        e.exports = r.p + "fa8da1499894ecac36c7.mp3"
      },
      293885: function(e, n, r) {
        "use strict";
        e.exports = r.p + "9dbfb1c211e3815cd7b1.mp3"
      },
      586680: function(e, n, r) {
        "use strict";
        e.exports = r.p + "badc42c2a9063b4a962c.mp3"
      },
      597453: function(e, n, r) {
        "use strict";
        e.exports = r.p + "ec3d9eaea30b33e16da6.mp3"
      },

These are then used to make the final path e.g. https://canary.discord.com/assets/fea7a918aecf33a04116.mp3 r.p in this case is just /assets/ and is determined here:

r.p = (null !== (i = window.GLOBAL_ENV.STATIC_ENDPOINT) && void 0 !== i ? i : "") + window.GLOBAL_ENV.PUBLIC_PATH,

Notably this list is in the same order as the one lookup table above [4] as far as I can tell.

Because GLOBAL_ENV is attached to the window you can easily query it in your own client.

A point of curiosity: There exists:

          "./halloween_deafen.mp3": "57814",
          "./halloween_defean.mp3": "819098",

and

          "./halloween_undeafen.mp3": "257130",
          "./halloween_undefean.mp3": "107848",

halloween_deafen and halloween_defean point to the same file:

      57814: function(e, n, r) {
        "use strict";
        e.exports = r.p + "c4aedda3b528df50221c.mp3"
      },
      819098: function(e, n, r) {
        "use strict";
        e.exports = r.p + "c4aedda3b528df50221c.mp3"
      },

But halloween_undeafen and halloween_undefean point to two different files:

      257130: function(e, n, r) {
        "use strict";
        e.exports = r.p + "045e5b9608df1607e0cf.mp3"
      },
      107848: function(e, n, r) {
        "use strict";
        e.exports = r.p + "0a3d90cd04942aa5ac0d.mp3"
      },

These files are actually not identical, but I personally can't hear any difference between them. They might be different exports.

I have downloaded and reuploaded all of the files that exist in the client as of the current revision to the Internet Archive so that you can find them should they change or become lost in the future.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment