From 09e22888413fadd0796651f6d26c1ed1da476464 Mon Sep 17 00:00:00 2001 From: Arnaud Levy Date: Sat, 15 Aug 2026 15:01:04 +0200 Subject: [PATCH 1/4] Wip (no snippet yet) --- app/services/video/provider.rb | 3 +- app/services/video/provider/instagram.rb | 33 +++++++++++++++++++ .../initializers/content_security_policy.rb | 1 + 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 app/services/video/provider/instagram.rb diff --git a/app/services/video/provider.rb b/app/services/video/provider.rb index 5a6fa9832..3fad91a0f 100644 --- a/app/services/video/provider.rb +++ b/app/services/video/provider.rb @@ -2,9 +2,10 @@ class Video::Provider PROVIDERS = [ Arte, Canalu, + Dailymotion, + Instagram, Vimeo, Youtube, - Dailymotion, Peertube # Comes last because detection is less reliable ] diff --git a/app/services/video/provider/instagram.rb b/app/services/video/provider/instagram.rb new file mode 100644 index 000000000..0ec973ea0 --- /dev/null +++ b/app/services/video/provider/instagram.rb @@ -0,0 +1,33 @@ +class Video::Provider::Instagram < Video::Provider::Default + DOMAINS = [ + 'instagram.com', + 'www.instagram.com' + ] + + def csp_domains + DOMAINS + end + + # https://www.instagram.com/reel/DZMwtovSJn4 + def identifier + video_url.split('reel/').last.split('/').first + end + + def iframe_tag(**iframe_options) + raw (blockquote + script) + end + + def iframe_preview_tag(**iframe_options) + iframe_tag + end + + def script + "" + end + + protected + + def blockquote + "
" + end +end diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index f89374694..b27041f1a 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -14,6 +14,7 @@ https://example.osuny.org/js/ https://plausible.io https://tally.so + https://instagram.com https://d2wy8f7a9ursnm.cloudfront.net/v7/ ) script_urls << "https://cdn.jsdelivr.net/npm/summernote@#{SummernoteRails::Rails::VERSION.split('.').take(3).join('.')}/dist/lang/" From 3cecc5f04c4700bd3692f22b3b7a600cffea43c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= Date: Mon, 31 Aug 2026 10:18:57 +0200 Subject: [PATCH 2/4] test video title instagram --- app/services/video/provider/instagram.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/services/video/provider/instagram.rb b/app/services/video/provider/instagram.rb index 0ec973ea0..5121bbc96 100644 --- a/app/services/video/provider/instagram.rb +++ b/app/services/video/provider/instagram.rb @@ -25,6 +25,15 @@ def script "" end + def title + html = URI.parse(video_url).open.read + # + meta_twitter_title = Nokogiri::HTML5(html).css("meta[name='twitter:title']").first + meta_twitter_title["content"] if meta_twitter_title + rescue + nil + end + protected def blockquote From b39966c6d4793d82a469802542f5d6046a3a32ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= Date: Mon, 7 Sep 2026 14:35:28 +0200 Subject: [PATCH 3/4] fix loading snippet scripts --- .../apps/blocks-editor/components/Blocks.vue | 22 ++++++++++++++++--- .../initializers/content_security_policy.rb | 2 +- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/javascript/apps/blocks-editor/components/Blocks.vue b/app/javascript/apps/blocks-editor/components/Blocks.vue index fdc9a3c98..4f5bfed50 100644 --- a/app/javascript/apps/blocks-editor/components/Blocks.vue +++ b/app/javascript/apps/blocks-editor/components/Blocks.vue @@ -48,6 +48,20 @@ export default { if (!confirm(this.$t('blocksEditor.confirm.duplication'))) return; this.$emit('duplicate', block); }, + loadSnippetScripts(event) { + // Script elements are note executed when loaded in v-html. + // We replace them with same content here to force the load (protected by CSP) + var snippetElement = event.el, + scriptElements = snippetElement.querySelectorAll('script'); + + scriptElements.forEach(script => { + const executableScript = document.createElement('script'); + Array.from(script.attributes).forEach(attribute => { + executableScript.setAttribute(attribute.name, attribute.value); + }); + script.replaceWith(executableScript); + }); + }, } }; @@ -102,7 +116,7 @@ export default { @click="onDuplicate($event, block)"> {{ $t('blocksEditor.actions.duplicate') }} - @@ -111,7 +125,9 @@ export default {
-
+
@@ -120,4 +136,4 @@ export default { - \ No newline at end of file + diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index b27041f1a..377d0e2af 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -14,7 +14,7 @@ https://example.osuny.org/js/ https://plausible.io https://tally.so - https://instagram.com + https://www.instagram.com https://d2wy8f7a9ursnm.cloudfront.net/v7/ ) script_urls << "https://cdn.jsdelivr.net/npm/summernote@#{SummernoteRails::Rails::VERSION.split('.').take(3).join('.')}/dist/lang/" From 9790e1f5730a93aea62c10e7d07b370da779dbcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= Date: Mon, 7 Sep 2026 14:39:39 +0200 Subject: [PATCH 4/4] fix snippet display --- app/models/communication/block/template/video.rb | 4 ++++ app/services/video/provider/default.rb | 4 ++++ app/services/video/provider/instagram.rb | 4 ++++ .../communication/blocks/templates/video/_snippet.html.erb | 4 ++-- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/models/communication/block/template/video.rb b/app/models/communication/block/template/video.rb index 803cde7b3..209ceca99 100644 --- a/app/models/communication/block/template/video.rb +++ b/app/models/communication/block/template/video.rb @@ -41,6 +41,10 @@ def video_embed_with_defaults video_provider.embed_with_defaults end + def video_snippet_classes + video_provider.snippet_classes + end + def before_validation super if url.present? && video_title.blank? && video_provider.present? diff --git a/app/services/video/provider/default.rb b/app/services/video/provider/default.rb index bf033265d..734265f2f 100644 --- a/app/services/video/provider/default.rb +++ b/app/services/video/provider/default.rb @@ -61,6 +61,10 @@ def iframe_preview_tag(**iframe_options) content_tag(:iframe, nil, options) end + def snippet_classes + "ratio ratio-16x9" + end + def correct? url_in_domains? end diff --git a/app/services/video/provider/instagram.rb b/app/services/video/provider/instagram.rb index 5121bbc96..1158f58ae 100644 --- a/app/services/video/provider/instagram.rb +++ b/app/services/video/provider/instagram.rb @@ -21,6 +21,10 @@ def iframe_preview_tag(**iframe_options) iframe_tag end + def snippet_classes + "" + end + def script "" end diff --git a/app/views/admin/communication/blocks/templates/video/_snippet.html.erb b/app/views/admin/communication/blocks/templates/video/_snippet.html.erb index 5be930a64..ce38090ea 100644 --- a/app/views/admin/communication/blocks/templates/video/_snippet.html.erb +++ b/app/views/admin/communication/blocks/templates/video/_snippet.html.erb @@ -1,4 +1,4 @@ -
+
<%= block.template.video_iframe_preview %>
<% unless block.template.video_title.blank? %> @@ -18,4 +18,4 @@ <%= block_component_show block, :transcription %>
-<% end %> \ No newline at end of file +<% end %>