Esempio n. 1
0
/**
 * secondDelimiterNewReleases function.
 *
 * @access public
 * @param mixed $w
 * @param mixed $query
 * @param mixed $settings
 * @param mixed $db
 * @param mixed $update_in_progress
 * @return void
 */
function secondDelimiterNewReleases($w, $query, $settings, $db, $update_in_progress)
{
    $words = explode('▹', $query);
    $kind = $words[0];
    $all_playlists = $settings->all_playlists;
    $is_alfred_playlist_active = $settings->is_alfred_playlist_active;
    $radio_number_tracks = $settings->radio_number_tracks;
    $now_playing_notifications = $settings->now_playing_notifications;
    $max_results = $settings->max_results;
    $alfred_playlist_uri = $settings->alfred_playlist_uri;
    $alfred_playlist_name = $settings->alfred_playlist_name;
    $country_code = $settings->country_code;
    $last_check_update_time = $settings->last_check_update_time;
    $oauth_client_id = $settings->oauth_client_id;
    $oauth_client_secret = $settings->oauth_client_secret;
    $oauth_redirect_uri = $settings->oauth_redirect_uri;
    $oauth_access_token = $settings->oauth_access_token;
    $oauth_expires = $settings->oauth_expires;
    $oauth_refresh_token = $settings->oauth_refresh_token;
    $display_name = $settings->display_name;
    $userid = $settings->userid;
    $echonest_api_key = $settings->echonest_api_key;
    $country = $words[1];
    if ($country == 'Choose a Country') {
        // list taken from http://charts.spotify.com/docs
        $spotify_country_codes = array("ar", "at", "au", "be", "bg", "ch", "cl", "co", "cr", "cz", "de", "dk", "ec", "ee", "es", "fi", "fr", "gb", "gr", "gt", "hk", "hu", "ie", "is", "it", "li", "lt", "lu", "lv", "mx", "my", "nl", "no", "nz", "pe", "pl", "pt", "se", "sg", "sk", "sv", "tr", "tw", "us", "uy");
        foreach ($spotify_country_codes as $spotify_country_code) {
            if (strtoupper($spotify_country_code) != 'US' && strtoupper($spotify_country_code) != 'GB' && strtoupper($spotify_country_code) != strtoupper($country_code)) {
                $w->result(null, '', getCountryName(strtoupper($spotify_country_code)), 'Browse the new album releases in ' . getCountryName(strtoupper($spotify_country_code)), './images/new_releases.png', 'no', null, 'New Releases▹' . strtoupper($spotify_country_code) . '▹');
            }
        }
    } else {
        if (substr_count($query, '@') == 0) {
            //
            // Get New Releases Online
            //
            // call to web api, if it fails,
            // it displays an error in main window
            $albums = getTheNewReleases($w, $country, $max_results);
            $w->result(null, 'help', "Select an album below to browse it", 'singles and compilations are also displayed', './images/info.png', 'no', null, '');
            $noresult = true;
            foreach ($albums as $album) {
                if (checkIfResultAlreadyThere($w->results(), ucfirst($album->name) . ' (' . count($album->tracks->items) . ' tracks)') == false) {
                    $noresult = false;
                    $genre = count($album->genres) > 0 ? ' ● Genre: ' . implode('|', $album->genres) : '';
                    $tracks = $album->tracks;
                    $w->result(null, '', ucfirst($album->name) . ' (' . count($album->tracks->items) . ' tracks)', $album->album_type . " by " . $album->artists[0]->name . ' ● Release date: ' . $album->release_date . $genre, getTrackOrAlbumArtwork($w, $album->uri, false), 'no', null, "New Releases▹" . $country . '▹' . $album->uri . "@" . $album->name);
                }
            }
            if ($noresult) {
                $w->result(null, 'help', "There is no album for this artist", "", './images/warning.png', 'no', null, '');
            }
        } elseif (substr_count($query, '@') == 1) {
            //
            // Search Album Online
            //
            $tmp = $words[2];
            $words = explode('@', $tmp);
            $album_uri = $words[0];
            $album_name = $words[1];
            $album_artwork_path = getTrackOrAlbumArtwork($w, $album_uri, false);
            $w->result(null, serialize(array('', $album_uri, '', '', '', '', '', 'playalbum', '', '', $album_name, '', '', $album_artwork_path, '', '')), "💿 " . escapeQuery($album_name), 'Play album', $album_artwork_path, 'yes', null, '');
            if ($update_in_progress == false) {
                $w->result(null, '', 'Add album ' . escapeQuery($album_name) . ' to...', 'This will add the album to Your Music or a playlist you will choose in next step', './images/add.png', 'no', null, 'Add▹' . $album_uri . '∙' . escapeQuery($album_name) . '▹');
            }
            // call to web api, if it fails,
            // it displays an error in main window
            $tracks = getTheAlbumFullTracks($w, $album_uri);
            $noresult = true;
            foreach ($tracks as $track) {
                // if ($noresult == true) {
                //     $subtitle = "⌥ (play album) ⌘ (play artist) ctrl (lookup online)";
                //     $subtitle = "$subtitle fn (add track to ...) ⇧ (add album to ...)";
                //     $w->result(null, 'help', "Select a track below to play it (or choose alternative described below)", $subtitle, './images/info.png', 'no', null, '');
                // }
                // $noresult           = false;
                $track_artwork_path = getTrackOrAlbumArtwork($w, $track->uri, false);
                $w->result(null, serialize(array($track->uri, $album_uri, $track->artists[0]->uri, '', '', '', '', 'play_track_in_album_context', $track->artists[0]->name, $track->name, $album_name, $track_artwork_path, '', '', '', '')), escapeQuery(ucfirst($track->artists[0]->name)) . " ● " . escapeQuery($track->name), array(beautifyTime($track->duration_ms / 1000) . " ● " . $album_name, 'alt' => 'Play album ' . escapeQuery($album_name) . ' in Spotify', 'cmd' => 'Play artist ' . escapeQuery($track->artists[0]->name) . ' in Spotify', 'fn' => 'Add track ' . escapeQuery($track->name) . ' to ...', 'shift' => 'Add album ' . escapeQuery($album_name) . ' to ...', 'ctrl' => 'Search artist ' . escapeQuery($track->artists[0]->name) . ' online'), $track_artwork_path, 'yes', null, '');
            }
        }
    }
}
Esempio n. 2
0
     addArtistToPlayQueue($w, $artist_uri, $artist_name, $country_code);
     return;
 } else {
     if ($other_action == "playalbum") {
         if ($album_uri == "") {
             if ($track_uri == "") {
                 displayNotificationWithArtwork("Cannot get current album", './images/warning.png', 'Error!');
                 return;
             }
             $album_uri = getAlbumUriFromTrack($w, $track_uri);
             if ($album_uri == false) {
                 displayNotificationWithArtwork("Cannot get album", './images/warning.png', 'Error!');
                 return;
             }
         }
         $album_artwork_path = getTrackOrAlbumArtwork($w, $album_uri, true);
         $mopidy_arg = "";
         if ($use_mopidy) {
             $mopidy_arg = "MOPIDY";
         }
         exec("./src/spotify_mini_player_notifications.ksh -d \"" . $w->data() . "\" -a start -m \"" . $mopidy_arg . "\"  >> \"" . $w->cache() . "/action.log\" 2>&1 & ");
         if (!$use_mopidy) {
             exec("./src/track_info.ksh 2>&1", $retArr, $retVal);
             if ($retVal != 0) {
                 displayNotificationWithArtwork('AppleScript Exception: ' . htmlspecialchars($retArr[0]) . ' use spot_mini_debug command', './images/warning.png', 'Error!');
                 exec("osascript -e 'tell application \"Alfred 2\" to search \"spot_mini_debug AppleScript Exception: " . htmlspecialchars($retArr[0]) . "\"'");
                 return;
             }
         }
         if ($use_mopidy) {
             playUriWithMopidy($w, $album_uri);
Esempio n. 3
0
/**
 * refreshLibrary function.
 *
 * @access public
 * @param mixed $w
 * @return void
 */
function refreshLibrary($w)
{
    if (!file_exists($w->data() . '/library.db')) {
        displayNotificationWithArtwork("Refresh library called while library does not exist", './images/warning.png');
        return;
    }
    touch($w->data() . "/update_library_in_progress");
    $w->write('InitRefreshLibrary▹' . 0 . '▹' . 0 . '▹' . time() . '▹' . 'starting', 'update_library_in_progress');
    $in_progress_data = $w->read('update_library_in_progress');
    //
    // Read settings from JSON
    //
    $settings = getSettings($w);
    $country_code = $settings->country_code;
    $userid = $settings->userid;
    $words = explode('▹', $in_progress_data);
    putenv('LANG=fr_FR.UTF-8');
    ini_set('memory_limit', '512M');
    $nb_playlist = 0;
    // db for fetch artworks
    $fetch_artworks_existed = true;
    $dbfile = $w->data() . '/fetch_artworks.db';
    if (!file_exists($dbfile)) {
        touch($dbfile);
        $fetch_artworks_existed = false;
    }
    // kill previous process if running
    $pid = exec("ps -efx | grep \"php\" | egrep \"DOWNLOAD_ARTWORKS\" | grep -v grep | awk '{print \$2}'");
    if ($pid != "") {
        logMsg("KILL Download daemon <{$pid}>");
        $ret = exec("kill -9 \"{$pid}\"");
    }
    if (file_exists($w->data() . '/download_artworks_in_progress')) {
        deleteTheFile($w->data() . '/download_artworks_in_progress');
    }
    try {
        $dbartworks = new PDO("sqlite:{$dbfile}", "", "", array(PDO::ATTR_PERSISTENT => true));
        $dbartworks->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
        handleDbIssuePdoEcho($dbartworks, $w);
        $dbartworks = null;
        $db = null;
        return false;
    }
    // DB artowrks
    if ($fetch_artworks_existed == false) {
        try {
            $dbartworks->exec("create table artists (artist_name text PRIMARY KEY NOT NULL, already_fetched boolean)");
            $dbartworks->exec("create table tracks (track_uri text PRIMARY KEY NOT NULL, already_fetched boolean)");
            $dbartworks->exec("create table albums (album_uri text PRIMARY KEY NOT NULL, already_fetched boolean)");
        } catch (PDOException $e) {
            logMsg("Error(updateLibrary): (exception " . print_r($e) . ")");
            handleDbIssuePdoEcho($dbartworks, $w);
            $dbartworks = null;
            $db = null;
            return false;
        }
    }
    try {
        // artworks
        $insertArtistArtwork = "insert or ignore into artists values (:artist_name,:already_fetched)";
        $stmtArtistArtwork = $dbartworks->prepare($insertArtistArtwork);
        $insertTrackArtwork = "insert or ignore into tracks values (:track_uri,:already_fetched)";
        $stmtTrackArtwork = $dbartworks->prepare($insertTrackArtwork);
        $insertAlbumArtwork = "insert or ignore into albums values (:album_uri,:already_fetched)";
        $stmtAlbumArtwork = $dbartworks->prepare($insertAlbumArtwork);
    } catch (PDOException $e) {
        logMsg("Error(updateLibrary): (exception " . print_r($e) . ")");
        handleDbIssuePdoEcho($dbartworks, $w);
        $dbartworks = null;
        $db = null;
        return false;
    }
    $artworksToDownload = false;
    rename($w->data() . '/library.db', $w->data() . '/library_old.db');
    copy($w->data() . '/library_old.db', $w->data() . '/library_new.db');
    $dbfile = $w->data() . '/library_new.db';
    $nb_added_playlists = 0;
    $nb_removed_playlists = 0;
    $nb_updated_playlists = 0;
    try {
        $db = new PDO("sqlite:{$dbfile}", "", "", array(PDO::ATTR_PERSISTENT => true));
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $db->exec("drop table counters");
        $db->exec("create table counters (all_tracks int, yourmusic_tracks int, all_artists int, yourmusic_artists int, all_albums int, yourmusic_albums int, playlists int)");
        $getPlaylists = "select * from playlists where uri=:uri";
        $stmtGetPlaylists = $db->prepare($getPlaylists);
        $insertPlaylist = "insert into playlists values (:uri,:name,:nb_tracks,:owner,:username,:playlist_artwork_path,:ownedbyuser,:nb_playable_tracks,:duration_playlist,:nb_times_played,:collaborative,:public)";
        $stmtPlaylist = $db->prepare($insertPlaylist);
        $insertTrack = "insert into tracks values (:yourmusic,:popularity,:uri,:album_uri,:artist_uri,:track_name,:album_name,:artist_name,:album_type,:track_artwork_path,:artist_artwork_path,:album_artwork_path,:playlist_name,:playlist_uri,:playable,:added_at,:duration,:nb_times_played,:local_track)";
        $stmtTrack = $db->prepare($insertTrack);
        $deleteFromTracks = "delete from tracks where playlist_uri=:playlist_uri";
        $stmtDeleteFromTracks = $db->prepare($deleteFromTracks);
        $updatePlaylistsNbTracks = "update playlists set nb_tracks=:nb_tracks,nb_playable_tracks=:nb_playable_tracks,duration_playlist=:duration_playlist,public=:public where uri=:uri";
        $stmtUpdatePlaylistsNbTracks = $db->prepare($updatePlaylistsNbTracks);
        $deleteFromTracksYourMusic = "delete from tracks where yourmusic=:yourmusic";
        $stmtDeleteFromTracksYourMusic = $db->prepare($deleteFromTracksYourMusic);
    } catch (PDOException $e) {
        logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
        handleDbIssuePdoEcho($db, $w);
        $dbartworks = null;
        $db = null;
        return;
    }
    $savedListPlaylist = array();
    $offsetGetUserPlaylists = 0;
    $limitGetUserPlaylists = 50;
    do {
        $retry = true;
        $nb_retry = 0;
        $api = getSpotifyWebAPI($w);
        while ($retry) {
            try {
                // refresh api
                $api = getSpotifyWebAPI($w, $api);
                $userPlaylists = $api->getUserPlaylists(urlencode($userid), array('limit' => $limitGetUserPlaylists, 'offset' => $offsetGetUserPlaylists));
                $retry = false;
            } catch (SpotifyWebAPI\SpotifyWebAPIException $e) {
                logMsg("Error(getUserPlaylists): retry " . $nb_retry . " (exception " . print_r($e) . ")");
                if ($e->getCode() == 429 || $e->getCode() == 404 || $e->getCode() == 500 || $e->getCode() == 502 || $e->getCode() == 503 || $e->getCode() == 0) {
                    // retry
                    if ($nb_retry > 10) {
                        handleSpotifyWebAPIException($w, $e);
                        $retry = false;
                        return false;
                    }
                    $nb_retry++;
                    sleep(5);
                } else {
                    handleSpotifyWebAPIException($w, $e);
                    $retry = false;
                    return false;
                }
            }
        }
        $nb_playlist_total = $userPlaylists->total;
        foreach ($userPlaylists->items as $playlist) {
            if ($playlist->name != "") {
                $savedListPlaylist[] = $playlist;
            }
        }
        $offsetGetUserPlaylists += $limitGetUserPlaylists;
    } while ($offsetGetUserPlaylists < $userPlaylists->total);
    // consider Your Music as a playlist for progress bar
    $nb_playlist_total++;
    foreach ($savedListPlaylist as $playlist) {
        $tracks = $playlist->tracks;
        $owner = $playlist->owner;
        $nb_playlist++;
        $w->write('Refresh Library▹' . $nb_playlist . '▹' . $nb_playlist_total . '▹' . $words[3] . '▹' . escapeQuery($playlist->name), 'update_library_in_progress');
        try {
            // Loop on existing playlists in library
            $stmtGetPlaylists->bindValue(':uri', $playlist->uri);
            $stmtGetPlaylists->execute();
            $noresult = true;
            while ($playlists = $stmtGetPlaylists->fetch()) {
                $noresult = false;
                break;
            }
        } catch (PDOException $e) {
            logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
            handleDbIssuePdoEcho($db, $w);
            $dbartworks = null;
            $db = null;
            return;
        }
        // Playlist does not exist, add it
        if ($noresult == true) {
            $nb_added_playlists++;
            $playlist_artwork_path = getPlaylistArtwork($w, $playlist->uri, true, true);
            if ("-" . $owner->id . "-" == "-" . $userid . "-") {
                $ownedbyuser = 1;
            } else {
                $ownedbyuser = 0;
            }
            $nb_track_playlist = 0;
            $duration_playlist = 0;
            $offsetGetUserPlaylistTracks = 0;
            $limitGetUserPlaylistTracks = 100;
            do {
                $retry = true;
                $nb_retry = 0;
                while ($retry) {
                    try {
                        // refresh api
                        $api = getSpotifyWebAPI($w, $api);
                        $userPlaylistTracks = $api->getUserPlaylistTracks(urlencode($owner->id), $playlist->id, array('fields' => array('total', 'items(added_at)', 'items(is_local)', 'items.track(is_playable,duration_ms,uri,popularity,name)', 'items.track.album(album_type,images,uri,name)', 'items.track.artists(name,uri)'), 'limit' => $limitGetUserPlaylistTracks, 'offset' => $offsetGetUserPlaylistTracks, 'market' => $country_code));
                        $retry = false;
                    } catch (SpotifyWebAPI\SpotifyWebAPIException $e) {
                        logMsg("Error(getUserPlaylistTracks): retry " . $nb_retry . " (exception " . print_r($e) . ")");
                        if ($e->getCode() == 429 || $e->getCode() == 404 || $e->getCode() == 500 || $e->getCode() == 502 || $e->getCode() == 503 || $e->getCode() == 0) {
                            // retry
                            if ($nb_retry > 10) {
                                handleSpotifyWebAPIException($w, $e);
                                $retry = false;
                                return false;
                            }
                            $nb_retry++;
                            sleep(5);
                        } else {
                            handleSpotifyWebAPIException($w, $e);
                            $retry = false;
                            return false;
                        }
                    }
                }
                foreach ($userPlaylistTracks->items as $item) {
                    $track = $item->track;
                    $artists = $track->artists;
                    $artist = $artists[0];
                    $album = $track->album;
                    $playable = 0;
                    $local_track = 0;
                    if (isset($track->is_playable) && $track->is_playable) {
                        $playable = 1;
                    }
                    if (isset($item->is_local) && $item->is_local) {
                        $playable = 1;
                        $local_track = 1;
                    }
                    try {
                        //
                        // Download artworks in Fetch later mode
                        $thetrackuri = 'spotify:track:faketrackuri';
                        if ($local_track == 0 && isset($track->uri)) {
                            $thetrackuri = $track->uri;
                        }
                        list($already_present, $track_artwork_path) = getTrackOrAlbumArtwork($w, $thetrackuri, true, true);
                        if ($already_present == false) {
                            $artworksToDownload = true;
                            $stmtTrackArtwork->bindValue(':track_uri', $thetrackuri);
                            $stmtTrackArtwork->bindValue(':already_fetched', 0);
                            $stmtTrackArtwork->execute();
                        }
                        $theartistname = 'fakeartist';
                        if (isset($artist->name)) {
                            $theartistname = $artist->name;
                        }
                        list($already_present, $artist_artwork_path) = getArtistArtwork($w, $theartistname, true, true);
                        if ($already_present == false) {
                            $artworksToDownload = true;
                            $stmtArtistArtwork->bindValue(':artist_name', $theartistname);
                            $stmtArtistArtwork->bindValue(':already_fetched', 0);
                            $stmtArtistArtwork->execute();
                        }
                        $thealbumuri = 'spotify:album:fakealbumuri';
                        if (isset($album->uri)) {
                            $thealbumuri = $album->uri;
                        }
                        list($already_present, $album_artwork_path) = getTrackOrAlbumArtwork($w, $thealbumuri, true, true);
                        if ($already_present == false) {
                            $artworksToDownload = true;
                            $stmtAlbumArtwork->bindValue(':album_uri', $thealbumuri);
                            $stmtAlbumArtwork->bindValue(':already_fetched', 0);
                            $stmtAlbumArtwork->execute();
                        }
                    } catch (PDOException $e) {
                        logMsg("Error(updateLibrary): (exception " . print_r($e) . ")");
                        handleDbIssuePdoEcho($dbartworks, $w);
                        $dbartworks = null;
                        $db = null;
                        return false;
                    }
                    $duration_playlist += $track->duration_ms;
                    try {
                        $stmtTrack->bindValue(':yourmusic', 0);
                        $stmtTrack->bindValue(':popularity', $track->popularity);
                        $stmtTrack->bindValue(':uri', $track->uri);
                        $stmtTrack->bindValue(':album_uri', $album->uri);
                        $stmtTrack->bindValue(':artist_uri', $artist->uri);
                        $stmtTrack->bindValue(':track_name', escapeQuery($track->name));
                        $stmtTrack->bindValue(':album_name', escapeQuery($album->name));
                        $stmtTrack->bindValue(':artist_name', escapeQuery($artist->name));
                        $stmtTrack->bindValue(':album_type', $album->album_type);
                        $stmtTrack->bindValue(':track_artwork_path', $track_artwork_path);
                        $stmtTrack->bindValue(':artist_artwork_path', $artist_artwork_path);
                        $stmtTrack->bindValue(':album_artwork_path', $album_artwork_path);
                        $stmtTrack->bindValue(':playlist_name', escapeQuery($playlist->name));
                        $stmtTrack->bindValue(':playlist_uri', $playlist->uri);
                        $stmtTrack->bindValue(':playable', $playable);
                        $stmtTrack->bindValue(':added_at', $item->added_at);
                        $stmtTrack->bindValue(':duration', beautifyTime($track->duration_ms / 1000));
                        $stmtTrack->bindValue(':nb_times_played', 0);
                        $stmtTrack->bindValue(':local_track', $local_track);
                        $stmtTrack->execute();
                    } catch (PDOException $e) {
                        logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
                        handleDbIssuePdoEcho($db, $w);
                        $dbartworks = null;
                        $db = null;
                        return;
                    }
                    $nb_track_playlist++;
                }
                $offsetGetUserPlaylistTracks += $limitGetUserPlaylistTracks;
            } while ($offsetGetUserPlaylistTracks < $userPlaylistTracks->total);
            try {
                $stmtPlaylist->bindValue(':uri', $playlist->uri);
                $stmtPlaylist->bindValue(':name', escapeQuery($playlist->name));
                $stmtPlaylist->bindValue(':nb_tracks', $tracks->total);
                $stmtPlaylist->bindValue(':owner', $owner->id);
                $stmtPlaylist->bindValue(':username', $owner->id);
                $stmtPlaylist->bindValue(':playlist_artwork_path', $playlist_artwork_path);
                $stmtPlaylist->bindValue(':ownedbyuser', $ownedbyuser);
                $stmtPlaylist->bindValue(':nb_playable_tracks', $nb_track_playlist);
                $stmtPlaylist->bindValue(':duration_playlist', beautifyTime($duration_playlist / 1000, true));
                $stmtPlaylist->bindValue(':nb_times_played', 0);
                $stmtPlaylist->bindValue(':collaborative', $playlist->collaborative);
                $stmtPlaylist->bindValue(':public', $playlist->public);
                $stmtPlaylist->execute();
            } catch (PDOException $e) {
                logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
                handleDbIssuePdoEcho($db, $w);
                $dbartworks = null;
                $db = null;
                return;
            }
            displayNotificationWithArtwork('Added playlist ' . escapeQuery($playlist->name), $playlist_artwork_path, 'Refresh Library');
        } else {
            // number of tracks has changed or playlist name has changed or the privacy has changed
            // update the playlist
            if ($playlists[2] != $tracks->total || $playlists[1] != escapeQuery($playlist->name) || ($playlists[11] == '' && $playlist->public == true || $playlists[11] == true && $playlist->public == '')) {
                $nb_updated_playlists++;
                // force refresh of playlist artwork
                getPlaylistArtwork($w, $playlist->uri, true, true);
                try {
                    if ($playlists[1] != escapeQuery($playlist->name)) {
                        $updatePlaylistsName = "update playlists set name=:name where uri=:uri";
                        $stmtUpdatePlaylistsName = $db->prepare($updatePlaylistsName);
                        $stmtUpdatePlaylistsName->bindValue(':name', escapeQuery($playlist->name));
                        $stmtUpdatePlaylistsName->bindValue(':uri', $playlist->uri);
                        $stmtUpdatePlaylistsName->execute();
                    }
                    $stmtDeleteFromTracks->bindValue(':playlist_uri', $playlist->uri);
                    $stmtDeleteFromTracks->execute();
                } catch (PDOException $e) {
                    logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
                    handleDbIssuePdoEcho($db, $w);
                    $dbartworks = null;
                    $db = null;
                    return;
                }
                $tmp = explode(':', $playlist->uri);
                $duration_playlist = 0;
                $nb_track_playlist = 0;
                $offsetGetUserPlaylistTracks = 0;
                $limitGetUserPlaylistTracks = 100;
                do {
                    $retry = true;
                    $nb_retry = 0;
                    while ($retry) {
                        try {
                            // refresh api
                            $api = getSpotifyWebAPI($w, $api);
                            $userPlaylistTracks = $api->getUserPlaylistTracks(urlencode($tmp[2]), $tmp[4], array('fields' => array('total', 'items(added_at)', 'items(is_local)', 'items.track(is_playable,duration_ms,uri,popularity,name)', 'items.track.album(album_type,images,uri,name)', 'items.track.artists(name,uri)'), 'limit' => $limitGetUserPlaylistTracks, 'offset' => $offsetGetUserPlaylistTracks, 'market' => $country_code));
                            $retry = false;
                        } catch (SpotifyWebAPI\SpotifyWebAPIException $e) {
                            logMsg("Error(getUserPlaylistTracks): retry " . $nb_retry . " (exception " . print_r($e) . ")");
                            if ($e->getCode() == 429 || $e->getCode() == 404 || $e->getCode() == 500 || $e->getCode() == 502 || $e->getCode() == 503 || $e->getCode() == 0) {
                                // retry
                                if ($nb_retry > 10) {
                                    handleSpotifyWebAPIException($w, $e);
                                    $retry = false;
                                    return false;
                                }
                                $nb_retry++;
                                sleep(5);
                            } else {
                                handleSpotifyWebAPIException($w, $e);
                                $retry = false;
                                return false;
                            }
                        }
                    }
                    foreach ($userPlaylistTracks->items as $item) {
                        $track = $item->track;
                        $artists = $track->artists;
                        $artist = $artists[0];
                        $album = $track->album;
                        $playable = 0;
                        $local_track = 0;
                        if (isset($track->is_playable) && $track->is_playable) {
                            $playable = 1;
                        }
                        if (isset($item->is_local) && $item->is_local) {
                            $playable = 1;
                            $local_track = 1;
                        }
                        try {
                            //
                            // Download artworks in Fetch later mode
                            $thetrackuri = 'spotify:track:faketrackuri';
                            if ($local_track == 0 && isset($track->uri)) {
                                $thetrackuri = $track->uri;
                            }
                            list($already_present, $track_artwork_path) = getTrackOrAlbumArtwork($w, $thetrackuri, true, true);
                            if ($already_present == false) {
                                $artworksToDownload = true;
                                $stmtTrackArtwork->bindValue(':track_uri', $thetrackuri);
                                $stmtTrackArtwork->bindValue(':already_fetched', 0);
                                $stmtTrackArtwork->execute();
                            }
                            $theartistname = 'fakeartist';
                            if (isset($artist->name)) {
                                $theartistname = $artist->name;
                            }
                            list($already_present, $artist_artwork_path) = getArtistArtwork($w, $theartistname, true, true);
                            if ($already_present == false) {
                                $artworksToDownload = true;
                                $stmtArtistArtwork->bindValue(':artist_name', $theartistname);
                                $stmtArtistArtwork->bindValue(':already_fetched', 0);
                                $stmtArtistArtwork->execute();
                            }
                            $thealbumuri = 'spotify:album:fakealbumuri';
                            if (isset($album->uri)) {
                                $thealbumuri = $album->uri;
                            }
                            list($already_present, $album_artwork_path) = getTrackOrAlbumArtwork($w, $thealbumuri, true, true);
                            if ($already_present == false) {
                                $artworksToDownload = true;
                                $stmtAlbumArtwork->bindValue(':album_uri', $thealbumuri);
                                $stmtAlbumArtwork->bindValue(':already_fetched', 0);
                                $stmtAlbumArtwork->execute();
                            }
                        } catch (PDOException $e) {
                            logMsg("Error(updateLibrary): (exception " . print_r($e) . ")");
                            handleDbIssuePdoEcho($dbartworks, $w);
                            $dbartworks = null;
                            $db = null;
                            return false;
                        }
                        $duration_playlist += $track->duration_ms;
                        try {
                            $stmtTrack->bindValue(':yourmusic', 0);
                            $stmtTrack->bindValue(':popularity', $track->popularity);
                            $stmtTrack->bindValue(':uri', $track->uri);
                            $stmtTrack->bindValue(':album_uri', $album->uri);
                            $stmtTrack->bindValue(':artist_uri', $artist->uri);
                            $stmtTrack->bindValue(':track_name', escapeQuery($track->name));
                            $stmtTrack->bindValue(':album_name', escapeQuery($album->name));
                            $stmtTrack->bindValue(':artist_name', escapeQuery($artist->name));
                            $stmtTrack->bindValue(':album_type', $album->album_type);
                            $stmtTrack->bindValue(':track_artwork_path', $track_artwork_path);
                            $stmtTrack->bindValue(':artist_artwork_path', $artist_artwork_path);
                            $stmtTrack->bindValue(':album_artwork_path', $album_artwork_path);
                            $stmtTrack->bindValue(':playlist_name', escapeQuery($playlist->name));
                            $stmtTrack->bindValue(':playlist_uri', $playlist->uri);
                            $stmtTrack->bindValue(':playable', $playable);
                            $stmtTrack->bindValue(':added_at', $item->added_at);
                            $stmtTrack->bindValue(':duration', beautifyTime($track->duration_ms / 1000));
                            $stmtTrack->bindValue(':nb_times_played', 0);
                            $stmtTrack->bindValue(':local_track', $local_track);
                            $stmtTrack->execute();
                        } catch (PDOException $e) {
                            logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
                            handleDbIssuePdoEcho($db, $w);
                            $dbartworks = null;
                            $db = null;
                            return;
                        }
                        $nb_track_playlist++;
                    }
                    $offsetGetUserPlaylistTracks += $limitGetUserPlaylistTracks;
                } while ($offsetGetUserPlaylistTracks < $userPlaylistTracks->total);
                try {
                    $stmtUpdatePlaylistsNbTracks->bindValue(':nb_tracks', $userPlaylistTracks->total);
                    $stmtUpdatePlaylistsNbTracks->bindValue(':nb_playable_tracks', $nb_track_playlist);
                    $stmtUpdatePlaylistsNbTracks->bindValue(':duration_playlist', beautifyTime($duration_playlist / 1000, true));
                    $stmtUpdatePlaylistsNbTracks->bindValue(':uri', $playlist->uri);
                    $stmtUpdatePlaylistsNbTracks->bindValue(':public', $playlist->public);
                    $stmtUpdatePlaylistsNbTracks->execute();
                } catch (PDOException $e) {
                    logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
                    handleDbIssuePdoEcho($db, $w);
                    $dbartworks = null;
                    $db = null;
                    return;
                }
                displayNotificationWithArtwork('Updated playlist ' . escapeQuery($playlist->name), getPlaylistArtwork($w, $playlist->uri, true), 'Refresh Library');
            } else {
                continue;
            }
        }
    }
    try {
        // check for deleted playlists
        $getPlaylists = "select * from playlists";
        $stmt = $db->prepare($getPlaylists);
        $stmt->execute();
        while ($playlist_in_db = $stmt->fetch()) {
            $found = false;
            foreach ($savedListPlaylist as $playlist) {
                if ($playlist->uri == $playlist_in_db[0]) {
                    $found = true;
                    break;
                }
            }
            if ($found == false) {
                $nb_removed_playlists++;
                $deleteFromPlaylist = "delete from playlists where uri=:uri";
                $stmtDelete = $db->prepare($deleteFromPlaylist);
                $stmtDelete->bindValue(':uri', $playlist_in_db[0]);
                $stmtDelete->execute();
                $deleteFromTracks = "delete from tracks where playlist_uri=:uri";
                $stmtDelete = $db->prepare($deleteFromTracks);
                $stmtDelete->bindValue(':uri', $playlist_in_db[0]);
                $stmtDelete->execute();
                displayNotificationWithArtwork('Removed playlist ' . $playlist_in_db[1], getPlaylistArtwork($w, $playlist_in_db[0], false), 'Refresh Library');
            }
        }
    } catch (PDOException $e) {
        logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
        handleDbIssuePdoEcho($db, $w);
        $dbartworks = null;
        $db = null;
        return;
    }
    // check for update to Your Music
    $retry = true;
    $nb_retry = 0;
    while ($retry) {
        try {
            // refresh api
            $api = getSpotifyWebAPI($w, $api);
            // get only one, we just want to check total for now
            $userMySavedTracks = $api->getMySavedTracks(array('limit' => 1, 'offset' => 0));
            $retry = false;
        } catch (SpotifyWebAPI\SpotifyWebAPIException $e) {
            logMsg("Error(getMySavedTracks): retry " . $nb_retry . " (exception " . print_r($e) . ")");
            if ($e->getCode() == 429 || $e->getCode() == 404 || $e->getCode() == 500 || $e->getCode() == 502 || $e->getCode() == 503 || $e->getCode() == 0) {
                // retry
                if ($nb_retry > 10) {
                    handleSpotifyWebAPIException($w, $e);
                    $retry = false;
                    return false;
                }
                $nb_retry++;
                sleep(5);
            } else {
                handleSpotifyWebAPIException($w, $e);
                $retry = false;
                return false;
            }
        }
    }
    try {
        // get current number of track in Your Music
        $getCount = 'select count(distinct uri) from tracks where yourmusic=1';
        $stmt = $db->prepare($getCount);
        $stmt->execute();
        $yourmusic_tracks = $stmt->fetch();
    } catch (PDOException $e) {
        logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
        handleDbIssuePdoEcho($db, $w);
        $db = null;
        return;
    }
    $your_music_updated = false;
    if ($yourmusic_tracks[0] != $userMySavedTracks->total) {
        $your_music_updated = true;
        // Your Music has changed, update it
        $nb_playlist++;
        $w->write('Refresh Library▹' . $nb_playlist . '▹' . $nb_playlist_total . '▹' . $words[3] . '▹' . 'Your Music', 'update_library_in_progress');
        // delete tracks
        try {
            $stmtDeleteFromTracksYourMusic->bindValue(':yourmusic', 1);
            $stmtDeleteFromTracksYourMusic->execute();
        } catch (PDOException $e) {
            logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
            handleDbIssuePdoEcho($db, $w);
            $db = null;
            return;
        }
        $offsetGetMySavedTracks = 0;
        $limitGetMySavedTracks = 50;
        do {
            $retry = true;
            $nb_retry = 0;
            while ($retry) {
                try {
                    // refresh api
                    $api = getSpotifyWebAPI($w, $api);
                    $userMySavedTracks = $api->getMySavedTracks(array('limit' => $limitGetMySavedTracks, 'offset' => $offsetGetMySavedTracks, 'market' => $country_code));
                    $retry = false;
                } catch (SpotifyWebAPI\SpotifyWebAPIException $e) {
                    logMsg("Error(getMySavedTracks): retry " . $nb_retry . " (exception " . print_r($e) . ")");
                    if ($e->getCode() == 429 || $e->getCode() == 404 || $e->getCode() == 500 || $e->getCode() == 502 || $e->getCode() == 503 || $e->getCode() == 0) {
                        // retry
                        if ($nb_retry > 10) {
                            handleSpotifyWebAPIException($w, $e);
                            $retry = false;
                            return false;
                        }
                        $nb_retry++;
                        sleep(5);
                    } else {
                        handleSpotifyWebAPIException($w, $e);
                        $retry = false;
                        return false;
                    }
                }
            }
            foreach ($userMySavedTracks->items as $item) {
                $track = $item->track;
                $artists = $track->artists;
                $artist = $artists[0];
                $album = $track->album;
                $playable = 0;
                $local_track = 0;
                if (isset($track->is_playable) && $track->is_playable) {
                    $playable = 1;
                }
                if (isset($item->is_local) && $item->is_local) {
                    $playable = 1;
                    $local_track = 1;
                }
                try {
                    //
                    // Download artworks in Fetch later mode
                    $thetrackuri = 'spotify:track:faketrackuri';
                    if ($local_track == 0 && isset($track->uri)) {
                        $thetrackuri = $track->uri;
                    }
                    list($already_present, $track_artwork_path) = getTrackOrAlbumArtwork($w, $thetrackuri, true, true);
                    if ($already_present == false) {
                        $artworksToDownload = true;
                        $stmtTrackArtwork->bindValue(':track_uri', $thetrackuri);
                        $stmtTrackArtwork->bindValue(':already_fetched', 0);
                        $stmtTrackArtwork->execute();
                    }
                    $theartistname = 'fakeartist';
                    if (isset($artist->name)) {
                        $theartistname = $artist->name;
                    }
                    list($already_present, $artist_artwork_path) = getArtistArtwork($w, $theartistname, true, true);
                    if ($already_present == false) {
                        $artworksToDownload = true;
                        $stmtArtistArtwork->bindValue(':artist_name', $theartistname);
                        $stmtArtistArtwork->bindValue(':already_fetched', 0);
                        $stmtArtistArtwork->execute();
                    }
                    $thealbumuri = 'spotify:album:fakealbumuri';
                    if (isset($album->uri)) {
                        $thealbumuri = $album->uri;
                    }
                    list($already_present, $album_artwork_path) = getTrackOrAlbumArtwork($w, $thealbumuri, true, true);
                    if ($already_present == false) {
                        $artworksToDownload = true;
                        $stmtAlbumArtwork->bindValue(':album_uri', $thealbumuri);
                        $stmtAlbumArtwork->bindValue(':already_fetched', 0);
                        $stmtAlbumArtwork->execute();
                    }
                } catch (PDOException $e) {
                    logMsg("Error(updateLibrary): (exception " . print_r($e) . ")");
                    handleDbIssuePdoEcho($dbartworks, $w);
                    $dbartworks = null;
                    $db = null;
                    return false;
                }
                try {
                    $stmtTrack->bindValue(':yourmusic', 1);
                    $stmtTrack->bindValue(':popularity', $track->popularity);
                    $stmtTrack->bindValue(':uri', $track->uri);
                    $stmtTrack->bindValue(':album_uri', $album->uri);
                    $stmtTrack->bindValue(':artist_uri', $artist->uri);
                    $stmtTrack->bindValue(':track_name', escapeQuery($track->name));
                    $stmtTrack->bindValue(':album_name', escapeQuery($album->name));
                    $stmtTrack->bindValue(':artist_name', escapeQuery($artist->name));
                    $stmtTrack->bindValue(':album_type', $album->album_type);
                    $stmtTrack->bindValue(':track_artwork_path', $track_artwork_path);
                    $stmtTrack->bindValue(':artist_artwork_path', $artist_artwork_path);
                    $stmtTrack->bindValue(':album_artwork_path', $album_artwork_path);
                    $stmtTrack->bindValue(':playlist_name', '');
                    $stmtTrack->bindValue(':playlist_uri', '');
                    $stmtTrack->bindValue(':playable', $playable);
                    $stmtTrack->bindValue(':added_at', $item->added_at);
                    $stmtTrack->bindValue(':duration', beautifyTime($track->duration_ms / 1000));
                    $stmtTrack->bindValue(':nb_times_played', 0);
                    $stmtTrack->bindValue(':local_track', $local_track);
                    $stmtTrack->execute();
                } catch (PDOException $e) {
                    logMsg("Error(refreshLibrary): (exception " . print_r($e) . ")");
                    handleDbIssuePdoEcho($db, $w);
                    $db = null;
                    return;
                }
            }
            $offsetGetMySavedTracks += $limitGetMySavedTracks;
        } while ($offsetGetMySavedTracks < $userMySavedTracks->total);
    }
    // update counters
    try {
        $getCount = 'select count(distinct uri) from tracks';
        $stmt = $db->prepare($getCount);
        $stmt->execute();
        $all_tracks = $stmt->fetch();
        $getCount = 'select count(distinct uri) from tracks where yourmusic=1';
        $stmt = $db->prepare($getCount);
        $stmt->execute();
        $yourmusic_tracks = $stmt->fetch();
        $getCount = 'select count(distinct artist_name) from tracks';
        $stmt = $db->prepare($getCount);
        $stmt->execute();
        $all_artists = $stmt->fetch();
        $getCount = 'select count(distinct artist_name) from tracks where yourmusic=1';
        $stmt = $db->prepare($getCount);
        $stmt->execute();
        $yourmusic_artists = $stmt->fetch();
        $getCount = 'select count(distinct album_name) from tracks';
        $stmt = $db->prepare($getCount);
        $stmt->execute();
        $all_albums = $stmt->fetch();
        $getCount = 'select count(distinct album_name) from tracks where yourmusic=1';
        $stmt = $db->prepare($getCount);
        $stmt->execute();
        $yourmusic_albums = $stmt->fetch();
        $getCount = 'select count(*) from playlists';
        $stmt = $db->prepare($getCount);
        $stmt->execute();
        $playlists_count = $stmt->fetch();
        $insertCounter = "insert into counters values (:all_tracks,:yourmusic_tracks,:all_artists,:yourmusic_artists,:all_albums,:yourmusic_albums,:playlists)";
        $stmt = $db->prepare($insertCounter);
        $stmt->bindValue(':all_tracks', $all_tracks[0]);
        $stmt->bindValue(':yourmusic_tracks', $yourmusic_tracks[0]);
        $stmt->bindValue(':all_artists', $all_artists[0]);
        $stmt->bindValue(':yourmusic_artists', $yourmusic_artists[0]);
        $stmt->bindValue(':all_albums', $all_albums[0]);
        $stmt->bindValue(':yourmusic_albums', $yourmusic_albums[0]);
        $stmt->bindValue(':playlists', $playlists_count[0]);
        $stmt->execute();
    } catch (PDOException $e) {
        logMsg("Error(updateLibrary): (exception " . print_r($e) . ")");
        handleDbIssuePdoEcho($db, $w);
        $dbartworks = null;
        $db = null;
        return false;
    }
    $elapsed_time = time() - $words[3];
    $changedPlaylists = false;
    $changedYourMusic = false;
    $addedMsg = '';
    $removedMsg = '';
    $updatedMsg = '';
    $yourMusicMsg = '';
    if ($nb_added_playlists > 0) {
        $addedMsg = $nb_added_playlists . ' added';
        $changedPlaylists = true;
    }
    if ($nb_removed_playlists > 0) {
        $removedMsg = $nb_removed_playlists . ' removed';
        $changedPlaylists = true;
    }
    if ($nb_updated_playlists > 0) {
        $updatedMsg = $nb_updated_playlists . ' updated';
        $changedPlaylists = true;
    }
    if ($your_music_updated) {
        $yourMusicMsg = ' - Your Music: updated';
        $changedYourMusic = true;
    }
    if ($changedPlaylists && $changedYourMusic) {
        $message = 'Playlists: ' . $addedMsg . ' ' . $removedMsg . ' ' . $updatedMsg . ' ' . $yourMusicMsg;
    } elseif ($changedPlaylists) {
        $message = 'Playlists: ' . $addedMsg . ' ' . $removedMsg . ' ' . $updatedMsg;
    } elseif ($changedYourMusic) {
        $message = $yourMusicMsg;
    } else {
        $message = 'No change';
    }
    displayNotificationWithArtwork($message . " - took " . beautifyTime($elapsed_time, true), './images/update.png', 'Library refreshed');
    if (file_exists($w->data() . '/library_old.db')) {
        deleteTheFile($w->data() . '/library_old.db');
    }
    rename($w->data() . '/library_new.db', $w->data() . '/library.db');
    // Download artworks in background
    logMsg("========DOWNLOAD_ARTWORKS DURING REFRESH LIBRARY ========");
    exec("php -f ./src/action.php -- \"\" \"DOWNLOAD_ARTWORKS\" \"DOWNLOAD_ARTWORKS\" >> \"" . $w->cache() . "/action.log\" 2>&1 & ");
    deleteTheFile($w->data() . '/update_library_in_progress');
}
Esempio n. 4
0
     }
     addTrackToPlayQueue($w, $track_uri, $track_name, $artist_name, $album_name, $duration, $country_code);
     return;
 } else {
     if ($other_action == "random_album") {
         list($album_uri, $album_name, $theartistname) = getRandomAlbum($w);
         // start now playing if needed
         exec("./src/spotify_mini_player_notifications.ksh -d \"" . $w->data() . "\" -a start >> \"" . $w->cache() . "/action.log\" 2>&1 & ");
         exec("./src/track_info.ksh 2>&1", $retArr, $retVal);
         if ($retVal != 0) {
             displayNotificationWithArtwork('AppleScript Exception: ' . htmlspecialchars($retArr[0]) . ' use spot_mini_debug command', './images/warning.png', 'Error!');
             exec("osascript -e 'tell application \"Alfred 2\" to search \"spot_mini_debug AppleScript Exception: " . htmlspecialchars($retArr[0]) . "\"'");
             return;
         }
         exec("osascript -e 'tell application \"Spotify\" to play track \"{$album_uri}\"'");
         displayNotificationWithArtwork('🔈 Album ' . $album_name . ' by ' . $theartistname, getTrackOrAlbumArtwork($w, $album_uri, true), 'Play Random Album');
         if ($userid != 'vdesabou') {
             stathat_ez_count('AlfredSpotifyMiniPlayer', 'play', 1);
         }
         addAlbumToPlayQueue($w, $album_uri, $album_name);
         return;
     } else {
         if ($other_action == "reset_settings") {
             deleteTheFile($w->data() . '/settings.json');
             return;
         } else {
             if ($other_action == "biography") {
                 displayCurrentArtistBiography($w);
                 if ($userid != 'vdesabou') {
                     stathat_ez_count('AlfredSpotifyMiniPlayer', 'display biography', 1);
                 }