reddit_bot 1.7.4 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/lib/reddit_bot.rb +63 -21
  3. data/reddit_bot.gemspec +9 -13
  4. metadata +12 -74
  5. data/Gemfile +0 -5
  6. data/README.md +0 -101
  7. data/Rakefile +0 -6
  8. data/examples/.bashrc +0 -2
  9. data/examples/.gitignore +0 -2
  10. data/examples/Gemfile.lock +0 -17
  11. data/examples/boilerplate.rb +0 -12
  12. data/examples/councilofricks/Gemfile +0 -4
  13. data/examples/councilofricks/Gemfile.lock +0 -17
  14. data/examples/councilofricks/main.rb +0 -58
  15. data/examples/cptflairbot3/.bashrc +0 -1
  16. data/examples/cptflairbot3/Code.gs +0 -13
  17. data/examples/cptflairbot3/Gemfile +0 -5
  18. data/examples/cptflairbot3/Gemfile.lock +0 -74
  19. data/examples/cptflairbot3/app.js +0 -40
  20. data/examples/cptflairbot3/casual/casualpokemontrades.htm +0 -910
  21. data/examples/cptflairbot3/casual/script.js +0 -55
  22. data/examples/cptflairbot3/casual/style.css +0 -1099
  23. data/examples/cptflairbot3/log.htm +0 -1
  24. data/examples/cptflairbot3/main.rb +0 -62
  25. data/examples/cptflairbot3/package.json +0 -6
  26. data/examples/cptflairbot3/pubsub.rb +0 -30
  27. data/examples/cptflairbot3/update_gas_hook_secret.rb +0 -4
  28. data/examples/devflairbot/Gemfile +0 -6
  29. data/examples/devflairbot/Gemfile.lock +0 -74
  30. data/examples/devflairbot/main.rb +0 -81
  31. data/examples/get_dimensions.rb +0 -212
  32. data/examples/iostroubleshooting/Gemfile +0 -5
  33. data/examples/iostroubleshooting/Gemfile.lock +0 -16
  34. data/examples/iostroubleshooting/main.rb +0 -36
  35. data/examples/johnnymarr/Gemfile +0 -3
  36. data/examples/johnnymarr/Gemfile.lock +0 -17
  37. data/examples/johnnymarr/main.rb +0 -54
  38. data/examples/johnnymarr/twitter.rb +0 -80
  39. data/examples/largeimages/Gemfile +0 -11
  40. data/examples/largeimages/Gemfile.lock +0 -107
  41. data/examples/largeimages/main.rb +0 -167
  42. data/examples/largeimagesreview/Gemfile +0 -4
  43. data/examples/largeimagesreview/Gemfile.lock +0 -15
  44. data/examples/largeimagesreview/main.rb +0 -43
  45. data/examples/mlgtv/Gemfile +0 -4
  46. data/examples/mlgtv/Gemfile.lock +0 -23
  47. data/examples/mlgtv/channels.txt +0 -127
  48. data/examples/mlgtv/main.rb +0 -160
  49. data/examples/net_http_utils.rb +0 -148
  50. data/examples/oneplus/Gemfile +0 -5
  51. data/examples/oneplus/Gemfile.lock +0 -26
  52. data/examples/oneplus/main.rb +0 -43
  53. data/examples/realtimeww2/.bashrc +0 -1
  54. data/examples/realtimeww2/Gemfile +0 -3
  55. data/examples/realtimeww2/Gemfile.lock +0 -17
  56. data/examples/realtimeww2/main.rb +0 -129
  57. data/examples/sexypizza/Gemfile +0 -3
  58. data/examples/sexypizza/Gemfile.lock +0 -15
  59. data/examples/sexypizza/main.rb +0 -33
  60. data/examples/wallpaper/Gemfile +0 -5
  61. data/examples/wallpaper/Gemfile.lock +0 -33
  62. data/examples/wallpaper/main.rb +0 -27
  63. data/examples/yayornay/Gemfile +0 -3
  64. data/examples/yayornay/Gemfile.lock +0 -15
  65. data/examples/yayornay/main.rb +0 -33
  66. data/lib/reddit_bot/version.rb +0 -3
