youtube_url_parser 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +9 -0
  3. data/lib/youtube_url_parser.rb +119 -0
  4. metadata +140 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5056a518d86f597b391cc3255c180f5cd878a71719b565daeefdbeec7336d2d0
4
+ data.tar.gz: b92c49bf64a633f40c2d278a10d00101e4daba9bdf74516681e1889d909262c0
5
+ SHA512:
6
+ metadata.gz: 127ac1c2e736dab479a4f4f7a0e7112511d7d59cba683baf55a4df6318bc6aacf0bc1e2b6ec97a50edf95d831ea4609d45a889b2fc960bc88874f4a12ff3176b
7
+ data.tar.gz: b84f3961b0c24ec4e9db8c0bd16eb905b25b53dd686afd9d6120a248760407eab3bfd4a3fc9fa11a517bab02b14dc0d67c81f8d6b35f34fa56c3ec3eb79b77ae
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+
2
+ begin
3
+ require "rspec/core/rake_task"
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task default: :spec
8
+ rescue LoadError
9
+ end
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
4
+ require "active_model"
5
+ require "rack/utils"
6
+
7
+ class YoutubeUrlParser
8
+ class YoutubeShareUrl
9
+ include ActiveModel::Model
10
+ attr_accessor :link, :uri
11
+
12
+ def self.share_link?(link)
13
+ link.include?("/youtu.be")
14
+ end
15
+
16
+ def youtube_id
17
+ parse_link
18
+ return nil unless valid_host?
19
+
20
+ uri.path.delete("/")
21
+ end
22
+
23
+ def parse_link
24
+ self.uri = URI.parse(link)
25
+ end
26
+
27
+ private
28
+
29
+ def valid_host?
30
+ uri.host == "youtu.be"
31
+ end
32
+ end
33
+
34
+ class YoutubeEmbedUrl < YoutubeShareUrl
35
+ def self.embed_link?(link)
36
+ link.include?("embed")
37
+ end
38
+
39
+ def youtube_id
40
+ self.link = url_from_embed_link
41
+ parse_link
42
+ link_path = uri.path
43
+ youtube_id = link_path.gsub("/embed/", "")
44
+ end
45
+
46
+ private
47
+
48
+ def url_from_embed_link
49
+ urls = URI.extract(link)
50
+ urls.find { |url| self.class.embed_link?(url) }
51
+ end
52
+ end
53
+
54
+ class YoutubeDirectUrl < YoutubeShareUrl
55
+ def youtube_id
56
+ parse_link
57
+ query = uri.query
58
+ youtube_id = ::Rack::Utils.parse_nested_query(query)
59
+ youtube_id = youtube_id.fetch("v", nil)
60
+ end
61
+ end
62
+
63
+ class YoutubeShortUrl < YoutubeShareUrl
64
+ def self.short_link?(link)
65
+ link.include?("short")
66
+ end
67
+
68
+ def youtube_id
69
+ self.link = url_from_short_link(link)
70
+ parse_link
71
+ link_path = uri.path
72
+ youtube_id = link_path.gsub("/shorts/", "")
73
+ end
74
+
75
+ private
76
+
77
+ def url_from_short_link(link)
78
+ urls = URI.extract(link)
79
+ urls.find { |url| self.class.short_link?(url) }
80
+ end
81
+ end
82
+
83
+ def parse(link)
84
+ return nil unless link
85
+
86
+ youtube_link = define_link(link).new(:link => link)
87
+ youtube_link.youtube_id
88
+ rescue URI::InvalidURIError => error
89
+ nil
90
+ end
91
+
92
+ def parse_as_url(link)
93
+ return nil unless link
94
+
95
+ youtube_link = define_link(link).new(:link => link)
96
+
97
+ if youtube_link.youtube_id.present?
98
+ return "https://www.youtube.com/watch?v=#{youtube_link.youtube_id}"
99
+ end
100
+
101
+ nil
102
+ rescue URI::InvalidURIError => error
103
+ nil
104
+ end
105
+
106
+ private
107
+
108
+ def define_link(link)
109
+ if YoutubeShareUrl.share_link?(link)
110
+ YoutubeShareUrl
111
+ elsif YoutubeEmbedUrl.embed_link?(link)
112
+ YoutubeEmbedUrl
113
+ elsif YoutubeShortUrl.short_link?(link)
114
+ YoutubeShortUrl
115
+ else
116
+ YoutubeDirectUrl
117
+ end
118
+ end
119
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: youtube_url_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ole Palm
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-01-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '8.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '5.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '8.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rack
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '2.0'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '4.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '2.0'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '4.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: uri
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0.10'
60
+ type: :runtime
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0.10'
67
+ - !ruby/object:Gem::Dependency
68
+ name: bundler
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '2.0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '2.0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: rake
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '10.0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '10.0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: minitest
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ description:
110
+ email: ole.palm@substancelab.com
111
+ executables: []
112
+ extensions: []
113
+ extra_rdoc_files: []
114
+ files:
115
+ - Rakefile
116
+ - lib/youtube_url_parser.rb
117
+ homepage: https://github.com/substancelab/youtube_url_parser
118
+ licenses:
119
+ - MIT
120
+ metadata: {}
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ requirements: []
136
+ rubygems_version: 3.2.22
137
+ signing_key:
138
+ specification_version: 4
139
+ summary: Parsing of youtube urls
140
+ test_files: []