- shoutcast-directory:
"http://www.shoutcast.com/sbin/newxml.phtml" -> genre list
"http://www.shoutcast.com/sbin/newxml.phtml?genre=" + genre -> station list for a genre.xml
"http://www.shoutcast.com/sbin/newxml.phtml?search=" + filter -> station list for a search term
"http://www.shoutcast.com/sbin/shoutcast-playlist.pls?rn=" + id + "&file=filename.pls" -> URL of the playlist corresponding to id

TODO: Docu-Text: You can remove plugins by simply deleting them. // Das muss natürlich implementiert werden!

Im Tree-Destructor: alle Plugins deregistrieren

Icecast: http://dir.xiph.org/yp.xml

Weitere Verzeichnisse: http://www.basic.ch/ http://www.live365.com/ http://streamdir.com/

- fixme: streamdirectory-dock sollte beim nächsten Start des Programms an der alten Position wiederhergestellt werden.

- bessere Kontextmenüs (andere, wenn Station oder wenn ins Leere)
- besseres Action-Handling (Start, Stop aktiviert usw.)
miB
- Dateinamen-Schemata pro Stream (statt global) nutzen? Aktivieren!

- KIO-Slaves.

- "truncate duplicates [...]" -> "truncate duplicates [...] to 0 Bytes"

- gegen manuelle/unsachgemäße Änderungen bei den config-Files durch den user robuster machen!
- warum Fehlermeldung auf Sdterr wenn New Stream?
- qt-extensions release with _working_ version_number
- doxygen-documentation for the property "error": folgendes
  wird erkannt: "streamripper-error 12 [BLABLA]" sowie
  "kradioripper-error 1001, 1002 usw.". (Und natürlich die
  Zahlen > 1000 entsprechend programmieren!)
- requiere in spec the necessary kdebase version!!!

- HIG folgen

Code-Qualität:
- template.spec -> richtige KDE-Version fordern!
- wieder const-_Referenzen_ verwenden!
- Wie kriegt stationlistModel mit, dass settings_stream_dialog was verändert hat?
  Wer emitted die signals?
- .internalValue -> überprüfe, ob der Aufruf zulässig und sinnvoll ist!
  Insb. bitte keine == und !=, okay?
  Auch wenn internal_xxx selbst verglichen wird -> absolute Vorsicht!!!
