elibri_watermarking 0.9.12 → 0.10.1

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: 6dfeccb31fb16c84d2df681c37df78b70806f7b075380a45059d393774e8811b
4
- data.tar.gz: '00569eacecf7a8d1f61e72d0a9bd03984c8a8725f666d7f3513a3c058a8d068f'
3
+ metadata.gz: 7da8046f7838971cb2018299ea60181556f6a0b77e3a9ae166878db5d3bc32ea
4
+ data.tar.gz: 18a0c3940cb3f71e90706ed8de498a09432d75b5766b49363ceb609c6d142381
5
5
  SHA512:
6
- metadata.gz: 3d2874427b18fff2d1b47f3c509bf92973336b9eab6b115c92bb7c4b3e7ac50088c8370c1e6d218a95e2d6343ca408d953787a17b92d972a29a3526c43470788
7
- data.tar.gz: 17c627667d83ca72287445758cbf09c53db4afe537993c2dfe1ee682326a25817d5a7384eed0a4ff5184e1960d67536ee057dc279c902a47b98c8cf2969ba0cf
6
+ metadata.gz: cfac4d93c881d47f52351d03d0ccd097891ed448935861aba6310a96c6b5e988b6c9ca277300a9925b937aae4a9b1c7bd9ba39643eeac888521bff610fe5175d
7
+ data.tar.gz: 2fd51e451aaae9d5d829071376690b6d316f5501d3982de7f190a4201f7b8f99f04c21d2815fcca4e0af0c71a1e290f6608717661f0ab715581bf96dca14c3e8
data/README.md CHANGED
@@ -1,101 +1,24 @@
1
- # Biblioteka Elibri Watermarking
1
+ # Elibri Watermarking
2
2
 
3
- ## Opis
3
+ ## Description
4
4
 
5
- Biblioteka Elibri Watermarking, dostarczana jest w postaci pliku gema (dostępna na rubygems: https://rubygems.org/gems/elibri_watermarking ).
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
- ## Zastosowanie
7
+ ## Usage
9
8
 
10
- Biblioteka Elibri Watermarking upraszcza operacje wykonywane na API watermarkingu Elibri, abstrahując je do operacji wykonywanych na obiekcie Rubyego.
9
+ First, include `elibri_watermarking` in your Gemgile
11
10
 
12
- ## Użycie
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
- Biblioteka daje nam do dyspozycji parę metod, odpowiadających wywołaniom metod API watermarkingu elibri:
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
- Request jest typu post, zawiera w swojej treści identyfikator ukończonej transakcji - po jego otrzymaniu sklep powinien odebrać plik z bucketu s3 i zapisać go u siebie na serwerze.
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, :servers
14
+ attr_accessor :token, :secret, :logger, :server
15
15
 
16
- def initialize(token, secret, servers = nil)
16
+ def initialize(token, secret, server = nil)
17
17
  self.token = token
18
18
  self.secret = secret
19
- self.servers = servers
19
+ self.server = server || "https://www.elibri.com.pl"
20
20
  end
21
21
 
22
- def watermark(ident, formats, visible_watermark, title_postfix, customer_ip, client_symbol = nil, supplier = nil,
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
- raise ParametersError.new if delivery_form && formats != 'mp3_in_zip'
33
- raise ParametersError.new if delivery_form && (delivery_form != 'mp3' && delivery_form != 'zip')
34
- data = {ident_type => ident, 'formats' => formats, 'visible_watermark' => visible_watermark,
35
- 'title_postfix' => title_postfix, 'client_symbol' => client_symbol, 'delivery_form' => delivery_form}
36
- data.merge!(:supplier => supplier) if supplier
37
- data.merge!(:customer_ip => customer_ip) if customer_ip
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 = false)
47
- try_with_different_servers('deliver') do |uri|
48
- data = {'trans_id' => trans_id}
49
- data.merge!(:low_priority => low_priority) if low_priority
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, delivery_form = nil, low_priority = false)
55
- try_with_different_servers('retry') do |uri|
56
- data = {'trans_id' => trans_id, 'delivery_form' => delivery_form}
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
- try_with_different_servers('available_files.json') do |uri|
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
- try_with_different_servers('soon_available_files.json') do |uri|
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
- try_with_different_servers('soon_unavailable_files.json') do |uri|
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
- get_response_from_server(construct_main_server_url('/api_complaints'), {:trans_id => trans_id, :reason => reason}, Net::HTTP::Post)
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 try_with_different_servers(action)
126
- txt_record = self.servers || Net::DNS::Resolver.start("transactional-servers.elibri.com.pl", Net::DNS::TXT).answer.first.txt
127
- servers = txt_record.split(",").sort_by { rand }.map(&:strip)
128
- servers.each do |server|
129
- if server.starts_with?("https:")
130
- uri = URI("#{server}/watermarking/#{action}")
131
- else
132
- uri = URI("https://#{server}.elibri.com.pl/watermarking/#{action}")
133
- end
134
- logger.info("trying #{uri}") if logger
135
- begin
136
- yield uri
137
- rescue Timeout::Error, SystemCallError
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)
@@ -1,3 +1,3 @@
1
1
  module ElibriWatermarking
2
- VERSION = "0.9.12"
2
+ VERSION = "0.10.1"
3
3
  end
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.9.12
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: 2022-07-04 00:00:00.000000000 Z
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.1.6
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.