Kindle, chmura i okładki

6 mi­nut(y)

Ak­tu­al­nie opro­gra­mo­wa­nie czyt­ni­ków Kin­dle umoż­li­wia wy­świe­tla­nie w bi­blio­te­ce okła­dek ksią­żek i au­dio­bo­oków. Dzia­ła to bez­błęd­nie z książ­ka­mi ze skle­pu Ama­zo­na oraz au­dio­bo­oka­mi z Au­di­ble. Dla tych tre­ści, od nie­daw­na okład­ka wy­świe­tla się tak­że na ekra­nie blo­ka­dy (wy­ga­sza­czu ekra­nu).

Nie­ste­ty po­wyż­sze funk­cje nie dzia­ła­ją tak do­brze dla ksią­żek spo­za eko­sys­te­mu Ama­zo­na, szcze­gól­nie tych wy­sy­ła­nych przez chmu­rę. Moż­li­we jest ła­twe stwo­rze­nie e-bo­oka i wgra­nie go po ka­blu, ta­kie roz­wią­za­nie ma jed­nak licz­ne ogra­ni­cze­nia i nie bę­dę go po­waż­nie roz­wa­żał. Sku­pię się na tre­ściach prze­sy­ła­nych przez chmu­rę Ama­zo­na.

Dawno, dawno temu…

W cza­sach kie­dy Ama­zon sprze­da­wał książ­ki w for­ma­cie AZW, czy­li lek­ko zmo­dy­fi­ko­wa­ne pli­ki PRC/MO­BI, prze­sła­nie wła­snych ksią­żek przez chmu­rę skut­ko­wa­ło otrzy­ma­niem na czyt­ni­ku da­ne­go e-bo­oka, któ­ry moż­li­wo­ścia­mi nie od­bie­gał od tre­ści ze skle­pu Ama­zo­na. Wraz z wpro­wa­dze­niem do po­wszech­ne­go obie­gu for­ma­tu AZW3 (KF8) sy­tu­acja stop­nio­wo za­czę­ła ule­gać zmia­nie. A po wpro­wa­dze­niu for­ma­tu AZW8 (KFX) „po­stęp” w dys­kry­mi­no­wa­niu tre­ści spo­za skle­pu Ama­zo­na wszedł na ko­lej­ny po­ziom.

Pierwsze bitwy

Wraz z wpro­wa­dze­niem opro­gra­mo­wa­nia w wer­sji 5, Ama­zon po­sta­no­wił, że tre­ści prze­sy­ła­ne via e-ma­il do­sta­ną „łat­kę” oso­bi­stych do­ku­men­tów, a nie ksią­żek. I da­lej – oso­bi­ste do­ku­men­ty nie do­sta­ną moż­li­wo­ści wy­świe­tla­nia okła­dek.

Na ta­ki stan rze­czy za­re­ago­wał Ro­bert Błaut, zna­ny też ja­ko qu­iris, któ­ry przy­go­to­wał na­rzę­dzie Extract­Co­ver­Thumbs, któ­re po­zwa­la­ło na wy­ge­ne­ro­wa­nie bra­ku­ją­cych okła­dek.

Pod­sta­wo­wą wa­dą ECT by­ła ko­niecz­ność pod­łą­cze­nia czyt­ni­ka do kom­pu­te­ra co ja­kiś czas, ale to dro­biazg. Ge­nial­na pro­gra­mist­ka Bec­ky przy­go­to­wa­ła ze­staw na­rzę­dzi o na­zwie EKT, któ­ry ko­rzy­sta­jąc z po­my­słu Ro­ber­ta, ale przy cał­ko­wi­cie in­nej im­ple­men­ta­cji m.​in. ro­bi to sa­mo, tyl­ko dzia­ła z po­zio­mu czyt­ni­ka. Dzię­ki te­mu po­zwa­la uzy­skać okład­ki bez ko­niecz­no­ści pod­łą­cza­nia czyt­ni­ka do kom­pu­te­ra.

