directlink 0.0.10.0 → 0.0.11.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 22f79345a6e337da21259e7f0a6502b72077862b76cd58c08a199f6fef4ca750
4
- data.tar.gz: 765af8ad0ea6e047799c33bad9217664ab6cc525ad9b8072ee1f8c3a2f16dc23
2
+ SHA1:
3
+ metadata.gz: 30657b1850442ca6f1267344dc356cdd3e0e55e8
4
+ data.tar.gz: b8dc86a2fb80cadb1583207934840fc28fdb6177
5
5
  SHA512:
6
- metadata.gz: ed636fbce9c660540e19fcd1ce5888f144a3844ea6de0a73bbe71c7e662abaaea05033697c9d89b601849bca8b4efceb589e64e8f8e639b5fa81c48b2dd293e4
7
- data.tar.gz: 40d2677c4273a5a28bdaa40466a8546737a26725eeb26b10504939cc44ce5811e5bdaa2778e139605f8047c5fe49c0f0c9c025bd04b2e481595e8a92d3819499
6
+ metadata.gz: d11e9b0f07127be8b711495f1496e527bd979c015a0376512e916c5f92fda19fcfd617d67584c768c1c223ebd41cb57c28bbf258b39659cdd12d5db4653f4120
7
+ data.tar.gz: 8d6beddd649ec2f1316009abe70c9224de3a34d8234443a040d492066b792b79d9f3fe3771b9906949982f1f5d12ff00a4dbebd9468bda2db63941e74e34f663
data/directlink.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "directlink"
3
- spec.version = "0.0.10.0"
3
+ spec.version = "0.0.11.0"
4
4
  spec.summary = "obtains from any kind of hyperlink a link to an image, its format and resolution"
5
5
 
6
6
  spec.author = "Victor Maslov aka Nakilon"
@@ -12,9 +12,9 @@ Gem::Specification.new do |spec|
12
12
  spec.required_ruby_version = ">=2.3" # because <<~ heredocs in tests
13
13
 
14
14
  spec.add_dependency "fastimage", "~>2.2.0"
15
- spec.add_dependency "nokogiri"
15
+ spec.add_dependency "nokogiri", "<1.11" # 1.11 requires ruby 2.5
16
16
  spec.add_dependency "nethttputils", "~>0.4.1.0"
17
- spec.add_dependency "reddit_bot", "~>1.8.0"
17
+ spec.add_dependency "reddit_bot", "~>1.9.0"
18
18
  spec.add_dependency "kramdown"
19
19
  spec.add_dependency "addressable"
20
20
  spec.add_development_dependency "minitest-around"
data/lib/directlink.rb CHANGED
@@ -40,13 +40,15 @@ module DirectLink
40
40
  SocketError,
41
41
  Net::OpenTimeout,
42
42
  Errno::ECONNRESET,
43
+ Errno::ECONNREFUSED,
44
+ Errno::ETIMEDOUT, # from FastImage
43
45
  NetHTTPUtils::Error,
44
46
  NetHTTPUtils::EOFError_from_rbuf_fill,
45
47
  FastImage::UnknownImageType,
46
48
  FastImage::ImageFetchFailure,
47
49
  DirectLink::ErrorNotFound,
48
50
  DirectLink::ErrorBadLink,
49
- ] # the only exceptions gem user should expect and handle
51
+ ] # all known exceptions that can be raised while using Directlink but not as its fault
50
52
 
51
53
 
52
54
  def self.google src, width = 0
@@ -78,8 +80,11 @@ module DirectLink
78
80
  /\A(https:\/\/lh[356]\.googleusercontent\.com\/-[a-zA-Z0-9]{11}\/AAAAAAAAAAI\/AAAAAAAAAAA\/[a-zA-Z0-9_]{34}\/)s(?:46|64)-c(?:-k(?:-no)?)?-mo\/photo\.jpg\z/
79
81
  "#{$1}s#{width}/"
80
82
  # Google Keep
81
- when /\A(https:\/\/lh\d\.googleusercontent\.com\/[a-zA-Z0-9_-]{104,106}=s)\d\d\d\d?\Z/
83
+ when /\A(https:\/\/lh\d\.googleusercontent\.com\/[a-zA-Z0-9_-]{104,106}=s)\d\d\d\d?\z/
82
84
  "#{$1}#{width}"
85
+ # opensea
86
+ when /\A(https:\/\/lh3\.googleusercontent\.com\/[a-zA-Z0-9]{78}-nGx_jf_XGqqiVANe_Jr8u2g=)w1400-k\z/
87
+ "#{$1}s#{width}"
83
88
  # mp4
