Quantcast
Channel: Squeezebox : Community : Forums - 3rd Party Software
Viewing all articles
Browse latest Browse all 2059

[Announce] GRUVI - .generate.random.URLs_for.viewing.images.

$
0
0
Happy New Year 2018 and happy to announce a PHP-script I've been working on during Christmas, GRUVI (.generate.random.URLs_for.viewing.images.)!

The script randomly picks a predetermined number of pictures from a chosen web-server location, resizes them to fit the SB Touch and Radio displays, with or without captions. It renews the selection after som predefined time interval, and reshuffles the order every time the script is called from the players.

Notwithstanding som other great SB image viewer utilities out there, like Picture Gallery, Image Browser, iPeng etc., the script solves some yet unmet needs I've had for a long time, like random selections of images, functioning as an automatic screen saver and photo frame, off-loading my main media server, NAS and players(runs well in the background on a small RPi3), captioning and configurability, working with the built-in Image Viewer app on the players with total independence from the rest of the LMS system and its plugins and such.

Prerequisites:
-Some web server:
-with access to the photos you want to show
-with PHP installed
-with ImageMagick installed
-which probably has to run on Linux because of my shell calls
-Some patience and and time to tinker a little bit... ;-)

Installation:
-Copy the contents of the zip-file to the hosted folders on the web server
-Set your wanted global parameters in the main gruvi.php script file
-Set the required execution, file and application path accesses
-Set up your players like this and choose to run the Image Viewer app as a screen saver if you like:
Name:  Plug.gif
Views: 49
Size:  110.7 KB

Then start GRUVI'n!: :cool:
Name:  Play.gif
Views: 47
Size:  130.3 KB


Enjoy(hopefully)! :)

Vegz78

Code:

<?php

/*  GRUVI
    A random URL image file list generator for the Image Viewer app on the Squeezebox Touch and Radio, with:
        -Random selection of files and random shuffle of the lists between every call to this PHP-file
        -Locally cached copies of the images with reduced sizes to reduce load on LMS, players and network
        -Image files hosted on a web server of your chosing and fittet to the players' screens
        -Choice between images with or without capitons
        -Choice of number of cached files and expiry time for reload of new batches of random images

    Totally independent from the LMS server etc. No more versions or plugins conflicts, no more spinning
    disks on the NAS, heavy machinery required to rund 24/7 etc... ;-)

    This was my very first complete PHP-script ever, so sorry for the bad and ugly coding, without
    any error or exception handling. It barely does what it's supposed to do, but gets the jobb done
    for the time being, if you can get it to work. I'm on the forum from time to time, but don't have
    the resources to provide any reliable support.

    Feel free to copy and improve as you feel fit! I certainly did a lot of copying from a lot of
    amazing resources and competent and sharing people on the web. Som much research and copying
    that I don't remember the people I should be thanking.


    !! Anyways, a special thanks to the primus motors on the Squeezebox community forum who keeps both
    the best audio community and the best music server/player ecosystem ever still alive and kicking!!

    Nice also if any improvements to this script were posted back on the the forum!


    by vegz78... */


//Global variables
$LIST_SIZE = 60; //Number of random images to be processed and  included in the image URL list
$FILE_AGE_MAX = 2500; //Time in minutes before a random image file pointed to in the list is changed
$CAPTIONS = 1; //0 = Captions OFF, 1 = Captions ON
$IMG_SOURCE = '/mnt/Some_path_to_images'; //Path to original large image files

$URL_ROOT = 'http://192.168.x.x/'; //Host server address
$IMAGE_ROOT = 'sbtouch_img/'; //Storage folder for images in the www-directory


//Identify player type and set corresponding identifier variable
$isTouch = false;
$FILE_NAME = 'sbradio.lst';
$FILE_SUFFIX = '.jpg';
if(isset($_SERVER['HTTP_USER_AGENT'])) {
        $playerType = $_SERVER['HTTP_USER_AGENT']; //Identifier for the different player types
        if (strpos($playerType, 'fab4') !== false) {
                $isTouch = true; //TRUE if Squeezebox Touch, FALSE otherwise
                $FILE_NAME = 'sbtouch.lst'; //URL list file name for the Touch
                $FILE_SUFFIX = '_fab4.jpg'; //Image file suffix for the Touch
        }
}