Kontrofensywa Amazona

Wraz z wy­da­niem opro­gra­mo­wa­nia o nu­me­rze 5.6.5 Ama­zon po­sta­no­wił ukró­cić moż­li­wo­ści ofe­ro­wa­ne przez po­wyż­sze na­rzę­dzia. Ro­bert ulep­szył swo­je na­rzę­dzie, tak by zmie­nia­ło w me­ta­da­nych cde­Ty­pe z „PDOC” na „EBOK”. W od­po­wie­dzi Ama­zon wy­dał wer­sję 5.8.5, któ­ra „po­ra­dzi­ła so­bie z ty­mi prak­ty­ka­mi”. Od tam­te­go mo­men­tu, sys­tem nie tyl­ko sam nie two­rzy okład­ki dla na­szych ksią­żek prze­sy­ła­nych przez chmu­rę, ale do­dat­ko­wo styg­ma­ty­zu­je pli­ki PDOC, tak by po ręcz­nym do­da­niu okład­ki, czyt­nik jej nie wy­świe­tlił.

Ofi­cjal­ne na­rzę­dzie Ama­zo­na do two­rze­nia pli­ków MO­BI – Kin­dle Pre­vie­wer (a tak­że kin­dle­gen), nie wy­peł­nia po­la 501 w me­ta­da­nych, a chmu­ra wi­dząc brak te­go po­la, wsta­wia tam ciąg „PDOC”. W ten spo­sób uzy­sku­je­my efekt za­mie­rzo­ny przez Ama­zo­na – ład­ne okład­ki tyl­ko dla ksią­żek z Kin­dle Sto­re.

Moja odsiecz…

Ro­bert od­pu­ścił, a ra­czej stra­cił moż­li­wość dal­sze­go zwal­cza­nia tej brzyd­kiej za­gryw­ki Ama­zo­na. Nie po­go­dzi­łem się z ta­kim ob­ro­tem spraw i po­sta­no­wi­łem na­pra­wić ten za­mie­rzo­ny i pre­cy­zyj­nie wdro­żo­ny błąd Ama­zo­na. Oczy­wi­ście bez ro­ota ani rusz, ale je­śli ktoś za­dbał o ja­il­bre­ak od­po­wied­nio wcze­śniej, to ma szan­se po­wal­czyć.

Na po­czą­tek zlo­ka­li­zo­wa­łem kla­sę CoverArtServiceImpl.class. A w niej ta­ką in­struk­cję:

if (s.charAt(0) == '*' || "PDOC".equals(anObject)) {
  CoverArtServiceImpl.LOG.b(CoverArtServiceImpl.ezL, new String[] { "nonAmazonContent", s }, (String)null);
  return null;
}

Nie­co da­lej w tej sa­mej kla­sie zna­la­złem ta­ką in­struk­cję:

if ((catalogItem.getCDEKey() == null || catalogItem.getCDEKey().charAt(0) != '*') && !"PDOC".equals(catalogItem.getCDEType())) {
  if (!"PSNL".equals(catalogItem.getCDEType())) {
    final String a3 = this.a(catalogItem.getCDEKey(), catalogItem.getCDEType(), null, b, false);
    if (a3 != null) {
      final String thumbnailLocation = catalogItem.getThumbnailLocation();
      if (thumbnailLocation == null || !thumbnailLocation.equals(a3)) {
          CoverArtServiceImpl.mea.put(a3, catalogItem);
      }
    }
  }
}