84
89
  when /\A(https:\/\/lh3\.googleusercontent\.com\/-[a-zA-Z]{11}\/W[a-zA-Z0-9]{9}I\/AAAAAAAAODw\/[a-zA-Z0-9]{32}QCJoC\/)w530-h883-n-k-no\/[^\/]+\.mp4\z/
85
90
  "#{$1}s#{width}/"
@@ -91,6 +96,7 @@ module DirectLink
91
96
  end
92
97
  end
93
98
 
99
+
94
100
  require "json"
95
101
 
96
102
  # TODO make the timeout handling respect the way the Directlink method works with timeouts
@@ -244,9 +250,9 @@ module DirectLink
244
250
  end
245
251
  if data["media_metadata"]
246
252
  return [true, data["media_metadata"].values.map do |media|
247
- next if media == {"status"=>"failed"}
248
- raise ErrorAssert.new "our knowledge about Reddit API seems to be outdated" unless media["status"] == "valid"
249
- [media["m"], *media["s"].values_at("x", "y"), CGI.unescapeHTML(media["s"]["u"])]
253
+ next if media == {"status"=>"failed"} || media == {"status"=>"unprocessed"}
254
+ raise ErrorAssert.new "our knowledge about Reddit API seems to be outdated (media == #{media.inspect})" unless media["status"] == "valid"
255
+ [media["m"], *media["s"].values_at("x", "y"), CGI.unescapeHTML(media["s"][media["m"]=="image/gif" ? "gif" : "u"])]
250
256
  end.compact]
251
257
  end
252
258
  return [true, "#{"https://www.reddit.com" if /\A\/r\/[0-9a-zA-Z_]+\/comments\/[0-9a-z]{5,6}\// =~ data["url"]}#{data["url"]}"] if data["crosspost_parent"]
@@ -268,7 +274,7 @@ module DirectLink
268
274
  t
269
275
  end ]
270
276
  when %r{\Ahttps://vk\.com/wall(?<id>-?\d+_\d+)\z},
271
- %r{\Ahttps://vk\.com/[a-z\.]+\?w=wall(?<id>\d+_\d+)\z}
277
+ %r{\Ahttps://vk\.com/[a-z\.]+\?w=wall(?<id>-?\d+_\d+)\z}
272
278
  [$1, :wall, :posts, lambda do |t|
273
279
  t.first.fetch("attachments").select do |item|
274
280
  case item.keys
@@ -293,7 +299,7 @@ module DirectLink
293
299
  photos.fetch("sizes").map do |size|
294
300
  size.values_at("width", "height", "url").tap do |whu|
295
301
  w, h, u = whu
296
- whu[0, 2] = FastImage.new(u, raise_on_failure: true).size if [w, h].include? 0
302
+ whu[0, 2] = FastImage.new(u, raise_on_failure: true).size if [w, h].include? 0 # wtf?
297
303
  end
298
304
  end.max_by{ |w, h, u| w * h }
299
305
  end
@@ -347,7 +353,7 @@ def DirectLink link, timeout = nil, proxy = nil, giveup: false, ignore_meta: fal
347
353
  max_start_http_retry_delay: timeout,
348
354
  max_read_retry_delay: timeout,
349
355
  } : {})
350
- rescue Net::ReadTimeout
356
+ rescue Net::ReadTimeout, Errno::ETIMEDOUT
351
357
  rescue NetHTTPUtils::Error => e
352
358
  raise unless 418 == e.code
353
359
  else
data/unit.test.rb CHANGED
@@ -4,12 +4,6 @@ require "minitest/mock"
4
4
  require "webmock/minitest"
5
5
  require_relative "webmock_patch"
6
6
 
7
- ENV["IMGUR_CLIENT_ID"] = "001788999ccdddf"
8
- ENV["FLICKR_API_KEY"] = "00123333456678889bbbbcccddddddff"
9
- ENV["REDDIT_SECRETS"] = "reddit_token.yaml"
10
- ENV["VK_ACCESS_TOKEN"] = "0011222222233334455566667777778888888888999999aaaaaaabbbbcddddddddddddddeeeeeeeffffff"
11
- ENV["VK_CLIENT_SECRET"] = "0011223445555555555566777777888999999999999aaaaaaabccddddddddeeefffffff"
12
-
13
7
  require_relative "lib/directlink"
14
8
  DirectLink.silent = true # TODO: remove?
15
9
  DirectLink.timeout = 30 # TODO: tests about this attribute
@@ -190,6 +184,7 @@ describe DirectLink do
190
184
  https://lh3.googleusercontent.com/-tV86KJvppss/XE2Nb2Z2aAI/AAAAAAAAGu4/94E_abcDE6AaJ59n43wmmd9rFa--OUuSQCJoC/w530-h338-n/IMG_6845%252C.png
191
185
  https://lh3.googleusercontent.com/-cr-2ZSQGMPg/XFWLfetwr7I/AAAAAAAAQQQ/TbwDabcDE6wb4IDDO0SwfArFSZyDG0i0wCJoC/w530-h360-n/DSC07294.JPG
192
186
  https://lh3.googleusercontent.com/-7ey25Wg_cQ4/X-Xy8LJPjMI/AAAAAAAAALE/raXQabcDE6EzEDfAg3TcsOU_xc9z4szcwCLcBGAsYHQ/w1200-h630-p-k-no-nu/1608905381407960-0.png
187
+ https://lh3.googleusercontent.com/C84udoMpvJmi95AqshlF9acaR11TCsUgO9rGB9gG1w5Wp3WpB7U52ntft4jBHAyDg2guo6zqI4KZim-nGx_jf_XGqqiVANe_Jr8u2g=w1400-k
193
188
  }.each_with_index do |link, i|
194
189
  it "largeimages ##{i + 1}" do
195
190
  assert DirectLink.google link
@@ -567,6 +562,43 @@ describe DirectLink do
567
562
  nil,
568
563
  "https://v.redd.it/abcde6fb6w721",
569
564
  ],
