diff --git a/app/assets/javascripts/materials.js b/app/assets/javascripts/materials.js new file mode 100644 index 000000000..1ec5544cc --- /dev/null +++ b/app/assets/javascripts/materials.js @@ -0,0 +1,27 @@ +function make_zenodo_video(video_element, files_url, preferred_key) { + const videoExtensions = ['.mp4', '.webm', '.ogg', '.ogv', '.mov', '.m4v', '.mkv']; + const audioExtensions = ['.mp3', '.ogg', '.wav', '.aac', '.flac', '.opus']; + video_element.parentElement.style.display = 'none'; + + fetch(files_url) + .then(response => response.json()) + .then(data => { + let video_file = null; + if (preferred_key != null) { + video_file = data.entries.find(file => file.key === String(preferred_key)); + } + if (!video_file) { + video_file = data.entries.find(file => videoExtensions.some(ext => file.key.toLowerCase().endsWith(ext))); + } + if (!video_file) { // fallback to audio + video_file = data.entries.find(file => audioExtensions.some(ext => file.key.toLowerCase().endsWith(ext))); + } + if (video_file) { + const video_url = video_file.links.content; + video_element.src = video_url; + video_element.style.display = 'block'; + video_element.parentElement.style.display = 'block'; + } + }) + .catch(error => console.error('Error fetching Zenodo files:', error)); +} \ No newline at end of file diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 51dca1c07..af8996f3e 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -886,10 +886,11 @@ input[type=checkbox].field-lock + label:before, .embedded-content { margin: 2em auto; + display: flex; + justify-content: center; iframe { display: block; - margin: auto; } } diff --git a/app/helpers/materials_helper.rb b/app/helpers/materials_helper.rb index 0fc4d362e..04e8ffe38 100644 --- a/app/helpers/materials_helper.rb +++ b/app/helpers/materials_helper.rb @@ -124,7 +124,15 @@ def display_attribute_no_label(resource, attribute, markdown: false, &block) # r end def embed_youtube(material) - renderer = Renderers::Youtube.new(material) + embed_video(Renderers::Youtube, material) + end + + def embed_zenodo(material) + embed_video(Renderers::Zenodo, material) + end + + def embed_video(renderer_class, material) + renderer = renderer_class.new(material) return unless renderer.can_render? content_tag(:div, class: 'embedded-content') do diff --git a/app/views/materials/show.html.erb b/app/views/materials/show.html.erb index e180b97b6..81131bcc6 100644 --- a/app/views/materials/show.html.erb +++ b/app/views/materials/show.html.erb @@ -47,6 +47,7 @@ <%= embed_youtube(@material) %> + <%= embed_zenodo(@material) %>