*/ if(!defined('DW_LF')) define('DW_LF',"\n"); require_once(DOKU_INC.'inc/html.php'); /** * outputs the requested lastfm chart * * @author Michael Klier */ function lastfm_xhtml($user,$chart,$limit,$dformat,$utc_offset,$cols,$imgonly) { global $lang; $data = array(); $xml = lastfm_get_xml($user,$chart); $data = ($chart != 'profile') ? @array_pop(lastfm_xml2array($xml)) : lastfm_xml2array($xml); // do we have any data? if(!is_array($data)) { print $lang['nothingfound']; return; }; // apply limit if($chart != 'profile') $data = array_slice($data,0,$limit); print '' . DW_LF; switch($chart) { case 'topartists': foreach($data as $rcd) { print '' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print '' . DW_LF; } break; case 'topalbums': if(!$imgonly) { foreach($data as $rcd) { print '' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print '' . DW_LF; } } else { $num = count($data); $col = 1; for($i=0;$i<$num;$i++) { if($col == 1) print '' . DW_LF; print ' ' . DW_LF; if($col == $cols) { print '' . DW_LF; $col = 1; } else { $col++; } } } break; case 'toptracks': foreach($data as $rcd) { print '' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print '' . DW_LF; } break; case 'tags': foreach($data as $rcd) { print '' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print '' . DW_LF; } break; case 'friends': $num = count($data); $col = 1; for($i=0;$i<$num;$i++) { if($col == 1) print '' . DW_LF; print ' ' . DW_LF; if($col == $cols) { print '' . DW_LF; $col = 1; } else { $col++; } } break; case 'neighbours': $num = count($data); $col = 1; for($i=0;$i<$num;$i++) { if($col == 1) print '' . DW_LF; print ' ' . DW_LF; if($col == $cols) { print '' . DW_LF; $col = 1; } else { $col++; } } break; case 'recenttracks': foreach($data as $rcd) { print '' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print '' . DW_LF; } break; case 'weeklyartistchart': foreach($data as $rcd) { print '' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print '' . DW_LF; } break; case 'weeklyalbumchart': foreach($data as $rcd) { // FIXME mbid field print '' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print '' . DW_LF; } break; case 'weeklytrackchart': foreach($data as $rcd) { print '' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print ' ' . DW_LF; print '' . DW_LF; } break; case 'profile': print '' . DW_LF; print ' ' . $user . '' . DW_LF; print '' . DW_LF; break; } print '
' . $rcd['rank'] . '.' . DW_LF; print ' ' . $rcd['name'] . '' . DW_LF; print ' ' . DW_LF; print '
' . $rcd['playcount'] . '
' . DW_LF; print '
' . $rcd['rank'] . '.' . DW_LF; print ' ' . DW_LF; print ' ' . $rcd['name'] . '' . DW_LF; print ' ' . DW_LF; print ' ' . $rcd['artist'] . ' [' . $rcd['name'] . ']' . $rcd['playcount'] . '
' . DW_LF; print ' ' . DW_LF; print ' ' . $data[$i]['name'] . '' . DW_LF; print ' ' . DW_LF; print '
' . $rcd['rank'] . '.' . $rcd['name'] . '' . $rcd['playcount'] . '
' . $rcd['count'] . '' . $rcd['name'] . '
' . DW_LF; print ' ' . DW_LF; print ' ' . $data[$i]['attributes']['username'] . '' . DW_LF; print ' ' . DW_LF; print '
' . DW_LF; print ' ' . DW_LF; print ' ' . $data[$i]['attributes']['username'] . ' ' . $data[$i]['match'] . '%' . DW_LF; print ' ' . DW_LF; print '
' . DW_LF; print ' ' . $rcd['artist'] . ' · ' . $rcd['name'] . '' . DW_LF; print ' ' . lastfm_cvdate($rcd['date'],$dformat,$utc_offset) . '
' . $rcd['chartposition'] . '.' . DW_LF; print ' ' . $rcd['name'] . '' . DW_LF; print ' ' . $rcd['playcount'] . '
' . $rcd['chartposition'] . '.' . DW_LF; print ' ' . $rcd['artist'] . ' · ' . $rcd['name'] . '' . DW_LF; print ' ' . $rcd['playcount'] . '
' . $rcd['chartposition'] . '.' . DW_LF; print ' ' . $rcd['artist'] . ' · ' . $rcd['name'] . '' . DW_LF; print ' ' . $rcd['playcount'] . '
' . DW_LF; } /** * gets the xml file from the lastfm page * * @author Michael Klier */ function lastfm_get_xml($user,$chart) { $xml = ''; $http = new DokuHTTPClient(); $url = 'http://ws.audioscrobbler.com/1.0/user/'; $url .= $user . '/' . $chart . '.xml'; $xml = $http->get($url); if($http->status == 200) return $xml; } /** * converst the date provided by the lastfm service * * @author Michael Klier */ function lastfm_cvdate($date,$dformat,$utc_offset) { list($day,$month,$year,$time) = explode(' ',$date); list($hour,$min) = explode(':',$time); $year = substr($year,0,-1); // remove trailing comma $hour = $hour + $utc_offset; return date($dformat,strtotime($day." ".$month." ".$year. " ".$hour.":".$min)); } /** * wrapper function around _xmlToArray() */ function lastfm_xml2array($xml) { return _xmlToArray($xml); } /** * This static method converts an xml file to an associative array * duplicating the xml file structure. * * @param $fileName. String. The name of the xml file to convert. * This method returns an Error object if this file does not * exist or is invalid. * @param $includeTopTag. booleal. Whether or not the topmost xml tag * should be included in the array. The default value for this is false. * @param $lowerCaseTags. boolean. Whether or not tags should be * set to lower case. Default value for this parameter is true. * @access public static * @return Associative Array * @author Jason Read * @author Michael Klier */ function & _xmlToArray($xml_raw, $includeTopTag = false, $lowerCaseTags = true) { $p = xml_parser_create(); xml_parse_into_struct($p,$xml_raw,$vals,$index); xml_parser_free($p); $xml = array(); $levels = array(); $multipleData = array(); $prevTag = ""; $currTag = ""; $topTag = false; foreach ($vals as $val) { // Open tag if ($val["type"] == "open") { if (!_xmlFileToArrayOpen($topTag, $includeTopTag, $val, $lowerCaseTags, $levels, $prevTag, $multipleData, $xml)) { continue; } } // Close tag else if ($val["type"] == "close") { if (!_xmlFileToArrayClose($topTag, $includeTopTag, $val, $lowerCaseTags, $levels, $prevTag, $multipleData, $xml)) { continue; } } // Data tag else if ($val["type"] == "complete" && isset($val["value"])) { $loc =& $xml; foreach ($levels as $level) { $temp =& $loc[str_replace(":arr#", "", $level)]; $loc =& $temp; } $tag = $val["tag"]; if ($lowerCaseTags) { $tag = strtolower($val["tag"]); } $loc[$tag] = str_replace("\\n", "\n", $val["value"]); } // Tag without data else if ($val["type"] == "complete") { _xmlFileToArrayOpen($topTag, $includeTopTag, $val, $lowerCaseTags, $levels, $prevTag, $multipleData, $xml); _xmlFileToArrayClose($topTag, $includeTopTag, $val, $lowerCaseTags, $levels, $prevTag, $multipleData, $xml); } } return $xml; } /** * Private support function for xmlFileToArray. Handles an xml OPEN tag. * * @param $topTag. String. xmlFileToArray topTag variable * @param $includeTopTag. boolean. xmlFileToArray includeTopTag variable * @param $val. String[]. xmlFileToArray val variable * @param $currTag. String. xmlFileToArray currTag variable * @param $lowerCaseTags. boolean. xmlFileToArray lowerCaseTags variable * @param $levels. String[]. xmlFileToArray levels variable * @param $prevTag. String. xmlFileToArray prevTag variable * @param $multipleData. boolean. xmlFileToArray multipleData variable * @param $xml. String[]. xmlFileToArray xml variable * @access private static * @return boolean * @author Jason Read */ function _xmlFileToArrayOpen(& $topTag, & $includeTopTag, & $val, & $lowerCaseTags, & $levels, & $prevTag, & $multipleData, & $xml) { // don't include top tag if (!$topTag && !$includeTopTag) { $topTag = $val["tag"]; return false; } $currTag = $val["tag"]; if ($lowerCaseTags) { $currTag = strtolower($val["tag"]); } $levels[] = $currTag; // Multiple items w/ same name. Convert to array. if ($prevTag === $currTag) { if (!array_key_exists($currTag, $multipleData) || !$multipleData[$currTag]["multiple"]) { $loc =& $xml; foreach ($levels as $level) { $temp =& $loc[$level]; $loc =& $temp; } $loc = array($loc); $multipleData[$currTag]["multiple"] = true; $multipleData[$currTag]["multiple_count"] = 0; } $multipleData[$currTag]["popped"] = false; $levels[] = ":arr#" . ++$multipleData[$currTag]["multiple_count"]; } else { $multipleData[$currTag]["multiple"] = false; } // Add attributes array if (array_key_exists("attributes", $val)) { $loc =& $xml; foreach ($levels as $level) { $temp =& $loc[str_replace(":arr#", "", $level)]; $loc =& $temp; } $keys = array_keys($val["attributes"]); foreach ($keys as $key) { $tag = $key; if ($lowerCaseTags) { $tag = strtolower($tag); } $loc["attributes"][$tag] = & $val["attributes"][$key]; } } return true; } /** * Private support function for xmlFileToArray. Handles an xml OPEN tag. * * @param $topTag. String. xmlFileToArray topTag variable * @param $includeTopTag. boolean. xmlFileToArray includeTopTag variable * @param $val. String[]. xmlFileToArray val variable * @param $currTag. String. xmlFileToArray currTag variable * @param $lowerCaseTags. boolean. xmlFileToArray lowerCaseTags variable * @param $levels. String[]. xmlFileToArray levels variable * @param $prevTag. String. xmlFileToArray prevTag variable * @param $multipleData. boolean. xmlFileToArray multipleData variable * @param $xml. String[]. xmlFileToArray xml variable * @access private static * @return boolean * @author Jason Read */ function _xmlFileToArrayClose(& $topTag, & $includeTopTag, & $val, & $lowerCaseTags, & $levels, & $prevTag, & $multipleData, & $xml) { // don't include top tag if ($topTag && !$includeTopTag && $val["tag"] == $topTag) { return false; } if ($multipleData[$currTag]["multiple"]) { $tkeys = array_reverse(array_keys($multipleData)); foreach ($tkeys as $tkey) { if ($multipleData[$tkey]["multiple"] && !$multipleData[$tkey]["popped"]) { array_pop($levels); $multipleData[$tkey]["popped"] = true; break; } else if (!$multipleData[$tkey]["multiple"]) { break; } } } $prevTag = array_pop($levels); if (strpos($prevTag, "arr#")) { $prevTag = array_pop($levels); } return true; } // vim:ts=4:sw=4:et:enc=utf8: