functions.php
author Dan
Sun, 23 Mar 2008 22:03:57 -0400
changeset 4 cde92f6ec29f
parent 2 860ba7141641
child 5 9b96265b5918
permissions -rw-r--r--
Should be completely iPhone/iPod Touch-friendly now :)

<?php

/**
 * Utility functions
 * 
 * Web control interface script for Amarok
 * Written by Dan Fuhry - 2008
 *
 * This script is in the public domain. Use it for good, not evil.
 */

/**
 * Utility/reporting functions
 */
 
/**
 * Report a fatal error and exit
 * @param string Error message
 */

function burnout($msg)
{
  echo "\x1B[31;1m[WebControl] fatal: \x1B[37;1m";
  echo "$msg\x1B[0m\n";
  exit(1);
}

/**
 * Print a stylized status message, compatible with Linux consoles
 * @param string Status message
 */

function status($msg)
{
  echo "\x1B[32;1m[WebControl] \x1B[32;0m$msg\x1B[0m\n";
}

/**
 * Performs an action with DCOP.
 * @param string DCOP component, e.g. player, playlist, playlistbrowser, ...
 * @param string Action to perform, e.g. stop, play, ...
 * @param string additional parameters... (NOT IMPLEMENTED)
 * @return mixed output of DCOP command
 */

function dcop_action($component, $action)
{
  $tmpfile = tempnam('amaweb', '');
  if ( !$tmpfile )
    burnout('tempnam() failed us');
  system("dcop amarok $component $action > $tmpfile");
  $output = @file_get_contents($tmpfile);
  @unlink($tmpfile);
  $output = trim($output);
  
  // detect type of output
  if ( $output == 'true' )
    return true;
  else if ( $output == 'false' )
    return false;
  else if ( preg_match('/^-?[0-9]+/', $output) )
    return intval($output);
  else
    return $output;
}

/**
 * Rebuilds the copy of the playlist in RAM
 */

$playlist_last_md5 = '';

function rebuild_playlist()
{
  // import what we need
  global $homedir, $playlist;
  // sync and load the playlist file
  $playlist_file = dcop_action('playlist', 'saveCurrentPlaylist');
  // check MD5 - if it's not changed, exit to save CPU cycles
  global $playlist_last_md5;
  if ( $playlist_last_md5 == @md5_file($playlist_file) )
  {
    return true;
  }
  $playlist_last_md5 = @md5_file($playlist_file);
  // start XML parser
  try
  {
    $xml = simplexml_load_file($playlist_file);
  }
  catch ( Exception $e )
  {
    burnout("Caught exception trying to load playlist file:\n$e");
  }
  $attribs = $xml->attributes();
  if ( @$attribs['product'] != 'Amarok' )
  {
    burnout('Playlist is not in Amarok format');
  }
  $playlist = array();
  foreach ( $xml->children() as $child )
  {
    $attribs = $child->attributes();
    $item = array(
        'uri'    => $attribs['uri'],
        'title'  => strval($child->Title),
        'artist' => strval($child->Artist),
        'album'  => strval($child->Album),
        'length' => seconds_to_str(intval($child->Length)),
        'length_int' => intval($child->Length)
      );
    $playlist[] = $item;
  }
}

/**
 * Converts a number to minute:second format
 * @param int Seconds
 * @return string format: mm:ss
 */

function seconds_to_str($secs)
{
  $seconds = $secs % 60;
  $minutes = ( $secs - $seconds ) / 60;
  $seconds = strval($seconds);
  $minutes = strval($minutes);
  if ( strlen($seconds) < 2 )
    $seconds = "0$seconds";
  if ( strlen($minutes) < 2 )
    $minutes = "0$minutes";
  return "$minutes:$seconds";
}

/**
 * Loads the specified theme into Smarty
 * @param string Theme ID
 * @return object Smarty object
 */

function load_theme($theme_id)
{
  global $httpd;
  static $smarty = array();
  if ( !isset($smarty[$theme_id]) )
  {
    $smarty[$theme_id] = new Smarty();
    $smarty[$theme_id]->template_dir = "./themes/$theme_id";
    $smarty[$theme_id]->compile_dir = "./themes/$theme_id/compiled";
    $smarty[$theme_id]->cache_dir = "./cache";
    $smarty[$theme_id]->config_dir = "./config";
    $httpd->add_handler("themes/$theme_id", 'dir', "./themes/$theme_id");
  }
  return $smarty[$theme_id];
}