piwigo-api 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f8aaa98dc9734ed3044e993de4bd3d2c5fc216b5fdc484e0085aff689c95021
4
- data.tar.gz: b1368c6b9d0ad50c5dd7970e1b924962f263add8822a141b2e0d041a4c155dfe
3
+ metadata.gz: 7b631bbf1feb2e43cdc914db7f8ae0e839739951a99bbf00d1789c65f64524d1
4
+ data.tar.gz: 460e4d390cc2362865f0b9f168bd821f0b0451599daceaa8afaceca137ebc71e
5
5
  SHA512:
6
- metadata.gz: bffedcebc720217299770d4a615e8f19b9b95a351ca63e3e0f5d49ad12ba0b31088444ca102ab935fca037ec2b1021f9800b417903104b38f3904bfebe2d810d
7
- data.tar.gz: 002a39a2d6dfd7d4dd9d5baf931ed32a79f58f582935d43a385f0e15f2ac664372257f1dadd8397f68184f73fa63880bad90f20de19657f97ce3b9fc74a852d8
6
+ metadata.gz: 68fe0e10a5ccfc1522b8fdef5c0f964e7702ff0d676282d406aa811d5f39bf29fb4893be125a8143ce9033f077043c3277fc6d871c23374060bab506bac687b3
7
+ data.tar.gz: 9e42d435b2c00cd85db2ebc2d77511497f9f7ba7ec7d2deb7b1e61d08434566a31d844fa80a864a2bbe92431fb81bbc545eaa1277c4eb51518ee650b8ac83549
data/.gitignore CHANGED
@@ -8,3 +8,4 @@
8
8
  /tmp/
9
9
  *.gem
10
10
  main.rb
11
+ settings.json
data/.rubocop.yaml ADDED
@@ -0,0 +1,18 @@
1
+ Style/Encoding:
2
+ Enabled: false
3
+
4
+ Metrics/LineLength:
5
+ Max: 200
6
+
7
+ Metrics/CyclomaticComplexity:
8
+ Max: 15
9
+
10
+ Metrics/AbcSize:
11
+ Max: 40
12
+
13
+ Metrics/MethodLength:
14
+ Max: 40
15
+
16
+ AllCops:
17
+ Exclude:
18
+ - 'tests/*.rb'
data/CHANGELOG.md CHANGED
@@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ 0.4.0 - 2019-11-20
8
+ - Add methods to check for the existance of a specific image and to upload images
9
+
7
10
  0.3.1 - 2019-11-20
8
11
  - Add a codecov.yaml for coverage reports
9
12
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- piwigo-api (0.2.0)
4
+ piwigo-api (0.4.0)
5
5
  http (~> 4.2)
6
6
  logger (~> 1.4)
7
7
 
@@ -10,6 +10,11 @@ GEM
10
10
  specs:
11
11
  addressable (2.7.0)
12
12
  public_suffix (>= 2.0.2, < 5.0)
13
+ codecov (0.1.16)
14
+ json
15
+ simplecov
16
+ url
17
+ docile (1.3.2)
13
18
  domain_name (0.5.20190701)
14
19
  unf (>= 0.0.5, < 1.0.0)
15
20
  ffi (1.11.2-x64-mingw32)
@@ -26,13 +31,20 @@ GEM
26
31
  http-form_data (2.1.1)
27
32
  http-parser (1.2.1)
28
33
  ffi-compiler (>= 1.0, < 2.0)
34
+ json (2.2.0)
29
35
  logger (1.4.1)
30
36
  minitest (5.13.0)
31
37
  public_suffix (4.0.1)
32
38
  rake (10.5.0)
39
+ simplecov (0.17.1)
40
+ docile (~> 1.1)
41
+ json (>= 1.8, < 3)
42
+ simplecov-html (~> 0.10.0)
43
+ simplecov-html (0.10.2)
33
44
  unf (0.1.4)
34
45
  unf_ext
35
46
  unf_ext (0.0.7.6)
47
+ url (0.3.2)
36
48
 
37
49
  PLATFORMS
38
50
  ruby
@@ -40,6 +52,7 @@ PLATFORMS
40
52
 
41
53
  DEPENDENCIES
42
54
  bundler (~> 2.0)
55
+ codecov (>= 0.1.10)
43
56
  minitest (~> 5.0)
44
57
  piwigo-api!
45
58
  rake (~> 10.0)
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Piwigo-API
2
2
 