W obu przy­pad­kach ciąg „PDOC” uzna­łem za zbęd­ny i po­sta­no­wi­łem się go po­zbyć. Tu­taj ma­ła uwa­ga – jak­by ktoś pla­no­wał po­dob­ne kro­ki, to le­piej niech przy­go­tu­je się na ewen­tu­al­ny brick czyt­ni­ka. Ta kla­sa jest w jed­nym z klu­czo­wych ar­chi­wów JAR i nie moż­na so­bie w niej bez­kar­nie grze­bać do wo­li. Wspo­mnę tyl­ko, że przy wer­sji FW 5.9, w miej­sce na­pi­sów „PDOC” wsta­wi­łem ciąg „JPEG” lub „.JPG” i wszyst­ko dzia­ła­ło jak na­le­ży, ma­to­miast kie­dy zro­bi­łem to sa­mo w wer­sji 5.13.6, to zbric­ko­wa­łem czyt­nik. Po­dob­nie kie­dyś po­my­śla­łem, że sko­ro to 4 zna­ki, to wsta­wię tam „NULL” – to nie był do­bry po­mysł. W koń­cu wsta­wi­łem tam wła­ści­wy ciąg zna­ków, któ­ry nie po­wo­du­je bric­ka, a co naj­waż­niej­sze…

…po tej drob­nej zmia­nie EKT (a tak­że ECT) ge­ne­ru­ją okład­ki, któ­re są wi­docz­ne w bi­blio­te­ce. Tak­że w przy­pad­ku pli­ków PDOC.

Na chwi­lę obec­ną bi­twa za­koń­czo­na zwy­cię­stwem – być mo­że są sub­tel­niej­sze me­to­dy, ale to był „pierw­szy strzał” i choć do­ty­ka wraż­li­wych czę­ści sys­te­mu, to dzię­ki nie­mu mam tyl­ko pol­skie książ­ki (po­za jed­ną te­sto­wą od Ama­zo­na), wszyst­kie wgra­ne na czyt­nik przez chmu­rę i każ­da ma okład­kę wi­docz­ną w bi­blio­te­ce.

Kolejne pole bitwy – wygaszacz

Wraz z ak­tu­ali­za­cją 5.13.6 Ama­zon wpro­wa­dził no­wą funk­cję – wy­świe­tla­nie okład­ki ostat­nio otwo­rzo­nej książ­ki lub au­dio­bo­oka na wy­ga­sza­czu, za­miast do­myśl­nych ołów­ków i ka­ła­ma­rzy. Nie­ste­ty, jak zwy­kle, ta funk­cja dzia­ła bar­dzo do­brze je­dy­nie z książ­ka­mi ze skle­pu Ama­zo­na i au­dio­bo­oka­mi z Au­di­ble.

Ana­li­zo­wa­łem opro­gra­mo­wa­nie w wer­sji 5.13.6, czy­li naj­now­sze dla Kin­dle Voy­age. Zer­k­ną­łem też po­bież­nie na kod z wer­sji 5.13.7 (dla Kin­dle Oasis) i za­uwa­ży­łem, że róż­ni się w kil­ku miej­scach. Użyt­kow­ni­cy no­wych czyt­ni­ków Kin­dle z opro­gra­mo­wa­niem 5.13.7 do­star­cza­ją sprzecz­nych do­nie­sień – u jed­nych okład­ki na wy­ga­sza­czu są przy każ­dej książ­ce, u in­nych przy nie­któ­rych, aż wresz­cie są też oso­by, któ­re okła­dek na wy­ga­sza­czu nie zo­ba­czy­ły przy żad­nej książ­ce spo­za skle­pu Ama­zo­na.

Pierw­szą mo­ją my­ślą by­ło spró­bo­wa­nie ma­new­ru po­dob­ne­go do te­go, któ­ry do­ty­czy okła­dek w bi­blio­te­ce. Prze­szu­ka­łem kod i zna­la­złem tam ta­ką funk­cję:

