RexxGauge
BGNDCOL=CCCCCC;TEXTCOL=00FF00;FONT=5.System VIO;COLOR1=0000FF;COLOR2=000080;COLOR3=CCCCCC;SCRIPT=/* Z! Controller - monitor */%0D%0A%0D%0Asignal on error name TrapErr%0D%0Asignal on syntax name TrapErr%0D%0Asignal on failure name TrapErr%0D%0Asignal on halt name TrapErr%0D%0A%0D%0A/* -- User configuration Section -------------- */%0D%0AScrollFactor %3D @@ScrollFactor@@ %0D%0ATimeWidth %3D 35%0D%0AZPath %3D @@ZPath@@ %0D%0A/* -- End User Configuration ---------------- */%0D%0A%0D%0APipeName %3D '\pipe\zmp3'%0D%0Anl %3D '0D0A'x%0D%0A%0D%0Agauge.1 %3D 0%0D%0Agauge.background %3D '000000'%0D%0A%0D%0Astatus %3D stream(PipeName, 'C', 'OPEN')%0D%0Aif status \%3D 'READY:' then do%0D%0A%09rc %3D stream(PipeName, 'C', 'CLOSE')%0D%0A%09if gauge.user \%3D '' then do%0D%0A%09%09gauge.user %3D ''%0D%0A%09%09exit%0D%0A%09end%0D%0A%09gauge.text %3D '(Z! not running)'%0D%0A%09gauge.tooltip %3D ''%0D%0A%09gauge.user %3D ''%0D%0A%09exit%0D%0Aend%0D%0A%0D%0Arc %3D lineout(PipeName, '*rawinfo')%0D%0Arawinfo %3D linein(PipeName)%0D%0Arc %3D stream(PipeName, 'C', 'CLOSE')%0D%0A%0D%0Aname %3D clean(substr(rawinfo, 1, 256))%0D%0Aif name \%3D '' then do%0D%0A%09songinfo %3D clean(substr(rawinfo, 257, 256))%0D%0A%09forcedttl %3D linein(ZPath||'force-title.txt', 1, 1)%0D%0A%09if forcedttl %3D '' then do%0D%0A%09%09track %3D clean(substr(rawinfo, 513, 128))%0D%0A%09%09artist %3D clean(substr(rawinfo, 641, 128))%0D%0A%09end%3B else do%0D%0A%09%09parse value forcedttl with artist '- ' track%0D%0A%09%09if track %3D '' then do%0D%0A%09%09%09track %3D artist%0D%0A%09%09%09artist %3D clean(substr(rawinfo, 641, 128))%0D%0A%09%09end%0D%0A%09end%0D%0A%0D%0A%09album %3D clean(substr(rawinfo, 769, 128))%0D%0A%09if Left(album, 7) %3D 'http://' then call InetRadio%0D%0A%0D%0A%09playtime %3D clean(substr(rawinfo, 1031, 10))%0D%0A%09timenow %3D clean(substr(rawinfo, 1041, 10))%0D%0A%0D%0A%09gauge.2 %3D TimeWidth%0D%0A%09gauge.3 %3D TimeWidth + 2%0D%0A%0D%0A%09gauge.tooltip %3D %09'track:' track nl||,%0D%0A%09%09%09'artist:' artist nl||,%0D%0A%09%09%09'album:' album nl||,%0D%0A%09%09%09'playing time:' playtime%0D%0A%0D%0A%09if playtime \%3D '' then do%0D%0A%09%09parse var playtime mm ':' ss%0D%0A%09%09splaytime %3D mm*60+ss%0D%0A%09%09if  timenow \%3D '' then do%0D%0A%09%09%09parse var timenow mm ':' ss%0D%0A%09%09%09stimenow %3D mm*60+ss%0D%0A%09%09%09if splaytime \%3D 0 then%0D%0A%09%09%09%09gauge.1 %3D gauge.2 * stimenow %25 splaytime%0D%0A%09%09%09else%0D%0A%09%09%09%09gauge.1 %3D gauge.2%0D%0A%0D%0A%09%09%09if mm > 59 then do%0D%0A%09%09%09%09hh %3D mm %25 60%0D%0A%09%09%09%09hh %3D beautify(hh)%0D%0A%09%09%09%09mm %3D beautify(mm - (60 * hh))%0D%0A%09%09%09%09timenow %3D hh || ':' || mm%0D%0A%09%09%09end%3B else do%0D%0A%09%09%09%09mm %3D beautify(mm)%0D%0A%09%09%09%09ss %3D beautify(ss)%0D%0A%09%09%09%09timenow %3D mm || ':' || ss%0D%0A%09%09%09end%0D%0A%09%09%09gauge.text %3D timenow || ' ' || scroller(track)%0D%0A%09%09end%0D%0A%09end%0D%0Aend%3B else do%0D%0A%09gauge.2 %3D 0%0D%0A%09gauge.3 %3D 0%0D%0A%09gauge.text %3D '(not playing)'%0D%0A%09gauge.user %3D 1%0D%0Aend%0D%0A%0D%0Aexit%0D%0A%0D%0Ascroller: procedure expose ScrollFactor gauge. forcedttl%0D%0A%09ScrollText %3D arg(1)%0D%0A%09ScrollInit %3D gauge.user%0D%0A%09if forcedttl \%3D '' then ScrollFactor %3D ScrollFactor - 2%0D%0A%09if (ScrollInit %3D '') | ,%0D%0A%09   (ScrollInit > (length(ScrollText) - ScrollFactor))%0D%0A%09then%0D%0A%09%09ScrollInit %3D 1%0D%0A%09else%0D%0A%09%09ScrollInit %3D ScrollInit + 1%0D%0A%0D%0A%09gauge.user %3D ScrollInit%0D%0A%09if forcedttl \%3D '' then%0D%0A%09%09return substr(ScrollText, ScrollInit, ScrollFactor) || ' %11'%0D%0A%09else%0D%0A%09%09return substr(ScrollText, ScrollInit, ScrollFactor)%0D%0A%0D%0AInetRadio: procedure expose album ZPath%0D%0A%09Env %3D 'OS2ENVIRONMENT'%0D%0A%09if (Value('ZCRT',,Env) %3D '') |,%0D%0A%09   (Value('ZCRT',,Env) \%3D album)%0D%0A%09then do%0D%0A%09%09Radio %3D Right(album, Length(album) - 7)%0D%0A%09%09CurDir %3D directory()%0D%0A%09%09call directory strip(ZPath, 'T', '\')%0D%0A%09%09'@detach ' || ZPAth || 'gettitle.cmd ' || Radio%0D%0A%09%09call directory CurDir%0D%0A%09%09call Value 'ZCRT', album, Env%0D%0A%09end%0D%0A%09return%0D%0A%0D%0Aclean:%0D%0A%09return strip(arg(1), , '0'x)%0D%0A%0D%0Abeautify: procedure%0D%0A%09aText %3D arg(1)%0D%0A%09aText %3D format(aText, 2, 0)%0D%0A%09aText %3D translate(aText, '0', ' ')%0D%0A%09return aText%0D%0A%0D%0ATrapErr:%0D%0A    nl %3D '0D0A'x%0D%0A    ErrMsg %3D 'An error occurred in the script. See below for details:'%0D%0A    ErrMsg %3D ErrMsg || nl || nl%0D%0A    ErrMsg %3D ErrMsg || 'Error: ' || rc || nl%0D%0A    ErrMsg %3D ErrMsg || 'Description: ' ErrorText(rc) || nl%0D%0A    ErrMsg %3D ErrMsg || 'Condition: ' Condition('C') || nl%0D%0A    ErrMsg %3D ErrMsg || 'Line: ' SIGL || nl%0D%0A    ErrMsg %3D ErrMsg || 'Code: ' SourceLine(SIGL)%0D%0A    ErrMsg %3D ErrMsg || nl || nl%0D%0A    ErrMsg %3D ErrMsg || 'Please send this info to <criguada@libero.it>' || nl%0D%0A    ErrMsg %3D ErrMsg || nl || nl%0D%0A    ErrMsg %3D ErrMsg || 'The program will now simulate another error, '%0D%0A    ErrMsg %3D ErrMsg || 'so that your script will stop running.'%0D%0A    rc %3D RxMessageBox(ErrMsg, 'Script error', 'OK', 'ERROR')%0D%0A    rc %3D 1/0%0D%0A    exit%0D%0A;DBLCLK=/* Double-click action for Z! Controller Monitor */%0D%0Arc %3D RxFuncAdd('SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs')%0D%0Aif rc %3D 0 then call SysLoadFuncs%0D%0A%0D%0A/* -- User configuration Section -------------- */%0D%0AZPath %3D @@ZPath@@ %0D%0A/* -- End User Configuration ---------------- */%0D%0A%0D%0Arc %3D SysOpenObject(ZPath||'z.exe', DEFAULT, TRUE)%0D%0A%0D%0A;TITLE=Z! Monitor;HEIGHT=10;WIDTH=100;REFRESH=1000;