ePUB extrahieren

ePUB extrahierenDa ich einige E-Books auf meinem Rechner habe, wollte ich mir eine Übersicht verschaffen und eine Art Katalog erstellen. Für diesen “Katalog” sollte das Titelbild und ein paar Metadaten (Titel, Autor, etc.) angezeigt werden. Zuerst dachte ich an die Verwendung einer API, wie z.Bsp.:

Beide verfügen über Suchfunktionen und Methoden zum Auffinden von Buch-Covern. Leider zeigte sich, dass Cover und Informationen für deutsche Bücher, wie ich sie besitze recht rar gesät sind.

Da die meisten meiner Bücher ohne DRM sind, entschied ich mich dann, die Daten einfach direkt aus den Büchern auszulesen(ePUB extrahieren). In meinem Artikel “ePUB-Screencast, Reise durch ein Buch in 1:18” habe ich erläutert, wie ich mir die Arbeitsweise eines eReaders vorstelle. Dieser Vorstellung folgend, habe ich mir also einen kleinen eReader (Schwerpunkt Metadaten und Coverbild) in Node.js erstellt.

Die Arbeitsweise, ist wie im obigen Artikel beschrieben, Öffnen des Archivs, Auslesen des Pfades der Content-Datei (pof) aus der Container.xml unter META-INF und dann analysieren von Metadaten und Manifest in dieser OPF-Datei.

Voraussetzung für das Programm sind neben Node.js die Module xml2js (für die Umwandlung von XML in JSON) und node-zip (für das Auslesen des ZIP-Archivs).

Der ePUB-Extractor selbst ist event-gesteuert. Um ein ePUB extrahieren zu können, muss man den Extractor mit dem Pfad des Buches instanzieren und sich dann beim Ereignis “extracted” registrieren.

var epub = require('./extractor.js'),
    extractor = epub.getExtractor('pg35794-images.epub');

// Eventuelle Fehler abfangen
extractor.on('extracterror', function(data) {
   console.log(data.message);
});

// Fertig-Ereignis registrieren
extractor.on('extracted', function(data) {
   var item;
   // Daten zum ePUB
   console.log(data); 
   // Daten eines Zip-Eintrags holen
   item = extractor.getItemData('35794/www.gutenberg.org@files@35794@35794-h@35794-h-3.htm.html'); 
   console.log(new Buffer(item.toString(), 'binary').toString('utf8'));
}); 

// Extraction starten
extractor.extract();

Der obige Code zeigt, wie man den Extractor verwenden kann. Bei Registrierung des Ereignisses “extracted” bekommt man die Buch-Daten als JSON-Objekt.

{ filename: 'pg35794-images.epub',
 filesize: 154382,
 entries: 
 [ '35794/www.gutenberg.org@files@35794@35794-h@35794-h-1.htm.html',
 '35794/wrap0000.html',
 '35794/www.gutenberg.org@files@35794@35794-h@35794-h-3.htm.html',
 '35794/www.gutenberg.org@files@35794@35794-h@images@title-page.jpg',
 'META-INF/container.xml',
 '35794/0.css',
 'mimetype',
 '35794/pgepub.css',
 '35794/1.css',
 'META-INF/',
 '35794/www.gutenberg.org@files@35794@35794-h@35794-h-4.htm.html',
 '35794/www.gutenberg.org@files@35794@35794-h@35794-h-2.htm.html',
 '35794/www.gutenberg.org@files@35794@35794-h@35794-h-0.htm.html',
 '35794/www.gutenberg.org@files@35794@35794-h@35794-h-5.htm.html',
 '35794/www.gutenberg.org@files@35794@35794-h@35794-h-7.htm.html',
 '35794/toc.ncx',
 '35794/www.gutenberg.org@files@35794@35794-h@35794-h-6.htm.html',
 '35794/',
 '35794/content.opf' ],
 isEPUB: true,
 containerInfo: 
 { href: '35794/content.opf',
 filename: 'content.opf',
 opfRoot: '35794',
 type: 'application/oebps-package+xml',
 xml: 'XML der container.xml'},
 opfInfo: 
 { xml: 'XML der OPF-Datei'
 packageInfo: 
 { namespaces: [Object],
 hasMetadata: true,
 hasManifest: true,
 hasSpine: true,
 hasGuide: true,
 version: '2.0',
 'unique-identifier': 'id',
 metadataKey: 'metadata',
 manifestKey: 'manifest',
 spineKey: 'spine',
 guideKey: 'guide' },
 metadataInfo: { namespaces: [], meta: [Object], coverID: 'coverpage' },
 manifestInfo: { cover: [Object], hasNCX: true, items: [Object] },
 spineInfo: { linear: [Object], notlinear: [Object], toc: [Object] },
 guideInfo: { references: [Object], hasCover: true, hasToC: true } },
 coverData: 
 { path: '35794/www.gutenberg.org@files@35794@35794-h@images@title-page.jpg',
 data: 'base64-Data des Bildes'
 type: 'image/jpeg' },
 ncxInfo: 
 { navMap: 
 [ [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object],
 [Object] ],
 xml: 'NCX-Datei als XML',
 uid: 'http://www.gutenberg.org/ebooks/35794',
 depth: '2',
 generator: 'EpubMaker 0.3 by Marcello Perathoner <webmaster@gutenberg.org>',
 totalPageCount: '0',
 maxPageNumber: '0' 
 } 
}

Der obige Code zeigt die ersten Ebenen des data-Objektes. Es werden alle relevanten Informationen aus Container.xml, content.opf und toc.ncx extrahiert und (falls ein Cover-Eintrag vorhanden ist) das Cover als Base64-String übergeben. Wer selber parsen möchte, kann die XML-Dateien (Container, pof, ncx), die ebenfalls übergeben werden, verwenden.

Die Metadaten des Buches liegen dann unter matadataInfo.meta. Wer also über JavaScript ePUB extrahieren möchte, kann gerne das Script verwenden, bzw. dieses Script als Basis für eigene Entwicklungen verwenden.

ePUB extrahieren Kurzübersicht:

  • Installieren der Module xml2js und node-zip:
  • npm install xml2js
  • npm install node-zip
  • Download des Scriptes hier
  • Verwenden des Schiptes

Für Fragen ( ePUB extrahieren, ePUB allgemein und Programmierung ) stehe ich natürlich gerne zur Verfügung.

 

 

 

iTunes TV Shows taggen

iTunes TV Shows taggenUm auch eigene Serien in iTunes gut aussehen zu lassen muss man  in iTunes TV Shows tagen. Einige Informationen kann man über den Informationen-Dialog manuell pflegen und so über iTunes TV Shows tagen, aber erstens ist das mühsam und zweitens bietet die Oberfläche keine Eingabemöglichkeit für weitere Informationen, wie Schauspieler, Drehbuchautor, etc. Für alle Metadaten (u.a. auch plists), die iTunes für die Anzeige verwendet, kann man tags in den mp4-Dateien setzen. Ein freier tagger ist AtomicParsley. Im letzten Artikel habe ich mein NPM-Modul zum Laden von Seriendaten vorgestellt. Dieses Modul verwende ich jetzt in einem zweiten Modul, das mir erlaubt die Daten in einer lokalen Datenbank zu speichern und für das taggen aufzubereiten. Hierfür bietet das Modul einen Wrapper für AtomicParsley.