3
- ![](https://github.com/kkdad/piwigo-api/workflows/Ruby/badge.svg) ![](https://github.com/kkdad/piwigo-api/workflows/Ruby%20Gem/badge.svg) [![Gem Version](https://badge.fury.io/rb/piwigo-api.svg)](https://badge.fury.io/rb/piwigo-api)
3
+ ![](https://github.com/kkdad/piwigo-api/workflows/Ruby/badge.svg) [![codecov](https://codecov.io/gh/KKDad/piwigo-api/branch/master/graph/badge.svg)](https://codecov.io/gh/KKDad/piwigo-api) ![](https://github.com/kkdad/piwigo-api/workflows/Ruby%20Gem/badge.svg) [![Gem Version](https://badge.fury.io/rb/piwigo-api.svg)](https://badge.fury.io/rb/piwigo-api)
4
4
 
5
5
  [Piwigo](https://piwigo.org/) is open source web application to manage your collection of photos, and other medias. Piwigo provides an API for interacting with it.
6
6
 
@@ -24,9 +24,9 @@ Or install it yourself as:
24
24
 
25
25
  ## Usage
26
26
 
27
- Just include 'piwigo/session' and the related classes, then querying Piwigo is fairly quick and straightforward.
27
+ Just include 'piwigo/session' and the related classes, then querying Piwigo is fairly quick and straightforward. The latest RubyDocs for [piwigo-api](https://rubydoc.info/github/KKDad/piwigo-api) can be loacated on [rubydoc.info](https://rubydoc.info).
28
28
 
29
- # Get the second album and all of it's children
29
+ ### Get the second album and all of it's children
30
30
 
31
31
  ```ruby
32
32
  require 'piwigo/session'
@@ -39,7 +39,7 @@ unless session.nil?
39
39
  end
40
40
  ```
41
41
 
42
- # Add a new album
42
+ ### Add a new album
43
43
  ```ruby
44
44
  require 'piwigo/session'
45
45
  require 'piwigo/albums'
@@ -52,7 +52,7 @@ unless session.nil?
52
52
  end
53
53
  ```
54
54
 
55
- # List the Contents of an Album
55
+ ### List the Contents of an Album
56
56
 
57
57
  ```ruby
58
58
  require 'piwigo/session'
@@ -61,7 +61,6 @@ require 'piwigo/images'
61
61
  session = Piwigo::Session.login('mypiwigo.fqdn', 'Adrian', 'mypassword', https: false)
62
62
  unless session.nil?
63
63
  results = Piwigo::Images.getImages(session, album_id: 4)
64
-
65
64
  results[:images].each { |image| p "#{image.id}, #{image.name} - #{image.element_url}" }
66
65
  end
67
66
  ```
data/Rakefile CHANGED
@@ -1,10 +1,10 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
3
 
4
4
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
5
+ t.libs << 'test'
6
+ t.libs << 'lib'
7
+ t.test_files = FileList['test/**/*_test.rb']
8
8
  end
9
9
 
10
- task :default => :test
10
+ task default: :test
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "piwigo"
3
+ require 'bundler/setup'
4
+ require 'piwigo'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +10,5 @@ require "piwigo"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ require 'irb'
14
14
  IRB.start(__FILE__)
data/lib/piwigo/albums.rb CHANGED
@@ -6,180 +6,171 @@ require 'logger'
6
6
  # Piwigo organizes images by albums. The album tree has unlimted depth and each photo can belong to multiple albums. The Piwigo API
7
7
  # refers to a Album as a Category.
8
8
  module Piwigo
9
- class Albums
10
- class Album
11
- # @return [Number] Album ID
12
- attr_accessor :id
9
+ class Albums
10
+ class Album
11
+ # @return [Number] Album ID
12
+ attr_accessor :id
13
13
 
14
- # @return [String] Name of the Album
15
- attr_accessor :name
14
+ # @return [String] Name of the Album
15
+ attr_accessor :name
16
16
 
17
- # @return [String] Album Description
18
- attr_accessor :comment
17
+ # @return [String] Album Description
18
+ attr_accessor :comment
19
19
 
20
- # ???
21
- attr_accessor :permalink
20
+ # ???
21
+ attr_accessor :permalink
22
22
 
23
- # @return [String] public or private
24
- attr_accessor :status
23
+ # @return [String] public or private
24
+ attr_accessor :status
25
25
 
26
- # ???
27
- attr_accessor :uppercats
26
+ # ???
27
+ attr_accessor :uppercats
28
28
 
29
- # The rank of an album
30
- attr_accessor :global_rank
29
+ # The rank of an album
30
+ attr_accessor :global_rank
31
31
 
32
- # @return [Number] ID of the parent album, nil of this is a top-level album (Aka ParentID)
33
- attr_accessor :id_uppercat
32
+ # @return [Number] ID of the parent album, nil of this is a top-level album (Aka ParentID)
33
+ attr_accessor :id_uppercat
34
34
 
35
- # @return [Number] Number of the Newest photos, excluding child albums
36
- attr_accessor :nb_images
35
+ # @return [Number] Number of the Newest photos, excluding child albums
36
+ attr_accessor :nb_images
37
37
 
38
- # @return [Number] Number of the Newest photos, including child albums
39
- attr_accessor :total_nb_images
38
+ # @return [Number] Number of the Newest photos, including child albums
39
+ attr_accessor :total_nb_images
40
40
 
41
- # ID of the representative photo for an album. This photo doesn't have to belong to the album.
42
- attr_accessor :representative_picture_id
41
+ # ID of the representative photo for an album. This photo doesn't have to belong to the album.
42
+ attr_accessor :representative_picture_id
43
43
 
44
- # @return [DateTime] Date of the Newest photos, excluding child albums
45
- attr_accessor :date_last
44
+ # @return [DateTime] Date of the Newest photos, excluding child albums
45
+ attr_accessor :date_last
46
46
 
47
- # @return [DateTime] Date of the Newest photos, including child albums
48
- attr_accessor :max_date_last
47
+ # @return [DateTime] Date of the Newest photos, including child albums
48
+ attr_accessor :max_date_last
49
49
 
50
- # @return [Number] Number of child albums inside this album
51
- attr_accessor :nb_categories
50
+ # @return [Number] Number of child albums inside this album
51
+ attr_accessor :nb_categories
52
52
 
53
- # @return [Atring] Album URL
54
- attr_accessor :url
53
+ # @return [Atring] Album URL
54
+ attr_accessor :url
55
55
 
56
- # @return [String] Thumbnail URL
57
- attr_accessor :tn_url
56
+ # @return [String] Thumbnail URL
57
+ attr_accessor :tn_url
58
58
 
59
- def initialize(hash: nil)
60
- hash.each { |key, value| send("#{key}=", value) } unless hash.nil?
61
- end
59
+ def initialize(hash: nil)
60
+ hash&.each { |key, value| send("#{key}=", value) }
61
+ end
62
+ end
63
+
64
+ # Returns a list of albums
65
+ #
66
+ # @param [Session] session - Session
67
+ # @param [Number] album_id - Album to fetch, Optional
68
+ # @param [Boolean] recursive - Include subalbums, Optional
69
+ # @param [Boolean] public - Only include public albums, Optional
70
+ # @param [Boolean] fullname - ???, Optional
71
+ # @param [String] thumbnail_size - Size of thumbname to return, One of: square, thumb, 2small, xsmall, small, medium, large, xlarge, xxlarge. Optional
72
+ # @param [Logger] logger logger to output debug messages to (Optional)
73
+ #
74
+ # @return [Array<Album>] All albums that match the criteria, or nil there were no matches
75
+ def self.list(session, album_id: nil, recursive: false, public: false, fullname: false, thumbnail_size: 'thumb', logger: nil)
76
+ raise 'Invalid session' if session.uri.nil?
77
+
78
+ logger ||= Logger.new(STDOUT)
79
+
80
+ begin
81
+ http = Net::HTTP.new(session.uri.host, session.uri.port)
82
+ request = Net::HTTP::Post.new(session.uri.request_uri)
83
+ request.body = "method=pwg.categories.getList&cat_id=#{album_id}&recursive=#{recursive}&public=#{public}&fullname=#{fullname}&thumbnail_size=#{thumbnail_size}"
84
+ request['Cookie'] = [session.id]
85
+
86
+ # Send the request
87
+ response = http.request(request)
88
+ if response.code == '200'
89
+ data = JSON.parse(response.body)
90
+ albums = data['result']['categories'].map { |hash| Album.new(hash: hash) }
91
+ logger.info "Album List succeeded: #{albums.size} albums retrieved."
92
+ albums
62
93
  end
63
-
64
-
65
- # Returns a list of albums
66
- #
67
- # @param [Session] session - Session
68
- # @param [Number] album_id - Album to fetch, Optional
69
- # @param [Boolean] recursive - Include subalbums, Optional
70
- # @param [Boolean] public - Only include public albums, Optional
71
- # @param [Boolean] fullname - ???, Optional
72
- # @param [String] thumbnail_size - Size of thumbname to return, One of: square, thumb, 2small, xsmall, small, medium, large, xlarge, xxlarge. Optional
73
- # @param [Logger] logger logger to output debug messages to (Optional)
74
- #
75
- # @return [Array<Album>] All albums that match the criteria, or nil there were no matches
76
- #
77
- def self.list(session, album_id: nil, recursive: false, public: false, fullname: false, thumbnail_size: 'thumb', logger: nil)
78
- raise "Invalid session" if session.uri.nil?
79
- logger = logger || Logger.new(STDOUT)
80
-
81
-
82
- begin
83
- http = Net::HTTP.new(session.uri.host, session.uri.port)
84
- request = Net::HTTP::Post.new(session.uri.request_uri)
85
- request.body = "method=pwg.categories.getList&cat_id=#{album_id}&recursive=#{recursive}&public=#{public}&fullname=#{fullname}&thumbnail_size=#{thumbnail_size}"
86
- request['Cookie'] = [session.id]
87
-
88
- # Send the request
89
- response = http.request(request)
90
- if response.code == '200'
91
- data = JSON.parse(response.body)
92
- albums = data['result']['categories'].map{ |hash| Album.new(hash: hash) }
93
- logger.info "Album List succeeded: #{albums.size} albums retrieved."
94
- albums
95
- else
96
- nil
97
- end
98
- rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
99
- logger.error "Album List failed: #{e.messages}"
100
- nil
101
- end
94
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
95
+ logger.error "Album List failed: #{e.messages}"
96
+ nil
97
+ end
98
+ end
99
+
100
+ # Adds an album.
101
+ #
102
+ # @param [Session] session to interact with Piwigo
103
+ # @param [Album] album album to create
104
+ # @param [Logger] logger logger to output debug messages to (Optional)
105
+ #
106
+ # @return [Album] newly created album
107
+ def self.add(session, album, logger: nil)
108
+ raise 'Invalid session' if session.uri.nil?
109
+ raise 'Invalid album' if album.nil?
110
+
111
+ logger ||= Logger.new(STDOUT)
112
+
113
+ begin
114
+ http = Net::HTTP.new(session.uri.host, session.uri.port)
115
+ request = Net::HTTP::Post.new(session.uri.request_uri)
116
+ request.body = "method=pwg.categories.add&name=#{album.name}"
117
+ request.body.concat "&parent=#{album.id_uppercat}" unless album.id_uppercat.nil?
118
+ request.body.concat "&comment=#{album.comment}" unless album.comment.nil?
119
+ request.body.concat "&status=#{album.status}" unless album.status.nil?
120
+ request['Cookie'] = [session.id]
121
+
122
+ # Send the request
123
+ response = http.request(request)
124
+ if response.code == '200'
125
+ data = JSON.parse(response.body)
126
+ album.id = data['result']['id']
127
+ logger.info "Album Add succeeded: #{album.id} created."
128
+ album
102
129
  end
130
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
131
+ logger.error "Album Add failed: #{e.messages}"
132
+ nil
133
+ end
134
+ end
103
135
 
136
+ # Deletes album(s).
137
+ #
138
+ # @param [Session] piwigo session
139
+ # @param [Number] id of the album to remove
140
+ # @param [String] photo_deletion_mode can be "no_delete" (may create orphan photos), "delete_orphans" (default mode, only deletes photos linked to no other album)
141
+ # or "force_delete" (delete all photos, even those linked to other albums)
142
+ # @param [Logger] logger logger to output debug messages to (Optional)
143
+ #
144
+ # @return [Boolean] true if album was deleted
145
+ def self.delete(session, id, photo_deletion_mode: nil, logger: nil)
146
+ raise 'Invalid session' if session.uri.nil?
147
+
148
+ logger ||= Logger.new(STDOUT)
149
+
150
+ begin
151
+ http = Net::HTTP.new(session.uri.host, session.uri.port)
152
+ request = Net::HTTP::Post.new(session.uri.request_uri)
153
+ request.body = "method=pwg.categories.delete&category_id=#{id}"
154
+ request.body.concat "&photo_deletion_mode=#{photo_deletion_mode}" unless photo_deletion_mode.nil?
155
+ request.body.concat "&pwg_token=#{session.pwg_token}"
156
+ request['Cookie'] = [session.id]
157
+
158
+ # Send the request
159
+ response = http.request(request)
160
+ if response.code == '200'
161
+ data = JSON.parse(response.body)
162
+ logger.info "Album Delete succeeded: #{data}"
163
+ true
164
+ else
165
+ p response.code
166
+ p response.body
167
+ false
104
168
 
105
- # Adds an album.
106
- #
107
- # @param [Session] session to interact with Piwigo
108
- # @param [Album] album album to create
109
- # @param [Logger] logger logger to output debug messages to (Optional)
110
- #
111
- # @return [Album] newly created album
112
- def self.add(session, album, logger: nil)
113
- raise "Invalid session" if session.uri.nil?
114
- raise "Invalid album" if album.nil?
115
-
116
- logger = logger || Logger.new(STDOUT)
117
-
118
- begin
119
- http = Net::HTTP.new(session.uri.host, session.uri.port)
120
- request = Net::HTTP::Post.new(session.uri.request_uri)
121
- request.body = "method=pwg.categories.add&name=#{album.name}"
122
- request.body.concat "&parent=#{album.id_uppercat}" unless album.id_uppercat.nil?
123
- request.body.concat "&comment=#{album.comment}" unless album.comment.nil?
124
- request.body.concat "&status=#{album.status}" unless album.status.nil?
125
- request['Cookie'] = [session.id]
126
-
127
- # Send the request
128
- response = http.request(request)
129
- if response.code == '200'
130
- data = JSON.parse(response.body)
131
- album.id = albums = data['result']['id']
132
- logger.info "Album Add succeeded: #{album.id} created."
133
- album
134
- else
135
- nil
136
-
137
- end
138
- rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
139
- logger.error "Album Add failed: #{e.messages}"
140
- nil
141
- end
142
- end
143
-
144
-
145
- # Deletes album(s).
146
- #
147
- # @param [Session] piwigo session
148
- # @param [Number] id of the album to remove
149
- # @param [String] photo_deletion_mode can be "no_delete" (may create orphan photos), "delete_orphans" (default mode, only deletes photos linked to no other album)
150
- # or "force_delete" (delete all photos, even those linked to other albums)
151
- # @param [Logger] logger logger to output debug messages to (Optional)
152
- #
153
- # @return [Boolean] true if album was deleted
154
- def self.delete(session, id, photo_deletion_mode: nil, logger: nil)
155
- raise "Invalid session" if session.uri.nil?
156
-
157
- logger = logger || Logger.new(STDOUT)
158
-
159
- begin
160
- http = Net::HTTP.new(session.uri.host, session.uri.port)
161
- request = Net::HTTP::Post.new(session.uri.request_uri)
162
- request.body = "method=pwg.categories.delete&category_id=#{id}"
163
- request.body.concat "&photo_deletion_mode=#{photo_deletion_mode}" unless photo_deletion_mode.nil?
164
- request.body.concat "&pwg_token=#{session.pwg_token}"
165
- request['Cookie'] = [session.id]
166
-
167
- # Send the request
168
- response = http.request(request)
169
- if response.code == '200'
170
- data = JSON.parse(response.body)
171
- logger.info "Album Delete succeeded."
172
- true
173
- else
174
- p response.code
175
- p response.body
176
- false
177
-
178
- end
179
- rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
180
- logger.error "Album delete: #{e.messages}"
181
- false
182
- end
183
- end
169
+ end
170
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
171
+ logger.error "Album delete: #{e.messages}"
172
+ false
173
+ end
184
174
  end
185
- end
175
+ end
176
+ end
@@ -0,0 +1,142 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+ require 'json'
4
+ require 'logger'
5
+ require 'digest'
6
+ require 'base64'
7
+
8
+ # Add a photo.
9
+ #
10
+ # To avoid limitations on HTTP POST maximum size, the piwigo requires the image to be splitted into several calls to pwg.images.addChunk
11
+ # and then a single call to pwg.images.add.
12
+ #
13
+ # Reference: https://piwigo.org/doc/doku.php?id=dev:webapi:pwg.images.add
14
+ module Piwigo
15
+ class Images
16
+ class ImageUploader
17
+ MEGABYTE = 1024 * 1024
18
+
19
+ # Create a new ImageUploader
20
+ #
21
+ # @param [Session] session - session to a piwigo instance
22
+ def initialize(logger: nil)
23
+ @logger = logger || Logger.new(STDOUT)
24
+ end
25
+
26
+ # Add a photo to Piwigo
27
+ #
28
+ # @param [<Type>] session
29
+ # @param [<Type>] filename of the file to upload
30
+ # @param [<Type>] name of the image
31
+ #
32
+ # @return [Boolean] True if successful
33
+ def Upload(session, filename, name)
34
+ @session = session
35
+ raise 'Invalid session' if @session.uri.nil?
36
+
37
+ unless File.exist? filename
38
+ @Logger.error "No such file: #{filename}"
39
+ return false
40
+ end
41
+ chunk_num = 0
42
+ image_content = File.binread(filename)
43
+ original_sum = Digest::MD5.hexdigest(image_content)
44
+ encoded_content = Base64.encode64(image_content)
45
+ io = StringIO.new(encoded_content)
46
+ until io.eof?
47
+ chunk = io.read(MEGABYTE)
48
+ addChunk(chunk, original_sum, chunk_num)
49
+ chunk_num += 1
50
+ end
51
+ add(original_sum, filename, name)
52
+ end
53
+
54
+ private
55
+
56
+ # Add a chunk of a file.
57
+ #
58
+ # @param [String] data - substring of the base64 encoded binary file
59
+ # @param [String] original_sum - md5sum of the original photo, used as a unique identifier, not to check the chunk upload
60
+ # @param [Number] position - the numeric position of the chunk among all chunks of the given file
61
+ #
62
+ # @return [Boolean] true if successful
63
+ def addChunk(data, original_sum, position)
64
+ http = Net::HTTP.new(@session.uri.host, @session.uri.port)
65
+ request = Net::HTTP::Post.new(@session.uri.request_uri)
66
+ form = {
67
+ method: 'pwg.images.addChunk',
68
+ original_sum: original_sum,
69
+ position: position,
70
+ data: data
71
+ }
72
+ request.set_form_data(form)
73
+ request['Cookie'] = [@session.id]
74
+
75
+ response = http.request(request)
76
+ if response.code == '200'
77
+ data = JSON.parse(response.body)
78
+ @logger.info "Image AddChunk ##{position} succeeded: #{data}"
79
+ true
80
+ else
81
+ false
82
+ end
83
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
84
+ @logger.error "Image AddChunk failed: #{e.messages}"
85
+ false
86
+ end
87
+
88
+ # Add an image. Pwg.images.addChunk must have been called before (maybe several times).
89
+ #
90
+ # @param [<Type>] original_sum - md5sum that makes the photo unique
91
+ # @param [<Type>] original_filename
92
+ # @param [<Type>] name
93
+ # @param [<Type>] author
94
+ # @param [Number] level - 0 (—-), 1 (Contacts), 2 (Friends), 4 (Family), 8 (Admins)
95
+ # @param [String] date_creation - formatted as 2009-03-26
96
+ # @param [<Type>] comment -
97
+ # @param [<Type>] categories - list of category identifiers where you want the photo to be shown. Optionaly, you can set a rank inside the each category.
98
+ # Example : '19,3;16,0;134' will associate the photo to category 19 at rank 3, to category 16 at rank 0 (first position) and
99
+ # to category 134 with an automatic rank (last position).
100
+ # @param [<Type>] image_id - give an image_id if you want to update an existing photo
101
+ #
102
+ # @return [Boolean] True if successful
103
+ def add(original_sum, original_filename, name, author: nil, level: nil, date_creation: nil, comment: nil, categories: nil, image_id: nil)
104
+
105
+ http = Net::HTTP.new(@session.uri.host, @session.uri.port)
106
+ request = Net::HTTP::Post.new(@session.uri.request_uri)
107
+ form = {
108
+ method: 'pwg.images.add',
109
+ original_sum: original_sum,
110
+ original_filename: original_filename,
111
+ name: name
112
+ }
113
+
114
+ form[:author] = author unless author.nil?
115
+ form[:level] = level unless level.nil?
116
+ form[:date_creation] = date_creation unless date_creation.nil?
117
+ form[:comment] = comment unless comment.nil?
118
+ form[:categories] = categories unless categories.nil?
119
+ form[:image_id] = image_id unless image_id.nil?
120
+ request.set_form_data(form)
121
+
122
+ request['Cookie'] = [@session.id]
123
+
124
+ response = http.request(request)
125
+ if response.code == '500'
126
+ @logger.error "Image Add failed: #{response.messages}"
127
+ false
128
+ elsif response.code == '200'
129
+ data = JSON.parse(response.body)
130
+ p data
131
+ @logger.info 'Image Add succeeded.'
132
+ true
133
+ else
134
+ false
135
+ end
136
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
137
+ @logger.error "Image Add failed: #{e.messages}"
138
+ false
139
+ end
140
+ end
141
+ end
142
+ end
data/lib/piwigo/images.rb CHANGED
@@ -1,117 +1,170 @@
1
+ require 'base64'
1
2
  require 'net/http'
2
3
  require 'uri'
3
4
  require 'json'
4
5
  require 'logger'
6
+ require 'digest'
7
+ require_relative 'image_uploader'
5
8
 
6
9
  # Piwigo organizes images by albums. The album tree has unlimted depth and each photo can belong to multiple albums. The Piwigo API
7
10
  # refers to a Album as a Category.
8
11
  module Piwigo
9
- class Images
10
- class Image
11
- # @return [Number] Unique ID idenifying this ie
12
- attr_accessor :id
12
+ class Images
13
+ class Image
14
+ # @return [Number] Unique ID idenifying this ie
15
+ attr_accessor :id
13
16
 
14
- # @return [Number] Width of the image in pixels
15
- attr_accessor :width
17
+ # @return [Number] Width of the image in pixels
18
+ attr_accessor :width
16
19
 
17
- # @return [Number] Height of the image in pixels
18
- attr_accessor :height
20
+ # @return [Number] Height of the image in pixels
21
+ attr_accessor :height
19
22
 
20
- # @return [Number] Number of times the image has been viewed
21
- attr_accessor :hit
23
+ # @return [Number] Number of times the image has been viewed
24
+ attr_accessor :hit
22
25
 
23
- # @return [String] Filename for the image
24
- attr_accessor :file
26
+ # @return [String] Filename for the image
27
+ attr_accessor :file
25
28
 
26
- # @return [String] Name of the image
27
- attr_accessor :name
29
+ # @return [String] Name of the image
30
+ attr_accessor :name
28
31
 
29
- # @return [String] Comments about the image
30
- attr_accessor :comment
32
+ # @return [String] Comments about the image
33
+ attr_accessor :comment
31
34
 
32
- # @return [DateTime] DateTime when the image was taken
33
- attr_accessor :date_creation
35
+ # @return [DateTime] DateTime when the image was taken
36
+ attr_accessor :date_creation
34
37
 
35
- # @return [DateTime] DateTime when the image was uploaded to Piwigo
36
- attr_accessor :date_available
38
+ # @return [DateTime] DateTime when the image was uploaded to Piwigo
39
+ attr_accessor :date_available
37
40
 
38
- # @return [String] URL to the image page
39
- attr_accessor :page_url
41
+ # @return [String] URL to the image page
42
+ attr_accessor :page_url
40
43
 
41
- # @return [String] URL to the image itself
42
- attr_accessor :element_url
44
+ # @return [String] URL to the image itself
45
+ attr_accessor :element_url
43
46
 
44
- # @return [Array<String>] Links to different sizes of the image
45
- attr_accessor :derivatives
47
+ # @return [Array<String>] Links to different sizes of the image
48
+ attr_accessor :derivatives
46
49
 
47
- # @return [<Type>] List of all of the Albums this image is in
48
- attr_accessor :categories
50
+ # @return [<Type>] List of all of the Albums this image is in
51
+ attr_accessor :categories
49
52
 
50
- def initialize(hash: nil)
51
- hash.each { |key, value| send("#{key}=", value) } unless hash.nil?
52
- end
53
- end
53
+ def initialize(hash: nil)
54
+ hash&.each { |key, value| send("#{key}=", value) }
55
+ end
56
+ end
57
+
58
+ class Paging # rubocop:todo Style/Documentation
59
+ # @return [Number] Page number of the results
60
+ attr_accessor :page
54
61
 
55
- class Paging
56
- # @return [Number] Page number of the results
57
- attr_accessor :page
62
+ # @return [Number] Number of images requesed per page
63
+ attr_accessor :per_page
58
64
 
59
- # @return [Number] Number of images requesed per page
60
- attr_accessor :per_page
65
+ # @return [Number] Number of Images on this page. When this is less then the number per page, then there are no more results.
66
+ attr_accessor :count
61
67
 
62
- # @return [Number] Number of Images on this page. When this is less then the number per page, then there are no more results.
63
- attr_accessor :count
64
-
65
- # @return [Number] Total number of images across all pages
66
- attr_accessor :total_count
68
+ # @return [Number] Total number of images across all pages
69
+ attr_accessor :total_count
70
+
71
+ def initialize(hash: nil)
72
+ hash&.each { |key, value| send("#{key}=", value) }
73
+ end
74
+ end
67
75
 
68
- def initialize(hash: nil)
69
- hash.each { |key, value| send("#{key}=", value) } unless hash.nil?
70
- end
76
+ # Returns elements for the corresponding categories.
77
+ # order comma separated fields for sorting
78
+ #
79
+ # @param [Session] session
80
+ # @param [Number] album_id - Can be empty if recursive is true.
81
+ # @param [Boolean] recursive - Include images from child albums
82
+ # @param [Number] per_page - Number of items to include per page
83
+ # @param [Number] page - Page to retrieve
84
+ # @param [String] order - One or more of id, file, name, hit, rating_score, date_creation, date_available or random
85
+ # @param [Logger] logger logger to output debug messages to (Optional)
86
+ #
87
+ # @return [Hash] <description>
88
+ def self.getImages(session, album_id: nil, recursive: nil, per_page: 100, page: 0, order: nil, logger: nil)
89
+ raise 'Invalid session' if session.uri.nil?
90
+
91
+ logger ||= Logger.new(STDOUT)
92
+
93
+ begin
94
+ http = Net::HTTP.new(session.uri.host, session.uri.port)
95
+ request = Net::HTTP::Post.new(session.uri.request_uri)
96
+ form = {
97
+ method: 'pwg.categories.getImages'
98
+ }
99
+ form[:cat_id] = album_id unless album_id.nil?
100
+ form[:recursive] = recursive unless recursive.nil?
101
+ form[:per_page] = per_page unless per_page.nil?
102
+ form[:order] = order unless order.nil?
103
+ request.set_form_data(form)
104
+ request['Cookie'] = [session.id]
105
+
106
+ # Send the request
107
+ response = http.request(request)
108
+ if response.code == '200'
109
+ data = JSON.parse(response.body)
110
+ paging = Paging.new hash: data['result']['paging']
111
+ images = data['result']['images'].map { |hash| Image.new(hash: hash) }
112
+ logger.info "Image List succeeded: #{images.size} images retrieved."
113
+ { paging: paging, images: images }
71
114
  end
72
-
73
- # Returns elements for the corresponding categories.
74
- # order comma separated fields for sorting
75
- #
76
- # @param [Session] session
77
- # @param [Number] album_id - Can be empty if recursive is true.
78
- # @param [Boolean] recursive - Include images from child albums
79
- # @param [Number] per_page - Number of items to include per page
80
- # @param [Number] page - Page to retrieve
81
- # @param [String] order - One or more of id, file, name, hit, rating_score, date_creation, date_available or random
82
- # @param [Logger] logger logger to output debug messages to (Optional)
83
- #
84
- # @return [Hash] <description>
85
- def self.getImages(session, album_id: nil, recursive: nil, per_page: 100, page: 0, order: nil, logger: nil)
86
- raise "Invalid session" if session.uri.nil?
87
- logger = logger || Logger.new(STDOUT)
88
-
89
- begin
90
- http = Net::HTTP.new(session.uri.host, session.uri.port)
91
- request = Net::HTTP::Post.new(session.uri.request_uri)
92
- request.body = "method=pwg.categories.getImages"
93
- request.body.concat "&cat_id=#{album_id}" unless album_id.nil?
94
- request.body.concat "&recursive=#{recursive}" unless recursive.nil?
95
- request.body.concat "&per_page=#{per_page}" unless album_id.nil?
96
- request.body.concat "&order=#{order}" unless order.nil?
97
- request['Cookie'] = [session.id]
98
-
99
- # Send the request
100
- response = http.request(request)
101
- if response.code == '200'
102
- data = JSON.parse(response.body)
103
- paging = Paging.new hash: data['result']['paging']
104
- images = data['result']['images'].map{ |hash| Image.new(hash: hash) }
105
- logger.info "Image List succeeded: #{images.size} images retrieved."
106
- { :paging => paging, :images => images }
107
- else
108
- nil
109
- end
110
- rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
111
- logger.error "Image List failed: #{e.messages}"
112
- nil
113
- end
114
- end
115
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
116
+ logger.error "Image List failed: #{e.messages}"
117
+ nil
118
+ end
119
+ end
120
+
121
+ # Add a photo to Piwigo
122
+ #
123
+ # @param [<Type>] session
124
+ # @param [<Type>] filename of the file to upload
125
+ # @param [<Type>] name of the image
126
+ #
127
+ # @return [Boolean] True if successful
128
+ def self.Upload(session, file, name)
129
+ ImageUploader.new(session, file, name).Upload
130
+ end
115
131
 
132
+ # Checks existence of images
133
+ #
134
+ # @param [Session] session
135
+ # @param [String] file to check
136
+ # @param [Logger] logger
137
+ #
138
+ # @return [Number] Piwigo image_id if matched, nil if not present
139
+ def self.Lookup(session, file, logger: nil)
140
+ raise 'Invalid session' if session.uri.nil?
141
+
142
+ logger ||= Logger.new(STDOUT)
143
+ image_content = File.binread(file)
144
+ file_sum = Digest::MD5.hexdigest(image_content)
145
+
146
+ begin
147
+ http = Net::HTTP.new(session.uri.host, session.uri.port)
148
+ request = Net::HTTP::Post.new(session.uri.request_uri)
149
+ form = {
150
+ method: 'pwg.images.exist',
151
+ md5sum_list: file_sum,
152
+ filename_list: file
153
+ }
154
+ request.set_form_data(form)
155
+ request['Cookie'] = [session.id]
156
+
157
+ # Send the request
158
+ response = http.request(request)
159
+ if response.code == '200'
160
+ data = JSON.parse(response.body)
161
+ logger.info "Image Lookup succeeded: #{data['result']}"
162
+ data['result'][file_sum]
163
+ end
164
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
165
+ logger.error "Image Lookup failed: #{e.messages}"
166
+ nil
167
+ end
116
168
  end
117
- end
169
+ end
170
+ end
@@ -4,115 +4,116 @@ require 'json'
4
4
  require 'logger'
5
5
 
6
6
  module Piwigo
7
- # Class to hold the Piwigo session the rest of the API needs to pass in order to access the API
8
- class Session
9
-
10
- # @return [String] Piwigo session cookie
11
- attr_accessor :id
7
+ # Class to hold the Piwigo session the rest of the API needs to pass in order to access the API
8
+ class Session
9
+ # @return [String] Piwigo session cookie
10
+ attr_accessor :id
12
11
 
13
- # @return [URI::HTTP] Piwigo host associated with this session
14
- attr_accessor :uri
12
+ # @return [URI::HTTP] Piwigo host associated with this session
13
+ attr_accessor :uri
15
14
 
16
- # @return [String] token required for admin methods
17
- attr_accessor :pwg_token
15
+ # @return [String] token required for admin methods
16
+ attr_accessor :pwg_token
18
17
 
19
- # @return [String] token required for admin methods
20
- attr_accessor :username
18
+ # @return [String] token required for admin methods
19
+ attr_accessor :username
21
20
 
21
+ def initialize(id, uri)
22
+ self.id = id
23
+ self.uri = uri
22
24
 
23
- def initialize(id, uri)
24
- self.id = id
25
- self.uri = uri
25
+ status
26
+ end
26
27
 
27
- status
28
- end
29
-
30
- # Gets information about the current session. Also provides a token useable with admin methods.
31
- # {"stat":"ok","result":{"username":"Adrian","status":"webmaster","theme":"modus","language":"en_GB","pwg_token":"9edde6a1ae535934cca6a2423f9bcbe7","charset":"utf-8","current_datetime":"2019-11-17 21:57:58","version":"2.10.1","available_sizes":["square","thumb","2small","xsmall","small","medium","large","xlarge","xxlarge"],"upload_file_types":"jpg,jpeg,png,gif","upload_form_chunk_size":500}}
32
- # @return [<Type>] <description>
33
- def status
34
- logger = logger || Logger.new(STDOUT)
35
-
36
- begin
37
- # Create the HTTP objects
38
- http = Net::HTTP.new(uri.host, uri.port)
39
- request = Net::HTTP::Post.new(uri.request_uri)
40
- request.body = "method=pwg.session.getStatus"
41
- request['Cookie'] = self.id
42
-
43
- # Send the request
44
- response = http.request(request)
45
-
46
- if response.code == '200'
47
- logger.info "Status succeeded"
48
- data = JSON.parse(response.body)
49
- self.pwg_token = data['result']['pwg_token']
50
- self.username = data['result']['username']
51
- end
52
-
53
- rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
54
- logger.error "Unexpected failed: #{e.messages}"
55
- end
56
- nil
57
-
28
+ # Gets information about the current session. Also provides a token useable with admin methods.
29
+ # @return [<Type>] <description>
30
+ def status
31
+ logger ||= Logger.new(STDOUT)
32
+
33
+ begin
34
+ # Create the HTTP objects
35
+ http = Net::HTTP.new(uri.host, uri.port)
36
+ request = Net::HTTP::Post.new(uri.request_uri)
37
+ form = {
38
+ method: 'pwg.session.getStatus'
39
+ }
40
+ request.set_form_data(form)
41
+ request['Cookie'] = id
42
+
43
+ # Send the request
44
+ response = http.request(request)
45
+
46
+ if response.code == '200'
47
+ logger.info 'Status succeeded'
48
+ data = JSON.parse(response.body)
49
+ self.pwg_token = data['result']['pwg_token']
50
+ self.username = data['result']['username']
58
51
  end
59
-
60
- # Logout of the current session
61
- # @param [Logger] logger logger to output debug messages to (Optional)
62
- def logout(logger: nil)
63
- raise "This session has already been logged out" if uri.nil?
64
- logger = logger || Logger.new(STDOUT)
65
-
66
- # Create the HTTP objects
67
- http = Net::HTTP.new(self.uri.host, self.uri.port)
68
- request = Net::HTTP::Get.new(self.uri.request_uri + "&method=pwg.session.logout")
69
- request['Cookie'] = self.id
70
-
71
- # Send the request
72
- response = http.request(request)
73
- logger.info "Logout succeeded: #{response.body}" if response.code == '200'
74
- self.id = nil
75
- self.uri = nil
52
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
53
+ logger.error "Unexpected failed: #{e.messages}"
54
+ end
55
+ nil
56
+ end
57
+
58
+ # Logout of the current session
59
+ # @param [Logger] logger logger to output debug messages to (Optional)
60
+ def logout(logger: nil)
61
+ raise 'This session has already been logged out' if uri.nil?
62
+
63
+ logger ||= Logger.new(STDOUT)
64
+
65
+ # Create the HTTP objects
66
+ http = Net::HTTP.new(uri.host, uri.port)
67
+ request = Net::HTTP::Get.new(uri.request_uri + '&method=pwg.session.logout')
68
+ request['Cookie'] = id
69
+
70
+ # Send the request
71
+ response = http.request(request)
72
+ logger.info "Logout succeeded: #{response.body}" if response.code == '200'
73
+ self.id = nil
74
+ self.uri = nil
75
+ end
76
+
77
+ # Log into the piwigo API and grab the session id for subsequent calls.
78
+ # @param [string] piwigo - host to connect to. Can be fqdn or ip.
79
+ # @param [string] username - user to connect as
80
+ # @param [string] password - password for user
81
+ # @param [boolean] https - Use HTTPS?
82
+ # @param [Logger] logger logger to output debug messages to (Optional)
83
+ def self.login(host, username, password, https: true, logger: nil)
84
+ raise 'host should not be nil' if host.nil?
85
+ raise 'username should not be nil' if username.nil?
86
+
87
+ logger ||= Logger.new(STDOUT)
88
+
89
+ begin
90
+ uri = https ? URI::HTTPS.build(host: host, path: '/ws.php', query: 'format=json') :
91
+ URI::HTTP.build(host: host, path: '/ws.php', query: 'format=json')
92
+
93
+ # Create the HTTP objects
94
+ http = Net::HTTP.new(uri.host, uri.port)
95
+ request = Net::HTTP::Post.new(uri.request_uri)
96
+ form = {
97
+ method: 'pwg.session.login',
98
+ username: username,
99
+ password: password
100
+ }
101
+ request.set_form_data(form)
102
+
103
+ # Send the request
104
+ response = http.request(request)
105
+
106
+ if response.code == '200'
107
+ logger.info "Login succeeded: #{response.body}"
108
+ pwg_id = response.response['set-cookie'].split(';').select { |i| i.strip.start_with? 'pwg_id' }.first
109
+ return Session.new(pwg_id, uri)
110
+ else
111
+ logger.error "Login failed: #{response.body}"
76
112
  end
77
-
78
-
79
- # Log into the piwigo API and grab the session id for subsequent calls.
80
- # @param [string] piwigo - host to connect to. Can be fqdn or ip.
81
- # @param [string] username - user to connect as
82
- # @param [string] password - password for user
83
- # @param [boolean] https - Use HTTPS?
84
- # @param [Logger] logger logger to output debug messages to (Optional)
85
- def self.login(host, username, password, https: true, logger: nil)
86
-
87
- raise "host should not be nil" if host.nil?
88
- raise "username should not be nil" if username.nil?
89
- logger = logger || Logger.new(STDOUT)
90
-
91
- begin
92
-
93
- uri = https ? URI::HTTPS.build(host: host, path: "/ws.php", query: "format=json") :
94
- URI::HTTP.build(host: host, path: "/ws.php", query: "format=json")
95
-
96
- # Create the HTTP objects
97
- http = Net::HTTP.new(uri.host, uri.port)
98
- request = Net::HTTP::Post.new(uri.request_uri)
99
- request.body = "method=pwg.session.login&username=#{username}&password=#{password}"
100
-
101
- # Send the request
102
- response = http.request(request)
103
-
104
- if response.code == '200'
105
- logger.info "Login succeeded: #{response.body}"
106
- pwg_id = response.response['set-cookie'].split(';').select { |i| i.strip.start_with? "pwg_id" }.first
107
- return Session.new(pwg_id, uri)
108
- else
109
- logger.error "Login failed: #{response.body}"
110
- end
111
-
112
- rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
113
- logger.error "Login failed: #{e.messages}"
114
- end
115
- nil
116
- end
113
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
114
+ logger.error "Login failed: #{e.messages}"
115
+ end
116
+ nil
117
117
  end
118
- end
118
+ end
119
+ end
@@ -1,3 +1,3 @@
1
1
  module Piwigo
2
- VERSION = "0.3.1"
2
+ VERSION = '0.4.0'
3
3
  end
data/lib/piwigo.rb CHANGED
@@ -1,4 +1,4 @@
1
- require "piwigo/version"
1
+ require 'piwigo/version'
2
2
 
3
3
  module Piwigo
4
4
  class Error < StandardError; end
data/piwigo-api.gemspec CHANGED
@@ -1,36 +1,37 @@
1
- lib = File.expand_path("lib", __dir__)
1
+ lib = File.expand_path('lib', __dir__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "piwigo/version"
3
+ require 'piwigo/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "piwigo-api"
6
+ spec.name = 'piwigo-api'
7
7
  spec.version = Piwigo::VERSION
8
- spec.authors = ["Adrian Gilbert"]
9
- spec.email = ["adrian@gilbert.ca"]
8
+ spec.authors = ['Adrian Gilbert']
9
+ spec.email = ['adrian@gilbert.ca']
10
10
 
11
- spec.summary = %q{Gem to interact with the Piwigo API}
12
- spec.description = %q{Piwigo is open source web application to manage your collection of photos, and other medias. Piwigo provides an API for interacting with it. This is a ruby-based client for interacting with a Piwigo instance using the Piwigo API.}
13
- spec.homepage = "https://github.com/kkdad/piwigo-api"
14
- spec.license = "MIT"
11
+ spec.summary = 'Gem to interact with the Piwigo API'
12
+ spec.description = 'Piwigo is open source web application to manage your collection of photos, and other medias. Piwigo provides an API for interacting with it. This is a ruby-based client for interacting with a Piwigo instance using the Piwigo API.'
13
+ spec.homepage = 'https://github.com/kkdad/piwigo-api'
14
+ spec.license = 'MIT'
15
15
 
16
- spec.metadata["homepage_uri"] = spec.homepage
17
- spec.metadata["source_code_uri"] = "https://github.com/kkdad/piwigo-api"
18
- spec.metadata["changelog_uri"] = "https://github.com/kkdad/piwigo-api/CHANGELOG.md"
19
- spec.metadata["documentation_uri"] = "https://rubydoc.info/github/KKDad/piwigo-api/master"
16
+ spec.metadata['homepage_uri'] = spec.homepage
17
+ spec.metadata['source_code_uri'] = 'https://github.com/kkdad/piwigo-api'
18
+ spec.metadata['changelog_uri'] = 'https://github.com/kkdad/piwigo-api/CHANGELOG.md'
19
+ spec.metadata['documentation_uri'] = 'https://rubydoc.info/github/KKDad/piwigo-api/master'
20
20
 
21
21
  # Specify which files should be added to the gem when it is released.
22
22
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
24
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
25
  end
26
- spec.bindir = "exe"
26
+ spec.bindir = 'exe'
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
- spec.require_paths = ["lib"]
28
+ spec.require_paths = ['lib']
29
29
 
30
- spec.add_development_dependency "bundler", "~> 2.0"
31
- spec.add_development_dependency "rake", "~> 10.0"
32
- spec.add_development_dependency "minitest", "~> 5.0"
30
+ spec.add_development_dependency 'bundler', '~> 2.0'
31
+ spec.add_development_dependency 'codecov', '>= 0.1.10'
32
+ spec.add_development_dependency 'minitest', '~> 5.0'
33
+ spec.add_development_dependency 'rake', '~> 10.0'
33
34
 
34
- spec.add_runtime_dependency "logger", "~>1.4"
35
- spec.add_runtime_dependency "http", "~>4.2"
35
+ spec.add_runtime_dependency 'http', '~>4.2'
36
+ spec.add_runtime_dependency 'logger', '~>1.4'
36
37
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: piwigo-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrian Gilbert
@@ -25,19 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: codecov
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 0.1.10
34
34
  type: :development
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: '10.0'
40
+ version: 0.1.10
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -53,19 +53,19 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '5.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: logger
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.4'
62
- type: :runtime
61
+ version: '10.0'
62
+ type: :development
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.4'
68
+ version: '10.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: http
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '4.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: logger
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.4'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.4'
83
97
  description: Piwigo is open source web application to manage your collection of photos,
84
98
  and other medias. Piwigo provides an API for interacting with it. This is a ruby-based
85
99
  client for interacting with a Piwigo instance using the Piwigo API.
@@ -92,6 +106,7 @@ files:
92
106
  - ".github/workflows/gempush.yml"
93
107
  - ".github/workflows/ruby.yml"
94
108
  - ".gitignore"
109
+ - ".rubocop.yaml"
95
110
  - ".travis.yml"
96
111
  - ".vscode/launch.json"
97
112
  - CHANGELOG.md
@@ -105,6 +120,7 @@ files:
105
120
  - codecov.yml
106
121
  - lib/piwigo.rb
107
122
  - lib/piwigo/albums.rb
123
+ - lib/piwigo/image_uploader.rb
108
124
  - lib/piwigo/images.rb
109
125
  - lib/piwigo/session.rb
110
126
  - lib/piwigo/version.rb