- m_process als pointer, um das Object auf dem heap zu erzeugen und löschen
  zu können und neu zu erzeugen (evtl. on demand)? (Der Destruktor dauert
  aber auch an, bis der Prozess tatsächlich terminiert ist. Trotzdem hat man
  jedesmal ein neues QProcess-Object, das könnte zu weniger Fehlern führen...
- all TODOs (mit KFind suchen, denn "TODO" findet KDevelop nicht
- wenn bloß get_stream_info benutzt wird, dann sollte das working_directory
  ein temporäres Verzeichnis sein und die (leider inzwischen) entstehenden
  leeren Dateien anschließend gelöscht werden.
- warum beendet sich "recognizing" in settings_stream_widget_connection nicht
  recht schnell, wenn "ls" statt "streamripper" benutzt wird? Schließlich
  beendet sich doch auch das Programm "ls" selbst recht schnell...
- Pfad zu den stream_config Dateien nicht mehr absolut. Auch nicht mit $Home.
  Sondern nur noch den Namen!
- sicherstellen, dass unnötig von streamripper erzeugte Daten (get_stream_info)
  wieder gelöscht werden.
- introduce unit tests

UI:
- Warum wird die Größe des Hauptfensters wiederhergestellt, aber nicht die Position?
- Formatierung (delegate) mit links-rechts-bündig und grau/rot!?!
  leere Zeilen für existierende Einträge - das soll's nicht geben.
  Besser: in grau (oder in Klammern) ein "Name nicht erkannt".
- Feld für streamripper-command: Dateiauswahldialog anbieten!
- linker Klick in leere Tabellenfläche: unselect all.
  rechter Klick: unselect all + unterschiedliches Menü ja nachdem ob leere 
  Tabellenfläche oder ein Eintrag.
- modern Busy-dialog for KDE >= 4.2:
  http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/classPlasma_1_1BusyWidget.html

Überprüfen der Streamripper-Version
- beim Start Streamripper überprüfen. Wenn nicht funktionsfähig, dann
  Fehlermeldung (Hinweis: Streamripper nicht gefunden, bitte installieren
  (Download-link) und unter Einstellungen->KRadioRipper einrichten->Allgemeines.
  Entsprechende Fehlermeldung beim versuchten Start des Mitschneidens.)
- get-streamripper-version: beim Rückgabewert nicht "unset" verwenden,
  wenn keine Version erkannt, sondern "error"!!!
- Ablauf: There are several possiblities:
  - streamripper command exists and passes version check: Do nothing.
  - streamripper command doesn't exist: Display a message that streamripper
    is needed (in version x.y)
  - streamripper command exists but doesn't pass version check (too old):
  - streamripper command exists but doesn't pass version check (does not seem
    to be streamripper):
- Was ist mit Prozesspriorität für die Erkennung? Oder zumindest als User nobody?
- Streamripper muss in get_stream_info und insbesondere in get_version_info nach
  einer gewisen Zeit gekillt werden!!!

Übersetzungen/Texte:
- Überhaupt mehr Tooltips/What's this... (+ aktivieren von krazy2:tipsandthis)
- in welcher Einheit "meta data intervall"? In apidox u. den Tooltips/What's-This nachtragen!
  E-Mail an Greg Sharp. BTW: Please actualize the link to KRadioRipper homepage.
- tooltip "skipFirstXSongs": first x _complete_ songs
- tooltip for unsplitted file: There is mp3-Metadata as streamed id3
  in the file! (Only v2!) - for every song!

Packaging
- .mo-Dateien in spec als "language" oder so ähnlich kennzeichnen!
- opensuse kde:community hat ein Spec. In Kontakt treten und in unseres einarbeiten.
- bei opensuse contrib mitmachen?

Download-Verzeichnis
- Was passiert, wenn das download-Verzeichnis nicht gesetzt ist? Ein Assistent muss
  angezeigt werden, der einen _zwingt_, eines zu setzen. Sonst startet das Ripping nicht.
- Download-Verz. muss existieren. Wenn nicht, sollte es automatisch angelegt werden. Wenn nicht möglich: Assistent!
- download-Verz. _muss_ lokal sein!!! Sicherstellen!
- beim Start von KRadioRipper: teste auf falsches Kommando und auf nicht schreibbares
  download-Verzeichnis. Und auf leere URL.

service_classes
- service_classes: zweites Verzeichnis auf gleicher Ebene wie "kradioripper".
  Unter kradioripper/scripts ein Script, dass dieses Verzeichnis immer wieder
  neu erstellt, das bisherige löscht, den Quelltext und weitere Infos dorthin
  immer wieder neu kopiert und einen tar.bz2-ball baut.

Verschiedenes
- Was, wenn während des Rippings die Einstellungen des Streams geändert werden?
  (Nach Nachfrage) Neustart!
- einheitliche Zeiteinheit! (nicht ms + s, sondern nur s - evtl. mit Kommastellen)
- was passiert, wenn keine Internetverbindung besteht? Es sollte für diesen Fall
  eine nette (übersetzte!) Fehlermeldung geben

--------------------------------------------------------------

- good english!

- catch more error messages

- codecheck.sh: Stelle automatisch fest, welche Extra-Checker verfügbar sind und verwende sie alle...

- Was ist mit suspend to disk/ram? Amaroks streaming funktioniert danach einfach nicht mehr...
  Wäre das auch für okay?

- Phonon
- Lautstärenregelung
- relay server: starte play erst bei "ripping", nicht bei "8000"?
  Ab wann läuft der relay server tatsächlich? Und wann bricht er ab?
  Wir wollen Phonen-Fehlermeldungen vermeiden!
- Assistent für "relay server funktioniert". Automatisch starten bei
  Fehlermeldung von Phonon? Testen auf firewall!

- usablility
- obs für Mandriva und Ubuntu
- LSB's code/app checker? And Qt unit testing framework?
- Icons
- nutze KUniqueApplication (+ einen Eintrag im Config-file um ganz sicher zu gehen?) damit das Programm nur einmal gestarted wird..
- ein Klick auf "Default" sollte nicht das Feld serverUri löschen! / same for "General settings"/save directory.
- using solid to detect if computer is online or not?
- steamcast.com-Unterstützung
- Hilfe/Hilfe-Eintrag weg! (Oder ein Handbuch schreiben ;-)
- was, wenn jemand bspw. "ls" oder "gs" statt streamripper nimmt? Stoppt das ripping dann? Oder welche Meldungen gibt es?
- "-o version" is new since 1.63.5 -> support this as default! Und teste auf diese Version bei jedem Start!
- care about the encoding of the output of m_process
- a menu View/visible columns in the main menu bar
- about the splitting: support for metadata_parsingRules (calling a text editor?)
- Statt eine Liste von config-Dateien für die Streams zu führen, könnten einfach alle Dateien eines bestimmten Verzeichnisses benutzt werden, oder?
- Wo landen die Songs, wenn kein save-directory angegeben ist? (Fehlermeldung ausgeben!)
- es darf nur eine Instanz von KRadioRipper geben! (hilft das?: http://www.qt-apps.org/content/show.php/SingleApplication?content=81163)
- skipping: Unser Text sollte skipping/ripping sein, wenn _auch_ eine ganze Datei (unsplitted) geschrieben wird, bzw. nur "ripping" wenn _nur_ eine ganze Datei geschrieben wird. Mit entsprechenden Hilfe-Texten!
- support _all_ streamripper options (attention: new options in 1.63 beta!)
- Timer: runXSeconds or runXMegabytes
- knotify support
- benutze KDEs proxy settings (wahlweise aber auch wie bisher einen eigenen Wert).
- teste Proxy auf Funktionsfähigkeit, am besten direkt im UI (settings dialog). Zeige entsprechende Fehlermeldungen an, wenn der Proxy nicht erreichbar ist. Vielleich sollte ich selbst vorher testen, ob der Proxy erreichbar ist, bei IP-Adressen als Proxy gibt's nämlich kein Timeout in streamripper, und dann weiß man nicht, ob der Proxy Schrott ist oder die stream-URI...
- streams sollten sich alphabetisch nach Name sowie auch nach den anderen Spalten sortieren lassen
- Spalten sollten vertauschbar sein (beliebige Anordnung)!
- nachdem eine neue Zeile in der Tabelle produziert wurde, sollte ausschließlich diese markiert sein!
- automatische Metadaten-Erkennung für Streams ohne Metadaten
- Vor dem Löschen nachfragen!!!
- eine hübsche grafische Animation für die splitpoint detection settings!
- streamripper: sind searchWindow / silenceWindow = 0 sinnvoll? Muss searchWindow immer größer sein, oder reicht auch ==?
- systray support
- read URL(s) from command line / kradioripper --help should display appropriate help
- paste URL from Zwischenablage(n)
- benutze nach Möglichkeit Path statt URL als Typ in kcfg's
- benutze inotify um streamripper und die mp3s zu überwachen
- delete menu entry "help/handbook"
- URL for streamripper -> %20...
- server name/stream name empty != 0 !!!
- the reconnect by streamripper (and maybe other functions from streamripper) don't timeout. KRadioRipper has to force this.
- interpretate "skipping..." (je nachdem ob auch unsplitted aufgenommen wird als "überspringe" bzw. "überspringe/rippe", im letzten Fall mit einem erklärenden Tooltip)
- funktioniert das gesamte splitting wirklich nur für mp3? Oder gilt das nur fürs padding?
- _alle_ streamripper-Ausgaben interpretieren
- besser id3v2.4 als v2.3! Kann ich erzwingen, dass UTF-8 benutzt wird? (Wie funktioniert das Kommando dafür?) Ist das dann tatsächlich v2.4-konform?
- automaticly try other user agent strings when the first one doesn't work. When a change is done, send KNotification to the user by a popup (information) window. (Do this also on error SR_ERROR_NOT_SHOUTCAST_STREAM, this can sometimes help there also).
- make custom list of "user agent strings" possible???
- KIO support / die Dateien sollten zunächst in einem temporären Verzeichnis (=Arbeitsverzeichnis für streamripper) landen, und dann an ihren endgültigen Ort kommen - egal ob lokal oder im Netzwerk. Das temporäre Verzeichnis sollte frühzeitig gelöscht werden - und somit auch der ganze Schrott (halbe Lieder etc.), da darin ist.
- session management! (Restore selection in table after starting, and everything else.) Work fine after Suspend (eventually restart the streamrippers) and after a shutdown.
- limit the length of the strings user as arguments for the command line for streamripper (according to what streamripper accepts)
- when streamripper reconnects, it just does [re-connect] - without error message. We should set an error message ("connection lost") nevertheless!
- vielleicht sollte besser kradioripper reconnect machen als streamripper, denn wenn streamripper das macht und man nach dem laufenden reconnect das Kabel wieder reinsteckt, funktioniert's nicht! Außerdem hört streamripper manchmal auf, ohne dass es einen Fehler ausgibt. Auch hier sollte neu gestartet werden. Aber wie oft probiere ich das dann neu? Eine entsprechende Option einrichten!
- what happens after a reconnect fails in streamripper. There'se no error message, no? We should display one nevertheless!
- when closing the program, display a message "Waiting for shoutdown." -> "Wait for shoutdown." "Kill now". "Abort."
- UI: reconnect as sub-entry of "timeout"? Or has reconnect also an effect when not timing out?
- UI: reconnect: not a checkbox, but a radio button "Reconnect." "Stop."?
- Möglichkeit der Drosselung der Bandbreite vorsehen. Was passiert bei Überschreiten? Zusätzliche Streams werden nicht gestartet!
- Assistent für streamripper-Suche (Test vor jedem Start. Entsprechende Fehlermeldungen, wenn streamripper fehlt - auch in streamripper-base! Und diese auswerten in radioripper, streaminfo, radiostation)
- nepomuk: include these infos: original meta info (as written stderr by streamripper. Oder besser: streamrippers Erkennung abschalten und alles als Titel interpretieren. Dann den Titel auslesen, selbst eine Erkennung durchführen, und alles entsprechend speichern.). streamserver URI. stream name. server name. meta data intervall. [...] time and date of recording. version info of streamripper. version info of kradioripper.
- user defined name for streams (to use, if desired, instead of the automaticly retrieved name)
- even more columns in the table (one for _each_ avaible info).
- make shure that only _one_ instance of KRadioRipper starts
- mehrere stream-einträge gleichzeitig in einem "settings"-Dialog bearbeiten
- "record" und "stop": Diese kactions sollte präziser an- und ausgeschaltet werden - dann, wenn das ganze wirklich möglich ist. Wenn "shutdown" angesagt ist, wäre es nett, wenn trotzdem ein Starten möglich ist (in Warteschleife)
- audio-playback should be controled trough a checkbox in the table.
- Fehlermeldung von QFile beseitigen! (Wenn neues config-file erstellt wird)
- Folgende Optionen rauskriegen wie sie funktionieren: 4x codeset, -L, -I
- Streamripper immer so aufrufen, dass die Meldungen auf Englisch kommen (das ganze ist nämlich teilweise lokalisiert, und das ist für eine automatische Erkennung ganz blöd).
- Kein externes Programm für metadata-Verarbeitung möglich!?
- Support kio-slaves for saving directory
- Einzelne Stream-Einträge mit ihren Einstellungen sollten in Dateien gespeichert werden können. Und vielleich über KGetHotNewStuff bezogen werden können. Auch mehrere Einträge sollten zusammengepackt werden können – damit sie auch auf einem anderen Rechner funktionieren.
- Station(en) in tar.bz2-Archiven speichern (Importieren/Exportieren)
- teste _alle_ Formate (mp3, ogg, aac .. gibt's noch mehr), die streamripper unterstützt
- in KDE rein um ein Win-Version zu kriegen
- KGetHotNewStuff for getting radio stations? See also http://code.google.com/soc/2008/kde/appinfo.html?csaid=CB51037C010D7473 for packaging content!
- Would DCOP/KPart make sense?