public static boolean cf(final Book book) {
  if (book != null) {
    final BookMetadata ms = book.ms();
    final String cdeType = ms.getCdeType();
    if (ms != null && !StringUtils.qs(ms.getTitle()) && !StringUtils.qs(ms.nd()) && book.my() != IBook.BookType.INVALID_TYPE && book.my() != IBook.BookType.PDF && book.my() != IBook.BookType.TOPAZ && ms.getContentType() != IBookMetadata.ContentType.BOOK_TYPE_DICTIONARY.getType() && ms.getContentType() != IBookMetadata.ContentType.BOOK_TYPE_NEWSPAPER.getType() && ms.getContentType() != IBookMetadata.ContentType.BOOK_TYPE_FEED.getType() && !cdeType.equals("PDOC")) {
      return true;
    }
  }
  return false;
}

Czy­li okład­ka nie dla PDF-ów, pli­ków TO­PAZ, DIC­TIO­NA­RY (nie do­ty­czy słow­ni­ków z któ­rych ko­rzy­sta­my w cza­sie lek­tu­ry), NEW­SPA­PER, FE­ED i… „PDOC”.

Je­śli ktoś w tym mo­men­cie po­my­ślał, że „wy­sa­dze­nie z sio­dła” tu­taj cią­gu „PDOC” za­ła­twi spra­wę, to nie­ste­ty tak nie jest.

Po­pa­trzy­łem da­lej na kod i zna­la­złem np. ta­ki frag­ment:

public String getDisplayStyle() {
  return ("AUDI".equals(this.mType) || "EBOK".equals(this.mType)) ? "covers" : null;
}

To jak – do­pi­sze­my tu­taj "PDOC".equals(this.mType) i bę­dzie do­brze? Otóż nic tu­taj nie do­pi­sze­my – nie ma­my peł­nych źró­deł, więc nie mo­że­my do­wol­nie do­da­wać ko­du, tyl­ko je­dy­nie pod­mie­niać frag­men­ty.

To mo­że w miej­sce „AU­DI” wsta­wi­my „PDOC”? Przede wszyst­kim to ze­psu­cie do­myśl­nej funk­cji czyt­ni­ka, choć w przy­pad­ku Voy­age, gdzie au­dio­bo­oki są nie­do­stęp­ne, to żad­na stra­ta, to ta­ka pod­mia­na nie roz­wią­zu­je pro­ble­mu.

W jesz­cze in­nej kla­sie ist­nie­je ta­ka in­struk­cja:

if (this.eAn != null && this.eAq != null && this.eAq.equals(cd) && FileUtils.fileExists(this.eAs) && (!"EBSP".equals(this.eAn.getCdeType()) || !"EBOK".contentEquals(this.ce(book)))) {
  BookCoverHandler.LOG.info("Book cover model is not executed as the same book is opened");
  return;
}

Oczy­wi­ście wy­mia­na tu­taj „EBSP” na „PDOC” (zno­wu nie mo­że­my so­bie do­pi­sać ko­du), po­skuk­tu­je oka­le­cze­niem do­myśl­nej funk­cji – tu­taj na wy­ga­sza­czu nie zo­ba­czy­my pró­bek ksią­żek ze skle­pu Ama­zo­na. Oczy­wi­ście nie spra­wi to, że oso­bi­ste do­ku­men­ty za­czną wy­świe­tlać okład­kę na ekra­nie blo­ka­dy.

Nie bę­dę już przy­ta­czał ko­lej­nych zna­le­zio­nych frag­men­tów od­no­szą­cych się do okła­dek na wy­ga­sza­czu. Pod­su­mu­ję to tak: me­cha­nizm dys­kry­mi­no­wa­nia ksią­żek spo­za skle­pu Ama­zo­na jest roz­bi­ty na kil­ka klas, a kod miej­sca­mi jest tak skon­stru­owa­ny, że nie da się bez­piecz­nie do­dać wy­świe­tla­nia okła­dek PDOC–ów na wy­ga­sza­czu, bez po­świę­ce­nia okła­dek dla pró­bek i au­dio­bo­oków.