565
+ ["https://www.reddit.com/r/MapPorn/comments/abd123/________aaaabdeeeeeefggghhhiilmmnnoorrrssttuvyyz/",
566
+ [true, [
567
+ ["image/gif", 500, 375, "https://i.redd.it/00146fghhjkox.gif"],
568
+ ["image/jpg", 1000, 600, "https://preview.redd.it/1369aacghkswy.jpg?width=1000&format=pjpg&auto=webp&s=0122334444557777778889aaabbbbcdddddeeeef"],
569
+ ]],
570
+ false, "abd123",
571
+ nil,
572
+ nil,
573
+ "https://www.reddit.com/gallery/abd123",
574
+ {
575
+ "00146fghhjkox"=>{
576
+ "status"=>"valid",
577
+ "e"=>"AnimatedImage",
578
+ "m"=>"image/gif",
579
+ "p"=>[],
580
+ "s"=>{
581
+ "y"=>375,
582
+ "gif"=>"https://i.redd.it/00146fghhjkox.gif",
583
+ "mp4"=>"",
584
+ "x"=>500
585
+ },
586
+ "id"=>"00146fghhjkox"
587
+ },
588
+ "1369aacghkswy"=>{
589
+ "status"=>"valid",
590
+ "e"=>"Image",
591
+ "m"=>"image/jpg",
592
+ "p"=>[],
593
+ "s"=>{
594
+ "y"=>600,
595
+ "x"=>1000,
596
+ "u"=>"https://preview.redd.it/1369aacghkswy.jpg?width=1000&amp;format=pjpg&amp;auto=webp&amp;s=0122334444557777778889aaabbbbcdddddeeeef"
597
+ },
598
+ "id"=>"1369aacghkswy"
599
+ }
600
+ },
601
+ ]
570
602
  ].each_with_index do |(input, expectation, is_self, id, media, crosspost_parent, url, media_metadata), i|
571
603
  it "kinds of links" do
572
604
  unless is_self.nil?
@@ -636,6 +668,10 @@ describe DirectLink do
636
668
  [104, 130, "https://sun9-53.userapi.com/impf/c123456/v123456596/c7714/oImGe4o1ZJI.jpg?size=104x130&quality=96&sign=6ad356e84dcd6bbf2069d9b869a7bdb1&c_uniq_tag=8KN44nSlDjD-FMDiRhHqk6udwiqZfn5n1qqPNFwu_nI&type=album"],
637
669
  [1728, 2160, "https://sun9-53.userapi.com/impf/c123456/v123456596/c7714/oImGe4o1ZJI.jpg?size=1728x2160&quality=96&proxy=1&sign=c7961913ff3efd5064f2ed6c394288f2&c_uniq_tag=CA61KgCRsRXbHm4VJEYYskjpjpSiTHI7UPV4FsCPRmI&type=album"],
