elibri_watermarking 0.9.12 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +13 -90
- data/lib/elibri_watermarking/client.rb +37 -71
- data/lib/elibri_watermarking/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7da8046f7838971cb2018299ea60181556f6a0b77e3a9ae166878db5d3bc32ea
|
|
4
|
+
data.tar.gz: 18a0c3940cb3f71e90706ed8de498a09432d75b5766b49363ceb609c6d142381
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cfac4d93c881d47f52351d03d0ccd097891ed448935861aba6310a96c6b5e988b6c9ca277300a9925b937aae4a9b1c7bd9ba39643eeac888521bff610fe5175d
|
|
7
|
+
data.tar.gz: 2fd51e451aaae9d5d829071376690b6d316f5501d3982de7f190a4201f7b8f99f04c21d2815fcca4e0af0c71a1e290f6608717661f0ab715581bf96dca14c3e8
|
data/README.md
CHANGED
|
@@ -1,101 +1,24 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Elibri Watermarking
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Description
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
Użycie wymaga wcześniejszego kontaktu z serwisem Elibri (kontakt@elibri.com.pl), w celu otrzymania danych dostępowych do API.
|
|
5
|
+
This library implements [Elibri Watermarking API](https://www.elibri.com.pl/doc/watermarking/api) in ruby.
|
|
7
6
|
|
|
8
|
-
##
|
|
7
|
+
## Usage
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
First, include `elibri_watermarking` in your Gemgile
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
Next, initialise the client:
|
|
13
12
|
|
|
14
|
-
Aby użyć biblioteki w aplikacji Ruby on Rails, do pliku Gemfile należy dodać:
|
|
15
|
-
|
|
16
|
-
```gem 'elibri_watermarking```
|
|
17
|
-
|
|
18
|
-
aby użyć gema, poza aplikacją rails należy go zainstalować, komendą:
|
|
19
|
-
|
|
20
|
-
```gem install elibri_watermarking```
|
|
21
|
-
|
|
22
|
-
a następnie w konsoli w której chcemy użyć biblioteki wpisujemy:
|
|
23
|
-
|
|
24
|
-
```ruby
|
|
25
|
-
require 'rubygems'
|
|
26
|
-
require 'elibri_watermarking'
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
Następnie musimy zainicjalizować bibliotekę, podając token i secret, otrzymane od Elibri:
|
|
30
13
|
```ruby
|
|
31
14
|
client = ElibriWatermarking::Client.new('token', 'secret')
|
|
32
15
|
```
|
|
33
16
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
* watermark (przyjmuje parametry: identyfikator [ISBN bez myślników lub record_reference], formaty [zapisana po przecinku lista formatów do watermarkingu - najcześciej "epub,mobi", możliwe wartości: epub, mobi, pdf, mp3_in_zip], widoczny watermark [tekst widoczny na końcu każdego rozdziału], dopisek [krótki tekst dopisany do tytułu], supplier [numeryczny identyfikator dostawcy pliki], client_symbol [alfanumeryczny identyfikator zapisany przy transakcji], customer_ip [ip klienta końcowego, do celów statystycznych], price [cena zakupu pliku przez klienta końcowego], promotion_id [id promocji w jakiej został zakupiony plik], delivery_form [opcjonalna forma dostarczenia (używane tylko przy audiobooku). Może przyjąć wartości: zip (wtedy audiobook zostanie dostarczony jako plik zip), lub mp3 (wtedy w miarę postępu procesu watermarkowania, pojawiać się będą kolejne pliki w folderze o nazwie równej trans_id, na S3). W przypadku drugiej formy, klient zostanie powiadomiony o zakończeniu procesu dopiero gdy wszystkie pliki zostaną zwatermarkowane (wtedy również w folderze S3 pojawi się plik done). Jeśli sklep chce pobierać pliki mp3 w miarę postępu watermarkowania, jest zobowiązany do sprawdzania ich obecności na s3, zanim zostanie poinformowany o zakończeniu transakcji. W przypadku używania typu dostarczenia=mp3, audiobook musi być jedynym formatem, który jest żądany w danej transakcji] - zwraca identyfikator transakcji, który klient zobowiązany jest zapisać i przechowywać) - wywołuje żądanie watermarku na podanym produkcie, w podanych formatach
|
|
37
|
-
* deliver (przyjmuje jeden parametr: identifykator transacji [otrzymany od watermark]) - wywołuje żądanie dostarczenia zwatermarkowanego pliku do bucketu klienta na s3
|
|
38
|
-
* watermark_and_deliver (przyjmuje parametry identyczne jak watermark, zwraca identyfikator transacji, który klient zobowiązany jest zapisać i przechowywać) - wywołuje watermarkowanie pliku, a następnie żąda jego dostarczenia do bucketu klienta na s3
|
|
39
|
-
* retry (przyjmuje jako parametr identyfikator transakcji, zwraca identyfikator nowej transakcji i opcjonalnie delivery_form [opcjonalna forma dostarczenia (używane tylko przy audiobooku), analogicznie jak przy watermark]) - wywołuje żądanie ponowienia watermarkingu pliku, który został już ściągnięty (uwaga - sklep jest zobowiązany do przetrzymywanie zwatermarkowanego pliku przynajmniej przez 7 dni, dopiero po tym czasie możliwe jest wywołanie retry). Watermarking wykonywany jest z identycznymi parametrami, jak poprzedni. Klient zobowiązany jest zapisać i przechowywać nowy identyfikator transakcji. Po komendzie retry, niezbędne jest wywołanie komendy deliver w celu dostarczeni pliku do bucketu s3. Uwaga! Każdą transakcję retryować mozna tylko raz - w przypadku kolejnego żądania retry, konieczne jest podanie identyfikatora transakcji otrzymanego od poprzedniej komendy retry.
|
|
40
|
-
* available_files - zwraca listę dostępnych do watermarkingu przez klienta plików. Pliki są zwracane w postaci tablicy hashów, postaci:
|
|
41
|
-
```ruby
|
|
42
|
-
[
|
|
43
|
-
{
|
|
44
|
-
:record_reference => 'a'
|
|
45
|
-
:publisher_name => 'b'
|
|
46
|
-
:publisher_id => 1
|
|
47
|
-
:isbn => '1234'
|
|
48
|
-
:title => 'Tytuł',
|
|
49
|
-
:formats => ["epub", "mobi"]
|
|
50
|
-
:available_date => "data od kiedy plik jest dostępny - jeśli pole nie występuje, znaczy to, że plik jest dostępny"
|
|
51
|
-
:suppliers => [1, 2, 3] #tablica zawierająca identyfikatora dostawców, mogących dostarczyć plik dla danego klienta
|
|
52
|
-
:available_until => "data do kiedy plik jest dostępny - jeśli nie występuje, znaczy to, że plik nie jest wygasający"
|
|
53
|
-
}
|
|
54
|
-
]
|
|
55
|
-
```
|
|
56
|
-
* soon_available_files - zwraca listę wkrótce dostępnych do watermarkingu przez klienta plików. Format analogiczny jak w metodzie available_files.
|
|
57
|
-
* soon_unavailable_files - zwraca listę plików dostępnych do watermarkingu, które wkrótce wygasną (przestaną być dostępne). Format analogiczny jak w metodzie available_files.
|
|
58
|
-
* check_suppliers (przyjmuje jeden parametr: identyfikator [ISBN bez myślników lub record_reference]) - zwraca listę dostawców danego pliku, w postaci tablicy zawierającej numeryczne identyfikatory dostawców
|
|
59
|
-
* get_supplier (przyjmuje jeden parametr: numeryczny identyfikator dostawcy w systemie eLibri) - zwraca nazwę dostawcy o podanym identyfikatorze
|
|
60
|
-
* new_complaint (przyjmuje dwa parametry: identyfikator tranksacji do zareklamowania i powód reklamacji) - zgłasza nową reklamację do transakcji w systemie eLibri
|
|
61
|
-
|
|
62
|
-
## Błędy
|
|
63
|
-
|
|
64
|
-
Wywołanie poszczególnych metod może spowodować wywołanie jednego z następujących wyjątków:
|
|
65
|
-
|
|
66
|
-
* ParametersError - do serwera zostały wysłane złe parametry
|
|
67
|
-
* AuthenticationError - podany został zły token lub zły sig
|
|
68
|
-
* AuthorizationError - podany klient nie ma dostępu żądanego produktu, lub ten produkt nie istnieje, lub produkt nie posiada żądanego formatu
|
|
69
|
-
* ServerException - wystąpił wewnętrzny błąd serwera elibri
|
|
70
|
-
* RequestExpired - podany został zbyt stary request (request ważny jest 60 sekund)
|
|
71
|
-
|
|
72
|
-
Wszystkie te wyjątki, dziedziczą po klasie ElibriException, a także zawierają w treści opis błędu otrzymanego od API.
|
|
73
|
-
|
|
74
|
-
## Odebranie pliku
|
|
75
|
-
|
|
76
|
-
Po wywołaniu komendy deliver, plik zostaje załadowany do bucketu s3 (dane dostępowego do niego, otrzymacie Państwo podczas zakładania konta API). Sklep zobowiązany jest ściągnąć zwatermarkowany plik z bucketu s3 i przechowywać go po swojej stronie przez minimum 7 dni.
|
|
77
|
-
Plik zawsze będzie nazwany zgodnie z następującą konwencją:
|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
trans_id.format
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
gdzie trans_id to identyfikator transakcji w systemie elibri (otrzymany podczas zlecania watermarkingu), a format to jeden z: epub, mobi.
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
Przykładowy kod umożliwiający odczytanie i zapisanie na własnym serwerze zwatermarkowanego pliku z bucketu s3:
|
|
87
|
-
```ruby
|
|
88
|
-
require 'rubygems'
|
|
89
|
-
require 'aws-sdk'
|
|
90
|
-
|
|
91
|
-
s3 = AWS::S3.new(:access_key_id => 'amazon access key', :secret_access_key => 'amazon secret key')
|
|
92
|
-
File.open('ścieżka do pliku docelowego na serwerze', 'w') do |f|
|
|
93
|
-
f.puts s3.buckets['nazwa bucketu otrzymana przy rejestracji'].objects["identyfikator transacji.żądany format"].read
|
|
94
|
-
end
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## Powiadomienie o dostępności pliku
|
|
98
|
-
|
|
99
|
-
Po wykonaniu polecenia deliver, plik zostanie umieszczony w buckecie s3. Sklep zostanie powiadomiony o tym fakcie, za pomocą requestu na podany przez niego endpoint.
|
|
17
|
+
Available methods:
|
|
100
18
|
|
|
101
|
-
|
|
19
|
+
* watermark - registers transaction
|
|
20
|
+
* deliver - commits transaction
|
|
21
|
+
* available_files - a list of all available products
|
|
22
|
+
* soon_available_files - a list of soon available products
|
|
23
|
+
* soon_unavailable_files - a list of soon expiring products
|
|
24
|
+
* new_complaint - files a complains or cancelation
|
|
@@ -11,104 +11,75 @@ require 'json'
|
|
|
11
11
|
module ElibriWatermarking
|
|
12
12
|
class Client
|
|
13
13
|
|
|
14
|
-
attr_accessor :token, :secret, :logger, :
|
|
14
|
+
attr_accessor :token, :secret, :logger, :server
|
|
15
15
|
|
|
16
|
-
def initialize(token, secret,
|
|
16
|
+
def initialize(token, secret, server = nil)
|
|
17
17
|
self.token = token
|
|
18
18
|
self.secret = secret
|
|
19
|
-
self.
|
|
19
|
+
self.server = server || "https://www.elibri.com.pl"
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
def watermark(ident, formats
|
|
23
|
-
delivery_form = nil, price = nil, promotion_id = nil, low_priority = false)
|
|
22
|
+
def watermark(ident, formats:, visible_watermark:, client_symbol: nil, price: nil, promotion_id: nil, low_priority: false)
|
|
24
23
|
if ident =~ /^[0-9]+$/ && ident.size == 13
|
|
25
24
|
ident_type = 'isbn'
|
|
26
25
|
else
|
|
27
26
|
ident_type = 'record_reference'
|
|
28
27
|
end
|
|
29
|
-
raise WrongFormats.new if formats.is_a?(String) && !formats =~ /^(epub|mobi|pdf|mp3_in_zip|,)+$/
|
|
28
|
+
raise WrongFormats.new if formats.is_a?(String) && !(formats =~ /^(epub|mobi|pdf|mp3_in_zip|mp3_in_lpf|,)+$/)
|
|
30
29
|
raise WrongFormats.new if formats.is_a?(Array) && ((formats - ['epub','mobi','pdf','mp3_in_zip']) != [] || (formats & ['epub','mobi','pdf','mp3_in_zip']).count < 1)
|
|
31
30
|
formats = formats.join(",") if formats.is_a?(Array)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
data
|
|
35
|
-
|
|
36
|
-
data.merge!(:
|
|
37
|
-
|
|
38
|
-
data.merge!(:price => price) if price
|
|
39
|
-
data.merge!(:promotion_id => promotion_id) if promotion_id
|
|
40
|
-
data.merge!(:low_priority => low_priority) if low_priority
|
|
41
|
-
try_with_different_servers('watermark') do |uri|
|
|
31
|
+
data = { ident_type => ident, formats: formats, visible_watermark: visible_watermark }
|
|
32
|
+
data.merge!(client_symbol: client_symbol) if client_symbol
|
|
33
|
+
data.merge!(price: price) if price
|
|
34
|
+
data.merge!(promotion_id: promotion_id) if promotion_id
|
|
35
|
+
data.merge!(low_priority: low_priority) if low_priority
|
|
36
|
+
construct_url('watermark') do |uri|
|
|
42
37
|
return get_response_from_server(uri, data, Net::HTTP::Post)
|
|
43
38
|
end
|
|
44
39
|
end
|
|
45
40
|
|
|
46
|
-
def deliver(trans_id, low_priority
|
|
47
|
-
|
|
48
|
-
data = {
|
|
49
|
-
data.merge!(:
|
|
41
|
+
def deliver(trans_id, low_priority: false)
|
|
42
|
+
construct_url('deliver') do |uri|
|
|
43
|
+
data = { trans_id: trans_id }
|
|
44
|
+
data.merge!(low_priority: low_priority) if low_priority
|
|
50
45
|
return get_response_from_server(uri, data, Net::HTTP::Post)
|
|
51
46
|
end
|
|
52
47
|
end
|
|
53
48
|
|
|
54
|
-
def retry(trans_id,
|
|
55
|
-
|
|
56
|
-
data = {
|
|
49
|
+
def retry(trans_id, low_priority: false)
|
|
50
|
+
construct_url('retry') do |uri|
|
|
51
|
+
data = { trans_id: trans_id, delivery_form: delivery_form}
|
|
57
52
|
data.merge!(:low_priority => low_priority) if low_priority
|
|
58
53
|
return get_response_from_server(uri, data, Net::HTTP::Post)
|
|
59
54
|
end
|
|
60
55
|
end
|
|
61
56
|
|
|
62
57
|
def available_files
|
|
63
|
-
|
|
58
|
+
construct_url('available_files.json') do |uri|
|
|
64
59
|
return JSON.parse(get_response_from_server(uri, {}, Net::HTTP::Get))
|
|
65
60
|
end
|
|
66
61
|
end
|
|
67
62
|
|
|
68
63
|
def soon_available_files
|
|
69
|
-
|
|
64
|
+
construct_url('soon_available_files.json') do |uri|
|
|
70
65
|
return JSON.parse(get_response_from_server(uri, {}, Net::HTTP::Get))
|
|
71
66
|
end
|
|
72
67
|
end
|
|
73
68
|
|
|
74
69
|
def soon_unavailable_files
|
|
75
|
-
|
|
70
|
+
construct_url('soon_unavailable_files.json') do |uri|
|
|
76
71
|
return JSON.parse(get_response_from_server(uri, {}, Net::HTTP::Get))
|
|
77
72
|
end
|
|
78
73
|
end
|
|
79
74
|
|
|
80
|
-
def check_suppliers(ident)
|
|
81
|
-
ident =~ /^[0-9]+$/ ? ident_type = 'isbn' : ident_type = 'record_reference'
|
|
82
|
-
try_with_different_servers('check_suppliers') do |uri|
|
|
83
|
-
return get_response_from_server(uri, { ident_type => ident}, Net::HTTP::Get).split(",").map { |x| x.to_i }
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def get_supplier(id)
|
|
88
|
-
get_response_from_server(construct_main_server_url('/watermarking/get_supplier'), {:id => id}, Net::HTTP::Get)
|
|
89
|
-
#to chyba moze byc tylko z glownego serwera?
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def check_api
|
|
93
|
-
try_with_different_servers('ver') do |uri|
|
|
94
|
-
return get_response_from_server(uri, {}, Net::HTTP::Get)
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
75
|
def new_complaint(trans_id, reason)
|
|
99
|
-
|
|
76
|
+
construct_url('/api_complaints') do |uri|
|
|
77
|
+
return get_response_from_server(uri, {:trans_id => trans_id, :reason => reason}, Net::HTTP::Post)
|
|
78
|
+
end
|
|
100
79
|
end
|
|
101
80
|
|
|
102
81
|
protected
|
|
103
82
|
|
|
104
|
-
def construct_main_server_url(path)
|
|
105
|
-
if servers && servers.starts_with?("https:")
|
|
106
|
-
URI("#{servers}#{path}")
|
|
107
|
-
else
|
|
108
|
-
URI("https://www.elibri.com.pl#{path}")
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
|
|
112
83
|
def get_response_from_server(uri, data, request_class)
|
|
113
84
|
logger.info("doing #{uri}") if logger
|
|
114
85
|
timestamp = Time.now.to_i.to_s
|
|
@@ -122,25 +93,20 @@ module ElibriWatermarking
|
|
|
122
93
|
return validate_response(res)
|
|
123
94
|
end
|
|
124
95
|
|
|
125
|
-
def
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
logger.error($!) if logger
|
|
139
|
-
rescue ServerException
|
|
140
|
-
logger.error($!) if logger
|
|
141
|
-
end
|
|
96
|
+
def construct_url(action)
|
|
97
|
+
if action[0] == "/"
|
|
98
|
+
uri = URI("#{server}#{action}")
|
|
99
|
+
else
|
|
100
|
+
uri = URI("#{server}/transactional_api/#{action}")
|
|
101
|
+
end
|
|
102
|
+
logger.info("trying #{uri}") if logger
|
|
103
|
+
begin
|
|
104
|
+
yield uri
|
|
105
|
+
rescue Timeout::Error, SystemCallError
|
|
106
|
+
logger.error($!) if logger
|
|
107
|
+
rescue ServerException
|
|
108
|
+
logger.error($!) if logger
|
|
142
109
|
end
|
|
143
|
-
raise NoWorkingServer.new("none of the servers #{servers.map { |s| "#{s}.elibri.com.pl" }.join(', ')} seems to work now")
|
|
144
110
|
end
|
|
145
111
|
|
|
146
112
|
def validate_response(res)
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: elibri_watermarking
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.10.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Piotr Szmielew
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2023-12-12 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: rake
|
|
@@ -75,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
75
75
|
- !ruby/object:Gem::Version
|
|
76
76
|
version: '0'
|
|
77
77
|
requirements: []
|
|
78
|
-
rubygems_version: 3.
|
|
78
|
+
rubygems_version: 3.4.17
|
|
79
79
|
signing_key:
|
|
80
80
|
specification_version: 4
|
|
81
81
|
summary: Gem designed to help in use of Elibri watermarking API.
|