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 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.