Ergebnis: iTunes TV Shows taggen

iTunes Infos TV-ShowDie meisten tags liegen auf der ersten Seite des Information-Dialogs und könnten auch dort gesetzt werden.

Diese Informationen steuern die Anzeige bezüglich gezeigter Attribute. Wie lautet der Name, etc.

Die Sortierung wird über den Reiter Sortierung gesteuert. Im Gegensatz zu Musik, gibt es bei Videos (Movies, TV Shows) einen Reiter Video. Bei TV Shows beinhaltet dieser Reiter Felder zur Gruppierung bzw. Sortierung der Serien-Episoden. I.d.R. will man die Folgen pro Staffel gruppiert haben und in der Reihenfolge der Folgen dargestellt bekommen.

iTunes TV ShowsHier finden sich die Felder:

  • - Sendung
  • - Folgen-ID
  • - Beschreibung

Sendung wirkt gruppierend und Folgen-ID sortierend. Die Beschreibung beinhaltet die Inhaltsbeschreibung der Episode.

Um iTunes TV Shows tagen zu können, muss man den Zusammenhang zwischen tag und iTunes-Feld kennen und deren Wirkung bewerten können. Schauen wir uns also die tags bzw. deren Werte über AtomicParsley (AtomicParsley video.mp4 -t) an.

Atom "©nam" contains: Folge 1 - Aufgepasst, der Richter kommt
Atom "©ART" contains: Harrys wundersames Strafgericht
Atom "aART" contains: Harrys wundersames Strafgericht
Atom "©alb" contains: Harrys wundersames Strafgericht
Atom "©day" contains: 1984
Atom "trkn" contains: 1
Atom "disk" contains: 1
Atom "cpil" contains: false
Atom "tvsh" contains: Harrys wundersames Strafgericht
Atom "tvnn" contains: NBC
Atom "tven" contains: s01e01
Atom "tvsn" contains: 1
Atom "tves" contains: 1
Atom "sonm" contains: Folge 1 - Aufgepasst, der Richter kommt
Atom "soar" contains: Harrys wundersames Strafgericht
Atom "soaa" contains: Harrys wundersames Strafgericht
Atom "soal" contains: Harrys wundersames Strafgericht, Staffel 1
Atom "sosn" contains: Harrys wundersames Strafgericht
Atom "desc" contains: Der neue Richter Harry T. Stone kommt. Er wird von der Sekretärin, dem Gerichtsdiener und zwei Anwälten schon sehnlichst erwartet. Wenn sie wüssten, dass er sich bei ihnen schon längst eingeschlichen 
Atom "ldes" contains: Der neue Richter Harry T. Stone kommt. Er wird von der Sekretärin, dem Gerichtsdiener und zwei Anwälten schon sehnlichst erwartet. Wenn sie wüssten, dass er sich bei ihnen schon längst eingeschlichen hat.
Atom "hdvd" contains: 0
Atom "stik" contains: TV Show
Atom "pgap" contains: false
Atom "----" [com.apple.iTunes;iTunMOVI] contains: <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>cast</key>
  <array><dict>
   <key>name</key>
   <string>Harry Anderson</string>
  </dict>
  <dict>
   <key>name</key>
   <string>John Larroquette</string>
  </dict>
  <dict>
   <key>name</key>
   <string>Markie Post</string>
  </dict>
  <dict>
   <key>name</key>
   <string>Charles Robinson</string>
  </dict>
  <dict>
   <key>name</key>
   <string>Paula Kelly</string>
  </dict>
  <dict>
   <key>name</key>
   <string>Karen Austin</string>
  </dict>
  <dict>
   <key>name</key>
   <string>Richard Moll</string>
  </dict>
  <dict>
   <key>name</key>
   <string>Selma Diamond</string>
  </dict>
  <dict>
   <key>name</key>
   <string>Ellen Foley</string>
  </dict>
  <dict>
   <key>name</key>
   <string>Marsha Warfield</string>
  </dict>
  <dict>
   <key>name</key>
   <string>Florence Halop</string>
  </dict>
  <dict>
   <key>name</key>
   <string>William Utay</string>
  </dict>
  <dict>
   <key>name</key>
   <string>Mel Tormé</string>
  </dict>
  <dict>
   <key>name</key>
   <string>Denice Kumagai</string>
  </dict> 
 </array>
  <key>codirectors</key>
 <array/>
 <key>directors</key>
 <array>
  <dict>
   <key>name</key>
   <string>James Burrows</string>
  </dict>
 </array>
 <key>producers</key>
 <array/>
 <key>screenwriters</key>
 <array>
  <dict>
   <key>name</key>
   <string>Reinhold Weege</string>
  </dict> 
 </array>
 <key>studio</key>
 <string></string>
</dict>
</plist>
Atom "©grp" contains: Harrys wundersames Strafgericht
Atom "gnre" contains: Comedy
Atom "covr" contains: 1 piece of artwork

aAtomicParsley zeigt die Originalnamen (4 Chars) der Tags, obwohl in den Optionen des Tagging-Aufrufs sprechende Namen verwendet werden. Dafür bietet sich eine tagMap an.

tagMap um iTunes TV Shows tagen zu können

'©alb': 'album', 
 '©nam': 'title',
 '©ART': 'artist',
 aART: 'albumArtist',
 '©grp': 'grouping',
 trkn: 'tracknum',
 tvsh: 'TVShowName',
 tven: 'TVEpisode',
 tvsn: 'TVSeasonNum',
 tves: 'TVEpisodeNum',
 desc: 'description', 
 ldes: 'longdesc',
 sonm: 'sortOrder name',
 soar: 'sortOrder artist',
 soaa: 'sortOrder albumartist',
 soal: 'sortOrder album',
 sosn: 'sortOrder show',
 disk: 'disk',
 stik: 'stik',
 tvnn: 'TVNetwork',
 '©day': 'year',
 '©gen': 'genre'

Diese tagMap verwende ich im Modul zum Aufbau des AtomicParsley-Befehls. Optionen mit “sortOrder” schreiben tags für den Reiter Sortierung. S

iTunes Infochaut man sich den Output von AtomicParsley -t an, so fällt die plist-xml auf. Diese Informationen sind bei iTunes TV Shows nur im Info-Fenster sichtbar. Hier erscheinen die lange Beschreibung und der Inhalt der plist zu cast, screenwirter und Direktors. Alle diese Informationen liegen auf thetvdb.com vor und können für das iTunes TV Shows taggen verwendet werden. Das Staffelbild (artwork) muss natürlich erst heruntergeladen werden – kann dann aber ebenfalls (über den Pfadnamen) in die mp4-Datei geschrieben werden.