@@ -1 +0,0 @@
1
- <body style="margin: 0"><iframe style="width: 100vw; height: 100vh" src="https://docs.google.com/spreadsheets/d/1CmO0cxd4z1_37Fvo4WpPdyTqmd_HmCF_nD6PgeHuCAA/pubhtml?gid=0&amp;single=true&amp;widget=false&amp;headers=false&amp;chrome=false"></iframe></body>
@@ -1,62 +0,0 @@
1
- require_relative "../boilerplate"
2
- BOT = RedditBot::Bot.new YAML.load_file "secrets.yaml"
3
-
4
- require "gcplogger"
5
- logger = GCPLogger.logger "cptflairbot3"
6
-
7
- loop do
8
- unread = BOT.json :get, "/message/unread"
9
- unread["data"]["children"].each do |msg|
10
- next logger.info "bad destination: #{msg["data"]["dest"]}" unless msg["data"]["dest"] == "CPTFlairBot3"
11
- case msg["data"]["subject"]
12
- when "casualpokemontrades"
13
- unless /^(?<name>\S+( \S+)*) ?\n(?<id>\d\d\d\d-\d\d\d\d-\d\d\d\d)\n(?<css_class>[a-z2-]+)$/ =~ msg["data"]["body"]
14
- logger.info "invalid message for #{msg["data"]["subject"]}: %p" % msg["data"]["body"] unless Google::Cloud.env.compute_engine?
15
- # puts "marking invalid message as read: %p" % msg["data"]["body"]
16
- # BOT.json :post, "/api/read_message", {id: msg["data"]["name"]} unless Gem::Platform.local.os == "darwin"
17
- next
18
- end
19
- if name.size > 50
20
- logger.info "too large name: %p" % name unless Google::Cloud.env.compute_engine?
21
- next
22
- end
23
- begin
24
- BOT.json :post, "/r/#{msg["data"]["subject"]}/api/flair", {
25
- name: msg["data"]["author"],
26
- text: {
27
- "casualpokemontrades" => "#{id} | #{name}",
28
- "relaxedpokemontrades" => "#{name} #{id}",
29
- }[msg["data"]["subject"]],
30
- css_class: css_class,
31
- }.tap{ |h|
32
- timeout = 0
33
- begin
34
- logger.warn h.merge( {
35
- messaged_at: Time.at(msg["data"]["created_utc"]),
36
- processed_at: Time.now,
37
- } ), {
38
- subreddit: msg["data"]["subject"],
39
- }
40
- rescue Google::Cloud::UnavailableError => e
41
- logger.info "retrying in #{timeout += 1} seconds because of #{e}"
42
- sleep timeout
43
- retry
44
- end
45
- }
46
- rescue RuntimeError => e
47
- if e.to_s == "BAD_FLAIR_TARGET"
48
- logger.error "#{e.to_s}: '#{msg["data"]["author"]}'"
49
- else
50
- raise e
51
- end
52
- end
53
- BOT.json :post, "/api/read_message", {id: msg["data"]["name"]}
54
- else
55
- next logger.debug "bad subject: #{msg["data"]["subject"]}"
56
- end
57
- break # just for a case
58
- end
59
-
60
- logger.info "END LOOP #{Time.now}" unless Google::Cloud.env.compute_engine?
61
- sleep 60
62
- end
@@ -1,6 +0,0 @@
1
- {
2
- "main": "app.js",
3
- "dependencies": {
4
- "@google-cloud/storage": "^1.2.1"
5
- }
6
- }
@@ -1,30 +0,0 @@
1
- # this emulates a Pub/Sub message from a 'casualpokemontrades' Sink for a deployed Function in Emulator as
2
- # `GOOGLE_APPLICATION_CREDENTIALS="***.json" functions start`
3
- # `functions deploy casualpokemontrades --trigger-topic casualpokemontrades`
4
- # it waits for JSON payload from STDIN -- enter `{}` to use default payload sample
5
- # after that you may wanna do `tail -30 /usr/local/lib/node_modules/@google-cloud/functions-emulator/logs/cloud-functions-emulator.log`
6
- # to really deploy the Function do `gcloud beta functions deploy casualpokemontrades --stage-bucket casualpokemontrades.function.nakilon.pro --trigger-topic casualpokemontrades`
7
-
8
- require "base64"
9
- require "json"
10
-
11
- base64 = Base64.strict_encode64 JSON.dump(
12
- {
13
- "insertId"=>"dbkwdqg109zgse",
14
- "jsonPayload"=>{
15
- "css_class"=>"charizard",
16
- "messaged_at"=>"2017-08-19 10:11:57 +0300",
17
- "name"=>"nakilon",
18
- "processed_at"=>"2017-08-19 12:18:46 +0300",
19
- "text"=>"0000-0000-0000 | test"
20
- }.merge(JSON.load gets),
21
- "labels"=>{"subreddit"=>"casualpokemontrades"},
22
- "logName"=>"projects/nakilonpro/logs/cptflairbot3",
23
- "receiveTimestamp"=>"2017-08-19T09:18:47.260056855Z",
24
- "resource"=>{"labels"=>{"project_id"=>"nakilonpro"}, "type"=>"global"},
25
- "severity"=>"WARNING",
26
- "timestamp"=>"2017-08-19T09:18:46.666079Z"
27
- }
28
- )
29
-
30
- exec 'functions call casualpokemontrades --data=\'{"data":"' + base64 + '","attributes":{"logging.googleapis.com/timestamp":"2017-08-19T09:18:46.666079Z"},"@type":"type.googleapis.com/google.pubsub.v1.PubsubMessage"}\''
@@ -1,4 +0,0 @@
1
- # usage: `ruby update_gas_hook_secret.rb https://script.google.com/macros/s/.../exec`
2
-
3
- File.write "gas_hook_id.secret", ARGV[0][/.+\/([^\/]+)\//, 1]
4
- exec "gsutil cp ./gas_hook_id.secret gs://casualpokemontrades.function.nakilon.pro/"
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "reddit_bot", "~>1.6.6"
4
-
5
- gem "public_suffix", "<3.0" # Ruby 2.0
6
- gem "google-cloud-error_reporting", "~>0.27.0" # Ruby 2.0
@@ -1,74 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- addressable (2.5.2)
5
- public_suffix (>= 2.0.2, < 4.0)
6
- faraday (0.15.2)
7
- multipart-post (>= 1.2, < 3)
8
- google-cloud-core (1.2.1)
9
- google-cloud-env (~> 1.0)
10
- google-cloud-env (1.0.2)
11
- faraday (~> 0.11)
12
- google-cloud-error_reporting (0.27.0)
13
- google-cloud-core (~> 1.0)
14
- google-gax (~> 0.8.0)
15
- stackdriver-core (~> 1.2)
16
- google-gax (0.8.12)
17
- google-protobuf (~> 3.2)
18
- googleapis-common-protos (~> 1.3.5)
19
- googleauth (~> 0.5.1)
20
- grpc (~> 1.6.6)
21
- rly (~> 0.2.3)
22
- google-protobuf (3.6.0)
23
- googleapis-common-protos (1.3.7)
24
- google-protobuf (~> 3.0)
25
- googleapis-common-protos-types (~> 1.0)
26
- grpc (~> 1.0)
27
- googleapis-common-protos-types (1.0.1)
28
- google-protobuf (~> 3.0)
29
- googleauth (0.5.3)
30
- faraday (~> 0.12)
31
- jwt (~> 1.4)
32
- logging (~> 2.0)
33
- memoist (~> 0.12)
34
- multi_json (~> 1.11)
35
- os (~> 0.9)
36
- signet (~> 0.7)
37
- grpc (1.6.7)
38
- google-protobuf (~> 3.1)
39
- googleapis-common-protos-types (~> 1.0.0)
40
- googleauth (~> 0.5.1)
41
- json (2.1.0)
42
- jwt (1.5.6)
43
- little-plugger (1.1.4)
44
- logging (2.2.2)
45
- little-plugger (~> 1.1)
46
- multi_json (~> 1.10)
47
- memoist (0.16.0)
48
- multi_json (1.13.1)
49
- multipart-post (2.0.0)
50
- nethttputils (0.2.4.1)
51
- os (0.9.6)
52
- public_suffix (2.0.5)
53
- reddit_bot (1.6.6)
54
- json
55
- nethttputils (~> 0.2.4.1)
56
- rly (0.2.3)
57
- signet (0.8.1)
58
- addressable (~> 2.3)
59
- faraday (~> 0.9)
60
- jwt (>= 1.5, < 3.0)
61
- multi_json (~> 1.10)
62
- stackdriver-core (1.3.0)
63
- google-cloud-core (~> 1.2)
64
-
65
- PLATFORMS
66
- ruby
67
-
68
- DEPENDENCIES
69
- google-cloud-error_reporting (~> 0.27.0)
70
- public_suffix (< 3.0)
71
- reddit_bot (~> 1.6.6)
72
-
73
- BUNDLED WITH
74
- 1.16.1
@@ -1,81 +0,0 @@
1
- # The bot changes the post flair class with one with "dev" prefix
2
- # if there is response from someone with "developer" user flair in comments.
3
- # Seems like in current implementation it reads 10 last comments per subreddit
4
- # so it's possible to miss if bot is down for a while but in fact it's enough stable and does not go down.
5
-
6
- require_relative "../boilerplate"
7
- BOT = RedditBot::Bot.new YAML.load_file "secrets.yaml"
8
-
9
- fail("no ENV['ERROR_REPORTING_KEYFILE'] specified") unless ENV["ERROR_REPORTING_KEYFILE"]
10
- require "google/cloud/error_reporting"
11
- Google::Cloud::ErrorReporting.configure do |config|
12
- config.project_id = (JSON.load File.read ENV["ERROR_REPORTING_KEYFILE"])["project_id"]
13
- end
14
-
15
- reported = []
16
- loop do
17
- puts "LOOP #{Time.now}"
18
-
19
- moderated = BOT.json(:get, "/subreddits/mine/moderator")["data"]["children"].map do |child|
20
- fail unless child["kind"] == "t5"
21
- child["data"]["display_name"].downcase
22
- end
23
- [
24
- # ["ion", "Developer"],
25
- # ["survivetheculling", "Developer"],
26
- ["vigorgame", "Developer"],
27
- ["insurgency", "Developer"],
28
- ["Battalion1944", "Developer"],
29
- ].each do |subreddit, developer_class|
30
- subreddit.downcase!
31
- next puts "!!! can't moderate #{subreddit} !!!" unless moderated.include? subreddit
32
- puts "sub: #{subreddit}"
33
-
34
- JSON.parse( begin
35
- NetHTTPUtils.request_data "https://www.reddit.com/r/#{subreddit}/comments.json", header: ["User-Agent", "ajsdjasdasd"]
36
- rescue NetHTTPUtils::Error => e
37
- raise unless [503, 504, 500].include? e.code
38
- sleep 60
39
- retry
40
- end )["data"]["children"].each do |comment|
41
- id = comment["data"]["link_id"][3..-1]
42
- commenter_flair = comment["data"]["author_flair_css_class"]
43
- puts "flair: #{commenter_flair}" if commenter_flair
44
- next unless developer_class == commenter_flair
45
- puts "https://reddit.com/r/#{subreddit}/comments/#{id}/#{comment["data"]["id"]} '#{commenter_flair}'"
46
- flairselector = BOT.json :post, "/api/flairselector", { link: comment["data"]["link_id"] }
47
- current_flair_class = flairselector["current"]["flair_css_class"]
48
- puts "existing https://reddit.com/#{id} #{current_flair_class.inspect}"
49
- next unless target = case current_flair_class
50
- when nil then "untaggeddev"
51
- when "news" then "newsdev"
52
- when "discussion" then "discussiondev"
53
- when "media" then "mediadev"
54
- when "feedback" then "feedbackdev"
55
- when "question" then "questiondev"
56
- when "bug" then "bugdev"
57
- when "announcement" then "announcementdev"
58
- when "suggestion" then "suggestiondev"
59
- else puts "ignored https://reddit.com/#{id} #{current_flair_class.inspect}"
60
- end
61
- unless choice = flairselector["choices"].find{ |choice| choice["flair_css_class"] == target }
62
- next if reported.include? comment["data"]["link_id"]
63
- Google::Cloud::ErrorReporting.report RuntimeError.new("no '#{target}' link flair in /r/#{subreddit}").tap{ |_| _.set_backtrace caller }
64
- reported.push comment["data"]["link_id"]
65
- next
66
- end
67
- puts "assigning '#{target}' (#{choice}) flair to post https://reddit.com/#{id}"
68
- next if ENV["TEST"]
69
- _ = BOT.json :post,
70
- "/api/selectflair", {
71
- flair_template_id: choice["flair_template_id"],
72
- link: comment["data"]["link_id"],
73
- }
74
- fail _.inspect unless _ == {"json"=>{"errors"=>[]}}
75
- end
76
-
77
- end
78
-
79
- puts "END LOOP #{Time.now}"
80
- sleep 120
81
- end
@@ -1,212 +0,0 @@
1
- # TODO deprecate in favor of the gem directlink
2
-
3
- # TODO maybe activate raise_on_failure optional FastImage param
4
-
5
- require "pp"
6
- # require "json"
7
- # require "nethttputils"
8
- require "imgur2array"
9
- require "fastimage"
10
-
11
- module GetDimensions
12
- class Error404 < RuntimeError
13
- def initialize url
14
- # Module.nesting[1].logger.error url
15
- super "GetDimensions: NotFound error for #{url}"
16
- end
17
- end
18
- class ErrorUnknown < RuntimeError
19
- def initialize url
20
- # Module.nesting[1].logger.error url
21
- super "GetDimensions: fastimage can't get dimensions for unknown url #{url}"
22
- end
23
- end
24
-
25
- def self.get_dimensions url
26
- fail "env var missing -- IMGUR_CLIENT_ID" unless ENV["IMGUR_CLIENT_ID"]
27
- fail "env var missing -- FLICKR_API_KEY" unless ENV["FLICKR_API_KEY"]
28
- fail "env var missing -- _500PX_CONSUMER_KEY" unless ENV["_500PX_CONSUMER_KEY"]
29
-
30
- return :skipped if [
31
- %r{^https://www\.youtube\.com/},
32
- %r{^http://gfycat\.com/},
33
- %r{^https?://(i\.)?imgur\.com/.+\.gifv$}, # TODO: o'rly?!
34
- %r{^https?://www\.reddit\.com/},
35
- %r{^http://vimeo\.com/},
36
- ].any?{ |r| r =~ url }
37
-
38
- begin
39
- URI url
40
- rescue URI::InvalidURIError
41
- return :skipped
42
- end
43
- # return :skipped if %w{ minus com } == .host.split(?.).last(2)
44
-
45
- fi = lambda do |url|
46
- _ = FastImage.size url
47
- _ ? [*_, url] : fail
48
- end
49
- [
50
- ->_{
51
- _ = FastImage.size url
52
- [*_, url] if _
53
- },
54
- ->_{ if %w{ imgur com } == URI(_).host.split(?.).last(2)
55
- dimensions = begin
56
- Imgur::imgur_to_array _
57
- rescue Imgur::Error => e
58
- raise Error404.new _ if e.to_s.start_with? "Imgur error: bad link pattern"
59
- raise
60
- end
61
- raise Error404.new _ if !dimensions || dimensions.empty?
62
- [
63
- *dimensions.max_by{ |u, x, y, t| x * y }.take(3).rotate(1),
64
- *dimensions.map(&:first),
65
- ]
66
- end },
67
- ->_{ if %r{^https://www\.flickr\.com/photos/[^/]+/(?<id>[^/]+)} =~ _ ||
68
- %r{^https://flic\.kr/p/(?<id>[^/]+)$} =~ _
69
- json = JSON.parse NetHTTPUtils.request_data "https://api.flickr.com/services/rest/", form: {
70
- method: "flickr.photos.getSizes",
71
- api_key: ENV["FLICKR_API_KEY"],
72
- photo_id: id,
73
- format: "json",
74
- nojsoncallback: 1,
75
- }
76
- raise Error404.new _ if json == {"stat"=>"fail", "code"=>1, "message"=>"Photo not found"}
77
- if json["stat"] != "ok"
78
- fail [json, _].inspect
79
- else
80
- json["sizes"]["size"].map do |_|
81
- x, y, u = _.values_at("width", "height", "source")
82
- [x.to_i, y.to_i, u]
83
- end.max_by{ |x, y, u| x * y }
84
- end
85
- end },
86
- ->_{ if %r{https?://[^.]+.wiki[mp]edia\.org/wiki(/[^/]+)*/(?<id>File:.+)} =~ _
87
- _ = JSON.parse NetHTTPUtils.request_data "https://commons.wikimedia.org/w/api.php", form: {
88
- format: "json",
89
- action: "query",
90
- prop: "imageinfo",
91
- iiprop: "url",
92
- titles: id,
93
- }
94
- fi[_["query"]["pages"].values.first["imageinfo"].first["url"]]
95
- end },
96
- ->_{ if %r{^https://500px\.com/photo/(?<id>[^/]+)/[^/]+$} =~ _
97
- (JSON.parse NetHTTPUtils.request_data "https://api.500px.com/v1/photos/#{id}", form: {
98
- image_size: 2048,
99
- consumer_key: ENV["_500PX_CONSUMER_KEY"],
100
- } )["photo"].values_at("width", "height", "image_url")
101
- end },
102
- ->_{
103
- raise Error404.new _ if "404" == begin
104
- NetHTTPUtils.get_response _
105
- rescue SocketError => e
106
- raise Error404.new _
107
- end.code
108
- },
109
- ->_{ raise ErrorUnknown.new _ },
110
- ].lazy.map{ |_| _[url] }.find{ |_| _ }
111
- end
112
- end
113
-
114
- if $0 == __FILE__
115
- STDOUT.sync = true
116
- puts "self testing..."
117
-
118
- [
119
- ["http://minus.com/lkP3hgRJd9npi", GetDimensions::Error404],
120
- ["http://example.com", GetDimensions::ErrorUnknown],
121
- ["http://i.imgur.com/7xcxxkR.gifv", :skipped],
122
- ["http://imgur.com/HQHBBBD", [1024, 768, "https://i.imgur.com/HQHBBBD.jpg",
123
- "https://i.imgur.com/HQHBBBD.jpg"]],
124
- ["http://imgur.com/a/AdJUK", [1456, 2592, "https://i.imgur.com/Yunpxnx.jpg",
125
- "https://i.imgur.com/Yunpxnx.jpg",
126
- "https://i.imgur.com/3afw2aF.jpg",
127
- "https://i.imgur.com/2epn2nT.jpg"]],
128
- # TODO maybe we should do smth else with video -- maybe raise?
129
- ["https://imgur.com/9yaMdJq", [720, 404, "https://i.imgur.com/9yaMdJq.mp4",
130
- "https://i.imgur.com/9yaMdJq.mp4"]],
131
- ["http://imgur.com/gallery/dCQprEq/new", [5760, 3840, "https://i.imgur.com/dCQprEq.jpg",
132
- "https://i.imgur.com/dCQprEq.jpg"]],
133
- ["https://www.flickr.com/photos/tomas-/17220613278/", GetDimensions::Error404],
134
- ["https://www.flickr.com/photos/16936123@N07/18835195572", GetDimensions::Error404],
135
- ["https://www.flickr.com/photos/44133687@N00/17380073505/", [3000, 2000, "https://farm8.staticflickr.com/7757/17380073505_ed5178cc6a_o.jpg"]], # trailing slash
136
- ["https://www.flickr.com/photos/jacob_schmidt/18414267018/in/album-72157654235845651/", GetDimensions::Error404], # username in-album
137
- ["https://www.flickr.com/photos/tommygi/5291099420/in/dateposted-public/", [1600, 1062, "https://farm6.staticflickr.com/5249/5291099420_3bf8f43326_o.jpg"]], # username in-public
138
- ["https://www.flickr.com/photos/132249412@N02/18593786659/in/album-72157654521569061/", GetDimensions::Error404],
139
- ["https://www.flickr.com/photos/130019700@N03/18848891351/in/dateposted-public/", [4621, 3081, "https://farm4.staticflickr.com/3796/18848891351_f751b35aeb_o.jpg"]], # userid in-public
140
- ["https://www.flickr.com/photos/frank3/3778768209/in/photolist-6KVb92-eCDTCr-ur8K-7qbL5z-c71afh-c6YvXW-7mHG2L-c71ak9-c71aTq-c71azf-c71aq5-ur8Q-6F6YkR-eCDZsD-eCEakg-eCE6DK-4ymYku-7ubEt-51rUuc-buujQE-ur8x-9fuNu7-6uVeiK-qrmcC6-ur8D-eCEbei-eCDY9P-eCEhCk-eCE5a2-eCH457-eCHrcq-eCEdZ4-eCH6Sd-c71b5o-c71auE-eCHa8m-eCDSbz-eCH1dC-eCEg3v-7JZ4rh-9KwxYL-6KV9yR-9tUSbU-p4UKp7-eCHfwS-6KVbAH-5FrdbP-eeQ39v-eeQ1UR-4jHAGN", [1024, 681, "https://farm3.staticflickr.com/2499/3778768209_280f82abab_b.jpg"]],
141
- ["https://www.flickr.com/photos/patricksloan/18230541413/sizes/l", [2048, 491, "https://farm6.staticflickr.com/5572/18230541413_fec4783d79_k.jpg"]],
142
- ["https://flic.kr/p/vPvCWJ", [2048, 1365, "https://farm1.staticflickr.com/507/19572004110_d44d1b4ead_k.jpg"]],
143
- ["https://en.wikipedia.org/wiki/Prostitution_by_country#/media/File:Prostitution_laws_of_the_world.PNG", [1427, 628, "https://upload.wikimedia.org/wikipedia/commons/e/e8/Prostitution_laws_of_the_world.PNG"]],
144
- ["http://commons.wikimedia.org/wiki/File:Eduard_Bohlen_anagoria.jpg", [4367, 2928, "https://upload.wikimedia.org/wikipedia/commons/0/0d/Eduard_Bohlen_anagoria.jpg"]],
145
- ["https://500px.com/photo/112134597/milky-way-by-tom-hall", [4928, 2888, "https://drscdn.500px.org/photo/112134597/m%3D2048_k%3D1_a%3D1/v2?client_application_id=18857&webp=true&sig=c0d31cf9395d7849fbcce612ca9909225ec16fd293a7f460ea15d9e6a6c34257"]],
146
- ["https://i.redd.it/si758zk7r5xz.jpg", GetDimensions::Error404],
147
- ["http://www.cutehalloweencostumeideas.org/wp-content/uploads/2017/10/Niagara-Falls_04.jpg", GetDimensions::Error404],
148
- ["https://imgur.com/gallery/YO49F.", GetDimensions::Error404], # expect "Imgur error: bad link pattern"
149
- ["https://imgur.com/mM4Dh7Z", GetDimensions::Error404], # redirects to https://i.imgur.com/removed.png
150
- ].each do |input, expectation|
151
- puts "testing #{input}"
152
- if expectation.is_a? Class
153
- begin
154
- p GetDimensions::get_dimensions input
155
- fail
156
- rescue expectation
157
- end
158
- else
159
- abort "unable to inspect #{input}" unless result = GetDimensions::get_dimensions(input)
160
- abort "#{input} :: #{result.inspect} != #{expectation.inspect}" if result != expectation
161
- end
162
- end
163
-
164
- puts "OK #{__FILE__}"
165
- exit
166
- end
167
-
168
-
169
-
170
-
171
-
172
-
173
- __END__
174
-
175
- ["http://discobleach.com/wp-content/uploads/2015/06/spy-comic.png", []],
176
- ["http://spaceweathergallery.com/indiv_upload.php?upload_id=113462", []],
177
- ["http://livelymorgue.tumblr.com/post/121189724125/may-27-1956-in-an-eighth-floor-loft-of-an#notes", [0, 0]],
178
- http://mobi900.deviantart.com/art/Sea-Sunrise-Wallpaper-545266270
179
- http://mobi900.deviantart.com/art/Sunrise-Field-Wallpaper-545126742
180
-
181
-
182
- http://boxtail.deviantart.com/art/Celtic-Water-Orbs-548986856 from http://redd.it/3en92j
183
- http://imgur.com/OXCVSj7&amp;k82U3Qj#0 from http://redd.it/3ee7j1
184
-
185
- unable to size http://hubblesite.org/newscenter/archive/releases/2015/02/image/a/format/zoom/ from http://redd.it/2rhm8w
186
- unable to size http://www.deviantart.com/art/Tree-swing-437944764 from http://redd.it/3fnia2
187
-
188
- unable to size http://imgur.com/gallery/AsJ3N7x/new from http://redd.it/3fmzdg
189
-
190
-
191
-
192
-
193
-
194
- found this to be already submitted
195
- [4559, 2727] got from 3foerr: 'https://upload.wikimedia.org/wikipedia/commons/4/47/2009-09-19-helsinki-by-RalfR-062.jpg'
196
- retry download 'https://www.reddit.com/r/LargeImages/search.json?q=url%3Ahttps%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F4%2F47%2F2009-09-19-helsinki-by-RalfR-062.jpg&restrict_sr=on' in 1 seconds because of 503 Service Unavailable
197
-
198
- unable to size http://www.flickr.com/photos/dmacs_photos/12027867364/ from http://redd.it/1vqlgk
199
- unable to size https://dl.dropboxusercontent.com/u/52357713/16k.png from http://redd.it/1vomwy
200
-
201
- unable to size http://www.flickr.com/photos/dmacs_photos/12027867364/ from http://redd.it/1vqlgk
202
- unable to size https://dl.dropboxusercontent.com/u/52357713/16k.png from http://redd.it/1vomwy
203
-
204
- unable http://imgur.com/r/wallpaper/rZ37ZYN from http://redd.it/3knh3g
205
-
206
- unable http://www.flickr.com/photos/dmacs_photos/12027867364/ from http://redd.it/1vqlgk
207
-
208
-
209
- unable http://imgur.com/gallery/jm0OKQM from http://redd.it/3ukg4t
210
- unable http://imgur.com/gallery/oZXfZ from http://redd.it/3ulz2i
211
-
212
-