638
670
  ] ],
671
+ ["https://vk.com/wasserman.anatoliy?w=wall-123457771_353", [864, 1080, "https://userapi.com/impg/13456AABBCDDKKOQSTUWXZbcfghhhjlpqquwyz/z0UtQg2M1s4.jpg"], "wall", [
672
+ [104, 130, "https://sun9-38.userapi.com/impg/13456AABBCDDKKOQSTUWXZbcfghhhjlpqquwyz/z0UtQg2M1s4.jpg?size=104x130&quality=96&sign=a6012bb508e208c7b2b22c42872215e4&c_uniq_tag=qX06fI2p7bmyvnta_Pt2omQ-l5RBLcrG1DBsLWx1jJA&type=album"],
673
+ [864, 1080, "https://sun9-38.userapi.com/impg/13456AABBCDDKKOQSTUWXZbcfghhhjlpqquwyz/z0UtQg2M1s4.jpg?size=864x1080&quality=96&sign=8f02c4c6794efd653ed79609bf0850c8&c_uniq_tag=6WP6TY0RTDiG_8NK1lkYUOge22jtjkzGLLwc6IDxjjg&type=album"],
674
+ ] ],
639
675
  ].each_with_index do |(input, expectation, mtd, stub), i|
640
676
  it "kinds of links" do
641
677
  stub = {sizes: stub.map{ |w,h,u| {width: w, height: h, url: u} }}
@@ -794,6 +830,7 @@ describe DirectLink do
794
830
  assert (3 <= tries)
795
831
  assert (tries <= 4)
796
832
  end
833
+
797
834
  it "Reddit correctly parses out id when no token provided" do
798
835
  stub_request(:head, "https://www.reddit.com/r/gifs/comments/9ftc8f/")
799
836
  m = NetHTTPUtils.method :request_data
@@ -936,6 +973,16 @@ describe DirectLink do
936
973
  end
937
974
  end
938
975
  end
976
+ it "HEAD Errno::ETIMEDOUT and GET FastImage::ImageFetchFailure are handled by DirectLink::NORMAL_EXCEPTIONS" do
977
+ assert_includes DirectLink::NORMAL_EXCEPTIONS, FastImage::ImageFetchFailure
978
+ assert_raises FastImage::ImageFetchFailure do
979
+ NetHTTPUtils.stub :request_data, ->_,mtd,*{ fail unless mtd == :HEAD; raise Errno::ETIMEDOUT } do
980
+ FastImage.stub :new, ->*{ raise FastImage::ImageFetchFailure } do
981
+ DirectLink "http://www.mesacc.edu/~hello12345/hello/images/photos/aerial/a1234.jpg"
982
+ end
983
+ end
984
+ end
985
+ end
939
986
  [ # TODO this URLs may be reused from tests that check that this method calls internal method
940
987
  [:google, "//lh3.googleusercontent.com/proxy/578BDGJKLLNPTZceiikqtww_Wi2UTaQH0AC_h2kuURiu0AbwyI2ywOk2XgdAjL7ceg=w530-h354-n"],
941
988
  [:imgur, "http://imgur.com/ABCDEFG"],
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: directlink
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10.0
4
+ version: 0.0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Maslov aka Nakilon
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-02 00:00:00.000000000 Z
11
+ date: 2021-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fastimage
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "<"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '1.11'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "<"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '1.11'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: nethttputils
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.8.0
61
+ version: 1.9.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.8.0
68
+ version: 1.9.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: kramdown
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -122,7 +122,7 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
- description:
125
+ description:
126
126
  email: nakilon@gmail.com
127
127
  executables:
128
128
  - directlink
@@ -139,7 +139,7 @@ licenses:
139
139
  - MIT
140
140
  metadata:
141
141
  source_code_uri: https://github.com/nakilon/directlink
142
- post_install_message:
142
+ post_install_message:
143
143
  rdoc_options: []
144
144
  require_paths:
145
145
  - lib
@@ -156,8 +156,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - 'you may want to create apps and provide API tokens:'
158
158
  - IMGUR_CLIENT_ID, FLICKR_API_KEY, REDDIT_SECRETS
159
- rubygems_version: 3.2.0
160
- signing_key:
159
+ rubyforge_project:
160
+ rubygems_version: 2.5.2.3
161
+ signing_key:
161
162
  specification_version: 4
162
163
  summary: obtains from any kind of hyperlink a link to an image, its format and resolution
163
164
  test_files: