{"version":3,"file":"main.MMbZEo.js","sources":["theme-16/virtual:theme","theme-16/discourse/components/video-uploader.gjs","theme-16/discourse/components/vtt-uploader.gjs","theme-16/discourse/components/custom-simple-list.gjs","theme-16/discourse/components/poster-uploader.gjs","theme-16/discourse/components/modal/insert-video.gjs","theme-16/discourse/initializers/insert-video.js","theme-16/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(16);\n\nexport function themePrefix(key) {\n  return `theme_translations.16.${key}`;\n}\n","import Component from \"@glimmer/component\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport ConditionalLoadingSpinner from \"discourse/components/conditional-loading-spinner\";\nimport icon from \"discourse/helpers/d-icon\";\nimport UppyUpload from \"discourse/lib/uppy/uppy-upload\";\n\nexport default class VideoUploader extends Component {\n  uppyUpload = new UppyUpload(this, {\n    type: \"mp4\",\n    id: \"video-uploader\",\n\n    uploadDone: ({ url }) => {\n      this.args.refresh(url);\n    },\n  });\n\n  get addDisabled() {\n    return this.uppyUpload.uploading;\n  }\n\n  <template>\n    <div class=\"simple-list-uploader\">\n      <label class=\"btn {{if this.addDisabled 'disabled'}}\">\n        {{icon \"upload\"}}\n        <input\n          {{didInsert this.uppyUpload.setup}}\n          class=\"hidden-upload-field\"\n          disabled={{this.addDisabled}}\n          type=\"file\"\n          accept=\"video/mp4,video/webm,video/quicktime\"\n        />\n      </label>\n      <ConditionalLoadingSpinner @condition={{this.addDisabled}} />\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport ConditionalLoadingSpinner from \"discourse/components/conditional-loading-spinner\";\nimport icon from \"discourse/helpers/d-icon\";\nimport UppyUpload from \"discourse/lib/uppy/uppy-upload\";\n\nexport default class VttUploader extends Component {\n  uppyUpload = new UppyUpload(this, {\n    type: \"vtt\",\n    id: \"vtt-uploader\",\n    uploadDone: ({ url }) => {\n      this.args.refresh(url);\n    },\n  });\n\n  get addDisabled() {\n    return this.uppyUpload.uploading;\n  }\n\n  <template>\n    <div class=\"simple-list-uploader\">\n      <label class=\"btn {{if this.addDisabled 'disabled'}}\">\n        {{icon \"upload\"}}\n        <input\n          {{didInsert this.uppyUpload.setup}}\n          class=\"hidden-upload-field\"\n          disabled={{this.addDisabled}}\n          type=\"file\"\n          accept=\"text/vtt\"\n        />\n      </label>\n      <ConditionalLoadingSpinner @condition={{this.addDisabled}} />\n    </div>\n  </template>\n}\n","/* eslint-disable ember/no-classic-components, ember/require-tagless-components */\nimport Component from \"@ember/component\";\nimport { fn } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport { empty } from \"@ember/object/computed\";\nimport { classNameBindings } from \"@ember-decorators/component\";\nimport DButton from \"discourse/components/d-button\";\nimport withEventValue from \"discourse/helpers/with-event-value\";\nimport {\n  addUniqueValueToArray,\n  removeValueFromArray,\n} from \"discourse/lib/array-tools\";\nimport { trackedArray } from \"discourse/lib/tracked-tools\";\nimport { i18n } from \"discourse-i18n\";\nimport VideoUploader from \"./video-uploader\";\nimport VttUploader from \"./vtt-uploader\";\n\n@classNameBindings(\":value-list\")\nexport default class CustomSimpleList extends Component {\n  @empty(\"newValue\") inputInvalid;\n\n  inputDelimiter = null;\n  newValue = \"\";\n  @trackedArray collection = null;\n  values = null;\n\n  didReceiveAttrs() {\n    super.didReceiveAttrs(...arguments);\n    this.set(\n      \"collection\",\n      this._splitValues(this.values, this.inputDelimiter || \"\\n\")\n    );\n  }\n\n  get resolvedPlaceholderKey() {\n    return this.placeholderKey || themePrefix(\"simple_list_placeholder\");\n  }\n\n  keyUp(e) {\n    if (e.keyCode === 13) {\n      this.addValue(this.newValue);\n    }\n  }\n\n  @action\n  changeValue(index, event) {\n    const newValue = event.target.value;\n    this.collection.splice(index, 1, newValue);\n    this._saveValues();\n  }\n\n  @action\n  addValue(newValue) {\n    if (this.inputInvalid) {\n      return;\n    }\n\n    this.set(\"newValue\", null);\n    this._addValue(newValue);\n  }\n\n  @action\n  removeValue(value) {\n    removeValueFromArray(this.collection, value);\n    this._saveValues();\n  }\n\n  @action\n  addUploadUrl(value) {\n    this.set(\"newValue\", null);\n    this._addValue(value);\n  }\n\n  _addValue(value) {\n    addUniqueValueToArray(this.collection, value);\n    this._saveValues();\n  }\n\n  _saveValues() {\n    this.set(\"values\", this.collection.join(this.inputDelimiter || \"\\n\"));\n  }\n\n  _splitValues(values, delimiter) {\n    if (values && values.length) {\n      return values.split(delimiter).filter((x) => x);\n    } else {\n      return [];\n    }\n  }\n\n  <template>\n    {{#if this.collection}}\n      <div class=\"values\">\n        {{#each this.collection as |value index|}}\n          <div class=\"value\" data-index={{index}}>\n            <DButton\n              @action={{fn this.removeValue value}}\n              @icon=\"xmark\"\n              class=\"remove-value-btn btn-small\"\n            />\n\n            <input\n              {{on \"focusout\" (fn this.changeValue index)}}\n              type=\"text\"\n              title={{value}}\n              value={{value}}\n              class=\"value-input\"\n            />\n          </div>\n        {{/each}}\n      </div>\n    {{/if}}\n\n    <div class=\"simple-list-input\">\n      <input\n        {{on \"input\" (withEventValue (fn (mut this.newValue)))}}\n        type=\"text\"\n        value={{this.newValue}}\n        placeholder={{i18n this.resolvedPlaceholderKey}}\n        autocomplete=\"discourse\"\n        autocorrect=\"off\"\n        autocapitalize=\"off\"\n        class=\"add-value-input\"\n      />\n\n      {{#if this.newValue}}\n        <DButton\n          @action={{fn this.addValue this.newValue}}\n          @icon=\"plus\"\n          class=\"add-value-btn btn-small\"\n        />\n      {{else}}\n        {{#if this.hasVideoUploader}}\n          <VideoUploader @refresh={{this.addUploadUrl}} />\n        {{/if}}\n\n        {{#if this.hasVTTUploader}}\n          <VttUploader @refresh={{this.addUploadUrl}} />\n        {{/if}}\n      {{/if}}\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport ConditionalLoadingSpinner from \"discourse/components/conditional-loading-spinner\";\nimport icon from \"discourse/helpers/d-icon\";\nimport UppyUpload from \"discourse/lib/uppy/uppy-upload\";\n\nexport default class PosterUploader extends Component {\n  @tracked poster;\n\n  uppyUpload = new UppyUpload(this, {\n    type: \"image\",\n    id: \"poster-uploader\",\n    uploadDone: ({ url }) => {\n      this.poster = url;\n      this.args.setPoster(url);\n    },\n  });\n\n  get addDisabled() {\n    return this.uppyUpload.uploading;\n  }\n\n  @action\n  updatePoster(event) {\n    this.poster = event.target.value;\n    this.args.setPoster(this.poster);\n  }\n\n  <template>\n    <div class=\"poster-uploader\">\n      <input\n        type=\"text\"\n        name=\"poster-image\"\n        value={{this.poster}}\n        {{on \"input\" this.updatePoster}}\n      />\n\n      <div class=\"simple-list-uploader\">\n        <label class=\"btn {{if this.addDisabled 'disabled'}}\">\n          {{icon \"upload\"}}\n          <input\n            {{didInsert this.uppyUpload.setup}}\n            class=\"hidden-upload-field\"\n            type=\"file\"\n            disabled={{this.addDisabled}}\n            accept=\"image/*\"\n          />\n        </label>\n        <ConditionalLoadingSpinner @condition={{this.addDisabled}} />\n      </div>\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { action } from \"@ember/object\";\nimport { empty } from \"@ember/object/computed\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport DModal from \"discourse/components/d-modal\";\nimport { isVideo } from \"discourse/lib/uploads\";\nimport { i18n } from \"discourse-i18n\";\nimport CustomSimpleList from \"../custom-simple-list\";\nimport PosterUploader from \"../poster-uploader\";\n\nexport default class InsertVideoModal extends Component {\n  @service appEvents;\n\n  // both are set by `CustomSimpleList`\n  // eslint-disable-next-line discourse/no-unnecessary-tracked\n  @tracked sources;\n  // eslint-disable-next-line discourse/no-unnecessary-tracked\n  @tracked tracks;\n  @tracked poster;\n  @empty(\"sources\") insertDisabled;\n\n  _keyDown(e) {\n    if (e.keyCode === 13) {\n      e.preventDefault();\n      e.stopPropagation();\n      return false;\n    }\n  }\n\n  @action\n  async preventSubmitOnEnter(modal) {\n    // prevent submitting on enter while adding items to lists using Enter\n    modal\n      .querySelector(\".video-sources\")\n      .addEventListener(\"keydown\", this._keyDown);\n\n    modal\n      .querySelector(\".video-subtitles\")\n      .addEventListener(\"keydown\", this._keyDown);\n  }\n\n  get trackList() {\n    if (!this.tracks) {\n      return [];\n    }\n\n    return this.tracks.split(\"|\");\n  }\n\n  get sourceList() {\n    if (!this.sources) {\n      return [];\n    }\n\n    return this.sources.split(\"|\");\n  }\n\n  get validationMessage() {\n    const allVideos = this.sourceList.every(\n      (url) => isVideo(url) || url.endsWith(\".m3u8\")\n    );\n\n    return allVideos ? \"\" : i18n(themePrefix(\"source_not_video\"));\n  }\n\n  _sourceType(src) {\n    let prefix, type;\n    if (src.endsWith(\".m3u8\")) {\n      prefix = \"application\";\n      type = \"x-mpegURL\";\n    } else {\n      prefix = \"video\";\n      type = src.substring(src.lastIndexOf(\".\") + 1);\n    }\n    return `${prefix}/${type}`;\n  }\n\n  @action\n  insertVideo() {\n    let sources = \"\";\n    let tracks = \"\";\n\n    this.sourceList.forEach((src) => {\n      sources += `\\n  <source src=\"${src}\" type=\"${this._sourceType(src)}\" />`;\n    });\n\n    const controlslist = settings?.disable_download\n      ? `controlslist=\"nodownload\" `\n      : \"\";\n\n    this.trackList.forEach((t, i) => {\n      const track = t.split(\",\");\n      const url = track[0];\n      const label = track[1] || \"English\";\n      const langcode = track[2] || \"en\";\n      const def = i === 0 ? \" default\" : \"\";\n\n      tracks += `\\n  <track src=\"${url}\" label=\"${label}\" kind=\"subtitles\" srclang=\"${langcode}\"${def}/>`;\n    });\n\n    const poster = this.poster ? ` poster=\"${this.poster}\"` : \"\";\n    const text = `<video controls ${controlslist} preload=\"metadata\"${poster}>${sources}${tracks}\\n</video>`;\n\n    this.args.model.toolbarEvent.addText(text);\n    this.appEvents.trigger(\"discourse-insert-video:video-inserted\", text);\n    this.args.closeModal();\n  }\n\n  @action\n  setPoster(val) {\n    this.poster = val;\n  }\n\n  <template>\n    <DModal\n      @closeModal={{@closeModal}}\n      @title={{i18n (themePrefix \"modal.title\")}}\n      class=\"insert-video-modal\"\n      {{didInsert this.preventSubmitOnEnter}}\n    >\n      <:body>\n        <div class=\"insert-video-inputs video-sources\">\n          <label>\n            {{i18n (themePrefix \"modal.video_title\")}}\n          </label>\n\n          <CustomSimpleList\n            @values={{this.sources}}\n            @hasVideoUploader={{true}}\n          />\n        </div>\n\n        <div class=\"insert-video-inputs video-poster\">\n          <label>\n            {{i18n (themePrefix \"modal.poster\")}}\n          </label>\n\n          <PosterUploader @setPoster={{this.setPoster}} />\n        </div>\n\n        <div class=\"insert-video-inputs video-subtitles\">\n          <label>\n            {{i18n (themePrefix \"modal.vtt_title\")}}\n          </label>\n\n          <CustomSimpleList @values={{this.tracks}} @hasVTTUploader={{true}} />\n          <div class=\"desc\">{{i18n (themePrefix \"modal.vtt_help\")}}</div>\n        </div>\n\n        {{#if this.insertDisabled}}\n          <div class=\"video-insert-error\">\n            {{this.validationMessage}}\n          </div>\n        {{/if}}\n      </:body>\n      <:footer>\n        <DButton\n          class=\"btn-primary\"\n          @disabled={{this.insertDisabled}}\n          @label={{themePrefix \"modal.insert\"}}\n          @action={{this.insertVideo}}\n        />\n        <DButton\n          class=\"btn-danger\"\n          @label={{themePrefix \"modal.cancel\"}}\n          @action={{@closeModal}}\n        />\n      </:footer>\n    </DModal>\n  </template>\n}\n","import { withPluginApi } from \"discourse/lib/plugin-api\";\nimport InsertVideoModal from \"../components/modal/insert-video\";\n\nexport default {\n  name: \"insert-video\",\n  initialize() {\n    withPluginApi((api) => {\n      api.onToolbarCreate((toolbar) => {\n        let currentUser = api.getCurrentUser();\n\n        if (settings.only_available_to_staff && !currentUser.staff) {\n          return;\n        }\n\n        toolbar.addButton({\n          title: themePrefix(\"composer_title\"),\n          id: \"insertVideo\",\n          group: \"insertions\",\n          icon: \"video\",\n          perform: (e) => {\n            api.container.lookup(\"service:modal\").show(InsertVideoModal, {\n              model: { toolbarEvent: e },\n            });\n          },\n        });\n      });\n\n      if (settings.text_tracks_as_blobs) {\n        api.decorateCooked(processVideos, {\n          onlyStream: true,\n          id: \"discourse-insert-video-tracks\",\n        });\n      }\n\n      api.decorateCookedElement(processOverlay, {\n        onlyStream: false,\n        id: \"custom-video-overlay-element\",\n      });\n\n      function processOverlay(post) {\n        if (settings.disable_download) {\n          post.querySelectorAll(\"video\").forEach((video) => {\n            video.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n          });\n        }\n      }\n\n      function processVideos($elem) {\n        let v = $elem[0].querySelectorAll(\"video\");\n\n        if (v.length === 0) {\n          return;\n        }\n\n        v.forEach((video) => {\n          const tracks = video.querySelectorAll(\"track\");\n          tracks.forEach((track) => {\n            const src = track.getAttribute(\"src\");\n\n            let xhr = new XMLHttpRequest();\n            xhr.open(\"GET\", src, true);\n            xhr.responseType = \"arraybuffer\";\n            xhr.addEventListener(\"load\", function () {\n              if (xhr.status === 200) {\n                const url = URL.createObjectURL(new Blob([xhr.response]));\n                track.src = url;\n              }\n            });\n            xhr.send();\n          });\n        });\n      }\n    });\n  },\n};\n","import * as Mod1 from \"./discourse/components/custom-simple-list\";\nimport * as Mod2 from \"./discourse/components/modal/insert-video\";\nimport * as Mod3 from \"./discourse/components/poster-uploader\";\nimport * as Mod4 from \"./discourse/components/video-uploader\";\nimport * as Mod5 from \"./discourse/components/vtt-uploader\";\nimport * as Mod6 from \"./discourse/initializers/insert-video\";\nconst compatModules = {\n  \"discourse/components/custom-simple-list\": Mod1,\n  \"discourse/components/modal/insert-video\": Mod2,\n  \"discourse/components/poster-uploader\": Mod3,\n  \"discourse/components/video-uploader\": Mod4,\n  \"discourse/components/vtt-uploader\": Mod5,\n  \"discourse/initializers/insert-video\": Mod6,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","themePrefix","key","VideoUploader","Component","uppyUpload","UppyUpload","this","type","id","uploadDone","url","args","refresh","addDisabled","uploading","setComponentTemplate","createTemplateFactory","block","moduleName","scope","icon","didInsert","ConditionalLoadingSpinner","isStrictMode","VttUploader","CustomSimpleList","dt7948","c","g","prototype","empty","inputInvalid","i","inputDelimiter","newValue","trackedArray","collection","values","didReceiveAttrs","super","arguments","set","_splitValues","resolvedPlaceholderKey","placeholderKey","keyUp","e","keyCode","addValue","changeValue","index","event","target","value","splice","_saveValues","n","action","_addValue","removeValue","removeValueFromArray","addUploadUrl","addUniqueValueToArray","join","delimiter","length","split","filter","x","DButton","fn","on","i18n","withEventValue","classNameBindings","PosterUploader","tracked","poster","setPoster","updatePoster","InsertVideoModal","service","appEvents","sources","tracks","insertDisabled","_keyDown","preventDefault","stopPropagation","preventSubmitOnEnter","modal","querySelector","addEventListener","trackList","sourceList","validationMessage","every","isVideo","endsWith","_sourceType","src","prefix","substring","lastIndexOf","insertVideo","forEach","controlslist","disable_download","t","track","label","langcode","text","model","toolbarEvent","addText","trigger","closeModal","val","DModal","name","initialize","withPluginApi","api","onToolbarCreate","toolbar","currentUser","getCurrentUser","only_available_to_staff","staff","addButton","title","group","perform","container","lookup","show","text_tracks_as_blobs","decorateCooked","$elem","v","querySelectorAll","video","getAttribute","xhr","XMLHttpRequest","open","responseType","status","URL","createObjectURL","Blob","response","send","onlyStream","decorateCookedElement","post","compatModules","Mod1","Mod2","Mod3","Mod4","Mod5"],"mappings":"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"}