[alrtw] Ready to Watch for AniList 1.1.0

Wer Animes schaut, hat gegebenenfalls schonmal etwas von MyAnimeList oder alternativ von AniList gehört. Beides sind Services, die Informationen für Mangas und Animes bieten und es dem geneigten Konsumenten ermöglichen, seinen eigenen Fortschritt festzuhalten – sowohl an dem, was man schon gesehen hat, als auch an dem, was man noch nicht fertig hat. Irgendwann neigt man dazu, die Übersicht zu verlieren. Natürlich bieten beide Plattformen noch eine Reihe weiterer Annehmlichkeiten.

Ich selbst nutze AniList und bin damit soweit recht zufrieden. Leider ist die Zeit, die ich mir fürs Anime schauen einräume, seit dem Studiumsende geschwunden, weswegen ich oftmals mehrere neue Folgen noch nicht gesehen habe. Nun sehe ich auf meiner eigenen Fortschrittsliste leider nicht, welche Episoden bereits erschienen sind und ich verwende dann einige Zeit darauf, meinen eigenen Fortschritt mit den verfügbaren Folgen abzugleichen, um zu entscheiden, was ich weiterschaue.

Einen anderen Teil meiner Freizeit – zumindest bemühe ich mich – verwende ich auf berufliche Fortbildung. Im Moment versuche ich einen Hang zum neuestem Angular (4) zu bekommen und da hat sich meine kleine Informationslücke ganz wunderbar geeignet, etwas tätig zu werden. AniList bietet nämlich eine API an, um Informationen zu Medieninformationen, genauso wie zu Nutzerlisten abzufragen.

Das Ziel

Zielsetzung war also, folgende Informationen zu erlangen:

  • Animes, die der Nutzer aktuell schaut (ergo als „Watching“ auf seiner Liste vermerkt sind)
  • Die zuletzt erschienende Folge dieser Animes
  • Die Differenz zwischen dem Nutzerfortschritt und dem Erscheinungsstand anzeigen

Als kleines Schmankerl, weil es die Daten hergegeben haben, habe ich im Nachhinein noch folgendes hinzugefügt:

  • Falls der Nutzer up to date ist und keine Folgen zum ansehen verfügbar sind, die Zeit bis zur Nächsten Folge anzeigen

Die Umsetzung

Die Umsetzung ist mit einer Angular 4 App gemacht, die sich über die AniList GraphQL API mit Informationen versorgt. Da ausschließlich lesender Zugriff auf öffentliche Daten erfolgt, ist keinerlei Authentifizierung nötig. Außerdem werden keine Informationen gespeichert, weswegen die App ansich recht einfach ist.

Das Problem mit der einen AiringSchedule pro Anime

Während der Umsetzung bin ich auf ein Problem gestoßen, das ich bisher nicht lösen konnte. Ich nutze zwei GraphQL Queries zur Abfrage. Eine, um alle Animes des Nutzers X mit dem Status Watching zu bekommen – eine zweite, um die AiringSchedules (nächste Sendetermine) eben dieser Animes zu erhalten. Das Problem: Eigentlich benötige ich pro Anime *eine* AiringSchedule, und zwar die nächste. Ich habe jedoch nicht herausgefunden, wie ich der Query dies mitteilen konnte. Zwar bietet sie verschiedene Filteroptionen, aber nichts, was mir hier augenscheinlich weiter hilft.

Für das Problem gab es nun drei Lösungen, die alle nicht optimal waren: Ich konnte jeden Anime einzeln anfragen und mir statt einer Page (einer Menge an Informationen) eine einzelne AiringSchedule zurückgeben lassen – das wäre aber zu einem ziemlich unnötigen Abfragefest geworden.

Die zweite Möglichkeit war, die Informationen mit einem anderen Filter zu filtern, der so etwas ähnliches tut. Normalerweise erscheinen Animeepisoden im wöchentlichen Takt. Theoretisch sollte eine Folge also stets maximal 7 Tage entfernt sein. Mithilfe des airingAt_lesser Filters konnte ich die Auswahl also auf AiringSchedules begrenzen, die zwischen jetzt und in 7 Tagen liegen.

Diese Lösung hat zwei Probleme: Zum einen erfasst sie Animes nicht, die noch nicht erschienen sind (und genau genommen noch gar nichts auf der Watching List zu suchen haben) und Animes, die aus irgendwelchen Gründen (Feiertage o.ä.) eine Woche Pause machen, was hin und wieder vorkommt. Für diese Fälle liegt dann keine Information vor. Ich habe mich dennoch für diesen Workaround entschieden, da Lösung 1 und 3 zu unbekannt vielen Queries geführt hätten.

Lösung 3 wäre eine manuelle Filterung nach der nächsten AiringSchedule gewesen, nachdem ich alle bekommen habe. Problem hier: Ein Anime ist in der Regel 12 bis 24 Episoden lang. Ich bekomme dann alle AiringSchedules aller noch nicht erschienener Folgen, was gerade zu Beginn bspw. 10 oder gar 22 AiringSchedules pro Anime wären. Da eine Pagequery maximal 50 Ergebnisse zurückliefert, hätte ich hier unbekannt viele Pages querien müssen, um dann 90% der Informationen wieder wegzuschmeißen. Gne.

Das Ergebnis

Ich habe mich also dafür entschieden, den Nutzer im Falle eines Animes, der noch nicht abgeschlossen ist und dessen nächste Folge mehr als 7 Tage in der Zukunft liegt, nicht informieren zu können [1]. Nachdem dieses Problem aus dem Weg geräumt war, hatte ich vor allem mit meiner eigenen Unkenntnis und dem Einbinden von Modulen in Angular zu kämpfen, bin schlussendlich aber zu einem Ergebnis gekommen.

Die Sourcen sind auf Github zu finden, das Gerät ansich unter readytowatch.s-blu.de.

 

Und nochmal in Bildern: Von ungestylten Anfängen

 

bis zur Version 1.0.0 (und zum Onlinestellen):

 

und schließlich schon zur Version 1.1.0 mit etwas mehr Candy und personalisiertem Link

 

[1] Dazu kommt, das ich nach wie vor maximal 50 Ergebnisse zurückbekomme und entsprechend maximal 50 Animes listen kann. Aber mal ehrlich: Das soll reichen. Guck des erstmal fertig!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.