diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index b880b6ff6..24201afe5 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -36,3 +36,4 @@ export { default as Dtext } from '../src/javascripts/dtext.js'; export { default as Note } from '../src/javascripts/notes.js'; export { default as PostModeMenu } from '../src/javascripts/post_mode_menu.js'; export { default as Utility } from '../src/javascripts/utility.js'; +export { default as Ugoira } from '../src/javascripts/ugoira.js'; \ No newline at end of file diff --git a/app/javascript/src/javascripts/ugoira.js b/app/javascript/src/javascripts/ugoira.js new file mode 100644 index 000000000..06ed66051 --- /dev/null +++ b/app/javascript/src/javascripts/ugoira.js @@ -0,0 +1,76 @@ +import { ZipImagePlayer } from '../../vendor/pixiv-ugoira-player'; +require("jquery-ui/ui/widgets/progressbar"); +require("jquery-ui/ui/widgets/slider"); +require("jquery-ui/themes/base/progressbar.css"); +require("jquery-ui/themes/base/slider.css"); + +let Ugoira = {}; + +Ugoira.create_player = (mime_type, frames, file_url) => { + var meta_data = { + mime_type: mime_type, + frames: frames + }; + var options = { + canvas: $("#image")[0], + source: file_url, + metadata: meta_data, + chunkSize: 300000, + loop: true, + autoStart: true, + debug: false, + } + + Ugoira.player = new ZipImagePlayer(options); + Ugoira.player_manually_paused = false; + + $(Ugoira.player).on("loadProgress", (ev, progress) => { + $("#seek-slider").progressbar("value", Math.floor(progress * 100)); + }); + + $("#ugoira-play").click(e => { + Ugoira.player.play(); + $(this).hide(); + $("#ugoira-pause").show(); + Ugoira.player_manually_paused = false; + e.preventDefault(); + }) + + $("#ugoira-pause").click(e => { + Ugoira.player.pause(); + $(this).hide(); + $("#ugoira-play").show(); + Ugoira.player_manually_paused = true; + e.preventDefault(); + }); + + $("#seek-slider").progressbar({ + value: 0 + }); + + $("#seek-slider").slider({ + min: 0, + max: Ugoira.player._frameCount-1, + start: (event, ui) => { + // Need to pause while slider is being dragged or playback speed will bug out + Ugoira.player.pause(); + }, + slide: (event, ui) => { + Ugoira.player._frame = ui.value; + Ugoira.player._displayFrame(); + }, + stop: (event, ui) => { + // Resume playback when dragging stops, but only if player was not paused by the user earlier + if (!(Ugoira.player_manually_paused)) { + Ugoira.player.play(); + } + } + }); + + $(Ugoira.player).on("frame", (frame, frame_number) => { + $("#seek-slider").slider("option", "value", frame_number); + }); +} + +export default Ugoira; + diff --git a/app/javascript/vendor/pixiv-ugoira-player.js b/app/javascript/vendor/pixiv-ugoira-player.js index 7fe915fa3..0b2a19526 100644 --- a/app/javascript/vendor/pixiv-ugoira-player.js +++ b/app/javascript/vendor/pixiv-ugoira-player.js @@ -518,4 +518,8 @@ ZipImagePlayer.prototype = { hasError: function() { return this._failed; } -} \ No newline at end of file +} + +// added + +export { ZipImagePlayer }; \ No newline at end of file diff --git a/app/views/posts/partials/show/_ugoira_original.html.erb b/app/views/posts/partials/show/_ugoira_original.html.erb index bf35476f2..6781742e6 100644 --- a/app/views/posts/partials/show/_ugoira_original.html.erb +++ b/app/views/posts/partials/show/_ugoira_original.html.erb @@ -38,74 +38,12 @@ <% content_for(:html_header) do %> <% end %>