Um mir die Arbeit zu erleichtern, habe ich das Modul hpv-tvdb-mngr geschrieben. Dieses erlaubt mir das

  • Suchen einer Serie auf TheTvDb.com
  • Herunterladen der Daten und Bilder
  • Speichern der Daten in einer lokalen Datenbank
  • Taggen meiner Video-Dateien (einzeln oder ganze Staffel)

Wer über node.js iTunes TV Shows taggen möchte, kann sich das Modul ja mal anschauen, oder AtomicParsley näher betrachten.

thetvdb-api client

Da ich plane vom Windows Mediacenter wegzugehen und wahrscheinlich meine Mediathek nur über iTunes steuern werde, brauche ich ein Tool um mir Seriendaten für das tagging der mp4-Dateien zu besorgen. Habe mir deshalb in Notes.js eine kleine Anwendung erstellt, die über die thetvdb-api die Daten für meine Serien lädt. Wer auch die api verwenden will (und über einen Api-Key, oder sich einen zulegen will), hier meine Umsetzung. Dieser client bereitet die Daten auf und liefert das Ergebnis als JSON.

Installation geht einfach über

npm install hpv-tvdb

Hier die README von Github bzw. npmjs.org

thetvdb-api client

Client (für den Eigenbedarf entwickelt), der deutsche Informationen von thetvdb.com bezieht und diese in Form von JSON bereitstellt. Der Client stellt Methoden für den Zugriff auf die thetvdb.com-Api bereit. Für die Verwendung wird ein API-Key von thetvdb.com benötigt.

Installation

npm install hpv-tvdb

Das Modul verwendet request für die Aufrufe der tvdb-Api und xml2js für die Konvertierung der XML-Dateien

Verwendung

var tvdbc = require('hpv-tvdb'),
    client = new tvdbc.TvDbClient(%apikey),
    callback = function(err, result) {
        console.log(result);
    };
client.getSeriesByTitle('Bones', callback); 
// SerienId entnehmen
client.getSeasonsBySeriesId('75682', callback);

%apikey = von thetvdb.com bereitgestellter API-Key

API

Alle Aufrufe verlangen eine callback-Funktion in der Form function(error, result)

Suche über Titel

Aufruf

getSeriesByTitle(%titel, callback)

Result

Array von Serieninfo-Objekten

SerienInfo-Objekt

[ 
   {
        name: Serienname,
        alias: Alias-Name,
        imageurl: URL zum Banner,
        id: Serien-ID,
        language: Sprache,
        overview: Serienübersicht,
        imdbid: ID auf imdb.com
     }      
]

Alle Serieninformation über Serien-Id

Aufruf

getSeasonsBySeriesId(%Serien-Id, callback)

Result

Ein Serienobjekt mit allen Staffeln und Episoden. Enthält alle nötigen Daten ausser den Staffelbildern.

Serien-Objekt

    {
        series: {
            name: Serienname,
            id:  Serien-Id,
            overview: Übersicht,
            actors: [Array von Schuspielernamen],
            genre: [Array von Genres],
            rating: Einstufung,
            network: TV-Sender,
            language: Sprache,
            firstaired: Erstaustrahlung
        },
        seasons: {
            '%Staffelnummer': {
                seasonid: ID der Staffel,
                seasonnumber: Staffelnummer,
                episodes: [
                    {
                        name: Titel der Episode,
                        number: Nummer der Folge,
                        id: ID der Episode,
                        overview: Inhalt der Episode,
                        directors: [Array von Regiseuren],
                        writers: [Array von Drehbuchautoren],   
                        firstaired: Erstausstrahlungsdatum,
                        imageurl: URL zum Episodenbild, 
                        gueststars: [Array von Gaststars],
                        language: Sprache der Episode (de)
                    }
                ]
            }
        }
    }                   

%Staffelnummer = ’1′, ’2,’ …

Alle Bild-Urls einer Serie

Aufruf

getBannersBySeriesId(%Serien-Id, callback)

Result

Ein Objekt strukturiert nach Bildarten (bannertype)

{
    '%Bildart' : {
        url: Url zum Bild, 
        language: Sprache
    }
}          

Mögliche Bildarten sind:

  • fanart
  • poster
  • season
  • series

Schauspielerinformationen abrufen

Aufruf

getActorsBySeriesId(%Serien-Id, callback)

Result

Array von Bildobjekten

Bildobjekt

[
    {
        name: Schauspielername,
        role: Rollenname,
        id: Schauspieler-Id,
        imageurl: Url zum Bild des Schauspielers
    }
]        

Bild abrufen und speichern

Aufruf

getImageAndSave(url, filename, callback)

Übergeben werden die URL des Bildes (evtl. aus getBannersBySeriesId), der gewünschte Dateiname und der obligatorische callback

Der Client verfügt noch über weitere Funktionen, die aber hauptsächlich intern verwendet werden. Bei Interesse einfach in die Source schauen.

Notepad++ Emmet

Notepad++ Emmet PluginDas Notepad++ Emmet Plugin bietet Unterstützung für Zen-Coding und ist eines der wenigen Plugins, die ich verwende. Da sich Notepad++ ständig weiterentwickelt und an Funktionalität hinzu gewinnt, kann es immer wieder zu Konflikten mit Plugins kommen. In diesem Fall sind es die shortcuts.

Wer die Version 6.4.5 von Notepad++ und das Notepad++ Emmet Plugin installiert hat, wird feststellen, dass [Strg][Alt][Enter] unter Emmet nicht funktioniert.

