diff options
-rw-r--r-- | utils/modules/discography.php | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/utils/modules/discography.php b/utils/modules/discography.php new file mode 100644 index 0000000..9913113 --- /dev/null +++ b/utils/modules/discography.php @@ -0,0 +1,249 @@ +<?php +/* -*- Mode: php; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + +include_once($UTIL_DIR . "/convert.php"); +include_once($UTIL_DIR . "/markdown.php"); + +function time2str($t) +{ + $min = sprintf("%d", floor($t / 60)); + $sec = $t % 60; + return sprintf("%d:%02d", $min ,$sec); +} + +class Track { + public $title; + public $number; + public $playtime; + public $previewurl; + public $lyrics; + + public function write($fp) + { + fwrite($fp, " <track title=\"" . + htmlspecialchars($this->title, ENT_QUOTES, "UTF-8") . "\"\n"); + fwrite($fp, " number=\"" . $this->number . "\"\n"); + fwrite($fp, " playtime=\"" . $this->playtime . "\"\n"); + fwrite($fp, " previewurl=\"" . $this->previewurl . "\">\n"); + fwrite($fp, " <lyrics>".htmlspecialchars($this->lyrics, ENT_QUOTES, "UTF-8")."</lyrics>\n"); + fwrite($fp, " </track>\n"); + } + + public function show() + { + $str = ""; + $str .= " <div class=\"track\">\n"; + + $str .= " <div class=\"preview\">\n"; + if($this->previewurl) { + $str .= " <object type=\"application/x-shockwave-flash\" data=\"player_mp3_maxi.swf\" width=\"25\" height=\"12\">\n"; + $str .= " <param name=\"movie\" value=\"player_mp3_maxi.swf\"/>\n"; + $str .= " <param name=\"FlashVars\" value=\"mp3=".$this->previewurl."&showslider=0&width=25&height=12&skin=gfx/chicken.jpg\"/>\n"; + $str .= " </object>\n"; + } else { + } + $str .= " </div>\n"; + + $str .= " <div class=\"number\">".$this->number.". </div>\n"; + $str .= " <div class=\"title\">".$this->title."</div>\n"; + $str .= " <div class=\"playtime\">".time2str($this->playtime)."</div>\n"; + if($this->lyrics) { + $str .= " <a href=\"?page=lyrics&name=morsetsanguis\">Lyrics</a>\n"; + } + $str .= " </div>\n"; + + return $str; + } + + public function Track($title, $number, $playtime, $previewurl, $lyrics) + { + $this->title = $title; + $this->number = $number; + $this->playtime = $playtime; + $this->previewurl = $previewurl; + $this->lyrics = $lyrics; + } +} + +class Disc { + public $title; + public $releasetime; + public $description; + public $cover; + public $releaser; + public $tracks = array(); + + public function write($fp) + { + fwrite($fp, " <disc title=\"" . + htmlspecialchars($this->title, ENT_QUOTES, "UTF-8") . "\"\n"); + fwrite($fp, " releasetime=\"" . $this->releasetime . "\"\n"); + fwrite($fp, " description=\"" . + htmlspecialchars($this->description, ENT_QUOTES, "UTF-8") . "\"\n"); + fwrite($fp, " cover=\"" . $this->cover . "\"\n"); + fwrite($fp, " releaser=\"" . $this->releaser . "\">\n"); + fwrite($fp, " <tracks>\n"); + if($this->tracks) { + foreach($this->tracks as $track) { + $track->write($fp); + } + } + fwrite($fp, " </tracks>\n"); + fwrite($fp, " </disc>\n"); + } + + public function show() + { + $str = ""; + + $str .= " <div class=\"disc\">\n"; + $str .= " <div class=\"cover\">\n"; + $str .= " <a href=\"".$this->cover."\">\n"; + $str .= " <img alt=\"".$this->title." cover\"\n"; + $str .= " src=\"?mode=imagecache&uri=" . $this->cover . "&mw=200&mh=200\"/>\n"; + $str .= " </a>\n"; + $str .= " </div>\n"; + $str .= " <div class=\"record_title\">".$this->title." (".date("Y", $this->releasetime).")</div>\n"; + $str .= " <div class=\"label\">"; + if($this->releasetime > time()) $str .= "To be"; + else $str .= "Was"; + $str .= " released on ".$this->releaser.", ".date("F jS Y", $this->releasetime)."</div>\n"; + $str .= " <div class=\"traclist_header\">Tracks:</div>\n"; + $str .= " <div class=\"tracklist\">\n"; + $total = 0; + if($this->tracks) { + foreach($this->tracks as $track) { + $str .= $track->show(); + $total += $track->playtime; + } + } + $str .= " <div class=\"total_playtime\">Total playtime: ".time2str($total)."</div>\n"; + $str .= " </div>\n"; + $str .= " <div class=\"description\">".$this->description."</div>\n"; + $str .= " </div>\n"; + + return $str; + } + + public function addTrack($track) + { + $key = $track->number; + $this->tracks[$key] = $track; + } + + public function Disc($title, $releasetime, $description, $cover, $releaser) + { + $this->title = $title; + $this->releasetime = $releasetime; + $this->description = $description; + $this->cover = $cover; + $this->releaser = $releaser; + } +} + +class Discography { + + private $file; + private $discs = array(); + + // Admin config + public $admin_title = "Discography"; + public $admin_submodules = array("Add Disc" => "add", + "Edit Disc" => "edit", + "Delete Disc" => "delete"); + public function admin($sub, $action, $vars) + { + switch($sub) { + case "add": + break; + case "edit": + break; + case "delete": + break; + } + } + + public function run($params) + { + $str = "<div class=\"discography\">\n"; + + if($this->discs) { + foreach($this->discs as $disc) { + $str .= $disc->show(); + } + } + + $str .= "</div>\n"; + + return $str; + } + + public function add($disc) { + $key = $disc->releasetime; + $this->discs[$key] = $disc; + } + + public function write() + { + $fp = fopen($this->file, "w"); + fwrite($fp, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + + fwrite($fp, "<discography>\n"); + foreach($this->discs as $disc) { + $disc->write($fp); + } + fwrite($fp, "</discography>\n"); + + fclose($fp); + } + + private function read() + { + $dom = new DomDocument; + $dom->preserveWhiteSpace = FALSE; + $dom->load($this->file); + $discs = $dom->getElementsByTagName('disc'); + + foreach($discs as $d) { + $disc = new Disc($d->getAttribute('title'), + $d->getAttribute('releasetime'), + $d->getAttribute('description'), + $d->getAttribute('cover'), + $d->getAttribute('releaser')); + + $tracks = $d->getElementsByTagName('track'); + foreach($tracks as $t) { + $lyrics = ""; + $ls = $t->getElementsByTagName('lyrics'); + foreach($ls as $l) { + $lyrics = $l->textContent; + } + + $track = new Track($t->getAttribute('title'), + $t->getAttribute('number'), + $t->getAttribute('playtime'), + $t->getAttribute('previewurl'), + $lyrics); + + $disc->addTrack($track); + } + + $this->add($disc); + } + } + + public function Discography($file) + { + $this->file = $file; + if(file_exists($file)) $this->read(); + } + +} + +function discography_init() +{ + global $DATA_DIR; + return new Discography($DATA_DIR . "/discography.xml"); +} + +?> |