pinterest-dl 1.0.0 → 1.0.1

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 +4 -4
  2. data/README.md +57 -25
  3. data/lib/pinterest-dl.rb +135 -136
  4. metadata +6 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71ad1b053f92b611430a8e44a0a678037daa37577afaa1a0ff5dd04a3f53329b
4
- data.tar.gz: 2754556eacec0edfcb5f52700773bc9d725597c01c6f512f692fd1eff3c706ac
3
+ metadata.gz: 27626810a9014457fd993c95652b1705437df4c008e4df3586bdea8baf0b7e65
4
+ data.tar.gz: ddb835faccb168517d3ff36ef36e1d601094d23ebb29b8f36b12473d67ffd62f
5
5
  SHA512:
6
- metadata.gz: 55f78b7fe0ffb4d69f17f65b5bdf580d985a8418780145a8717c2a166c61ba123c3de7e64ed6cea1394bc6588db3c0279fe07e621403f0155f71c52eaef3b34b
7
- data.tar.gz: b662d4914cd490516c54f5c0e6b8b42476c6781e65b7a97846381a1be596295725b3525187338d8a62cee79b46b6d9bdf322ab3c26d66bf752d49027290aae43
6
+ metadata.gz: c945ee342ddd919339e480708d7d9f88710e56841f7e5d744c878a4c88c68ad53e37383b9f71a2a333a858a5874ed50f0d0c1f77552b60e87ca9d5dbcbf38800
7
+ data.tar.gz: 53d172562e998a79ef4931ce716850be86a86ba13cb9b5c875b4bc2e77fdc77a0f4fa7b5f2c80d71b392130b6f7566411793e696ffe2de45c74507a8d5442bbd
data/README.md CHANGED
@@ -1,25 +1,57 @@
1
- # pinterest-dl
2
-
3
- Get direct image and video URLs from Pinterest:)
4
-
5
-
6
-
7
- ```ruby
8
- gem install pinterest-dl
9
-
10
- ```
11
-
12
- ## Usage
13
-
14
- ```ruby
15
- require 'pinterest-dl'
16
- ```
17
-
18
-
19
- # Get image url
20
- url = PinterestDL.get_image_url('link')
21
- # => "https://i.pinimg.com/originals/8e/2a/..."
22
-
23
- # Get video url
24
- url = PinterestDL.get_video_url('link')
25
- # => "https://v.pinimg.com/videos/..."
1
+ <div align="center">
2
+
3
+ # pinterest-dl
4
+
5
+ ---
6
+
7
+ [![Gem Downloads](https://img.shields.io/gem/dt/pinterest-dl)](https://rubygems.org/gems/pinterest-dl)
8
+ [![License](https://img.shields.io/badge/License-MIT-green)](LICENSE)
9
+ [![Ruby](https://img.shields.io/badge/Ruby-2.5+-red)]()
10
+
11
+
12
+ <img src="https://img.icons8.com/color/96/000000/pinterest--v1.png" width="80">
13
+
14
+ </div>
15
+
16
+ ---
17
+
18
+ Get direct image and video URLs from Pinterest:)
19
+
20
+ ![Demo](https://github.com/monji024/pinterest-dl/raw/main/test.gif)
21
+
22
+ Using a VPN is important for those in Iran!!!
23
+
24
+ ## Installation
25
+
26
+ ```ruby
27
+ gem install pinterest-dl
28
+ ```
29
+
30
+ ## Usage
31
+
32
+ ```ruby
33
+ require 'pinterest-dl'
34
+ ```
35
+
36
+ ### Get image url
37
+
38
+ ```ruby
39
+ url = PinterestDL.get_image_url('https://www.pinterest.com/pin/example/')
40
+ # => "https://i.pinimg.com/originals/8e/2a/..."
41
+ ```
42
+
43
+ ### Get video url
44
+
45
+ ```ruby
46
+ url = PinterestDL.get_video_url('https://www.pinterest.com/pin/example/')
47
+ # => "https://v.pinimg.com/videos/..."
48
+ ```
49
+
50
+ ## Links
51
+
52
+ - [RubyGem](https://rubygems.org/gems/pinterest-dl)
53
+ - [GitHub](https://github.com/monji024/pinterest-dl)
54
+
55
+ ## License
56
+
57
+ MIT © [monji024](https://github.com/monji024)
data/lib/pinterest-dl.rb CHANGED
@@ -1,136 +1,135 @@
1
- #!/usr/bin/env ruby
2
- # pinterest-dl.rb
3
- # Pinterest downloader
4
- # creator: Monji
5
- # ver: 1.0.0
6
- # github: https://github.com/monji024/pinterest-dl
7
-
8
- require 'net/http'
9
- require 'uri'
10
- require 'json'
11
- require 'openssl'
12
-
13
-
14
- module PinterestDL
15
- ver = '1.0.0'.freeze
16
- craetor = 'Monji'.freeze
17
- github = 'https://github.com/monji024/pinterest-dl'.freeze
18
-
19
- puts "pinterest-dl v#{ver} by #{craetor} (#{github})\n\n"
20
-
21
- USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'.freeze
22
-
23
- class << self
24
- def get_image_url(pin_url)
25
- html = fetch_html(pin_url)
26
- return nil unless html
27
-
28
- # 1 -> json-ld
29
- url = extract_json_ld(html, 'ImageObject')
30
- return url if url
31
-
32
- # 2 -> open graph
33
- match = html.match(%r{<meta[^>]*property="og:image"[^>]*content="([^"]+)"})
34
- if match
35
- url = match[1]
36
- puts "image url: #{url}"
37
- return url
38
- end
39
-
40
- # 3 -> direct i.pinimg.com patterns
41
- match = html.match(%r{https://i\.pinimg\.com/(?:originals|474x|236x|736x)/[^"\s]+})
42
- if match
43
- url = match[0]
44
- reset = "\e[0m"
45
- green = "\e[32m"
46
- puts "#{green}image url :#{reset} #{url}"
47
- return url
48
- end
49
-
50
- puts 'No found'
51
- nil
52
- end
53
-
54
-
55
- def get_video_url(pin_url)
56
- html = fetch_html(pin_url)
57
- return nil unless html
58
-
59
- # 1 -> json-ld
60
- url = extract_json_ld(html, 'VideoObject')
61
- if url
62
- url = url.gsub('\\u002F', '/').gsub('\\', '')
63
- puts "ok : #{url}"
64
- return url
65
- end
66
-
67
- # 2 -> Open Graph video
68
- match = html.match(%r{<meta[^>]*property="og:video"[^>]*content="([^"]+)"})
69
- if match
70
- url = match[1].gsub('\\u002F', '/').gsub('\\', '')
71
- puts "video url: #{url}"
72
- return url
73
- end
74
-
75
- # 3 -> contentUrl in page source
76
- match = html.match(/"contentUrl"\s*:\s*"([^"]+\.mp4[^"]*)"/)
77
- if match
78
- url = match[1].gsub('\\u002F', '/').gsub('\\', '')
79
- green = "\e[32m"
80
- reset = "\e[0m"
81
- puts "#{green}video url :#{reset} #{url}"
82
- return url
83
- end
84
-
85
- puts 'No found'
86
- nil
87
- end
88
-
89
- private
90
-
91
- def fetch_html(url)
92
- uri = URI(url)
93
- http = Net::HTTP.new(uri.host, uri.port)
94
- http.use_ssl = (uri.scheme == 'https')
95
- http.max_retries = 2
96
- http.open_timeout = 10
97
- http.read_timeout = 20
98
-
99
- resp = http.request(Net::HTTP::Head.new(uri, 'User-Agent' => USER_AGENT))
100
-
101
- 5.times do
102
- break unless resp.is_a?(Net::HTTPRedirection)
103
- location = resp['location']
104
- location = URI.join(uri.to_s, location) if location.start_with?('/')
105
- uri = URI(location)
106
- http = Net::HTTP.new(uri.host, uri.port)
107
- http.use_ssl = (uri.scheme == 'https')
108
- resp = http.request(Net::HTTP::Head.new(uri, 'User-Agent' => USER_AGENT))
109
- end
110
-
111
- # get final page
112
- req = Net::HTTP::Get.new(uri, 'User-Agent' => USER_AGENT)
113
- resp = http.request(req)
114
-
115
- return resp.body if resp.is_a?(Net::HTTPSuccess)
116
- nil
117
- rescue StandardError => e
118
- red = "\e[31m"
119
- reset = "\e[0m"
120
- puts "#{red}http err!:#{reset} #{e.message}"
121
- nil
122
- end
123
- def extract_json_ld(html, type)
124
- match = html.match(%r{<script[^>]*type="application/ld\+json"[^>]*>(.*?)</script>}m)
125
- return nil unless match
126
-
127
- begin
128
- data = JSON.parse(match[1])
129
- data = data[0] if data.is_a?(Array) && !data.empty?
130
- return data['contentUrl'] if data['@type'] == type && data['contentUrl']
131
- rescue JSON::ParserError
132
- end
133
- nil
134
- end
135
- end
136
- end
1
+ #!/usr/bin/env ruby
2
+ # pinterest-dl.rb
3
+ # Pinterest downloader
4
+ # creator: Monji
5
+ # ver: 1.0.0
6
+ # github: https://github.com/monji024/pinterest-dl
7
+
8
+ require 'net/http'
9
+ require 'uri'
10
+ require 'json'
11
+ require 'openssl'
12
+
13
+
14
+ module PinterestDL
15
+ ver = '1.0.0'.freeze
16
+ github = 'https://github.com/monji024/pinterest-dl'.freeze
17
+
18
+ puts "pinterest-dl v#{ver} (#{github})\n\n"
19
+
20
+ USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'.freeze
21
+
22
+ class << self
23
+ def get_image_url(pin_url)
24
+ html = fetch_html(pin_url)
25
+ return nil unless html
26
+
27
+ # 1 -> json-ld
28
+ url = extract_json_ld(html, 'ImageObject')
29
+ return url if url
30
+
31
+ # 2 -> open graph
32
+ match = html.match(%r{<meta[^>]*property="og:image"[^>]*content="([^"]+)"})
33
+ if match
34
+ url = match[1]
35
+ puts "image url: #{url}"
36
+ return url
37
+ end
38
+
39
+ # 3 -> direct i.pinimg.com patterns
40
+ match = html.match(%r{https://i\.pinimg\.com/(?:originals|474x|236x|736x)/[^"\s]+})
41
+ if match
42
+ url = match[0]
43
+ reset = "\e[0m"
44
+ green = "\e[32m"
45
+ puts "#{green}image url :#{reset} #{url}"
46
+ return url
47
+ end
48
+
49
+ puts 'No found'
50
+ nil
51
+ end
52
+
53
+
54
+ def get_video_url(pin_url)
55
+ html = fetch_html(pin_url)
56
+ return nil unless html
57
+
58
+ # 1 -> json-ld
59
+ url = extract_json_ld(html, 'VideoObject')
60
+ if url
61
+ url = url.gsub('\\u002F', '/').gsub('\\', '')
62
+ puts "ok : #{url}"
63
+ return url
64
+ end
65
+
66
+ # 2 -> Open Graph video
67
+ match = html.match(%r{<meta[^>]*property="og:video"[^>]*content="([^"]+)"})
68
+ if match
69
+ url = match[1].gsub('\\u002F', '/').gsub('\\', '')
70
+ puts "video url: #{url}"
71
+ return url
72
+ end
73
+
74
+ # 3 -> contentUrl in page source
75
+ match = html.match(/"contentUrl"\s*:\s*"([^"]+\.mp4[^"]*)"/)
76
+ if match
77
+ url = match[1].gsub('\\u002F', '/').gsub('\\', '')
78
+ green = "\e[32m"
79
+ reset = "\e[0m"
80
+ puts "#{green}video url :#{reset} #{url}"
81
+ return url
82
+ end
83
+
84
+ puts 'No found'
85
+ nil
86
+ end
87
+
88
+ private
89
+
90
+ def fetch_html(url)
91
+ uri = URI(url)
92
+ http = Net::HTTP.new(uri.host, uri.port)
93
+ http.use_ssl = (uri.scheme == 'https')
94
+ http.max_retries = 2
95
+ http.open_timeout = 10
96
+ http.read_timeout = 20
97
+
98
+ resp = http.request(Net::HTTP::Head.new(uri, 'User-Agent' => USER_AGENT))
99
+
100
+ 5.times do
101
+ break unless resp.is_a?(Net::HTTPRedirection)
102
+ location = resp['location']
103
+ location = URI.join(uri.to_s, location) if location.start_with?('/')
104
+ uri = URI(location)
105
+ http = Net::HTTP.new(uri.host, uri.port)
106
+ http.use_ssl = (uri.scheme == 'https')
107
+ resp = http.request(Net::HTTP::Head.new(uri, 'User-Agent' => USER_AGENT))
108
+ end
109
+
110
+ # get final page
111
+ req = Net::HTTP::Get.new(uri, 'User-Agent' => USER_AGENT)
112
+ resp = http.request(req)
113
+
114
+ return resp.body if resp.is_a?(Net::HTTPSuccess)
115
+ nil
116
+ rescue StandardError => e
117
+ red = "\e[31m"
118
+ reset = "\e[0m"
119
+ puts "#{red}http err!:#{reset} #{e.message}"
120
+ nil
121
+ end
122
+ def extract_json_ld(html, type)
123
+ match = html.match(%r{<script[^>]*type="application/ld\+json"[^>]*>(.*?)</script>}m)
124
+ return nil unless match
125
+
126
+ begin
127
+ data = JSON.parse(match[1])
128
+ data = data[0] if data.is_a?(Array) && !data.empty?
129
+ return data['contentUrl'] if data['@type'] == type && data['contentUrl']
130
+ rescue JSON::ParserError
131
+ end
132
+ nil
133
+ end
134
+ end
135
+ end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pinterest-dl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Monji
8
+ autorequire:
8
9
  bindir: bin
9
10
  cert_chain: []
10
- date: 2026-02-12 00:00:00.000000000 Z
11
+ date: 2026-06-28 00:00:00.000000000 Z
11
12
  dependencies: []
12
13
  description: Simple Pinterest Downloader Tool:)
13
14
  email: hoseinmonjiofficial@gmail.com
@@ -23,6 +24,7 @@ licenses:
23
24
  metadata:
24
25
  source_code_uri: https://github.com/monji024/pinterest-dl
25
26
  bug_tracker_uri: https://github.com/monji024/pinterest-dl/issues
27
+ post_install_message:
26
28
  rdoc_options: []
27
29
  require_paths:
28
30
  - lib
@@ -37,7 +39,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
37
39
  - !ruby/object:Gem::Version
38
40
  version: '0'
39
41
  requirements: []
40
- rubygems_version: 3.6.3
42
+ rubygems_version: 3.5.22
43
+ signing_key:
41
44
  specification_version: 4
42
45
  summary: Extract direct image/video URLs from Pinterest!!!
43
46
  test_files: []