Dies liegt daran, dass Notepad++ nun shortcuts für das Einfügen einer Leerzeile (oberhalb und unterhalb der aktuellen Zeile) bietet. Man kann die Einträge unter Bearbeiten/Zeilenoperationen finden. Diese Befehle sind mit den shortcuts von Emmet belegt. Wer längere Zeit mit dem Notepad++ Emmet Plugin gearbeitet hat, möchte sich nur ungern umgewöhnen und den Plugin Befehlen neue shortcuts zuweisen. Ich habe deshalb unter Einstellungen/Tastatur/Main Menu bei den Einträgen “Insert Blank Line Above Current” und “Insert Blank Line Below Current”, die shortcuts entfernt (kein Haken bei Sondertasten und “Keine” bei der Normaltaste”.

Wer diese shortcuts behalten will, kann natürlich unter Einstellungen/Tastatur/Plugin Commands auch die Zuordnung für Notepad++ Emmet ändern.

Eine Übersicht der freien shortcuts kann man hier finden.

Notepad++ Kompakteinstieg

Notepad++ KompakteinstiegNotepad++ Kompakteinstieg als eBook in den Formaten ePUB und mobi zum Download.

Lieber Blog-Besucher. An dieser Stelle eine Bitte. Falls Sie dieses eBook heruntergeladen und durchgelesen haben, dann geben Sie mir bitte ein feedback bzw. lassen Sie mir Ihre Verbesserungsvorschläge zukommen. Ich denke, ein Buch zu Notepad++ ist notwendig und sollte für ein breiteres Publikum zugänglich sein. Ich würde dieses Buch gerne als (kostenlosen) Download auf Amazon anbieten. Hierfür sollte das Buch aber vorher einer kritischen Überprüfung unterzogen werden. Da ich kein professioneller Autor bin und alles in meiner Freizeit erstelle, bin ich auf die Hilfe anderer angewiesen. Es wäre also nett, wenn Sie dieses Projekt unterstützen würden. Da dieses Buch kostenlos angeboten werden soll, kann ich Sie natürlich nicht entlohnen, aber ich kann Sie, wenn es wünschen, in einer Danksagung erwähnen, oder Ihre Website verlinken oder ähnliches. Lassen Sie mich wissen, wie ich mich erkenntlich zeigen kann. Senden Sie Ihre Kritik und Wünsche bitte an hpv@leo.uberspace.de.

Downloads Notepad++ Kompakteinstieg

ePUB:

mobi:

Für Amazon ist das mobi-Format relevant, aber das ePUB kann natürlich genauso für eine kritische Betrachtung herangezogen werden.Wer möchte, kann natürlich auch gerne in den Originaldateien Anmerkungen machen oder korrigieren. Hierfür einfach das epub downloaden, in zip umbenennen und entpacken. Im Ordner OEBPS sind dann die Dateien. Wer lieber ein eigenes Buch schreiben will und Passagen dieses Buches oder Inhalte des Blogs verwenden will, kann dies gerne tun. Alle Texte und Beispiele sind frei und können gerne (auch ohne Nennung) verwendet werden.

Viel Spaß beim Lesen und ich würde mich über ein feeback freuen.

Tastaturbelegung Notepad++

tastaturbelegung shortcutsBei der Vergabe eigener shortcuts (z.Bsp. bei Makros) komme ich immer ins Stocken, da ich nicht sicher bin, ob diese Tastenkombination bereits verwendet wird und wie die Tastaturbelegung genau ist.

Habe mir deshalb ein cheatsheet angelegt, dass für alle möglichen Tastenkombinationen zeigt, ob und wie dieser shortcut bereits verwendet wird. Wer möchte, kann sich dieses cheatsheet als PDF herunterladen. Wer das Excel dazu wünscht, kann sich ja melden (hpv@leo.uberspace.de)

Funktionsumfang Notepad++ 6.4.5

Der FunktionsuFunktionsumfang Notepad++ 6.4.5mfang hat von Notepad++ hat mit der Version 6.4.x noch einmal zugenommen. Da ich mich in die neue Version einarbeiten will und auch meine Erkenntnisse dokumentieren will, habe ich die Funktionen in Form eines Menübaums einmal festgehalten und auch die shortcuts (Standardsetzungen) und accesskeys (wie in aktueller german.xml vom 26.08.2013 gesetzt) dokumentiert. Denke, hilft dem einen oder anderen und kann als Grundlage für eine deutsche Dokumentation für die Version 6.4.5 dienen.

Funktionsumfang 6.4.5

  1. Datei [Alt]+[d]
    1. Neu [Strg]+[n]
    2. Öffnen [Strg]+[o]
    3. Neu laden
    4. Speichern [Strg]+[s]
    5. Speichern unter [Strg]+[Alt]+[s]
    6. Kopie Speichern unter
    7. Alle speichern [Strg]+[⇑]+[s]
    8. Umbenennen
    9. Schließen [Strg]+[w]
    10. Alle schließen
    11. Close more
      1. Alle schließen bis auf aktuelle Datei
      2. Close all to left
      3. Close all to right
    12. Von Datenträger löschen
    13. Sitzung öffnen
    14. Sitzung speichern
    15. Drucken [Strg]+[p]
    16. Jetzt drucken!
    17. (Liste der letzten Dateien)
    18. Alle zuletzt verwendeteten Dateien öffnen
    19. Liste löschen
    20. Beenden [Alt]+[F4]
  2. Bearbeiten [Alt]+[b]
    1. Rückgängig [Strg]+[z]
    2. Wiederherstellen [Strg]+[y]
    3. Ausschneiden [Strg]+[x]
    4. Kopieren [Strg]+[c]
    5. Einfügen [Strg]+[v]
    6. Löschen [Entf]
    7. Alles auswählen [Strg]+[a]
    8. Auswahl beginnen/beenden
    9. Dateipfad kopieren
      1. Vollständigen Pfad kopieren
      2. Nur Dateinamen kopieren
      3. Nur Verzeichnispfad kopieren
    10. Einrückung
      1. Tab einfügen (einrücken)[Tab]
      2. Tab entfernen (ausrücken)[⇑]+[Tab]
    11. Groß-/Kleinschreibung
      1. In Großbuchstaben umwandeln [Strg]+[⇑]+[u]
      2. In Kleinbuchstaben umwandeln [Strg]+[u]
    12. Zeilenoperationen
      1. Zeile/Markierung wiederholen [Strg]+[d]
      2. Zeile am Fensterrand teilen [Strg]+[i]
      3. Zeile zusammenfassen [Strg]+[j]
      4. Zeile nach oben schieben [Strg]+[⇑]+[↑]
      5. Zeile nach unten schieben [Strg]+[⇑]+[↓]
      6. Leerzeilen (nur völlig leere) löschen
      7. Leerzeilen (auch mit Whitespace) löschen
      8. Insert Blank Line Above Current [Strg]+[Alt]+[↵]
      9. Insert Blank Line Below Current [Strg]+[Alt]+[⇑]+[↵]
    13. Kommentare
      1. Zeilenweise ein-/auskommentieren [Strg]+[q]
      2. Block auskommentieren [Strg]+[k]
      3. Block einkommentieren [Strg]+[⇑]+[q]
      4. Markierung auskommentieren [Strg]+[⇑]+[k]
      5. Markierung einkommentieren
    14. Autovervollständigung
      1. Funktionsvervollständigung [Strg]+[ ]
      2. Wortvervollständigung [Strg]+[↵]
      3. Funktionsparameter anzeigen [Strg]+[⇑]+[ ]
    15. Format Zeilenende
      1. Konvertiere zu Windows
      2. Konvertiere zu UNIX
      3. Konvertiere zu Mac
    16. Nicht druckbare Zeichen
      1. Leerzeichen und Tabulatoren am Zeilenende löschen
      2. Leerzeichen und Tabulatoren am Zeilenanfang löschen
      3. Leerzeichen und Tabulatoren am Zeilenanfang und -ende löschen
      4. Mehrfachen Whitespace und Umbrüche entfernen
      5. Tabulatoren in Leerzeichen umwandeln
      6. Leerzeichen in Tabulatoren umwandeln (alle)
      7. Leerzeichen in Tabulatoren umwandeln (nur am Zeilenanfang)
    17. Einfügen spezial
      1. HTML-Inhalt einfügen
      2. RTF-Inhalt einfügen
      3. Binär-Inhalt kopieren
      4. Binär-Inhalt ausschneiden
      5. Binär-Inhalt einfügen
    18. Spalten-Modus [Alt]+[⇑]
    19. Block-Editor [Alt]+[c]
    20. Zeichentabelle
    21. Zwischenablage
    22. Schreibschutz
    23. Schreibschutz-Attribut löschen
  3. Suchen [Alt]+[s]
    1. Suchen [Strg]+[f]
    2. In Dateien suchen [Strg]+[⇑]+[f]
    3. Weitersuchen [F3]
    4. Rückwärts suchen [⇑]+[F3]
    5. Auswahl oder Wort am Cursor suchen [Strg]+[F3]
    6. Wort am Cursor rückwärts suchen [Strg]+[⇑]+[F3]
    7. Auswahl oder Wort am Cursor suchen (ohne History) [Strg]+[Alt]+[F3]
    8. Wort am Cursor rückwärts suchen (ohne History) [Strg]+[Alt]+[⇑]+[F3]
    9. Ersetzen [Strg]+[h]
    10. Inkrementelle Suche [Strg]+[Alt]+[i]
    11. Suchergebnis-Fenster [F7]
    12. Zu nächstem Suchergebnis springen [F4]
    13. Zu verherigem Suchergebnis springen [⇑]+[F4]
    14. Gehe zu [Strg]+[g]
    15. Suche zugehörige Klammer [Strg]+[b]
    16. Select All Between Matching Braces [Strg]+[⇑]+[b]
    17. Alle Vorkommnisse hervorheben
      1. Hervorhebung 1
      2. Hervorhebung 2
      3. Hervorhebung 3
      4. Hervorhebung 4
      5. Hervorhebung 5
    18. Alle Hervorhebungen löschen
      1. Hervorhebung 1 entfernen
      2. Hervorhebung 2 entfernen
      3. Hervorhebung 3 entfernen
      4. Hervorhebung 4 entfernen
      5. Hervorhebung 5 entfernen
      6. Alle entfernen
    19. Zu vorheriger Hervorhebung springen
      1. Hervorhebung 1 [Strg]+[⇑]+[1]
      2. Hervorhebung 2 [Strg]+[⇑]+[2]
      3. Hervorhebung 3 [Strg]+[⇑]+[3]
      4. Hervorhebung 4 [Strg]+[⇑]+[4]
      5. Hervorhebung 5 [Strg]+[⇑]+[5]
      6. Hervorhebung aus Suche
    20. Zu nächster Hervorhebung springen
      1. Hervorhebung 1 [Strg]+[1]
      2. Hervorhebung 2 [Strg]+[2]
      3. Hervorhebung 3 [Strg]+[3]
      4. Hervorhebung 4 [Strg]+[4]
      5. Hervorhebung 5 [Strg]+[5]
      6. Hervorhebung aus Suche
    21. Lesezeichen
      1. Lesezeichen setzen/löschen [Strg]+[F2]
      2. Nächstes Lesezeichen [F2]
      3. Vorheriges Lesezeichen [⇑]+[F2]
      4. Alle Lesezeichen löschen
      5. Zeilen mit Lesezeichen ausschneiden
      6. Zeilen mit Lesezeichen kopieren
      7. Zeilen mit Lesezeichen durch Zwischenablage ersetzen
      8. Zeilen mit Lesezeichen löschen
      9. Zeilen ohne Lesezeichen löschen
      10. Lesezeichen invertieren
  4. Ansicht [Alt]+[a]
    1. Immer im Vordergrund halten
    2. Vollbild [F11]
    3. Post-It [F12]
    4. Nicht druckbare Zeichen
      1. Leerezeichen und Tabulatoren anzeigen
      2. Zeilenende anzeigen
      3. Alle Zeichen anzeigen
      4. Einrückung anzeigen
      5. Symbol bei automatischem Umbruch
    5. Zoom
      1. Schrift vergrößern [Strg]+[Num +]
      2. Schrift verkleinern [Strg]+[Num -]
      3. Standardgröße [Strg]+[Num /]
    6. Datei verschieben/duplizieren
      1. In zweite Ansicht verschieben
      2. In zweite Ansicht duplizieren
      3. In neue Instanz verschieben
      4. In neue Instanz duplizieren
    7. Tab
      1. 1st Tab [Strg]+[Num 1]
      2. 2nd Tab [Strg]+[Num 2]
      3. 3rd Tab [Strg]+[Num 3]
      4. 4th Tab [Strg]+[Num 4]
      5. 5th Tab [Strg]+[Num 5]
      6. 6th Tab [Strg]+[Num 6]
      7. 7th Tab [Strg]+[Num 7]
      8. 8th Tab [Strg]+[Num 8]
      9. 9th Tab [Strg]+[Num 9]
      10. Next Tab [Strg]+[Bild↓]
      11. Previous Tab [Strg]+[Bild↑]
    8. Automatischer Zeilenumbruch
    9. Zur anderen Ansicht wechseln [F8]
    10. Zeilen ausblenden [Alt]+[h]
    11. Alle Textblöcke schließen [Alt]+[0]
    12. Alle Textblöcke öffnen [Alt]+[⇑]+[0]
    13. Textblock schließen [Strg]+[Alt]+[f]
    14. Textblock öffnen [Strg]+[Alt]+[⇑]+[f]
    15. Textblöcke schließen
      1. 1 [Alt]+[1]
      2. 2 [Alt]+[2]
      3. 3 [Alt]+[3]
      4. 4 [Alt]+[4]
      5. 5 [Alt]+[5]
      6. 6 [Alt]+[6]
      7. 7 [Alt]+[7]
      8. 8 [Alt]+[8]
    16. Textblöcke öffnen
      1. 1 [Alt]+[⇑]+[1]
      2. 2 [Alt]+[⇑]+[2]
      3. 3 [Alt]+[⇑]+[3]
      4. 4 [Alt]+[⇑]+[4]
      5. 5 [Alt]+[⇑]+[5]
      6. 6 [Alt]+[⇑]+[6]
      7. 7 [Alt]+[⇑]+[7]
      8. 8 [Alt]+[⇑]+[8]
    17. Datei-Info
    18. Projektverwaltung
      1. Projektfenster 1
      2. Projektfenster 2
      3. Projektfenster 3
    19. Miniaturansicht
    20. Funktionsliste
    21. Synchrones vertikales Scrollen
    22. Synchrones horizontales Scrollen
    23. Schreibrichtung von rechts nach links [Strg]+[Alt]+[r]
    24. Schreibrichtung von links nach rechts [Strg]+[Alt]+[l]
  5. Kodierung [Alt]+[k]
    1. Ansi
    2. UTF-8 ohne BOM
    3. UTF-8
    4. UCS-2 Big Endian
    5. UCS-2 Little Endian
    6. Zeichensatz
      1. Arabisch
        1. ISO 8859-6
        2. OEM 720
        3. Windows-1256
      2. Baltisch
        1. ISO 8859-4
        2. ISO 8859-13
        3. OEM 775
        4. Windows-1257
      3. Keltisch
        1. ISO 8859-14
      4. Kyrillisch
        1. ISO 8859-5
        2. KOI8-R
        3. KOI8-U
        4. Macintosh
        5. OEM 855
        6. OEM 866
        7. Windows-1251
      5. Mitteleuropäisch
        1. OEM 852
        2. Windows-1250
      6. Chinesisch
        1. Big5 (Traditional)
        2. GB2312 (Simplified)
      7. Osteuropäisch
        1. ISO 8859-2
      8. Griechisch
        1. ISO 8859-7
        2. OEM 737
        3. OEM 869
        4. Windows-1253
      9. Hebräisch
        1. ISO 8859-8
        2. OEM 862
        3. Windows-1255
      10. Japanisch
        1. Shift-JIS
      11. Koreanisch
        1. Windows-949
        2. EUC-KR
      12. Nordeuropäisch
        1. OEM 861:Icelandic
        2. OEM 865:Nordic
      13. Thai
        1. TIS-620
      14. Türkisch
        1. ISO 8859-3
        2. ISO 8859-9
        3. OEM 857
        4. Windows-1254
      15. Westeuropäisch
        1. ISO 8859-1
        2. ISO 8859-15
        3. OEM 850
        4. OEM 858
        5. OEM 860:Portuguese
        6. OEM 863:French
        7. OEM US
        8. Windows-1252
      16. Vietnamesisch
        1. Windows-1258
    7. Konvertiere zu Ansi
    8. Konvertiere zu UTF-8 ohne BOM
    9. Konvertiere zu UTF-8
    10. Konvertiere zu UCS-2 Big Endian
    11. Konvertiere zu UCS-2 Little Endian
  6. Sprachen [Alt]+[p]
    1. (Liste der Sprachen)
    2. Eigene Sprachen definieren
    3. (Liste der eigenen Sprachen)
    4. Benutzerdefiniert
  7. Einstellungen [Alt]+[e]
    1. Optionen
    2. Stile
    3. Tastatur
    4. Import
      1. Plugin(s) importieren
      2. Design(s) importieren
    5. Kontextmenü anpassen
  8. Makro [Alt]+[m]
    1. Aufzeichnung starten [Strg]+[⇑]+[r]
    2. Aufzeichnung stoppen [Strg]+[⇑]+[r]
    3. Makro ausführen [Strg]+[⇑]+[p]
    4. Aufgenommenes Makro speichern
    5. Makro mehrfach ausführen
    6. (Liste der eigenen Makros)
    7. Shortcut ändern/Makro löschen
  9. Ausführen [Alt]+[r]
    1. Externes Programm ausführen [F5]
    2. (Liste der eigenen Befehle)
    3. Shortcut ändern/Befehl löschen
  10. (Erweiterungen) [Alt]+[w]
    1. (Liste der Erweiterungen)
  11. Fenster [Alt]+[n]
    1. (Liste der Fenster)
    2. Fenster
  12. ? [Alt]+[?]
    1. Inhalt [⇑]+[F1]
    2. Notepad++ im Web
    3. Notepad++ bei SourceForge
    4. Online-Hilfe
    5. Forum
    6. Erweiterungen
    7. Info [F1]

Wer möchte, kann diese Darstellung des Funktionsumfang gerne für eigene Dokumentationen zu Notepad++ verwenden. Eine textliche Beschreibung des Funktionsumfang ist in Arbeit.

musik-apis Album Teil3 der Reihe

In diesem Teil (musik-apis Album) der Reihe geht es um Daten zu den Alben/Stücken. Hierfür müssen allerdings erst ein paar Begrifflichkeiten (musicbrainz) geklärt werden. Bei musicbrainz und discogs spricht man von releases, also Veröffentlichungen. Ein Album kann mehrere Veröffentlichungen zu unterschiedlichen Zeitpunkten, auf unterschiedlichen Medien und in unterschiedlichen Ländern, durch unterschiedliche “Label” haben. Recording bezeichnet auf musicbrainz eine Aufnahme/Stück, das dann auf unterschiedlichen releases auftauchen kann.

So gibt es z.Bsp. zum Album “Le Pop” von Katzenjamer 4 releases.

musik-apis Album le pop

Hier sieht man, dass es releases zu unterschiedlichen Zeitpunkten und von unterschiedlichen labels gibt, die sowohl als CD, als auch als MP3-Downloads verfügbar sind.

In diesem Beitrag geht es darum Daten und Bilder zu Alben zu finden. D.h. die musik-apis sollen uns folgendes liefern:

  • Cover (Bild) eines Albums
  • Song/Trackliste eines Albums
  • Alben/Aufnahmen der Gruppe

Wie immer, bietet auch Wikipedia viele Informationen zu Alben und Stücken, aber wie immer, ist es nicht leicht die Information zu finden und sie muss “geparst” werden.

musik-apis Album Wikipedia

Die deutsche Wikipedia zeigt uns zwar auf der Seite der Gruppe (Katzenjammer_(Band)) eine Liste der Alben an, bietet aber sonst keine Details.

musik-apis dicografie katzenjammerIm Gegensatz dazu bietet die englische Wikipedia sogar mehrere Detailseiten an.

Die erste Seite bietet eine ausführliche Übersicht aller Veröffentlichungen (Alben, Singles, Videos, Live, Studio, etc.) während die letzten zwei Links Details zu den Alben liefern. Hier gibt es wieder eine Infobox-Vorlage für die Hauptdaten des Albums, aber auch eine Tracklist mit Titeln und Dauer der Stücke. Damit könnten wir alle Informationen, die wir für ein Mediacenter benötigen, hier extrahieren. Der Parsing-Aufwand ist jedoch sehr hoch.

Wer es dennoch angehen möchte. Hier bietet sich die bekannte Abfrage zu den Revisionen an. Z.Bsp.:

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&rvsection=0&titles=Le_Pop

oder

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles=Katzenjammer_(band)&format=json

In beiden Fällen muss der Text allerdings ausgewertet werden. Die Infoboxen beinhalten dann auch das Cover (Cover = Katzenjammer Le Pop.jpg) des Albums, für das wir, wie gewohnt, erst die URL auflösen müssen.

music-apis Album musicbrainz

Bei musicbrainz können wir uns releases auflisten lassen. Hierfür gibt es mehrere Möglichkeiten. Da wir aber wissen wollen, ob auf dem coverart-archive Bilder für diesen release vorhanden sind, bietet sich folgende Abfrage an.

http://musicbrainz.org/ws/2/release?artist=ad102038-c2a1-4c6b-856f-f671254de54f&fmt=json

Diese Abfrage zeigt uns pro Künstler-Id alle releases und ob für den release ein Cover existiert.

musik-apis musicbrainz releases

Der Abschnitt cover-art-archive zeigt an, ob es Bilder gibt und das Attribut title gibt uns den Albumnamen. Musicbrainz kann aber auf Ebene eines Releases noch weitere Information, wie z.Bsp. Besetzung, Trackliste anzeigen. Eine Abfrage mit sehr hohem Detailgrad lautet:

http://musicbrainz.org/ws/2/release/05b77116-1bd6-4551-b0b8-39926c71ba4f?inc=recordings+recording-level-rels+artist-rels&fmt=json

Hier fragen wir explizit einen release ab und lassen uns für diesen release die artist-relations und die Relationen, die auf Recording-Ebene (also darunter) liegen, anzeigen.

mbrelease

Auch hier erhalten wir Information über mögliche Coverbilder und den Titel. Hier interessiert uns allerdings mehr die Trackliste, die wir über media.tracks finden. Die Anzahl der Stücke (tracks) stehen im track-count. Wenn wir das Tracklist-Array anschauen, so finden wir (durch unsere Vorgabe in der Abfrage) den Namen des tracks, die Besetzung und die Dauer des Stückes.

Daneben sehen wir unter den recording-Relationen Infos zur Besetzung im Stück.

 

mbtrack

Die Dauer des Stückes ist in Millisekunden angegeben und muss noch aufbereitet werden. Hier gibt es mehrere Möglichkeiten:

~~(270480/1000) / 60)*60 liefert uns die Dauer in Sekunden – hier 270, oder

