diff --git a/app/services/video/provider.rb b/app/services/video/provider.rb index ea50081e1f9128e3e19b9ec80c4988f90199ea2e..808d9fbd19f6dfc5284ae650fa06a765a8446334 100644 --- a/app/services/video/provider.rb +++ b/app/services/video/provider.rb @@ -3,19 +3,14 @@ class Video::Provider Vimeo, Youtube, Dailymotion, - Peertube + Peertube # Comes last because detection is less reliable ] def self.find(video_url) - PROVIDERS.each do |provider| - return provider.new(video_url) if url_in_domains?(video_url, provider::DOMAINS) + PROVIDERS.each do |provider_class| + provider = provider_class.new(video_url) + return provider if provider.correct? end Default.new(video_url) end - - protected - - def self.url_in_domains?(url, domains) - domains.any? { |domain| url.include? domain } - end end diff --git a/app/services/video/provider/default.rb b/app/services/video/provider/default.rb index 336e8e7aaa27216a09f189c9fc7afee93b43e7cb..3cb5b7f3bac8cd8ce2a3f9c415a580a9c23a60b3 100644 --- a/app/services/video/provider/default.rb +++ b/app/services/video/provider/default.rb @@ -1,4 +1,6 @@ class Video::Provider::Default + DOMAINS = [] + attr_reader :video_url include ActionView::Helpers::TagHelper @@ -19,6 +21,10 @@ class Video::Provider::Default content_tag(:iframe, nil, default_iframe_options.merge(iframe_options)) end + def correct? + url_in_domains? + end + def default_iframe_options { class: (platform == :default ? nil : platform), @@ -26,4 +32,12 @@ class Video::Provider::Default src: iframe_url } end + + protected + + def url_in_domains? + self.class::DOMAINS.any? do |domain| + video_url.include?(domain) + end + end end diff --git a/app/services/video/provider/peertube.rb b/app/services/video/provider/peertube.rb index 6bcdc3966e467fa6927398d4b121a830230feb77..af3b2ce744b0f0f392d0d60618fda3f52ae0a3cc 100644 --- a/app/services/video/provider/peertube.rb +++ b/app/services/video/provider/peertube.rb @@ -1,7 +1,6 @@ class Video::Provider::Peertube < Video::Provider::Default - DOMAINS = ['peertube.fr', 'peertude.my.noesya.coop'] + DOMAINS = ['peertube.fr'] - # "https://peertube.fr/w/1i848Qvi7Q3ytW2uPY8AxG" def identifier video_url.split('/w/').last end @@ -14,4 +13,14 @@ class Video::Provider::Peertube < Video::Provider::Default def iframe_url "#{host}/videos/embed/#{identifier}" end + + def correct? + url_in_domains? || url_looks_like_peertube? + end + + protected + + def url_looks_like_peertube? + "/w/".in?(video_url) || "/videos/watch/".in?(video_url) + end end diff --git a/test/services/video/provider_test.rb b/test/services/video/provider_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..ea10dedad6fec11aa63e244972c6728d2102560e --- /dev/null +++ b/test/services/video/provider_test.rb @@ -0,0 +1,35 @@ +require "test_helper" + +class Video::ProviderTest < ActiveSupport::TestCase + + test "provider empty" do + provider = Video::Provider.find('') + assert_equal Video::Provider::Default, provider.class + end + + test "vimeo" do + provider = Video::Provider.find('https://vimeo.com/248482251') + assert_equal Video::Provider::Vimeo, provider.class + end + + test "youtube" do + provider = Video::Provider.find('https://www.youtube.com/watch?v=sN8Cq5HEBug') + assert_equal Video::Provider::Youtube, provider.class + provider = Video::Provider.find('https://youtu.be/sN8Cq5HEBug') + assert_equal Video::Provider::Youtube, provider.class + end + + test "dailymotion" do + provider = Video::Provider.find('https://www.dailymotion.com/video/x35l6b8') + assert_equal Video::Provider::Dailymotion, provider.class + provider = Video::Provider.find('https://dai.ly/x35l6b8') + assert_equal Video::Provider::Dailymotion, provider.class + end + + test "peertube" do + provider = Video::Provider.find('https://peertube.fr/w/1i848Qvi7Q3ytW2uPY8AxG') + assert_equal Video::Provider::Peertube, provider.class + provider = Video::Provider.find('https://peertube.my.noesya.coop/w/qBMwAAULLA9oadFgbtdyq8') + assert_equal Video::Provider::Peertube, provider.class + end +end \ No newline at end of file