home *** CD-ROM | disk | FTP | other *** search
- /* HippoPlayer ARexx script for Filer, use as a button. (v 1.0) *
- * ================================================================ *
- * *
- * Adds selected files into HiP's playlist and randomplays them. *
- * If HiP isn't already running it is run first. *
- * *
- * If directories were selected this script recurses through all *
- * subdirectories, so it is possible to add all your modules to *
- * HiP's playinglist just by selecting your module directory! *
- * *
- * If nothing was selected (user just pushed the button) then *
- * we tell HiP to Random Play with it's current playlist unless *
- * there's only one module in it, in which case we eject it. *
- * But if the playlist is empty already we advice the user to *
- * select a module before fooling around... *
- * *
- *------------------------------------------------------------------*
- * NOTE! This script checks if a file has a suffix or prefix that *
- * indicates something else than a module, for example "foo.info", *
- * "program.readme" or ".backdrop". Unfortunately this also makes *
- * the script noticeably slower, so this feature is disabled by *
- * default. If you want to use it, see CONFIGURATION below. *
- *------------------------------------------------------------------*
- * *
- ***** Requirements: rexxsupport.library, HiP, and Filer... ******
- * Remember to replace the HippoPath variable below with the *
- * correct path of HiP in your system! You might also want to set *
- * HiP's screen to FilerScreen in the HiP-prefs, though this script *
- * opens HiP on FilerScreen automatically anyway. *
- * *
- * Sorry for the messyness, especially in dirpart, but it works! :) *
- * If it fails for you, contact me: *
- * Janne Simonen - jsimonen@cc.joensuu.fi */
-
-
- /* -------------------------------------------------------------------- */
- /**** CONFIGURATION: change the following lines to suit your system! ****/
- /* -------------------------------------------------------------------- */
-
- HippoPath = 'dh2:HippoPlayer/Hip' /* Where to find HiP */
-
- /* This flag controls the printing of extra information on FilerScreen. */
- /* 0 = OFF, 1 = ON. If you don't have composers' names in filenotes and */
- /* don't want to know how big the mod is, switch this off. */
-
- Verbose = 1 /* Default: speak up! */
-
- /* This flag turns filename checking on/off, 0 = OFF, 1 = ON */
-
- CheckFileNames = 0 /* Default: don't check filenames for ".info"s etc. */
-
- /* These suffixes/prefixes indicate that a file really is NOT a module! */
- /* You can add your own, just remember to change crapnumbers accordingly*/
- /* The more you add, the slower the script gets, so... */
-
- IF ~(CheckFileNames = 0) THEN DO /* if checking is not disabled */
-
- crapsufnumber = 3 /* number of crap suffixes */
- crapsuffix.1 = '.info' /* disregard these suffixes */
- crapsuffix.2 = '.readme'
- crapsuffix.3 = '.doc'
-
- crapprefnumber = 1 /* number of crap prefixes */
- crapprefix.1 = '.' /* disregard these prefixes */
- END
-
- ELSE DO /* if checking is disabled then accept ALL files */
- crap = 0 /* regardless of filename. Don't change this! */
- END
-
- /* Random play if nothing selected? If not then show modinfo */
-
- RandPlay = 0
-
-
- /* -------------------------------------------------------------------- */
- /* ******************* MAIN PROGRAM STARTS HERE *********************** */
- /* -------------------------------------------------------------------- */
-
- OPTIONS RESULTS
-
- SIGNAL ON IOERR /* Trap for IO-Errors (filehandling etc.) */
- SIGNAL ON BREAK_C /* Trap for control-c break (doesn't work?) */
-
- /********** Make sure HiP is running (with an open ARexx port) **********/
-
- IF ~SHOW("Ports","HIPPOPLAYER") THEN DO
- ADDRESS 'FilerRexx'
- 'STATUS Loading HippoPlayer...'
- ADDRESS 'COMMAND' 'run >NIL: '||HippoPath
-
- /* give HiP exactly 5 seconds time to emerge */
- ADDRESS 'FilerRexx'
- 'STATUS Waiting for HippoPlayer to open its ARexx port...'
- TIME('R')
- DO WHILE ((TIME('E')<5) & (~SHOW("Ports","HIPPOPLAYER")))
- END
-
- IF ~SHOW("Ports","HIPPOPLAYER") THEN DO
- ADDRESS 'FilerRexx'
- "STATUS HippoPlayer didn't show up!"
- EXIT
- END
-
- ADDRESS 'HIPPOPLAYER'
- 'PUBSCREEN FilerScreen' /* open HiP on FilerScreen */
- 'ZIP 0' /* and zip the window. */
- END
-
- /****** Open a lib to get SHOWDIR() to be used with directories ********/
-
- CALL ADDLIB('rexxsupport.library', 0, -30, 0)
-
- /********************* Give HiP the modules to play *********************/
-
- ADDRESS 'FilerRexx'
-
- /* Get source directory name, append "/" if it is not a device name */
- GETSOURCEPATH
- srcdir = RESULT
- IF RIGHT( srcdir, 1 ) ~= ":" THEN srcdir = srcdir || "/"
-
- GETNUMENTRIES /* get number of sourcedir entries */
- numentries = RESULT
-
- DO j = 1 TO numentries /* loop through all entries */
- GETNAME j /* get jth entry */
- entry = RESULT
-
- type = LEFT( entry, 1 ) /* parse filetype (f, d, F, D) */
- name = SUBSTR( entry, 2 ) /* parse filename */
-
- SELECT /* it's either a file OR a directory*/
-
- /* If entry is a selected FILE we add it to playlist */
-
- WHEN type = 'f' THEN DO
-
- IF CheckFileNames = 1 THEN DO /* if checking not disabled */
- CALL FileCheck /* check if it's a module */
- END
-
- IF crap = 0 THEN DO /* if it is, then lets add... */
-
- IF checkflag ~= 'TRUE' THEN DO /* if it's the first file to */
- ADDRESS 'HIPPOPLAYER' /* add we clear the playlist */
- 'CLEAR'
- checkflag = 'TRUE'
- END
-
- ADDRESS 'FilerRexx'
- /* just finetuning the message..*/
- Message = 'HiP: Adding module "'||name||'" into playlist...'
- IF LENGTH( Message ) < 67 THEN DO
- Message = OVERLAY( 'Please wait!', Message, 68)
- END
-
- 'STATUS '||Message /* tell user what's happening */
- ADDRESS 'HIPPOPLAYER'
- 'ADD '||srcdir||name /* add the file into playlist */
-
- END /* IF - FileCheck */
-
- ADDRESS 'FilerRexx'
- TOGGLEENTRY j /* de-select */
-
- END /* WHEN */
-
- /* If entry is a DIRECTORY we scan it through and see what's in */
-
- WHEN type = 'd' THEN DO
-
- Dirname = srcdir||name
- /* get a string containing the filenames separated with a '0a'x */
- Filelist = SHOWDIR( Dirname, 'FILE', '0a'x )
- /* if string not empty we append a '0a'x (to make things work...) */
- IF Filelist ~= '' THEN Filelist = Filelist || '0a'x
-
- CALL FileNameParser /* add all the files in the dir to playlist */
-
- /* See if there are any SUBDIRECTORIES and scan them for files */
-
- i = 1 /* recursion level */
- CALL DirRecurser /* let's delve through the subdirectories */
- ADDRESS 'FilerRexx'
- TOGGLEENTRY j
-
- END /* WHEN - DIRECTORY */
-
- OTHERWISE /* ignore entries not selected */
-
- END /* SELECT */
-
- END /* DO j */
-
- /* -------------------------------------------------------------------- */
- /* Ok, we've scanned all selected files/dirs and added the files to */
- /* playlist, now it's time to do some bonus stuff... */
- /* -------------------------------------------------------------------- */
-
- /* If no file (or module! FileNameCheck...) was selected then: */
-
- IF checkflag ~= "TRUE" THEN DO
-
- ADDRESS 'HIPPOPLAYER'
- 'GET NFIL' /* get number of files in playlist */
- numberoffiles = RESULT
-
- /* if only non-module files were selected then this helps us complain */
- IF NameCheckFlag = 1 THEN numberoffiles = 0
-
- IF numberoffiles = 1 THEN DO /* if it's one we eject the mod */
- 'CLEAR'
- 'EJECT'
- ADDRESS 'FilerRexx'
- 'STATUS HiP: Ejected the only module in the playlist.'
- EXIT
- END
-
- IF numberoffiles = 0 THEN DO /* Nothing playing? Let's complain */
- ADDRESS 'FilerRexx'
- 'STATUS HiP: It might help if you selected a module to play! :)'
- EXIT
- END
-
- IF RandPlay = 0 THEN
- CALL DisplayStuff /* Show info if multiple entries in playlist*/
-
- END
-
- ADDRESS 'FilerRexx'
- 'STATUS HiP: Loading module, please wait...'
-
- ADDRESS 'HIPPOPLAYER'
-
- 'GET NFIL' /* get number of files in playlist */
- /* because RANDPLAY doesn't work */
- IF RESULT = 1 THEN DO /* if there's only one file... */
- 'CHOOSE 1' /* ...at least not with HiP207. */
- 'PLAY'
- END /* single file: let's play it. */
- ELSE 'RANDPLAY' /* multiple files: Random Play. */
-
- 'GET PLAY' /* check if anything is playing */
- playornot = RESULT
- IF playornot = 0 THEN DO /* if not -> we're very sorry... */
- ADDRESS 'FilerRexx' /* ...probably out of memory */
- "STATUS HiP: Sorry, can't play this one!"
- EXIT
- END
-
- DisplayStuff:
- /* Now a mod is playing, so we just display some info on FilerScreen */
-
- 'GET NAME' /* get mod name so that we can show */
- modname = RESULT /* it on Filer's statusbar */
-
- IF modname = '' THEN DO /* if modname doesn't exist */
- 'GET CNAM' /* we simply use filename */
- modname = RESULT
- /* strip off any prefix (like mod.) */
- /* a little fix for a bug in HiP207: CNAM gives path too! K-P? :) */
- DivPos = max(lastpos(':', modname),lastpos('/', modname)) +1
- modname = substr(modname, DivPos)
- modname = substr(modname, lastpos('.', modname, 6) +1)
-
- END /* IF */
-
- modname = SPACE( modname, 1) /* remove extra spaces from name */
-
- IF Verbose = 0 THEN DO /* if Verbose is switched off we */
- ADDRESS 'FilerRexx' /* only tell the module's name */
- 'STATUS HiP: Playing "'||modname'"'
- EXIT /* and exit.*/
- END
-
- 'GET COMM' /* get filenote/comment because */
- comment = RESULT /* I have the composer's name in it */
-
- IF comment = '' THEN DO /* no comment? Then give type&size */
- 'GET TYPE' /* instead to have some chrome :) */
- modtype = RESULT
- 'GET SIZE'
- modsize = RESULT
-
- comment = 'HiP: Playing '||modtype||' module "'||modname'"'
-
- /* check that announcement fits on screen */
- IF LENGTH( comment ) < 61 THEN DO
- comment = comment || ', size '||modsize||' bytes'
- END
- /* announce what HiP is playing */
- ADDRESS 'FilerRexx' /* with modtype and modsize */
- 'STATUS ' || comment
-
- END /* IF */
-
- ELSE DO
- comment = 'by ' || comment /* announce with composer's name */
- ADDRESS 'FilerRexx'
- 'STATUS HiP: Playing "'||modname||'" '||comment
- END /* ELSE */
-
- EXIT /* voilá! */
-
-
- /* -------------------------------------------------------------------- */
- /*************** END OF MAIN PROGRAM, SUBROUTINES FOLLOW ****************/
- /* -------------------------------------------------------------------- */
-
-
- FileNameParser:
- /* Parses filenames from the string 'Filelist' and adds them to playlist*/
- /* Gets the complete path from the variable 'Dirname'. */
- /* Filelist looks like "file1'0a'xfile2'0a'xfile3'0a'xfile4'0a'x". */
-
- DO WHILE POS( '0a'x, Filelist ) > 0 /* while we still have files */
-
- Slashpos = POS( '0a'x, Filelist ) /* find the next separator */
- name = LEFT( Filelist, Slashpos -1) /* extract filename */
-
- IF CheckFileNames = 1 THEN DO
- CALL FileCheck /* see if it is a module */
- END
-
- IF crap = 0 THEN DO /* if yes, add it to playlist: */
-
- IF checkflag ~= 'TRUE' THEN DO /* if this is the first file */
- ADDRESS 'HIPPOPLAYER' /* to add to playlist then */
- 'CLEAR' /* clear the list first */
- checkflag = 'TRUE'
- END
-
- ADDRESS 'FilerRexx'
- /* just finetuning the message..*/
- Message = 'HiP: Adding module "'||name||'" into playlist...'
- IF LENGTH( Message ) < 67 THEN DO
- Message = OVERLAY( 'Please wait!', Message, 68)
- END
-
- 'STATUS '||Message
- ADDRESS 'HIPPOPLAYER'
- 'ADD '||Dirname||'/'||name /* add the mod to playlist */
-
- END /* IF - FileCheck */
- /* Strip out added filename from string */
- Filelist = SUBSTR( Filelist, Slashpos +1)
-
- END /* WHILE */
-
- RETURN /* END OF SUBROUTINE ----------------------------------------*/
-
-
- DirRecurser:
- /* Recurses through all the subdirectories of a directory, then */
- /* calls FileNameParser to add the files in them into playlist. */
-
- /* Get list of subdirectories */
- Dirlist.i = SHOWDIR( Dirname, 'DIR', '0a'x)
- IF Dirlist.i ~= '' THEN Dirlist.i = Dirlist.i || '0a'x
-
- /* Go through the subdirs one by one, adding any files to playlist */
- DO WHILE POS( '0a'x, Dirlist.i ) > 0
-
- Slashpos = POS( '0a'x, Dirlist.i ) /* find the divider */
- dname = LEFT( Dirlist.i, Slashpos -1) /* get subdirname */
- Dirlist.i = SUBSTR( Dirlist.i, Slashpos +1) /* strip it off */
-
- Dirnamebak.i = Dirname /* take backup of Dirname */
- Dirname = Dirname || '/' ||dname /* make subdirectorypath */
-
- Filelist = SHOWDIR( Dirname, 'FILE', '0a'x) /* make filelist */
- IF Filelist ~= '' THEN Filelist = Filelist || '0a'x
-
- CALL FileNameParser /* add any files in subdir to playlist */
-
- i = i + 1 /* increase recursion level */
-
- CALL DirRecurser /* call subroutine itself recursively */
-
- i = i - 1 /* decrease recursion level */
-
- Dirname = Dirnamebak.i /* get back saved Dirname */
- END
-
- RETURN /* END OF SUBROUTINE -----------------------------------*/
-
-
- FileCheck:
- /* Checks if file clearly is not a module (.info .readme...) */
- /* Gets the filename from a global variable called "name" */
- /* If file is not a mod, returns crap = 1, else returns crap=0. */
- /* Bad suf(/pre)fixes are stored in crapsuf(/pre)fix variable. */
-
- a = 1
-
- DO WHILE a < (crapsufnumber+1)
- /* Check suffix */
- IF RIGHT( name, LENGTH( crapsuffix.a ) ) = crapsuffix.a THEN DO
- crap = 1 /* file is not a module! */
- NameCheckFlag = 1 /* a non-module file was found */
- RETURN
- END
- a = a + 1
- END
-
- a = 1
-
- DO WHILE a < (crapprefnumber+1)
- /* Check prefix */
- IF LEFT( name, LENGTH( crapprefix.a ) ) = crapprefix.a THEN DO
- crap = 1 /* file is not a module! */
- NameCheckFlag = 1 /* a non-mod was selected */
- RETURN
- END
- a = a + 1
- END
-
- crap = 0 /* file passed the check - it's no crap! :) */
-
- RETURN /* END OF SUBROUTINE -------------------------------*/
-
-
- IOERR: /* I/O-Error trap, not tested, might even work... */
-
- ADDRESS 'FilerRexx'
- 'STATUS HiP: Sorry, an I/O-error has occurred on line '||SIGL||'!'
- 'ALERTBOX I/O error - something is wrong!|File "'||name||'" was being processed.'
- EXIT
-
-
- BREAK_C: /* Break trap, never had this work... */
-
- ADDRESS 'FilerRexx'
- "STATUS HiP: Break request detected - I won't play anything!"
- 'NONE'
- EXIT
-