Minuten=(Wert/(1000*60))%60 Sekunden=(Wert/1000)%60 das uns Minuten und Sekunden – hier 4 Minuten 30 Sekunden liefert. Falls der release über Bilder verfügt, so können wir deren url über den Aufruf der cover-art-archive-api abfragen.

http://coverartarchive.org/release/8446ddc0-c876-4dc3-96e3-bd0727be6b1c

liefert:

{
  "images":[
  {
    "types":["Front"], 
    "front":true,
    "back":false,
    "edit":17748161,
    "image":"http://coverartarchive.org/release/8446ddc0-c876-4dc3-96e3-bd0727be6b1c/1043405445.jpg",
    "comment":"",
    "approved":true,
    "thumbnails":{
       "large":"http://coverartarchive.org/release/8446ddc0-c876-4dc3-96e3-bd0727be6b1c/1043405445-500.jpg",
       "small":"http://coverartarchive.org/release/8446ddc0-c876-4dc3-96e3-bd0727be6b1c/1043405445-250.jpg"
     },
    "id":"1043405445"
},
{ ...

musik-apis Album discogs

Auch discogs liefert Informationen zu Alben und bietet entsprechende Coverbilder an.

Eine Übersicht der Releases bekommen wir über:

http://api.discogs.com/artist/katzenjammer?releases=1&f=json

discogs

 

Für die Trackliste müssen wir einen einzelnen Release aufrufen.

Diese liefert uns unter dem Feld resource_url die Abfrage für weitere Details (tracklist).

Das Ergebnis einer solchen URL (http://api.discogs.com/masters/214279) liefert folgendes Bild:

dtrack

Hier haben wir dann die Angaben zu den Stücken und auch Bildinformationen. Um über musik-apis Album, bzw. Songinfos zu erhalten, ist also in allen apis möglich, aber mit unterschiedlichen Aufwänden verbunden. Je detaillierter man die Informationen benötigt, um so mehr Aufrufe benötigt es. Wiki liefert zwar viel Infos, aber der Parsingaufwand steht in keinem Verhältnis zum Aufwand, wenn man die gleichen Infos auch von musicbrainz und disogs erhalten kann. Musicbrainz stellt Bilder nur über coverartarchive.org zur Verfügung. Discogs, fanart.tv und Wikipedia speichern selbst Bilder.

musik-apis #2 Künstlerinfo

Im Teil 1 der Reihe ging es um die Suche, während es im Artikel musik-apis künstler darum geht, Details und Bilder zu den gefunden IDs zu erhalten.

musik-apis künstler infobox katzenjammer auf wikipedia

Beginne möchte ich mit wikipedia (das den größten Aufwand darstellt). Hier interessiert uns vor allem die Infobox auf wikipedia. Dies ist eine Foramtvorlage. Für Gruppen ist es die Formatvorlage Band. Alle Infoboxen auf wikipedia liegen in der Sektion 0 (außerhalb des Inhaltsverzeichnisse). Um an die gewünschten Informationen zu kommen, muss man den erhaltenen wikitext “parsen”. Im Beitrag mediawiki-api gehe ich auf die allgemeinen Details zu den Infoboxen und deren Auswertung ein. Die Infobox für Bands zeigt noch einige Besonderheiten. Dies ist der Tatsache geschuldet, dass eine Gruppe mehrere Mitglieder hat und diese unterschiedliche Funktionen/Instrumente in der Gruppe übernehmen (aktuelle Besetzung) und das die Besetzung über die Jahre sich verändert. Das Bild links zeigt die “gerenderte” Darstellung der Infobox. Das Bild unten zeigt den korrespondierenden Abzug der JSON-Daten mittels der mediawiki-api. Die URL für diese Daten lautet:

 

http://de.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles=Katzenjammer_(Band)&format=json&indexpageids=1&rvsection=0

Wir verwenden hier den, in musik-apis Teil1, ermittelten Seitentitel und verwenden die Abfrage von Revisionen (ohne Angabe einer Revision ist es die aktuelle Revision) und lassen uns den Inhalt (rvprop=content) der Sektion 0 (rvsection=0) ausgeben.

musik-apis künstler wiki

musik-apiwikipedia  katzenjammer json

Die Infobox wird durch 2 Klammerpaare {{…}} begrenzt. Wir können den Text, der Infobox-Information enthält über folgenden regulären Ausdruck extrahieren:

/\{\{Infobox([^\}]*)\}\}/i

Innerhalb dieses Textes finden wir jetzt Schlüssel-Werte-Paare mit den Informationen. Einzelne Paare sind mit dem “|”-Zeichen getrennt ( | Name = Katzenjammer ) und haben die Syntax | Schlüssel = Wert. Innerhalb der Besetzung wird es etwas komplizierter:

|Besetzung1a = Anne Marit Bergheim
|Besetzung1b = [[Gesang]], [[Klavier]], [[Akustische Gitarre|Akustikgitarre]], [[Akkordeon]], [[Mandoline]], [[Banjo]], [[Mundharmonika]]

Je nach Anzahl der Mitglieder gibt es einen Schlüssel Besetzung mit dem Suffix a und einen Schlüssel mit dem Suffix b. Der Suffix a steht für den Namen des Bandmitglieds und der Suffix b für den part in der Band. Bei 4 Mitgliedern also Besetzung1a/Besetzung1b bis Besetzung4a/Besetzung4b.

Diese Art der Darstellung kann in der Infobx dreimal vorkommen

  • Besetzung
  • Ehemalige
  • Gründer

Um diese Tabelle zu parsen, können wir folgende RegEx verwenden:

/(besetzung\d*[a|b])./i

Dies gibt uns die Besetzungstabelle. Ähnlich würden für Gründer oder ehemalige Mitglieder vorgehen. Da Wikipedia stark verlinkt ist, sind die meisten Textstellen als links angegeben. Wir benötigen jedoch nur den angezeigten Text des Links (Künstlername, Instrument). Auch hier hilft ein RegEx.

/\[\[(?:[^|\]]*\|)?([^\]]+)\]\]/ig

Damit haben wir die Hauptinformationen der Infobox extrahiert und können sie für uns aufbereiten. Meine Implementation eines Infobox-Parsers werde ich auf Github ablegen und einen entsprechenden Link veröffentlichen.

Weitaus einfacher geht es mit den anderen APIs.

musik-apis musicbrainz

Es gibt viele Möglichkeiten (über ein Album (release), etc.) an die Informationen zu kommen. Interessiert man sich nur für die reinen Künstlerinfos, so bietet sich folgender Aufruf an:

http://www.musicbrainz.org/ws/2/artist/ad102038-c2a1-4c6b-856f-f671254de54f?inc=artist-rels&fmt=json

Wir verwenden die ermittelte ID (musik-apis Teil1) des Künstlers und und geben als include noch die Künstler-Relationen (artist-rels) an. Falls gepflegt (hier ist es so) bekommen wir auch hier Besetzungsinformationen

{
  "country":"NO",
  "ipis":[],
  "area":{
    "iso_3166_3_codes":[],
    "sort-name":"Norway",
    "name":"Norway",
    "id":"6743d351-6f37-3049-9724-5041161fff4d",
    "iso_3166_2_codes":[],
    "iso_3166_1_codes":["NO"]
   },
  "relations":[{
     "type-id":"5be4c609-9afa-4ea0-910b-12ffb71e3821",
     "end":null,
     "direction":"backward",
     "ended":false,
     "artist":{
       "disambiguation":"",
       "sort-name":"Heilo, Solveig",
       "name":"Solveig Heilo",
       "id":"8d7540a0-bf4c-4fcc-8405-03df69f57f17"},
       "type":"member of band",
       "begin":null,
       "attributes":["accordion","balalaika","banjo","drumset","founder","guitar","harmonica","lead vocals","mandolin","piano","trumpet","ukulele"]
     },
     ....

Unter Relationen finden wir jetzt die Künstlerinformationen, wobei die Instrumente unter attributes zu finden sind.

musik-apis disogs

http://api.discogs.com/artists/1112820 oder http://api.discogs.com/artist/katzenjammer?f=json

Die Informationen zum Künstler sind hier jedoch spärlich (lediglich Namen der Mitglieder). Wir haben allerdings den Vorteil, sofort Bild-Urls zu bekommen.

Bilder

Das wichtigste für ein Mediacenter sind natürlich die visuellen Informationen, sprich Bilder der Künstler (oder Album-Cover). Da es uns hier erstmal um Bilder der Künstler geht, gehe ich hier näher auf das coverart-archive ein. Die wichtigsten Anlaufstellen für Bilder sind:

  • wikipedia:commons
  • discogs
  • fanart.tv (beste Qualität, aber kostenloser api-key erforderlich)

Um an die richtige Wikipedia Commons Kategorie zu gelangen, müssen wir diese aus dem Text (sie ist ein Link) extrahieren.

Durch den Aufruf

http://de.wikipedia.org/w/api.php?action=query&titles=Katzenjammer_(Band)&prop=extlinks&format=json&indexpageids

können wir uns alle Links der Seite anzeigen lassen und bekommen u.a. den Eintrag:

*: "//commons.wikimedia.org/wiki/Category:Katzenjammer?uselang=de"

Da wir jetzt die Kategorie kennen, können wir uns die Bild-Urls generieren lassen. Wir benutzen hierfür den Generator der Mediawiki-api.

http://commons.wikimedia.org/w/api.php?action=query&generator=search&gsrnamespace=6&gsrsearch=Katzenjammer&format=json&gsrlimit=50&gsroffset=20&prop=imageinfo&iiprop=url

Dieser Aufruf löst uns die Bildinformationen von Wikipedia so auf, dass die URLs direkt für einen Download verwendet werden können.

"imageinfo":[{ 
  "url":"http://upload.wikimedia.org/wikipedia/commons/f/fb/Katzenjammer_Hengelo_2011_IMGP1008_wp_smial.jpg",
  "descriptionurl":"http://commons.wikimedia.org/wiki/File:Katzenjammer_Hengelo_2011_IMGP1008_wp_smial.jpg"}
]}

Die besten Bilder bekommen wir jedoch von fanart.tv durch den Aufruf:

http://api.fanart.tv/webservice/artist/<api-key>/ad102038-c2a1-4c6b-856f-f671254de54f/json

Hier werden sofort die URLs angezeigt und in Kategorien gesammelt. Für uns interessant wäre dann an dieser Stelle die Gruppe artistthumb. Fanart.tv verwendet die Künstler-ID von musicbrainz.

musik-apis json bilder

Wer sich also ein Mediacenter bauen will und dieses mit Informationen und Bildern zu Künstlern ausstatten will, kann alles finden, wird aber mehrere musik-apis verwenden müssen. Die meisten Informationen bietet Wikipedia, die besten Bilder bietet fanart.tv. Den besten Einstieg bietet musicbrainz.

TIPP!

Wer von vorne herein weiß dass er mehrere Anlaufstellen benötigt, kann sich verfügbare Stellen über musicbrainz anzeigen lassen. Gibt man dem Aufruf des Künstlers ein include url-rels mit, so werden alle Links gelistet, die auf musicrainz zum Künstler vorhanden sind.

http://www.musicbrainz.org/ws/2/artist/ad102038-c2a1-4c6b-856f-f671254de54f?inc=url-rels&fmt=json

So kann man sich über diesen Aufruf auch die Suche in den anderen musik.apis ersparen. Bei diesem Aufruf bekommen wir z.Bsp. Wikipedia und disogs sofort geliefert:

url:
{
  resource: "http://en.wikipedia.org/wiki/Katzenjammer_(band)",
  id: "229e0a62-f16f-48ef-9267-7c8bdb8059dd"
}

Im nächsten Beitrag wenden wir uns dann den Albuminformationen zu. Wer zu diesen Themen noch Fragen hat, kann sich gerne melden.

amazon-mws encoding berichte

Momentan unterstütze ich einen Kollegen beim Abruf von Verkäuferdaten über den Amazon-Webservice – wir verwenden die “flachen” (tabseparierten) Bericht (getReport). Leider sind diese Ansi und nicht UTF-8. Da node.js standardmässig nur mit UTF-8 arbeitet, sind Probleme bei Umlauten vorprogrammiert. Nach langem Suchen und Probieren scheint dies die beste Einstellung zu sein, um Umlaute korrekt und nicht ersetzt mit 65533 zu bekommen.

workarround amazon-mws encoding

https.request(options, function(res) {  
  res.setEncoding('binary');
  res.addListener('data', function (chunk) {
  data += chunk;
});

res.addListener('end', function() {
  if(cb) cb(data.toString('utf-8'));
});

Wichtig ist das Encoding binary im Response. Bei “ascii” wären es 7Bit, so sind es 8Bit. Dies erlaubt das Konvertieren von Zeichen zwischen 128 und 255 zu UTF. Im data-Event arbeite ich noch mit dem buffer und wandle diesen erst am Ende zu string.

Hoffe, ich konnte dem einen oder anderen meine Frustration mit diesem Thema ersparen.