Na chwi­lę obec­ną, po­ma­ga zmia­na w me­ta­da­nych książ­ki cde­Ty­pe z „PDOC” na „EBOK”. Po tej pro­stej ope­ra­cji, któ­rą wy­ko­nu­ję bez­po­śred­nio na czyt­ni­ku, okład­ka na wy­ga­sza­czu po­ja­wia się bez­pro­ble­mo­wo. Od­by­wa się to jed­nak kosz­tem syn­chro­ni­za­cji e-bo­oka po­mię­dzy róż­ny­mi urzą­dze­nia­mi. Czy­tam tyl­ko na jed­nym czyt­ni­ku, więc nie­spe­cjal­nie mi to prze­szka­dza. Je­śli póź­niej, już po uka­za­niu się okład­ki otwo­rzo­nej książ­ki na wy­ga­sza­czu, przy­wró­cę „PDOC” w me­ta­da­nych, to okład­ka nie znik­nie – do cza­su otwo­rze­nia in­nej książ­ki.

Roz­wią­za­nie śred­nio mnie za­do­wa­la – to w koń­cu mo­dy­fi­ko­wa­nie pli­ków z książ­ka­mi i po­świę­ce­nie syn­chro­ni­za­cji. Wi­dząc jed­nak, że w tej kwe­stii opro­gra­mo­wa­nie róż­ne o je­den nu­me­rek na trze­ciej po­zy­cji (5.13.7), róż­ni się zna­czą­co i nie ma­jąc pew­no­ści, że Voy­age zo­stał cał­ko­wi­cie po­rzu­co­ny, ze zna­le­zie­niem bar­dziej ele­ganc­kie­go roz­wią­za­nia wstrzy­mam się do wer­sji 5.14 lub 6.0. W każ­dym ra­zie bi­twa nie jest skoń­czo­na. Być mo­że in­ter­wen­cja nie bę­dzie po­trzeb­na, bo Ama­zon do­pu­ści wy­świe­tla­nie okła­dek na wy­ga­sza­czu dla PDOC-ów.

Komentarze (2)

  syl­wek

Cze­mu ty nie po­da­jesz, ja­ki ciąg zna­ków tam wsta­wi­łeś, co też bym so­bie wsta­wił, al­bo ten EKT, że­byś wsta­wił re­le­ase al­bo in­struk­cję, jak uru­cho­mić na czyt­ni­ku?

Po­za tym przyj­rza­łem się bar­dziej two­im re­po (gi­thub atha­me­bo­ok) i ty do­ku­men­tu­jesz kod jak *, ani ko­men­ta­rzy, ani ja­kie­goś re­ad­me, wszyst­ko na za­sa­dzie „wiem, ale nie po­wiem”.

Od­po­wiedz




  Atha­me

Świa­do­mie za­ło­ży­łem, że jak ktoś do­tarł do te­go eta­pu, to bę­dzie wi­dział co tam moż­na wpi­sać, a cze­go nie wol­no. Oso­bi­ście wsta­wi­łem ja­kiś ist­nie­ją­cy, a nie­wy­ko­rzy­sty­wa­ny prze­ze mnie ciąg cde­Ty­pe(). Dzia­ła­ją róż­ne, a u mnie jest to praw­do­po­dob­nie „PSNL” (a prz­yn­ajmniej był przez ja­kiś czas i dzia­łał).

EKT jest ja­kie jest - nie uży­wam JB, a tym bar­dziej MRPI, więc na wła­sny uży­tek nie przy­go­to­wy­wa­łem pacz­ki in­sta­la­cyj­nej. Moi zna­jo­mi uży­wa­ją ro­ota ode mnie i tam zu­peł­nie ina­czej wgry­wa­my mo­dy.

Gi­thub atha­me­bo­ok jest mo­im pry­wat­nym, gdzie kod da­le­ko od­bie­ga od upo­rzad­ko­wa­ne­go i nie jest przy­go­to­wy­wa­ny dla po­wszech­ne­go użyt­ku.

Od­po­wiedz




Dodaj komentarz