//Check if the local optimized copies of files exist or must be created OR if they are too old and must be replaced with new images
$fileArray = array();  //Array of files which should be updated or created
for ($i = 1; $i <= $LIST_SIZE; $i++) {
        if (!file_exists("{$IMAGE_ROOT}{$i}{$FILE_SUFFIX}") || (time() - filemtime("{$IMAGE_ROOT}{$i}{$FILE_SUFFIX}"))/60 > $FILE_AGE_MAX) {
                $fileArray[] = $i;
        }
}


//Number of image and file operations until the images and the image URL list is ready
$fileArraySize = count($fileArray);
//echo "Array size = " . count($fileArray) . "!\n";


//Start image and file operations if any images are missing or old
if ($fileArraySize >=1) {

        //Traverse directory and subdirectories recursively and populate array with filenames
        $fileNameArray = array();
        $Directory = new RecursiveDirectoryIterator($IMG_SOURCE);
        $Iterator = new RecursiveIteratorIterator($Directory);
        $Regex = new RegexIterator($Iterator, '/^.+(.jpe?g)$/i', RecursiveRegexIterator::GET_MATCH);

        foreach($Regex as $name => $Regex) {
                $fileNameArray[] = $name;
//                echo "$name\n";
        }


        //Shuffle the array, and extract and resize the needed number of random new image files
//        echo count($fileNameArray) . "\n";
        shuffle($fileNameArray);
        for ($i = 0; $i <= $fileArraySize-1; $i++) {

                //Captions ON
                if ($CAPTIONS == 1) {
                        $exploded = explode("/", $fileNameArray[$i]);
                        $event = $exploded[count($exploded)-2]; //Makes parent directory available as string for caption text
                        $fileName = $exploded[count($exploded)-1];  //Makes file name available as string for caption text
                        if($isTouch) {
                                exec('/usr/bin/convert \\( ' . escapeshellarg($fileNameArray[$i]) . ' -auto-orient -background none -resize 480x480 -gravity center -extent 480x272 \\) \\( -background \'#0005\' -fill white -gravity west -size 480x25 -pointsize 11 caption:' . escapeshellarg($fileName. "\n") . escapeshellarg($event) . ' \\) -gravity south -composite ' . escapeshellarg($IMAGE_ROOT) . escapeshellarg($fileArray[$i]) . escapeshellarg($FILE_SUFFIX));
                        }
                        else {
                                exec('/usr/bin/convert \\( ' . escapeshellarg($fileNameArray[$i]) . ' -auto-orient -background none -resize 320x320 -gravity center -extent 320x240 \\) \\( -background \'#0005\' -fill white -gravity west -size 320x22 -pointsize 10 caption:' . escapeshellarg($fileName. "\n") . escapeshellarg($event) . ' \\) -gravity south -composite ' . escapeshellarg($IMAGE_ROOT) . escapeshellarg($fileArray[$i]) . escapeshellarg($FILE_SUFFIX));
                        }
                }

                //Captions OFF
                else {
                        if($isTouch) {
                                exec('/usr/bin/convert ' . escapeshellarg($fileNameArray[$i]) . ' -auto-orient -background none -resize 480x480 -gravity center -extent 480x272 ' . escapeshellarg($IMAGE_ROOT) . escapeshellarg($fileArray[$i]) . escapeshellarg($FILE_SUFFIX));
                        }
                        else {
                                exec('/usr/bin/convert ' . escapeshellarg($fileNameArray[$i]) . ' -auto-orient -background none -resize 320x320 -gravity center -extent 320x240 ' . escapeshellarg($IMAGE_ROOT) . escapeshellarg($fileArray[$i]) . escapeshellarg($FILE_SUFFIX));
                        }
                }
        }
}


//Update the file for the players with the URL list for the Image Viewer applet to read
$indexList = array();
for ($i = 1; $i <=  $LIST_SIZE; $i++) {
        $indexList[] = $i;
}
shuffle($indexList); //For random image viewer starts

$fp = fopen($FILE_NAME, 'w');
for ($i = 0; $i <=  $LIST_SIZE-1; $i++) {
        fwrite($fp, $URL_ROOT . $IMAGE_ROOT . $indexList[$i] . $FILE_SUFFIX ."\n");
}
fclose($fp);


//Send image URL file to Image Viewer
readfile($FILE_NAME);


?>

Attached Images
   

Viewing all articles
Browse latest Browse all 2059

Latest Images

Trending Articles



Latest Images