Elég régóta küzdök azzal a problémával, hogy miként tudnám automatikusan rendszerezni az ebook gyűjteményemet. Természetesen itt most több ezer pdf, chm, djvu és doc/docx fájlra kell gondolni. Eddigi lusta megoldásom az volt, hogy próbáltam fő témakörök szerint „bemappázni” őket, de mindig is éreztem, hogy ez nem túl jó megoldás, mivel így lehetetlen rákeresni egy adott könyvre. Erre megoldást nyújthatott volna a Google Desktop Search alkalmazása, de sajnos ez sem volt elég hatékony számomra. Így hát nem maradt más, mint hogy magunk oldjuk meg ezt a problémát.
A könyvek rendszáma
Ahhoz, hogy megfelelően kereshető adatbázist építsünk fel, rendelkeznünk kell a könyvek leíró adataival, mint pl. cím, szerző, kiadó, kiadás éve, rövid leírás, kulcssavak, stb. Ezeket az adatokat általában a könyvtárosok töltik fel a megfelelő adatbázisokba. A könyvek egyértelmű azonosítására pedig minden könyvhöz hozzárendelnek egy számot még kiadás előtt, mégpedig az ISBN számot (International Standard Book Number) ami 13 jegyű (a 2007. január 1. előtt kiadott könyveknél 10 jegyű). Ezen kód alapján bármely könyv egyértelműen azonosítható bármely adatbázisban. Szuper. Ez már megfelelő alapot nyújt ahhoz, hogy elvileg automatikusan katalogizáljuk többezres ebook gyűjteményünket. Két problémát kell megoldanunk: találni kell egy ingyenes és nyílt adatbázist, amiben lehetséges ISBN szám alapján keresni, valamint meg kell határoznunk a keresett ebook ISBN számát. Ez utolsó nem könnyű feladat.
Google Books mint adatbázis
Azt hiszem, ha nyílt könyvadatbázisra van szükségünk, akkor a leghelyesebb a Google Books szolgáltatásával kezdeni (bővebben itt). Mit is tud a Google Books? Semmi komolyat, csak cím, szerző és ISBN szám alapján kereshetünk a bedigitalizált könyvek között és a szükséges leíróadatokat beleértve a borító képet is letölthetjük hozzá. Csupán ennyit tud, de ez bőven elég! És egyben fantasztikus is! Irány a Visual Studio 2010 és new project.
Hárdkódolás
Ok, akkor most egy picit álljunk meg. Szükség lesz pár dll-re, hogy elérjük a Google Books szolgáltatást. A Google .NET API-ja itt érhető el. Töltsük le a bináris csomagot, majd adjuk hozzá a WPF-es projektünkhöz a következő szerelvényeket:
- Google.Apis.dll
- Google.Apis.Books.V1.dll
- Newtonsoft.Json.Net35.dll
bs.DeveloperKey = {YOUR_API_KEY};
A következő feladat, hogy beállítsuk az alkalmazáskulcsot. Abban az estben, ha még nem rendelkeznünk API_KEY-el azt a következő oldalon igényelhetjük bejelentkezés után: link
Eddig megvolnánk, most már csak meg kell konstruálnunk a query stringet és átadni a Google Book API-nak. Mi most ISBN szám alapján fogunk keresni, de persze vannak egyéb lehetőségek is. Részletek bővebben itt.
Eddig megvolnánk, most már csak meg kell konstruálnunk a query stringet és átadni a Google Book API-nak. Mi most ISBN szám alapján fogunk keresni, de persze vannak egyéb lehetőségek is. Részletek bővebben itt.
string query = "isbn:9780123814722";
VolumesResource vrs = new VolumesResource(bs);
Volumes volumes = vrs.List(query, VolumesResource.Download.Epub, null, null, 1,
VolumesResource.OrderBy.Relevance, VolumesResource.PrintType.All,
VolumesResource.Projection.Full, null, 0);
A VolumeResource List metódusának meghívása elindítja a lekérdezést. Az eredményt pedig eltároljuk a volumes változóban. A Volumes Items listájának első eleme lesz a keresett könyv. A könyvet leíró információkat a VolumeInfo tulajdonságon keresztül érhetjük el. Nagyon fontos, hogy az így kapott VolumeInfo nem teljes! Ennek az oka az, hogy ha nem ISBN kulcs alapján hanem pl. a leírásban keresünk kulcsszavak alapján akkor a találat nem egy elemű hanem akár a 40-et is elérheti. Nem lenne okos dolog mind a 40 könyvnek a teljes leírását átpumpálni a neten miközben nem is biztos, hogy a keresés eredménye megfelelő számunkra. Részletes információt a könyv ID-je alapján kérdezhetünk le a következő képen:
Volume volume = vrs.Get(id, VolumesResource.Projection.Full, null);
Volume volume = vrs.Get(id, VolumesResource.Projection.Full, null);
És ezzel meg is volnánk. Ha a könyvet sikerült megtalálni, akkor a következő információk érhetőek el: Title, Subtitle, Authors, Description, Publisher, PublishedDate, PageCount stb. Milyen szép lenne, ha a könyveinket a borítóképek alapján jelenítenénk meg. Természetesen ennek sincsen már akadálya. A borítókép a következőképpen érhető el:
A coverLink segítségével már letudjuk tölteni a borítót. A kész mintaalkalmazás képernyőképe itt látható. Hát nem kellemes a szemnek?
Ugye milyen egyszerű? Ha valami mégsem lenne világos akkor minden kiderül a mintaalkalmazásból:
A Google Books API tanulmányozásában nagyon sokat segíthet a Goolge Apis Explorer amit mindenkinek a figyelmébe ajánlok.
Egy kérdés maradt csak már hátra, miként lehet kinyerni az ISBN számot. Először is a könyv címe alapján indítsunk egy Google keresést és még spékeljük meg az "amazon" kulcsszóval. Ezután a kapott választ szedjük szanaszét egy reguláris kifejezéssel és meg fogjuk kapni az ISBN számot:
Abban az estben, ha a fájlok nevei nem a könyvek címét tartalmazzák akkor sem kell feladnunk, hiszen magukban a könyvekben is megtalálhatjuk az ISBN számot. A legegyszerűbben az IFilter segítségével nyerhetjük ki a fájlok szöveges tartalmát, majd egy regex kifejezéssel felkutatjuk az ISBN kulcsot. Szép feladat.
Volume.VolumeInfoData.ImageLinksData ild = vinfo.ImageLinks;
string coverLink = ild.Thumbnail;
string coverLink = ild.Thumbnail;
A coverLink segítségével már letudjuk tölteni a borítót. A kész mintaalkalmazás képernyőképe itt látható. Hát nem kellemes a szemnek?
Ugye milyen egyszerű? Ha valami mégsem lenne világos akkor minden kiderül a mintaalkalmazásból:
A Google Books API tanulmányozásában nagyon sokat segíthet a Goolge Apis Explorer amit mindenkinek a figyelmébe ajánlok.
Egy kérdés maradt csak már hátra, miként lehet kinyerni az ISBN számot. Először is a könyv címe alapján indítsunk egy Google keresést és még spékeljük meg az "amazon" kulcsszóval. Ezután a kapott választ szedjük szanaszét egy reguláris kifejezéssel és meg fogjuk kapni az ISBN számot:
1: public static string SearchIsbnInFileName(string fileName)
2: {
3: string uri = "http://www.google.com/search?hl=en&q=%22" + HttpUtility.UrlEncode(fileName) + "%22+amazon";
4: Match match = Regex.Match(simpleBrowseToPage(uri), @"www.amazon.com/.*?/(\d{9}X|\d{10,13})");
5: if (match.Success)
6: return match.Groups[1].ToString();
7:
8: return string.Empty;
9: }
10:
11: private static string simpleBrowseToPage(string uri)
12: {
13: HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
14: request.Method = "GET";
15: HttpWebResponse response = (HttpWebResponse)request.GetResponse();
16: string str = new StreamReader(response.GetResponseStream()).ReadToEnd();
17: response.Close();
18: return str;
19: }
0 megjegyzés :
Megjegyzés küldése