piwigo-api 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yaml +9 -5
- data/.vscode/launch.json +2 -2
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +17 -1
- data/examples/Upload_Image.md +15 -0
- data/lib/piwigo/albums.rb +33 -6
- data/lib/piwigo/folder_sync.rb +58 -0
- data/lib/piwigo/image_uploader.rb +6 -6
- data/lib/piwigo/images.rb +9 -7
- data/lib/piwigo/version.rb +1 -1
- data/piwigo-api.gemspec +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25b24077502730104d7ff8bb0fc3e4de59c1de1de94157936dd80846da1ee876
|
4
|
+
data.tar.gz: ecc50b004fc354d5f45599c745ccec83a5f77293eed1fd41d4ab34280e23cde9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7de1e335ce5f1a13e912cce73fe2cd3312876d687a64cc3ae488f419c11849b9484ba70d60393215566c3de8c6e9f489d9fdc1099d755c6f7670234a46ce83f6
|
7
|
+
data.tar.gz: 8cbc75ee1512e858c9190263c1c4a741ffccf0d71249c8813e7c501c73785534db59eefb85de8ddd472d6d519dd890a7609e41e7a4374d1fd9c869011cc6e6cb
|
data/.rubocop.yaml
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- 'tests/*.rb'
|
4
|
+
TargetRubyVersion: 2.6
|
5
|
+
|
6
|
+
Style/FrozenStringLiteralComment:
|
7
|
+
Enabled: false
|
8
|
+
|
1
9
|
Style/Encoding:
|
2
10
|
Enabled: false
|
3
11
|
|
@@ -11,8 +19,4 @@ Metrics/AbcSize:
|
|
11
19
|
Max: 40
|
12
20
|
|
13
21
|
Metrics/MethodLength:
|
14
|
-
Max: 40
|
15
|
-
|
16
|
-
AllCops:
|
17
|
-
Exclude:
|
18
|
-
- 'tests/*.rb'
|
22
|
+
Max: 40
|
data/.vscode/launch.json
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,10 @@ 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.5.0 - 2019-11-23
|
8
|
+
- Added a directory of example scripts
|
9
|
+
- Added a folder-album syncronization methods
|
10
|
+
|
7
11
|
0.4.0 - 2019-11-20
|
8
12
|
- Add methods to check for the existance of a specific image and to upload images
|
9
13
|
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
piwigo-api (0.
|
4
|
+
piwigo-api (0.5.0)
|
5
5
|
http (~> 4.2)
|
6
6
|
logger (~> 1.4)
|
7
7
|
|
@@ -14,9 +14,11 @@ GEM
|
|
14
14
|
json
|
15
15
|
simplecov
|
16
16
|
url
|
17
|
+
diff-lcs (1.3)
|
17
18
|
docile (1.3.2)
|
18
19
|
domain_name (0.5.20190701)
|
19
20
|
unf (>= 0.0.5, < 1.0.0)
|
21
|
+
ffi (1.11.2)
|
20
22
|
ffi (1.11.2-x64-mingw32)
|
21
23
|
ffi-compiler (1.0.1)
|
22
24
|
ffi (>= 1.0.0)
|
@@ -36,6 +38,19 @@ GEM
|
|
36
38
|
minitest (5.13.0)
|
37
39
|
public_suffix (4.0.1)
|
38
40
|
rake (10.5.0)
|
41
|
+
rspec (3.9.0)
|
42
|
+
rspec-core (~> 3.9.0)
|
43
|
+
rspec-expectations (~> 3.9.0)
|
44
|
+
rspec-mocks (~> 3.9.0)
|
45
|
+
rspec-core (3.9.0)
|
46
|
+
rspec-support (~> 3.9.0)
|
47
|
+
rspec-expectations (3.9.0)
|
48
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
49
|
+
rspec-support (~> 3.9.0)
|
50
|
+
rspec-mocks (3.9.0)
|
51
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
52
|
+
rspec-support (~> 3.9.0)
|
53
|
+
rspec-support (3.9.0)
|
39
54
|
simplecov (0.17.1)
|
40
55
|
docile (~> 1.1)
|
41
56
|
json (>= 1.8, < 3)
|
@@ -56,6 +71,7 @@ DEPENDENCIES
|
|
56
71
|
minitest (~> 5.0)
|
57
72
|
piwigo-api!
|
58
73
|
rake (~> 10.0)
|
74
|
+
rspec (~> 3.9)
|
59
75
|
|
60
76
|
BUNDLED WITH
|
61
77
|
2.0.2
|
@@ -0,0 +1,15 @@
|
|
1
|
+
## Upload a single image
|
2
|
+
|
3
|
+
Upload a single image if it doesn't already exist. Image is not associated with any Albums. The image will named apple-pie-bars
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
session = Piwigo::Session.login('10.100.230.78', 'Adrian', 'mypassword', https: false)
|
7
|
+
unless session.nil?
|
8
|
+
filename = 'C:\photos\apple-pie-bars-articleLarge.jpg'
|
9
|
+
if Piwigo::Images.Lookup(session, filename).nil?
|
10
|
+
Piwigo::Images.Upload(session, filename, 'apple-pie-bars')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
```
|
14
|
+
|
15
|
+
Piwigo will automatically associate the Author of the image as `Adrian` matching the session login id.
|
data/lib/piwigo/albums.rb
CHANGED
@@ -72,7 +72,7 @@ module Piwigo
|
|
72
72
|
# @param [Logger] logger logger to output debug messages to (Optional)
|
73
73
|
#
|
74
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:
|
75
|
+
def self.list(session, album_id: nil, recursive: nil, public: nil, fullname: nil, thumbnail_size: nil, logger: nil)
|
76
76
|
raise 'Invalid session' if session.uri.nil?
|
77
77
|
|
78
78
|
logger ||= Logger.new(STDOUT)
|
@@ -80,7 +80,15 @@ module Piwigo
|
|
80
80
|
begin
|
81
81
|
http = Net::HTTP.new(session.uri.host, session.uri.port)
|
82
82
|
request = Net::HTTP::Post.new(session.uri.request_uri)
|
83
|
-
|
83
|
+
form = {
|
84
|
+
method: 'pwg.categories.getList'
|
85
|
+
}
|
86
|
+
form[:cat_id] = album_id unless album_id.nil?
|
87
|
+
form[:recursive] = recursive unless recursive.nil?
|
88
|
+
form[:public] = public unless public.nil?
|
89
|
+
form[:fullname] = fullname unless fullname.nil?
|
90
|
+
form[:thumbnail_size] = thumbnail_size unless thumbnail_size.nil?
|
91
|
+
request.set_form_data(form)
|
84
92
|
request['Cookie'] = [session.id]
|
85
93
|
|
86
94
|
# Send the request
|
@@ -97,6 +105,21 @@ module Piwigo
|
|
97
105
|
end
|
98
106
|
end
|
99
107
|
|
108
|
+
# lookup a specific Album from a list of albums
|
109
|
+
#
|
110
|
+
# @param [<Type>] session
|
111
|
+
# @param [<Type>] album_name - Name of the album to locate
|
112
|
+
# @param [<Type>] logger <description>
|
113
|
+
#
|
114
|
+
# @return [<Type>] Album if located, nil otherwise
|
115
|
+
def self.lookup(session, album_name, logger: nil)
|
116
|
+
albums = list(session, recursive: true, fullname: false, logger: logger)
|
117
|
+
filtered = albums.select do |album|
|
118
|
+
album.name == album_name
|
119
|
+
end
|
120
|
+
filtered.size == 1 ? filtered[0] : nil
|
121
|
+
end
|
122
|
+
|
100
123
|
# Adds an album.
|
101
124
|
#
|
102
125
|
# @param [Session] session to interact with Piwigo
|
@@ -113,10 +136,14 @@ module Piwigo
|
|
113
136
|
begin
|
114
137
|
http = Net::HTTP.new(session.uri.host, session.uri.port)
|
115
138
|
request = Net::HTTP::Post.new(session.uri.request_uri)
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
139
|
+
form = {
|
140
|
+
method: 'pwg.categories.add',
|
141
|
+
name: album.name
|
142
|
+
}
|
143
|
+
form[:parent] = album.id_uppercat unless album.id_uppercat.nil?
|
144
|
+
form[:comment] = album.comment unless album.comment.nil?
|
145
|
+
form[:status] = album.status unless album.status.nil?
|
146
|
+
request.set_form_data(form)
|
120
147
|
request['Cookie'] = [session.id]
|
121
148
|
|
122
149
|
# Send the request
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'find'
|
3
|
+
require_relative 'albums'
|
4
|
+
require_relative 'image_uploader'
|
5
|
+
|
6
|
+
module Piwigo
|
7
|
+
# Syncronize a folder with Piwigo
|
8
|
+
# - Album name will be the same as the folder name
|
9
|
+
# - Will be created as a top-level folder unless specified
|
10
|
+
class FolderSync
|
11
|
+
# Create a new ImageUploader
|
12
|
+
#
|
13
|
+
# @param [Session] session - session to a piwigo instance
|
14
|
+
def initialize(session, logger: nil)
|
15
|
+
@logger = logger || Logger.new(STDOUT)
|
16
|
+
@session = session
|
17
|
+
@current_album = nil
|
18
|
+
@parent_album = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.synchronize(session, directory, logger: nil)
|
22
|
+
unless File.directory?(directory)
|
23
|
+
@Logger.error "No such directory: #{directory}"
|
24
|
+
return false
|
25
|
+
end
|
26
|
+
FolderSync.new(session, logger: logger).synchronize(directory)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Syncronize a folder with Piwigo
|
30
|
+
#
|
31
|
+
# @param [String] directory - directory to syncronize.
|
32
|
+
def synchronize(directory)
|
33
|
+
@logger.info "Processing Directory: #{directory}"
|
34
|
+
|
35
|
+
Find.find(directory) do |directory_entry|
|
36
|
+
next unless directory_entry != directory
|
37
|
+
|
38
|
+
if directory != directory_entry && File.directory?(directory_entry)
|
39
|
+
@parent_album = @current_album
|
40
|
+
@current_album = Piwigo::Albums::lookup(@session, File.basename(directory_entry))
|
41
|
+
if @current_album.nil?
|
42
|
+
album = Piwigo::Albums::Album.new(hash: { 'name' => File.basename(directory_entry),
|
43
|
+
'id_uppercat' => @parent_album.nil? ? nil : @parent_album.id })
|
44
|
+
@current_album = Piwigo::Albums.add @session, album
|
45
|
+
end
|
46
|
+
|
47
|
+
synchronize directory_entry
|
48
|
+
else
|
49
|
+
@logger.info "Processing Image: #{directory_entry} in album '#{@current_album}''"
|
50
|
+
image = Piwigo::Images::lookup(@session, directory_entry)
|
51
|
+
if image.nil?
|
52
|
+
Piwigo::Images::ImageUploader.new(logger: @logger).upload(@session, directory_entry, File.basename(directory_entry))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -30,7 +30,7 @@ module Piwigo
|
|
30
30
|
# @param [<Type>] name of the image
|
31
31
|
#
|
32
32
|
# @return [Boolean] True if successful
|
33
|
-
def
|
33
|
+
def upload(session, filename, name)
|
34
34
|
@session = session
|
35
35
|
raise 'Invalid session' if @session.uri.nil?
|
36
36
|
|
@@ -41,7 +41,7 @@ module Piwigo
|
|
41
41
|
chunk_num = 0
|
42
42
|
image_content = File.binread(filename)
|
43
43
|
original_sum = Digest::MD5.hexdigest(image_content)
|
44
|
-
encoded_content =
|
44
|
+
encoded_content = image_content
|
45
45
|
io = StringIO.new(encoded_content)
|
46
46
|
until io.eof?
|
47
47
|
chunk = io.read(MEGABYTE)
|
@@ -67,7 +67,7 @@ module Piwigo
|
|
67
67
|
method: 'pwg.images.addChunk',
|
68
68
|
original_sum: original_sum,
|
69
69
|
position: position,
|
70
|
-
data: data
|
70
|
+
data: Base64.encode64(data)
|
71
71
|
}
|
72
72
|
request.set_form_data(form)
|
73
73
|
request['Cookie'] = [@session.id]
|
@@ -81,7 +81,7 @@ module Piwigo
|
|
81
81
|
false
|
82
82
|
end
|
83
83
|
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
84
|
-
@logger.error "Image AddChunk failed: #{e.
|
84
|
+
@logger.error "Image AddChunk failed: #{e.message}"
|
85
85
|
false
|
86
86
|
end
|
87
87
|
|
@@ -123,7 +123,7 @@ module Piwigo
|
|
123
123
|
|
124
124
|
response = http.request(request)
|
125
125
|
if response.code == '500'
|
126
|
-
@logger.error "Image Add failed: #{response.
|
126
|
+
@logger.error "Image Add failed: #{response.message}"
|
127
127
|
false
|
128
128
|
elsif response.code == '200'
|
129
129
|
data = JSON.parse(response.body)
|
@@ -134,7 +134,7 @@ module Piwigo
|
|
134
134
|
false
|
135
135
|
end
|
136
136
|
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
137
|
-
@logger.error "Image Add failed: #{e.
|
137
|
+
@logger.error "Image Add failed: #{e.message}"
|
138
138
|
false
|
139
139
|
end
|
140
140
|
end
|
data/lib/piwigo/images.rb
CHANGED
@@ -100,6 +100,7 @@ module Piwigo
|
|
100
100
|
form[:recursive] = recursive unless recursive.nil?
|
101
101
|
form[:per_page] = per_page unless per_page.nil?
|
102
102
|
form[:order] = order unless order.nil?
|
103
|
+
form[:page] = page unless page.nil?
|
103
104
|
request.set_form_data(form)
|
104
105
|
request['Cookie'] = [session.id]
|
105
106
|
|
@@ -113,7 +114,7 @@ module Piwigo
|
|
113
114
|
{ paging: paging, images: images }
|
114
115
|
end
|
115
116
|
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
116
|
-
logger.error "Image List failed: #{e.
|
117
|
+
logger.error "Image List failed: #{e.message}"
|
117
118
|
nil
|
118
119
|
end
|
119
120
|
end
|
@@ -125,8 +126,8 @@ module Piwigo
|
|
125
126
|
# @param [<Type>] name of the image
|
126
127
|
#
|
127
128
|
# @return [Boolean] True if successful
|
128
|
-
def self.
|
129
|
-
ImageUploader.new(session, file, name).
|
129
|
+
def self.upload(session, file, name)
|
130
|
+
ImageUploader.new(session, file, name).upload
|
130
131
|
end
|
131
132
|
|
132
133
|
# Checks existence of images
|
@@ -136,7 +137,7 @@ module Piwigo
|
|
136
137
|
# @param [Logger] logger
|
137
138
|
#
|
138
139
|
# @return [Number] Piwigo image_id if matched, nil if not present
|
139
|
-
def self.
|
140
|
+
def self.lookup(session, file, logger: nil)
|
140
141
|
raise 'Invalid session' if session.uri.nil?
|
141
142
|
|
142
143
|
logger ||= Logger.new(STDOUT)
|
@@ -158,11 +159,12 @@ module Piwigo
|
|
158
159
|
response = http.request(request)
|
159
160
|
if response.code == '200'
|
160
161
|
data = JSON.parse(response.body)
|
161
|
-
logger.info "Image
|
162
|
-
data['result'][file_sum]
|
162
|
+
logger.info "Image lookup succeeded: #{data['result']}"
|
163
|
+
result = data['result'][file_sum]
|
164
|
+
result.nil? ? nil : result[file_sum]
|
163
165
|
end
|
164
166
|
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
165
|
-
logger.error "Image
|
167
|
+
logger.error "Image lookup failed: #{e.message}"
|
166
168
|
nil
|
167
169
|
end
|
168
170
|
end
|
data/lib/piwigo/version.rb
CHANGED
data/piwigo-api.gemspec
CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency 'codecov', '>= 0.1.10'
|
32
32
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
33
33
|
spec.add_development_dependency 'rake', '~> 10.0'
|
34
|
-
|
34
|
+
|
35
35
|
spec.add_runtime_dependency 'http', '~>4.2'
|
36
36
|
spec.add_runtime_dependency 'logger', '~>1.4'
|
37
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: piwigo-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrian Gilbert
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-11-
|
11
|
+
date: 2019-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -118,8 +118,10 @@ files:
|
|
118
118
|
- bin/console
|
119
119
|
- bin/setup
|
120
120
|
- codecov.yml
|
121
|
+
- examples/Upload_Image.md
|
121
122
|
- lib/piwigo.rb
|
122
123
|
- lib/piwigo/albums.rb
|
124
|
+
- lib/piwigo/folder_sync.rb
|
123
125
|
- lib/piwigo/image_uploader.rb
|
124
126
|
- lib/piwigo/images.rb
|
125
127
|
- lib/piwigo/session.rb
|