From b2642ad57db36564959de056c61c0fa388d38ab3 Mon Sep 17 00:00:00 2001 From: Penny Leach <penny@titania.local> Date: Sat, 30 Jun 2007 11:29:45 +1200 Subject: [PATCH] added audioscrobbler plugin --- .../UTF-8/lang_de.inc.php | 32 ++ .../UTF-8/lang_ru.inc.php | 45 ++ .../lang_de.inc.php | 32 ++ .../lang_en.inc.php | 46 ++ .../lang_ru.inc.php | 44 ++ .../serendipity_plugin_audioscrobbler.php | 542 ++++++++++++++++++ 6 files changed, 741 insertions(+) create mode 100644 plugins/serendipity_plugin_audioscrobbler/UTF-8/lang_de.inc.php create mode 100644 plugins/serendipity_plugin_audioscrobbler/UTF-8/lang_ru.inc.php create mode 100755 plugins/serendipity_plugin_audioscrobbler/lang_de.inc.php create mode 100644 plugins/serendipity_plugin_audioscrobbler/lang_en.inc.php create mode 100644 plugins/serendipity_plugin_audioscrobbler/lang_ru.inc.php create mode 100755 plugins/serendipity_plugin_audioscrobbler/serendipity_plugin_audioscrobbler.php diff --git a/plugins/serendipity_plugin_audioscrobbler/UTF-8/lang_de.inc.php b/plugins/serendipity_plugin_audioscrobbler/UTF-8/lang_de.inc.php new file mode 100644 index 0000000..2931d6c --- /dev/null +++ b/plugins/serendipity_plugin_audioscrobbler/UTF-8/lang_de.inc.php @@ -0,0 +1,32 @@ +<?php +define('PLUGIN_AUDIOSCROBBLER_TITLE', 'Audioscrobbler'); +define('PLUGIN_AUDIOSCROBBLER_TITLE_BLAHBLAH', 'Shows last played songs in your blog'); +define('PLUGIN_AUDIOSCROBBLER_NUMBER', 'Anzahl der Einträge'); +define('PLUGIN_AUDIOSCROBBLER_NUMBER_BLAHBLAH', 'Wieviele Einträge sollen angezeigt werden? (Standard: einer, muss mindestens 1 sein)'); +define('PLUGIN_AUDIOSCROBBLER_USERNAME', 'Audioscrobbler Benutzername'); +define('PLUGIN_AUDIOSCROBBLER_USERNAME_BLAHBLAH', 'Der Audioscrobbler Benutzername wird benötigt um den Feed abzufragen.'); +define('PLUGIN_AUDIOSCROBBLER_NEWWINDOW', 'Neues Fenster'); +define('PLUGIN_AUDIOSCROBBLER_NEWWINDOW_BLAHBLAH', 'Sollen die Links in einem neuen Fenster geöffnet werden (benötigt Javascript)'); +define('PLUGIN_AUDIOSCROBBLER_CACHETIME', 'Wann wird die Songliste aktualisiert?'); +define('PLUGIN_AUDIOSCROBBLER_CACHETIME_BLAHBLAH', 'Die Inhalte des Audioscrobbler Feeds werden gecached. Sobald der Cache älter ist als X Minuten wird er aktualisiert (Standard: 30 Minuten, mindestens 5 Minuten)'); +define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING', 'Der Formatierungsstring für einen Eintrag'); +define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLAHBLAH', '%ARTIST% für den Artist, %SONG% für den Song, %ALBUM% für das Album und %DATE% für das Datum.'); +define('PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE', 'Stunden Unterschied zur UTC Zeit'); +define('PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE_BLAHBLAH', 'Wieviel Stunden Unterschied zur UTC Zeit (GMT -1) (zum Beispiel -1 oder +2)'); +define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK', 'Der Formatierungsstring für den gesamten Block'); +define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK_BLAHBLAH', '%ENTRIES% für die Einträge, %PROFILE% für einen Link zum Audioscrobbler Profil, %LASTUPDATE% für die letzte Akutalisierung.'); +define('PLUGIN_AUDIOSCROBBLER_PROFILETITLE', 'Titel für den Profillink'); +define('PLUGIN_AUDIOSCROBBLER_PROFILETITLE_BLAHBLAH', 'Wird für %PROFILE% im Block-Formatierungsstring verwendet. %USER% für den Audioscrobbler Benutzername.'); +define('PLUGIN_AUDIOSCROBBLER_SONGLINK', 'Lieder als Links darstellen'); +define('PLUGIN_AUDIOSCROBBLER_SONGLINK_BLAHBLAH', 'Sollen die Lieder mit Audioscrobbler verlinkt werden?'); +define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK', 'Artist als Link darstellen'); +define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_BLAHBLAH', 'Sollen die Artists mit Audioscrobbler oder Musicbrainz verlinkt werden?'); +define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_SCROBBLER', 'mit Audioscrobbler verlinken'); +define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_NONE', 'mit Musicbrainz verlinken, falls verfügbar'); +define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_SCROBBLER', 'mit Musicbrainz oder nach Verfügbarkeit mit Audioscrobbler'); +define('PLUGIN_AUDIOSCROBBLER_SPACER', 'Trennzeichen'); +define('PLUGIN_AUDIOSCROBBLER_SPACER_BLAHBLAH', 'Was soll als Trennzeichen zwischen den Einträgen benutzt werden.'); +define('PLUGIN_AUDIOSCROBBLER_COULD_NOT_WRITE', 'Cache konnnte nicht geschrieben werden'); +define('PLUGIN_AUDIOSCROBBLER_COULD_NOT_READ', 'Cache konnnte nicht ausgewertet werden'); +define('PLUGIN_AUDIOSCROBBLER_FEED_OFFLINE', 'Audioscrobbler Songlist offline'); +?> diff --git a/plugins/serendipity_plugin_audioscrobbler/UTF-8/lang_ru.inc.php b/plugins/serendipity_plugin_audioscrobbler/UTF-8/lang_ru.inc.php new file mode 100644 index 0000000..d94055d --- /dev/null +++ b/plugins/serendipity_plugin_audioscrobbler/UTF-8/lang_ru.inc.php @@ -0,0 +1,45 @@ +<?php # $Id: lang_ru.inc.php,v 1.1 2007/02/06 09:00:17 garvinhicking Exp $ + +/** + * @version $Revision: 1.1 $ + * @author Alexey Noskov <alexey.noskov@gmail.com> + * EN-Revision: Revision of lang_en.inc.php + */ + +@define('PLUGIN_AUDIOSCROBBLER_TITLE', 'Audioscrobbler'); +@define('PLUGIN_AUDIOSCROBBLER_TITLE_BLAHBLAH', 'ÐÑобÑÐ°Ð¶Ð°ÐµÑ ÑпиÑок поÑÐ»ÐµÐ´Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸Ñий в ваÑем блоге'); +@define('PLUGIN_AUDIOSCROBBLER_NUMBER', 'ÐолиÑеÑÑво композиÑий'); +@define('PLUGIN_AUDIOSCROBBLER_NUMBER_BLAHBLAH', 'Ðак много композиÑий оÑобÑажаÑÑ? (Ðолжно бÑÑÑ Ð½Ðµ менÑÑе 1)'); +@define('PLUGIN_AUDIOSCROBBLER_USERNAME', 'Ðогин на Audioscrobbler'); +@define('PLUGIN_AUDIOSCROBBLER_USERNAME_BLAHBLAH', 'ÐведиÑе Ð²Ð°Ñ Ð»Ð¾Ð³Ð¸Ð½, ÑÑÐ¾Ð±Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½ мог полÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑооÑвеÑÑвÑÑÑей ленÑе.'); +@define('PLUGIN_AUDIOSCROBBLER_NEWWINDOW', 'Ðовое окно'); +@define('PLUGIN_AUDIOSCROBBLER_NEWWINDOW_BLAHBLAH', 'Sollen die Links in einem neuen Fenster ge??ffnet werden (needs Javascript)'); +@define('PLUGIN_AUDIOSCROBBLER_CACHETIME', 'Ðак ÑаÑÑо ÑпиÑок должен обновлÑÑÑÑÑ'); +@define('PLUGIN_AUDIOSCROBBLER_CACHETIME_BLAHBLAH', 'СодеÑжимое ÑпиÑка кÑÑиÑÑеÑÑÑ. Ðогда пÑевÑÑаеÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑй инÑеÑвал вÑемени, кÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑеÑÑÑ. (СÑандаÑÑно: 30 минÑÑ, минимÑм 5 минÑÑ)'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING', 'ФоÑмаÑиÑование запиÑи'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLAHBLAH', 'ÐÑполÑзÑйÑе %ARTIST% Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ иÑполниÑеÑ, %SONG% Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ композиÑии, %ALBUM% Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ алÑбома and %DATE% Ð´Ð»Ñ Ð´Ð°ÑÑ.'); +@define('PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE', 'Stunden Unterschied zur UTC Zeit'); +@define('PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE_BLAHBLAH', 'СмеÑение вÑемени Ð¾Ñ GMT (ÐÑимеÑ: ÐоÑква (РоÑÑиÑ) = 3)'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK', 'ФоÑмаÑиÑование вÑего блока'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK_BLAHBLAH', 'ÐÑполÑзÑйÑе %ENTRIES% Ð´Ð»Ñ ÑпиÑка композиÑийt, %PROFILE% Ð´Ð»Ñ ÑÑÑлки на пÑоÑилÑ, и %LASTUPDATE% Ð´Ð»Ñ Ð²Ñемени поÑледнего кÑÑиÑованиÑ.'); +@define('PLUGIN_AUDIOSCROBBLER_PROFILETITLE', 'Ðаголовок Ð´Ð»Ñ ÑÑÑлки на пÑоÑилÑ'); +@define('PLUGIN_AUDIOSCROBBLER_PROFILETITLE_BLAHBLAH', 'ТекÑÑ Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² ÑÑÑлке на ÐÐ°Ñ Ð¿ÑоÑилÑ. (ÐÐ»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ полÑзоваÑÐµÐ»Ñ Ð²Ð²ÐµÐ´Ð¸Ñе %USER%'); +@define('PLUGIN_AUDIOSCROBBLER_SONGLINK', 'СÑÑлки на композиÑии'); +@define('PLUGIN_AUDIOSCROBBLER_SONGLINK_BLAHBLAH', 'ÐÐ¾Ð»Ð¶Ð½Ñ Ð»Ð¸ композиÑии ÑÑÑлаÑÑÑÑ Ð½Ð° Ð¸Ñ ÑÑÑаниÑÑ Ð½Ð° Audioscrobbler?'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK', 'СÑÑлки на иÑполниÑелей'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_BLAHBLAH', 'СÑавиÑÑ Ð»Ð¸ ÑÑÑлки на иÑполниÑелей? (ÐÑбеÑиÑе ваÑианÑ)'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_NONE', 'Ðе ÑÑавиÑÑ ÑÑÑлок'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_SCROBBLER', 'СÑÑли на ÑÑÑаниÑÑ Ð¸ÑполниÑелей на Audioscrobbler'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_NONE', 'СÑÑлки на Musicbrainz, еÑли доÑÑÑпно'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_SCROBBLER', 'СÑÑлки на Musicbrainz, еÑли не доÑÑÑпно, Ñо на Audioscrobbler'); +@define('PLUGIN_AUDIOSCROBBLER_SPACER', 'РазделиÑелÑ'); +@define('PLUGIN_AUDIOSCROBBLER_SPACER_BLAHBLAH', 'ЧÑо должно бÑÑÑ Ð¸ÑполÑзовано Ð´Ð»Ñ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸Ñий в ÑпиÑке?'); +@define('PLUGIN_AUDIOSCROBBLER_COULD_NOT_WRITE', 'ÐÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¿Ð¸Ñан'); +@define('PLUGIN_AUDIOSCROBBLER_COULD_NOT_READ', 'ÐÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑоÑиÑан'); +@define('PLUGIN_AUDIOSCROBBLER_FEED_OFFLINE', 'СпиÑок композиÑий не доÑÑÑпен'); +@define('PLUGIN_AUDIOSCROBBLER_STACK', 'ÐÑполÑзоваÑÑ Ð¿Ð¾Ð²ÑоÑение?'); +@define('PLUGIN_AUDIOSCROBBLER_STACK_BLAHBLAH', 'ÐÑли колиÑеÑÑво композиÑий в ÑпиÑке менÑÑе Ñем ÑÐ°Ð·Ð¼ÐµÑ ÑпиÑка, ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑазÑеÑиÑÑ ÑÑÑ ÑÑÑановкÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÑледнÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸ÑиÑÑ Ð±Ñла повÑоÑена X Ñаз до Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑпиÑка.'); +@define('PLUGIN_AUDIOSCROBBLER_NUMBER_BLAHBLAH', 'как много композиÑий оÑобÑажаÑÑ? (СÑандаÑÑно: однÑ, не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼ÐµÐ½ÑÑе 1)'); +@define('PLUGIN_AUDIOSCROBBLER_FORCE_ENCODING', 'ÐÑполÑзоваÑÑ ÐºÐ¾Ð´Ð¸ÑовкÑ:'); +@define('PLUGIN_AUDIOSCROBBLER_FORCE_ENCODING_BLAHBLAH', 'ÐÐ¾Ñ Ð¼Ð¾Ð»ÑаниÑ, Serendipity иÑполÑзÑÐµÑ UTF-8 пÑи ÑазбоÑе даннÑÑ . ÐÑли ÑÑо вÑзÑÐ²Ð°ÐµÑ Ð¿ÑооблемÑ, Ñак как Ð²Ð°Ñ Ð±Ð»Ð¾Ð³ не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ UTF-8, введиÑе Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÑÑ ÐºÐ¾Ð´Ð¸ÑовкÑ.'); + diff --git a/plugins/serendipity_plugin_audioscrobbler/lang_de.inc.php b/plugins/serendipity_plugin_audioscrobbler/lang_de.inc.php new file mode 100755 index 0000000..85a3f52 --- /dev/null +++ b/plugins/serendipity_plugin_audioscrobbler/lang_de.inc.php @@ -0,0 +1,32 @@ +<?php +define('PLUGIN_AUDIOSCROBBLER_TITLE', 'Audioscrobbler'); +define('PLUGIN_AUDIOSCROBBLER_TITLE_BLAHBLAH', 'Shows last played songs in your blog'); +define('PLUGIN_AUDIOSCROBBLER_NUMBER', 'Anzahl der Einträge'); +define('PLUGIN_AUDIOSCROBBLER_NUMBER_BLAHBLAH', 'Wieviele Einträge sollen angezeigt werden? (Standard: einer, muss mindestens 1 sein)'); +define('PLUGIN_AUDIOSCROBBLER_USERNAME', 'Audioscrobbler Benutzername'); +define('PLUGIN_AUDIOSCROBBLER_USERNAME_BLAHBLAH', 'Der Audioscrobbler Benutzername wird benötigt um den Feed abzufragen.'); +define('PLUGIN_AUDIOSCROBBLER_NEWWINDOW', 'Neues Fenster'); +define('PLUGIN_AUDIOSCROBBLER_NEWWINDOW_BLAHBLAH', 'Sollen die Links in einem neuen Fenster geöffnet werden (benötigt Javascript)'); +define('PLUGIN_AUDIOSCROBBLER_CACHETIME', 'Wann wird die Songliste aktualisiert?'); +define('PLUGIN_AUDIOSCROBBLER_CACHETIME_BLAHBLAH', 'Die Inhalte des Audioscrobbler Feeds werden gecached. Sobald der Cache älter ist als X Minuten wird er aktualisiert (Standard: 30 Minuten, mindestens 5 Minuten)'); +define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING', 'Der Formatierungsstring für einen Eintrag'); +define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLAHBLAH', '%ARTIST% für den Artist, %SONG% für den Song, %ALBUM% für das Album und %DATE% für das Datum.'); +define('PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE', 'Stunden Unterschied zur UTC Zeit'); +define('PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE_BLAHBLAH', 'Wieviel Stunden Unterschied zur UTC Zeit (GMT -1) (zum Beispiel -1 oder +2)'); +define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK', 'Der Formatierungsstring für den gesamten Block'); +define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK_BLAHBLAH', '%ENTRIES% für die Einträge, %PROFILE% für einen Link zum Audioscrobbler Profil, %LASTUPDATE% für die letzte Akutalisierung.'); +define('PLUGIN_AUDIOSCROBBLER_PROFILETITLE', 'Titel für den Profillink'); +define('PLUGIN_AUDIOSCROBBLER_PROFILETITLE_BLAHBLAH', 'Wird für %PROFILE% im Block-Formatierungsstring verwendet. %USER% für den Audioscrobbler Benutzername.'); +define('PLUGIN_AUDIOSCROBBLER_SONGLINK', 'Lieder als Links darstellen'); +define('PLUGIN_AUDIOSCROBBLER_SONGLINK_BLAHBLAH', 'Sollen die Lieder mit Audioscrobbler verlinkt werden?'); +define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK', 'Artist als Link darstellen'); +define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_BLAHBLAH', 'Sollen die Artists mit Audioscrobbler oder Musicbrainz verlinkt werden?'); +define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_SCROBBLER', 'mit Audioscrobbler verlinken'); +define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_NONE', 'mit Musicbrainz verlinken, falls verfügbar'); +define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_SCROBBLER', 'mit Musicbrainz oder nach Verfügbarkeit mit Audioscrobbler'); +define('PLUGIN_AUDIOSCROBBLER_SPACER', 'Trennzeichen'); +define('PLUGIN_AUDIOSCROBBLER_SPACER_BLAHBLAH', 'Was soll als Trennzeichen zwischen den Einträgen benutzt werden.'); +define('PLUGIN_AUDIOSCROBBLER_COULD_NOT_WRITE', 'Cache konnnte nicht geschrieben werden'); +define('PLUGIN_AUDIOSCROBBLER_COULD_NOT_READ', 'Cache konnnte nicht ausgewertet werden'); +define('PLUGIN_AUDIOSCROBBLER_FEED_OFFLINE', 'Audioscrobbler Songlist offline'); +?> diff --git a/plugins/serendipity_plugin_audioscrobbler/lang_en.inc.php b/plugins/serendipity_plugin_audioscrobbler/lang_en.inc.php new file mode 100644 index 0000000..2ea5b3a --- /dev/null +++ b/plugins/serendipity_plugin_audioscrobbler/lang_en.inc.php @@ -0,0 +1,46 @@ +<?php # $Id: lang_en.inc.php,v 1.4 2006/12/18 16:22:05 slothman Exp $ + +/** + * @version $Revision: 1.4 $ + * @author Translator Noel <kriana_raktara@comcast.net> + * EN-Revision: Revision of lang_en.inc.php + */ + +@define('PLUGIN_AUDIOSCROBBLER_TITLE', 'Audioscrobbler'); +@define('PLUGIN_AUDIOSCROBBLER_TITLE_BLAHBLAH', 'Shows last played songs in your blog'); +@define('PLUGIN_AUDIOSCROBBLER_NUMBER', 'Number of Songs'); +@define('PLUGIN_AUDIOSCROBBLER_NUMBER_BLAHBLAH', 'How many songs should be displayed? (Standard: one, must be at least 1)'); +@define('PLUGIN_AUDIOSCROBBLER_USERNAME', 'Audioscrobbler Username'); +@define('PLUGIN_AUDIOSCROBBLER_USERNAME_BLAHBLAH', 'Enter your username so that the plugin can access the appropriate feed.'); +@define('PLUGIN_AUDIOSCROBBLER_NEWWINDOW', 'New Window'); +@define('PLUGIN_AUDIOSCROBBLER_NEWWINDOW_BLAHBLAH', 'Sollen die Links in einem neuen Fenster ge??ffnet werden (needs Javascript)'); +@define('PLUGIN_AUDIOSCROBBLER_CACHETIME', 'How often should the list be updated?'); +@define('PLUGIN_AUDIOSCROBBLER_CACHETIME_BLAHBLAH', 'The contents of the Audioscrobbler feed are cached. When this number of minutes expires, it is updated. (Standard: 30 minutes, minimum 5 Minuten)'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING', 'Entry Formatting'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLAHBLAH', 'Use %ARTIST% for the Artist, %SONG% for the Song, %ALBUM% for the Album and %DATE% for the Date.'); +@define('PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE', 'Stunden Unterschied zur UTC Zeit'); +@define('PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE_BLAHBLAH', 'Time offset from GMT (example: EST (Boston, New York (USA)) = -5)'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK', 'Formatting for the whole block'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK_BLAHBLAH', 'Use %ENTRIES% for the songlist, %PROFILE% for a link to your Audioscrobbler Profile, and %LASTUPDATE% for the date and time the feed was last cached.'); +@define('PLUGIN_AUDIOSCROBBLER_PROFILETITLE', 'Title for the Profile Link'); +@define('PLUGIN_AUDIOSCROBBLER_PROFILETITLE_BLAHBLAH', 'Text to display for the optional linke to your Audioscrobbler profile. (To use your username type %USER%'); +@define('PLUGIN_AUDIOSCROBBLER_SONGLINK', 'Link Songs'); +@define('PLUGIN_AUDIOSCROBBLER_SONGLINK_BLAHBLAH', 'Should songs be linked to their Audioscrobbler page?'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK', 'Link Artists'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_BLAHBLAH', 'Should artists be linked? (choose a service)'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_NONE', 'no'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_SCROBBLER', 'Artist page in Audioscrobbler'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_NONE', 'with Musicbrainz, if available'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_SCROBBLER', 'with Musicbrainz, if Musicbrainz is not available, with Audioscrobbler'); +@define('PLUGIN_AUDIOSCROBBLER_SPACER', 'Separator'); +@define('PLUGIN_AUDIOSCROBBLER_SPACER_BLAHBLAH', 'What should be used to separate entries in the songlist?'); +@define('PLUGIN_AUDIOSCROBBLER_COULD_NOT_WRITE', 'Cache could not be written'); +@define('PLUGIN_AUDIOSCROBBLER_COULD_NOT_READ', 'Cache could not be evaluated'); +@define('PLUGIN_AUDIOSCROBBLER_FEED_OFFLINE', 'Audioscrobbler Songlist offline'); +@define('PLUGIN_AUDIOSCROBBLER_STACK', 'Use stacking?'); +@define('PLUGIN_AUDIOSCROBBLER_STACK_BLAHBLAH', 'If the number of songs in your songlist is smaller than the number of songs you want to have displayed, you can enable this setting so that the last song item will be repeated X times to fill the list.'); +@define('PLUGIN_AUDIOSCROBBLER_NUMBER_BLAHBLAH', 'How many songs should be displayed? (Standard: one, must be at least 1)'); +@define('PLUGIN_AUDIOSCROBBLER_FORCE_ENCODING', 'Force encoding:'); +@define('PLUGIN_AUDIOSCROBBLER_FORCE_ENCODING_BLAHBLAH', 'By default, Serendipity uses UTF-8 to parse the Audioscrobbler data. If this is breaking special characters because your blog is not UTF-8, enter the appropriate encoding here.'); + +?> diff --git a/plugins/serendipity_plugin_audioscrobbler/lang_ru.inc.php b/plugins/serendipity_plugin_audioscrobbler/lang_ru.inc.php new file mode 100644 index 0000000..48c45d4 --- /dev/null +++ b/plugins/serendipity_plugin_audioscrobbler/lang_ru.inc.php @@ -0,0 +1,44 @@ +<?php # $Id: lang_ru.inc.php,v 1.1 2007/02/06 09:00:16 garvinhicking Exp $ + +/** + * @version $Revision: 1.1 $ + * @author Alexey Noskov <alexey.noskov@gmail.com> + * EN-Revision: Revision of lang_en.inc.php + */ + +@define('PLUGIN_AUDIOSCROBBLER_TITLE', 'Audioscrobbler'); +@define('PLUGIN_AUDIOSCROBBLER_TITLE_BLAHBLAH', 'ÐÑобÑÐ°Ð¶Ð°ÐµÑ ÑпиÑок поÑÐ»ÐµÐ´Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸Ñий в ваÑем блоге'); +@define('PLUGIN_AUDIOSCROBBLER_NUMBER', 'ÐолиÑеÑÑво композиÑий'); +@define('PLUGIN_AUDIOSCROBBLER_NUMBER_BLAHBLAH', 'Ðак много композиÑий оÑобÑажаÑÑ? (Ðолжно бÑÑÑ Ð½Ðµ менÑÑе 1)'); +@define('PLUGIN_AUDIOSCROBBLER_USERNAME', 'Ðогин на Audioscrobbler'); +@define('PLUGIN_AUDIOSCROBBLER_USERNAME_BLAHBLAH', 'ÐведиÑе Ð²Ð°Ñ Ð»Ð¾Ð³Ð¸Ð½, ÑÑÐ¾Ð±Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½ мог полÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑооÑвеÑÑвÑÑÑей ленÑе.'); +@define('PLUGIN_AUDIOSCROBBLER_NEWWINDOW', 'Ðовое окно'); +@define('PLUGIN_AUDIOSCROBBLER_NEWWINDOW_BLAHBLAH', 'Sollen die Links in einem neuen Fenster ge??ffnet werden (needs Javascript)'); +@define('PLUGIN_AUDIOSCROBBLER_CACHETIME', 'Ðак ÑаÑÑо ÑпиÑок должен обновлÑÑÑÑÑ'); +@define('PLUGIN_AUDIOSCROBBLER_CACHETIME_BLAHBLAH', 'СодеÑжимое ÑпиÑка кÑÑиÑÑеÑÑÑ. Ðогда пÑевÑÑаеÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑй инÑеÑвал вÑемени, кÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑеÑÑÑ. (СÑандаÑÑно: 30 минÑÑ, минимÑм 5 минÑÑ)'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING', 'ФоÑмаÑиÑование запиÑи'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLAHBLAH', 'ÐÑполÑзÑйÑе %ARTIST% Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ иÑполниÑеÑ, %SONG% Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ композиÑии, %ALBUM% Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ алÑбома and %DATE% Ð´Ð»Ñ Ð´Ð°ÑÑ.'); +@define('PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE', 'Stunden Unterschied zur UTC Zeit'); +@define('PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE_BLAHBLAH', 'СмеÑение вÑемени Ð¾Ñ GMT (ÐÑимеÑ: ÐоÑква (РоÑÑиÑ) = 3)'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK', 'ФоÑмаÑиÑование вÑего блока'); +@define('PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK_BLAHBLAH', 'ÐÑполÑзÑйÑе %ENTRIES% Ð´Ð»Ñ ÑпиÑка композиÑийt, %PROFILE% Ð´Ð»Ñ ÑÑÑлки на пÑоÑилÑ, и %LASTUPDATE% Ð´Ð»Ñ Ð²Ñемени поÑледнего кÑÑиÑованиÑ.'); +@define('PLUGIN_AUDIOSCROBBLER_PROFILETITLE', 'Ðаголовок Ð´Ð»Ñ ÑÑÑлки на пÑоÑилÑ'); +@define('PLUGIN_AUDIOSCROBBLER_PROFILETITLE_BLAHBLAH', 'ТекÑÑ Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² ÑÑÑлке на ÐÐ°Ñ Ð¿ÑоÑилÑ. (ÐÐ»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ полÑзоваÑÐµÐ»Ñ Ð²Ð²ÐµÐ´Ð¸Ñе %USER%'); +@define('PLUGIN_AUDIOSCROBBLER_SONGLINK', 'СÑÑлки на композиÑии'); +@define('PLUGIN_AUDIOSCROBBLER_SONGLINK_BLAHBLAH', 'ÐÐ¾Ð»Ð¶Ð½Ñ Ð»Ð¸ композиÑии ÑÑÑлаÑÑÑÑ Ð½Ð° Ð¸Ñ ÑÑÑаниÑÑ Ð½Ð° Audioscrobbler?'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK', 'СÑÑлки на иÑполниÑелей'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_BLAHBLAH', 'СÑавиÑÑ Ð»Ð¸ ÑÑÑлки на иÑполниÑелей? (ÐÑбеÑиÑе ваÑианÑ)'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_NONE', 'Ðе ÑÑавиÑÑ ÑÑÑлок'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_SCROBBLER', 'СÑÑли на ÑÑÑаниÑÑ Ð¸ÑполниÑелей на Audioscrobbler'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_NONE', 'СÑÑлки на Musicbrainz, еÑли доÑÑÑпно'); +@define('PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_SCROBBLER', 'СÑÑлки на Musicbrainz, еÑли не доÑÑÑпно, Ñо на Audioscrobbler'); +@define('PLUGIN_AUDIOSCROBBLER_SPACER', 'РазделиÑелÑ'); +@define('PLUGIN_AUDIOSCROBBLER_SPACER_BLAHBLAH', 'ЧÑо должно бÑÑÑ Ð¸ÑполÑзовано Ð´Ð»Ñ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸Ñий в ÑпиÑке?'); +@define('PLUGIN_AUDIOSCROBBLER_COULD_NOT_WRITE', 'ÐÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¿Ð¸Ñан'); +@define('PLUGIN_AUDIOSCROBBLER_COULD_NOT_READ', 'ÐÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑоÑиÑан'); +@define('PLUGIN_AUDIOSCROBBLER_FEED_OFFLINE', 'СпиÑок композиÑий не доÑÑÑпен'); +@define('PLUGIN_AUDIOSCROBBLER_STACK', 'ÐÑполÑзоваÑÑ Ð¿Ð¾Ð²ÑоÑение?'); +@define('PLUGIN_AUDIOSCROBBLER_STACK_BLAHBLAH', 'ÐÑли колиÑеÑÑво композиÑий в ÑпиÑке менÑÑе Ñем ÑÐ°Ð·Ð¼ÐµÑ ÑпиÑка, ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑазÑеÑиÑÑ ÑÑÑ ÑÑÑановкÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÑледнÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸ÑиÑÑ Ð±Ñла повÑоÑена X Ñаз до Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑпиÑка.'); +@define('PLUGIN_AUDIOSCROBBLER_NUMBER_BLAHBLAH', 'как много композиÑий оÑобÑажаÑÑ? (СÑандаÑÑно: однÑ, не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼ÐµÐ½ÑÑе 1)'); +@define('PLUGIN_AUDIOSCROBBLER_FORCE_ENCODING', 'ÐÑполÑзоваÑÑ ÐºÐ¾Ð´Ð¸ÑовкÑ:'); +@define('PLUGIN_AUDIOSCROBBLER_FORCE_ENCODING_BLAHBLAH', 'ÐÐ¾Ñ Ð¼Ð¾Ð»ÑаниÑ, Serendipity иÑполÑзÑÐµÑ UTF-8 пÑи ÑазбоÑе даннÑÑ . ÐÑли ÑÑо вÑзÑÐ²Ð°ÐµÑ Ð¿ÑооблемÑ, Ñак как Ð²Ð°Ñ Ð±Ð»Ð¾Ð³ не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ UTF-8, введиÑе Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÑÑ ÐºÐ¾Ð´Ð¸ÑовкÑ.'); diff --git a/plugins/serendipity_plugin_audioscrobbler/serendipity_plugin_audioscrobbler.php b/plugins/serendipity_plugin_audioscrobbler/serendipity_plugin_audioscrobbler.php new file mode 100755 index 0000000..ac120eb --- /dev/null +++ b/plugins/serendipity_plugin_audioscrobbler/serendipity_plugin_audioscrobbler.php @@ -0,0 +1,542 @@ +<?php + +// By Alphalogic (aka Flo Solcher) alpha@alphalogic.org + + +if (IN_serendipity !== true) { + die ("Don't hack!"); +} + +// Probe for a language include with constants. Still include defines later on, if some constants were missing +$probelang = dirname(__FILE__) . '/' . $serendipity['charset'] . 'lang_' . $serendipity['lang'] . '.inc.php'; +if (file_exists($probelang)) { + include $probelang; +} + +include_once dirname(__FILE__) . '/lang_en.inc.php'; + +class s9y_audioscrobbler_XMLParser { + function parseXML($xml_content, $forced_encoding = null) { + $xml_parser = xml_parser_create(); + xml_parser_set_option ($xml_parser, XML_OPTION_TARGET_ENCODING, 'UTF-8'); + xml_parser_set_option ($xml_parser, XML_OPTION_CASE_FOLDING, 1); + xml_parser_set_option ($xml_parser, XML_OPTION_SKIP_WHITE, 0); + $utf8_content = serendipity_utf8_encode($xml_content); + xml_parse_into_struct($xml_parser, $utf8_content, $xml_array); + xml_parser_free($xml_parser); + return $xml_array; + } + function getXMLArray($file, $forced_encoding = null) { + require_once (defined('S9Y_PEAR_PATH') ? S9Y_PEAR_PATH : S9Y_INCLUDE_PATH . 'bundled-libs/') . 'HTTP/Request.php'; + $req = &new HTTP_Request($file); + if (PEAR::isError($req->sendRequest()) || $req->getResponseCode() != '200') { + if ( ini_get( "allow_url_fopen")) { + $data = file_get_contents($file); + } else { + $data = ""; + } + } else { + $data = $req->getResponseBody(); + } + if (trim($data)== '') return false; + return $this->parseXML($data, $forced_encoding); + } +} + +class serendipity_plugin_audioscrobbler extends serendipity_plugin { + + var $title = PLUGIN_AUDIOSCROBBLER_TITLE; + var $scrobbler_error = array(); + var $songs = array(); + var $scrobblercache; + var $number; + var $username; + var $cachetime; + var $utcdifference; + var $read_scrobbler_feed = false; + var $scrobblerlastupdate; + + function introspect(&$propbag) { + $this->title = $this->get_config('sidebartitle', $this->title); + + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_TITLE); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_TITLE_BLAHBLAH); + $propbag->add('stackable', true); + $propbag->add('author', 'Flo Solcher'); + $propbag->add('version', '1.25'); + $propbag->add('requirements', array( + 'serendipity' => '0.8', + 'smarty' => '2.6.7', + 'php' => '4.1.0' + )); + $propbag->add('groups', array('FRONTEND_EXTERNAL_SERVICES')); + $propbag->add('configuration', array( 'number', + 'sidebartitle', + 'username', + 'songlink', + 'artistlink', + 'newwindow', + 'cachetime', + 'dateformat', + 'utcdifference', + 'spacer', + 'profiletitle', + 'formatstring', + 'formatstring_block', + 'lastupdate', + 'forced', + 'stack' + )); + } + + function introspect_config_item($name, &$propbag) { + switch($name) { + + case 'lastupdate': case 'forced': + $propbag->add('type', 'hidden'); + $propbag->add('default', 0); + break; + + case 'number': + $propbag->add('type', 'string'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_NUMBER); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_NUMBER_BLAHBLAH); + $propbag->add('default', '0'); + break; + + case 'sidebartitle': + $propbag->add('type', 'string'); + $propbag->add('name', TITLE); + $propbag->add('description', TITLE_FOR_NUGGET); + $propbag->add('default', ''); + break; + + case 'username': + $propbag->add('type', 'string'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_USERNAME); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_USERNAME_BLAHBLAH); + $propbag->add('default', ''); + break; + + case 'stack': + $propbag->add('type', 'boolean'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_STACK); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_STACK_BLAHBLAH); + $propbag->add('default', true); + break; + + case 'songlink': + $propbag->add('type', 'boolean'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_SONGLINK); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_SONGLINK_BLAHBLAH); + $propbag->add('default', '1'); + break; + + case 'artistlink': + $propbag->add('type', 'select'); + $propbag->add('select_values', array('0' => PLUGIN_AUDIOSCROBBLER_ARTISTLINK_NONE, + '1' => PLUGIN_AUDIOSCROBBLER_ARTISTLINK_SCROBBLER, + '2' => PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_NONE, + '3' => PLUGIN_AUDIOSCROBBLER_ARTISTLINK_MUSICBRAINZ_ELSE_SCROBBLER + )); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_ARTISTLINK); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_ARTISTLINK_BLAHBLAH); + $propbag->add('default', '4'); + break; + + + case 'newwindow': + $propbag->add('type', 'boolean'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_NEWWINDOW); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_NEWWINDOW_BLAHBLAH); + $propbag->add('default', false); + break; + + case 'cachetime': + $propbag->add('type', 'string'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_CACHETIME); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_CACHETIME_BLAHBLAH); + $propbag->add('default', 30); + break; + + case 'dateformat': + $propbag->add('type', 'string'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_DATEFORMAT); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_DATEFORMAT_BLAHBLAH); + $propbag->add('default', "%e. %B %Y, %H:%M"); + break; + + case 'utcdifference': + $propbag->add('type', 'string'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_UTCDIFFERENCE_BLAHBLAH); + $propbag->add('default', "0"); + break; + + case 'spacer': + $propbag->add('type', 'string'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_SPACER); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_SPACER_BLAHBLAH); + $propbag->add('default', '<br />'); + break; + + case 'profiletitle': + $propbag->add('type', 'string'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_PROFILETITLE); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_PROFILETITLE_BLAHBLAH); + $propbag->add('default', '%USER%'); + break; + + case 'formatstring': + $propbag->add('type', 'text'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_FORMATSTRING); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLAHBLAH); + $propbag->add('default', 'Song: %SONG%<br />Artist: %ARTIST%<br /><div class="serendipitySideBarDate">%DATE%</div>'); + break; + + case 'formatstring_block': + $propbag->add('type', 'text'); + $propbag->add('name', PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK); + $propbag->add('description', PLUGIN_AUDIOSCROBBLER_FORMATSTRING_BLOCK_BLAHBLAH); + $propbag->add('default', '<div style="text-align: center;">%PROFILE%</div><br />%ENTRIES%<br /><div style="text-align: center;">%LASTUPDATE%</div>'); + break; + + default: + return false; + } + return true; + } + + //renders the date for output + function renderScrobblerDate($date) { + $stamp = $date + intval($this->utcdifference) * 60 * 60; + return htmlspecialchars(serendipity_formatTime($this->get_config('dateformat'), $stamp, true)); + } + + //sets the timestamp of the last update try + function setLastUpdateTry() { + $stamp = time(); + $this->set_config('lastupdate', $stamp); + $this->scrobblerlastupdate = $stamp; + } + + //reads the songs from the audioscrobbler rdf feed + function getSongsFromScrobbler($force = false) { + if (!file_exists($this->scrobblercache) || filesize($this->scrobblercache) == 0 || $this->scrobblerlastupdate < (time() - $this->cachetime) || $force) { + $this->read_scrobbler_feed = true; + if ($this->get_config('forced') == 1 && $force) { + echo '<!-- second force attempt -->'."\n"; + return false; + } elseif ($this->get_config('forced') == 0 && $force) { + $this->set_config('forced', 1); + echo '<!-- setting force attempt -->'."\n"; + } + $this->setLastUpdateTry(); + echo '<!-- fetching scrobbler feed -->'."\n"; + $objXml = new s9y_audioscrobbler_XMLParser(); + $array = $objXml->getXMLArray('http://ws.audioscrobbler.com/1.0/user/'.$this->username.'/recenttracks.xml'); + error_log('http://ws.audioscrobbler.com/1.0/user/'.$this->username.'/recenttracks.xml'); + + if ($array && is_array($array)) { + $songs = array(); + $counter = 0; + //$start = false; + $start = true; + foreach ($array as $xml) { + if ($xml['tag'] == 'TRACK' && $xml['type'] == 'close') { + $counter++; + } elseif ($xml['tag'] == 'RECENTTRACKS' && $xml['type'] == 'close') { + $start = true; + } + if ($start) { + if ($xml['tag'] == 'LINK' && $xml['type'] == 'complete') { + $songs[$counter]['link'] = $this->reencode($xml['value']); + } + elseif ($xml['tag'] == 'NAME' && $xml['type'] == 'complete') + { + $songs[$counter]['songtitle'] = $this->reencode($xml['value']); + } + elseif ($xml['tag'] == 'DATE' && $xml['type'] == 'complete') + { + $songs[$counter]['date'] = $this->reencode($xml['attributes']['UTS']); + } + elseif ($xml['tag'] == 'URL' && $xml['type'] == 'complete') + { + $songs[$counter]['songlink'] = trim($this->reencode($xml['value'])); + + } + elseif ($xml['tag'] == 'ARTIST' && $xml['type'] == 'complete') + { + $songs[$counter]['artisttitle'] = $this->reencode($xml['value']); + + } + /* + } elseif ($xml['tag'] == 'DESCRIPTION' && $xml['type'] == 'complete') { + $songs[$counter]['description'] = reencode($xml['value']); + } elseif ($xml['tag'] == 'DC:DATE' && $xml['type'] == 'complete') { + $songs[$counter]['date'] = reencode($xml['value']); + } elseif ($xml['tag'] == 'DC:TITLE' && $xml['type'] == 'complete' && $state == 0) { + $songs[$counter]['songtitle'] = reencode($xml['value']); + $state++; + } elseif ($xml['tag'] == 'MM:ARTIST' && $xml['type'] == 'open' && is_array($xml['attributes'])) { + $songs[$counter]['artistlink'] = reencode($xml['attributes']['RDF:ABOUT']); + } elseif ($xml['tag'] == 'DC:TITLE' && $xml['type'] == 'complete' && $state == 1) { + $songs[$counter]['artisttitle'] = reencode($xml['value']); + $state++; + } elseif ($xml['tag'] == 'DC:TITLE' && $xml['type'] == 'complete' && $state == 2) { + $songs[$counter]['albumtitle'] = reencode($xml['value']); + $state = 0; + } + */ + } + + } + if (is_array($songs) && count($songs) > 0) { + if (count($songs) < intval($this->get_config('number'))) { + $songs = $this->stackerScrobbler($songs); + } elseif (count($songs) > intval($this->get_config('number'))) { + $songs = $this->deStackerScrobbler($songs); + } + if (!$force) { + $this->set_config('forced', 0); + } + $this->writeScrobblerCache($songs); + return true; + } elseif ($force) { + return false; + } elseif (!file_exists($this->scrobblercache)) { + $this->scrobbler_error[] = PLUGIN_AUDIOSCROBBLER_FEED_OFFLINE; + return false; + } + } + } + } + + // Reencodes UTF-8 to blog encoding + function reencode($string) { + if (LANG_CHARSET != 'UTF-8') { + return utf8_decode($string); + } + return $string; + } + + //destacks the songs so that always the $this->number songs are in the songarray + function deStackerScrobbler($songs) { + while (count($songs) != $this->number) array_pop($songs); + return $songs; + } + + //stacks the songs so that always the $this->number songs are in the songarray + function stackerScrobbler($songs) { + if (!serendipity_db_bool($this->get_config('stack'))) { + return $songs; + } + + $this->readScrobblerCache(true); + if ($oldsongs = $this->songs) { + $diff = $this->number - count($songs); + $lastsongs = array(); + foreach ($oldsongs as $oldsong) { + $addsong = true; + foreach ($songs as $song) { + if ($song['date'] == $oldsong['date']) { + $addsong = false; + } + } + if ($addsong) $lastsongs[] = $song; + } + $i = 0; + foreach(array_reverse($lastsongs) as $lastsong) { + $songs[] = $lastsong; + $i++; + if (($diff - $i) == 0) { + break; + } + } + return $songs; + } else { + return $songs; + } + } + + //encodes a scrobbler song array + function encodeScrobblerArray($song_array) { + if (function_exists('gzcompress')) { + return gzcompress(serialize($song_array)); + } else { + return serialize($song_array); + } + } + + //decodes a scrobbler song array + function decodeScrobblerArray($encoded_songs) { + if (function_exists('gzcompress')) { + return unserialize(gzuncompress($encoded_songs)); + } else { + return unserialize($encoded_songs); + } + } + + //writes the s9y cache sets $this->scrobbler_error on failure + function writeScrobblerCache($songs) { + //check if the $this->songs and $songs are equal + if (is_array ($this->songs)) { + $equal = true; + if (is_array($this->songs)) + foreach ($songs as $key => $song) { + foreach ($song as $tag => $value) { + if ($this->songs[$key][$tag] != $value) $equal = false; + } + } + if ($equal) { + echo '<!-- cache is equal -->'."\n"; + return; + } + } + $fp = @fopen($this->scrobblercache, 'w'); + if ($fp) { + fwrite($fp, $this->encodeScrobblerArray($songs)); + fclose($fp); + $this ->songs = $songs; + echo '<!-- cache written -->'."\n"; + } else { + $this->scrobbler_error[] = PLUGIN_AUDIOSCROBBLER_COULD_NOT_WRITE; + } + } + + //reads from the s9y cache sets $this->songs on success , $this->scrobbler_error on failure + function readScrobblerCache($no_error = false) { + //don't do things twice ;) + if (is_array($this->songs) && @count($this->songs) > 0) { + return $this->songs; + } else { + $songs = @file_get_contents($this->scrobblercache); + if (trim($songs) == '' || !@is_array($this->decodeScrobblerArray($songs))) { + //create a new cache if possible + //the scobbler feed was not read yet->read it + if (!$this->read_scrobbler_feed) { + echo '<!-- bad cache trying to create a new one -->'."\n"; + $this->getSongsFromScrobbler(); + return; + } + //if the feed is not readable and this is no stack call add an error + if (!$no_error) { + $this ->scrobbler_error[] = PLUGIN_AUDIOSCROBBLER_COULD_NOT_READ; + } + $this ->songs = false; + } else { + //if the cache doesnt match $this->number try to stack it with a force read + if (!($this->read_scrobbler_feed) && count($this->decodeScrobblerArray($songs)) < $this->number) { + echo '<!-- force read for stack -->'."\n"; + //if the songlist is offline or this is the second force attempt - return the cache + if (!$this->getSongsFromScrobbler(true)) { + $this->songs = $this->decodeScrobblerArray($songs); + } + return; + } + //destack the cache - *needed?* + if (count($this->decodeScrobblerArray($songs)) > $this->number) { + echo '<!-- destacking cache -->'."\n"; + $songs = $this->deStackerScrobbler($this->decodeScrobblerArray($songs)); + $this->writeScrobblerCache($songs); + return; + } + //return an O.K. cache + echo '<!-- cache read -->'."\n"; + $this ->songs = $this->decodeScrobblerArray($songs); + } + } + } + + //renders the output + function renderScrobblerOutput() { + $formatstring = $this->get_config('formatstring'); + $formatstring_block = $this->get_config('formatstring_block'); + $artistlink = $this->get_config('artistlink'); + $songlink = $this->get_config('songlink'); + $spacer = $this->get_config('spacer'); + $profiletitle = $this->get_config('profiletitle'); + $this -> getSongsFromScrobbler(); + $this -> readScrobblerCache(); + + if ($this->get_config('newwindow')) { + $onlick = ' onclick="window.open(this.href);"'; + } + + if (!$this->songs) { + echo '<span style="font-weight: bold;">'.PLUGIN_AUDIOSCROBBLER_ERROR.':</span><br /><ul><li>'.join('</li><li>', $this->scrobbler_error).'</li></ul>'; + return; + } + $content = array(); + $i = 0; + foreach ($this->songs as $key => $value) { + $value['songtitle'] = utf8_decode($value['songtitle']); + $value['artisttitle'] = utf8_decode($value['artisttitle']); + $value['songtitle'] = utf8_decode($value['songtitle']); + $add = ''; + if ($songlink) { + if (is_string(strstr($value['link'], '&mode'))) { + //fix ampersand entity + $song = '<a href="'.str_replace('&mode', '&mode', $value['link']). '"'.$onclick.'>'.htmlspecialchars($value['songtitle'], ENT_QUOTES).'</a>'."\n"; + } elseif (is_string(strstr($value['link'], '&mode'))) { + //link is ok + $song = '<a href="'.$value['link']. '"'.$onclick.'>'.htmlspecialchars($value['songtitle'], ENT_QUOTES).'</a>'."\n"; + } else { + //encode it + $song = '<a href="http://www.audioscrobbler.com/music/'.urlencode(utf8_encode($value['artisttitle'])). '/_/'.urlencode(utf8_encode($value['songtitle'])).'"'.$onclick.'>'.htmlspecialchars($value['songtitle'], ENT_QUOTES).'</a>'."\n"; + } + } else { + $song = htmlspecialchars($value['songtitle'], ENT_QUOTES); + } + if ($artistlink == 0) { + $artist = htmlspecialchars($value['artisttitle'], ENT_QUOTES); + } elseif ($artistlink == 1) { + $artist = '<a href="http://www.audioscrobbler.com/music/'.urlencode(utf8_encode($value['artisttitle'])).'"'.$onclick.'>'.htmlspecialchars($value['artisttitle'], ENT_QUOTES).'</a>'."\n"; + } elseif ($artistlink == 2) { + if ($value['artisttitle'] != '' || $value['artistlink'] != 'http://mm.musicbrainz.org/artist/') { + $artist = '<a href="' . $value['artistlink'] . '"'.$onclick.'>'.htmlspecialchars($value['artisttitle'], ENT_QUOTES).'</a>'."\n"; + } else { + $artist = htmlspecialchars($value['artisttitle'], ENT_QUOTES); + } + } else { + if (trim($value['artistlink']) != 'http://mm.musicbrainz.org/artist/' && trim($value['artistlink']) != '') { + $artist = '<a href="' . $value['artistlink'] . '"'.$onclick.'>'.htmlspecialchars($value['artisttitle'], ENT_QUOTES).'</a>'."\n"; + } else { + $artist = '<a href="http://www.audioscrobbler.com/music/'.urlencode(utf8_encode($value['artisttitle'])).'"'.$onclick.'>'.htmlspecialchars($value['artisttitle'], ENT_QUOTES).'</a>'."\n"; + } + } + $replacements = array('%ARTIST%' => $artist, '%SONG%' => $song, '%DATE%' => $this->renderScrobblerDate($value['date'], $dateformat)); + $add = str_replace(array_keys($replacements), array_values($replacements), $formatstring); + $content[] = $add; + $i++; + if ($i == $this->number) { + break; + } + } + $entries = join($spacer, $content); + $output = str_replace('%ENTRIES%', $entries, $formatstring_block); + $profiletitle = str_replace('%USER%', $this->username, $profiletitle); + $output = str_replace('%PROFILE%', '<a href="http://www.audioscrobbler.com/user/'.urlencode(utf8_encode($this->username)).'"'.$onclick.'>'.htmlspecialchars($profiletitle, ENT_QUOTES).'</a>', $output); + $output = str_replace('%LASTUPDATE%', htmlspecialchars(serendipity_formatTime($this->get_config('dateformat'), filemtime($this->scrobblercache), true)), $output); + $output = str_replace('audioscrobbler.com', 'last.fm', $output); + return $output; + } + + //checks and formats the settings + function doConfig() { + global $serendipity; + $this->number = (intval($this->get_config('number')) == 0) ? 1 : intval($this->get_config('number')); + $this->username = trim($this->get_config('username')); + $this->cachetime = (intval($this->get_config('cachetime')) == 0) ? 300 : ($this->get_config('cachetime') * 60); + $this->scrobblercache = $serendipity['serendipityPath'] . 'templates_c/audioscrobbler_cache_' . preg_replace('@[^a-z0-9]*@i', '', $this->username) . '.dat'; + $this->utcdifference = intval($this->get_config('utcdifference')); + $this->scrobblerlastupdate = intval($this->get_config('lastupdate')); + } + + function generate_content(&$title) { + $sidebartitle = $title = $this->get_config('sidebartitle', $this->title); + $this->doConfig(); + echo "\n".$this->renderScrobblerOutput()."\n"; + } +} +?> -- 2.39.5