Subversion Repositories cheapmusic

Rev

Rev 82 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
include_once ('php/constants.php');

error_reporting(E_ALL);

// Get itunes listings
function get_amazon($query, $searchCondition) {
    $vendors = Vendors::getInstance();
    $config = $vendors->getVendor(Vendors::AMAZON);

    $needMatches = empty($_SESSION["discogs"]);
    $arrMusic = [];
    $arrDigital = [];
    $arrAudiobooks = [];

    // Music
    $arrMusic = get_amazonCategory($config, $query, "Music", $needMatches);

    // Digital Music
    if ($_SESSION["filterMediaType"]["Digital"]) {
        $arrDigital = get_amazonCategory($config, $query, "MP3Downloads");
    }

    if ($_SESSION["filterMediaType"]["Book"]) {
        // Books
        $arrBooks = get_amazonCategory($config, $query, "Books");
    }

    return (array_merge($arrMusic, $arrDigital, $arrBooks));
}

// Get Amazon listings
function get_amazonCategory($config, $query, $searchIndex, $needMatches = false) {
    // API request variables
    $access_key_id = $config["access_key_id"];
    $secret_key = $config["secret_key"];
    $endpoint = $config["endpoint"];
    $uri = $config["uri"];
    $associate_tag = $config["associate_tag"];

    if ($needMatches) {
        $_SESSION["discogs"] = "";
    }

    $params = array(
        "Service" => "AWSECommerceService",
        "Operation" => "ItemSearch",
        "AWSAccessKeyId" => $access_key_id,
        "AssociateTag" => $associate_tag,
        "SearchIndex" => $searchIndex,
        "Keywords" => $query,
        "ResponseGroup" => "ItemAttributes,Images,Offers,OfferFull,Tracks",
        "Condition" => "All", /* New, Used, Collectible, Refurbished */
        "Sort" => "price",
        "Availability" => "Available",
        "Timestamp" => gmdate('Y-m-d\TH:i:s\Z')
    );

    // Sort the parameters by key
    ksort($params);

    $pairs = array();

    foreach ($params as $key => $value) {
        array_push($pairs, rawurlencode($key)."=".rawurlencode($value));
    }

    // Generate the canonical query
    $canonical_query_string = join("&", $pairs);

    // Generate the string to be signed
    $string_to_sign = "GET\n".$endpoint."\n".$uri."\n".$canonical_query_string;

    // Generate the signature required by the Product Advertising API
    $signature = base64_encode(hash_hmac("sha256", $string_to_sign, $secret_key, true));

    // Generate the signed URL
    $url = 'https://'.$endpoint.$uri.'?'.$canonical_query_string.'&Signature='.rawurlencode($signature);

    $result = getUrl($url);
    $parsed_xml = simplexml_load_string($result);

    $arr = [];

    //echo "$url<pre>";print_r($result);echo "</pre>";
    // Check to see if the request found any results
    if (!empty($parsed_xml->Items->Request->IsValid)) {
        $valid = (bool)(string)$parsed_xml->Items->Request->IsValid;
    }else {
        $valid = false;
    }

    if ($valid) {
        if ($needMatches) {
            $cnt = 0;
            $_SESSION["discogs"] = startMatches();
        }

        // If the response was loaded, parse it and store in array
        foreach($parsed_xml->Items->Item as $current){
            if (isset($current->ItemAttributes->UPC)) {
                $barcode = (string)$current->ItemAttributes->UPC;
            } else if (isset($current->ItemAttributes->EAN)) {
                $barcode = (string)$current->ItemAttributes->EAN;
            } else if (isset($current->ItemAttributes->ISBN)) {
                $barcode = (string)$current->ItemAttributes->ISBN;
            } else if (isset($current->ItemAttributes->EISBN)) {
                $barcode = (string)$current->ItemAttributes->EISBN;
            } else {
                $barcode = "";
            }
            $barcodeType = clsLibGTIN::GTINCheck($barcode, false, 1);

            $pic = str_replace('http://', 'https://', (string)$current->MediumImage->URL);
            if (empty($pic)) {
                continue;
            }

            if (strpos($current->ItemAttributes->Binding, "CD") !== false) {
                $mediaType = "CD";
            } else if (strpos($current->ItemAttributes->Binding, "MP3") !== false) {
                $mediaType = "Digital";
            } else if (strpos($current->ItemAttributes->Binding, "Vinyl") !== false) {
                $mediaType = "Record";
            } else {
                $mediaType = "Book";
            }

            if ($needMatches) {
                // bugbug: check maxMasterCnt?
                $_SESSION["discogs"] .= addMatch($current, ++$cnt, $mediaType);
            }

            $title = (string)$current->ItemAttributes->Title;
            $artists = getArtists($current);
            $creators = getCreators($current);
            if (!empty($artists)) {
                $title .= " by " . join(", ", $artists);
            } else if (!empty($creators)) {
                $title .= " by " . join(", ", $creators);
            }

            $url = str_replace('http://', 'https://', (string)$current->DetailPageURL);

            if (empty($url)) {
                continue;
            }

            $country = 'US';
            $bestOffer = false;

            foreach($current->ItemLinks->ItemLink as $link) {
                if ($link->Description == "All Offers") {
                    $url = str_replace('http://', 'https://', (string)$link->URL);
                    $url .= "&condition=";
                }
            }

            if (!empty($current->Offers->Offer)) {
                foreach($current->Offers->Offer as $offer){
                    $merchantName = "Amazon";
                    if (strpos($offer->Merchant->Name, "Amazon") === false) {
                        $merchantName .= " Marketplace";
                    }

                    $condition = (string)$offer->OfferAttributes->Condition;
                    $url .= $condition;
                    $detailCondition = $condition;
                    if ($condition == "Collectible") { $condition = 'Used'; $detailCondition = "Collectible"; }
                    $currency = (string)$offer->OfferListing->Price->CurrencyCode;
                    $price = number_format(floatval($offer->OfferListing->Price->Amount) / 100.00, 2, '.', '');

                    if ($price <= "0.00") {
                        continue;
                    }

                    $timeLeft = 0;
                    $listingType = 'Fixed';
                    $location = 'US';
                    $zip = '';
                    $feedbackScore = -1;
                    $feedbackPercent = -1;
                    $sellerName = "";
                    if ($offer->OfferListing->AvailabilityAttributes->MaximumHours == 0) {
                        $handlingTime = 1;
                    } else {
                        $handlingTime = (int)($offer->OfferListing->AvailabilityAttributes->MaximumHours / 24);
                    }
                    if (!empty($offer->OfferListing->IsEligibleForPrime)) {
                        $sellerName = "Prime";
                    }
                    if ($mediaType == "Digital") {
                        $shippingCost = 0.00;
                        $shippingEstimated = false;
                        $shippingCurrency = 'USD';
                    } else {
                        $shippingCost = 3.99; // bugbug
                        $shippingEstimated = true; // bugbug
                        $shippingCurrency = 'USD';
                    }
                    $freeShippingCap = !empty($offer->OfferListing->IsEligibleForSuperSaverShipping) ? 25 : 0;

                    $arr[] = array(
                        "Merchant" => $merchantName,
                        "Condition" => $condition,
                        "Title" => $title,
                        "Barcode" => $barcode,
                        "BarcodeType" => $barcodeType,
                        "Image" => $pic,
                        "URL" => $url,
                        "MediaType" => $mediaType,
                        "DetailCondition" => $detailCondition,
                        "Country" => $country,
                        "BestOffer" => $bestOffer,
                        "TimeLeft" => $timeLeft,
                        "Price" => $price,
                        "Currency" => $currency,
                        "ListingType" => $listingType,
                        "Location" => $location,
                        "Zip" => $zip,
                        "FeedbackScore" => $feedbackScore,
                        "FeedbackPercent" => $feedbackPercent,
                        "SellerName" => $sellerName,
                        "HandlingTime" => $handlingTime,
                        "ShippingCost" => $shippingCost,
                        "ShippingEstimated" => $shippingEstimated,
                        "ShippingCurrency" => $shippingCurrency,
                        "FreeShippingCap" => $freeShippingCap,
                        "Show" => true
                    );
                }
            }
        }

        if ($needMatches) {
            if ($cnt = 0) {
                $_SESSION["discogs"] = "";
            } else {
                $_SESSION["discogs"] .= endMatches();
            }
        }
    }
    // If the response does not indicate 'Success,' log the error(s)
    else {
        error_log($url);
        if (!empty($parsed_xml->OperationRequest->Errors)) {
            foreach($parsed_xml->OperationRequest->Errors->Error as $error){
                error_log($error->Message . " (" . $error->Code . ")");
            }
        } else if (!empty($parsed_xml->Errors)) {
            foreach($parsed_xml->OperationRequest->Errors->Error as $error){
                error_log($error->Message . " (" . $error->Code . ")");
            }
        } else if (!empty($parsed_xml->Error)) {
            error_log($parsed_xml->Error->Message . " (" . $parsed_xml->Error->Code . ")");
        } else {
            error_log(print_r($result, 1));
        }
    }

    return $arr;
}

function startMatches() {
    $str = "<div class=\"container-fluid bg-secondary\">";
    $str .= "<h4 class=\"text-center py-2\">Matching Albums</h4>";
    $str .= "<form method=\"post\" action=\"/index.php\">";
    $str .= "<input type=\"hidden\" name=\"sessionTab\" value=\"" . MySessionHandler::getSessionTab() . "\">";
    $str .= "<input id=\"discogsTitle\" type=\"hidden\" name=\"discogsTitle\" value=\"\">";
    $str .= "<input id=\"discogsArtist\" type=\"hidden\" name=\"discogsArtist\" value=\"\">";
    $str .= "<input id=\"discogsBarcode\" type=\"hidden\" name=\"discogsBarcode\" value=\"\">";
    $str .= "<div id=\"discogsDeck\" class=\"card-deck\">";

    return $str;
}

function endMatches() {
    $str = "</div>";
    $str .= "</form>";
    $str .= "</div>";


    return $str;
}

function addMatch($item, $cnt, $mediaType) {
    $artists = getArtists($item);

    $creators = getCreators($item);

    $actors = [];
    if (!empty($item->ItemAttributes->Actor)) {
        foreach($item->ItemAttributes->Actor as $actor) {
            $actors[] = $actor;
        }
    }

    $authors = [];
    if (!empty($item->ItemAttributes->Author)) {
        foreach($item->ItemAttributes->Author as $author) {
            $authors[] = $author;
        }
    }

    $directors = [];
    if (!empty($item->ItemAttributes->Director)) {
        foreach($item->ItemAttributes->Director as $director) {
            $directors[] = $director;
        }
    }

    $genres = [];
    if (!empty($item->ItemAttributes->Genre)) {
        foreach($item->ItemAttributes->Genre as $genre) {
            $genres[] = join(" ", array_map('ucfirst', explode('-', $genre)));
        }
    }

    $labels = [];
    if (!empty($item->ItemAttributes->Label)) {
        foreach($item->ItemAttributes->Label as $label) {
            $labels[] = $label;
        }
    }

    $languages = [];
    if (!empty($item->ItemAttributes->Languages->Language)) {
        foreach($item->ItemAttributes->Languages->Language as $language) {
            if ((string)$language->Type != "Unknown") {
                $languages[] = $language->Name . " (" . $language->Type . ")";
            }
        }
    }

    $runningTime = "";
    if (!empty($item->ItemAttributes->RunningTime)) {
        if ($mediaType != 'Digital') {
            $runningTime = (string)$item->ItemAttributes->RunningTime . " minutes";
        } else {
            $runningTime = gmdate("H:i:s", (int)$item->ItemAttributes->RunningTime);
        }
    }

    $modal = "";
    $str = "<div class=\"card mx-auto discogs-card\">";
    $str .= "<div class=\"card-header bg-info d-flex h-100\">";
    $str .= "<p class=\"card-title font-weight-bold small flex-grow-1\">" . (string)$item->ItemAttributes->Title . " by ";
    $searchArtists = "";
    if (count($artists) < 5) {
        $wlArtists = join(", ", $artists);
        if (!empty($artists) && $artists[0] != 'Various') {
            $searchArtists = join(" ", $artists);
        }
    }
    else {
        $wlArtists = "Various Artists";
    }
    $str .= $wlArtists;
    $str .= "</p>";
    $str .= "</div>";

    $thumbnail = !empty($item->MediumImage->URL) ? (string)$item->MediumImage->URL : "images/no-image-available.jpg";

    $str .= "<div class=\"card-body bg-light mx-auto p-0 m-0\">";
    $str .= "<img class=\"btn responsive-image p-0 m-0\" src=\"" . $thumbnail . "\" data-toggle=\"modal\" data-target=\"#masterModal" . $cnt . "\" title=\"Album Information\" data-toggle2=\"tooltip\" alt=\"Cover Thumbnail\">";
    $str .= "</div>";
    $str .= "<div class=\"card-footer bg-dark p-0 m-0\">";
    $str .= "<div class=\"container clearfix p-0 m-0\">";
    $str .= "<span class=\"float-left\">";
    $str .= "<button type=\"button\" class=\"btn btn-primary m-1 btn-sm\" data-toggle=\"modal\" data-target=\"#masterModal" . $cnt . "\" title=\"Album Information\" data-toggle2=\"tooltip\"><i class=\"fas fa-info\"></i></button>";

    $str .= "</span>";

    $str .= "<span class=\"float-right\">";

    $barcode = "";
    $tmpBarcode = "";
    if (!empty($item->ItemAttributes->UPC)) {
        $tmpBarcode = (string)$item->ItemAttributes->UPC;
    } else if (!empty($item->ItemAttributes->EAN)) {
        $tmpBarcode = (string)$item->ItemAttributes->EAN;
    } else if (!empty($item->ItemAttributes->ISBN)) {
        $tmpBarcode = (string)$item->ItemAttributes->ISBN;
    } else if (!empty($item->ItemAttributes->EISBN)) {
        $tmpBarcode = (string)$item->ItemAttributes->EISBN;
    }
    $barcodeType = clsLibGTIN::GTINCheck($tmpBarcode, false, 1);
    if (!empty($barcodeType)) {
        $barcode = $tmpBarcode;
    }

    if (isLoggedIn() && !checkWishlist('asin', $item->ASIN)) {
        $wlArr = array(
            'asin' => (string)$item->ASIN,
            'title' => (string)$item->ItemAttributes->Title,
            'artist' => $wlArtists,
            'barcode' => $barcode,
            'thumbnail' => $thumbnail,
            'url' => (string)$item->DetailPageURL
        );
        $wl = base64_encode(json_encode($wlArr));
        $str .= "  <button type=\"button\" class=\"btn btn-primary m-1 btn-sm\" onclick=\"addWishlist('" . $_SESSION['sessData']['userID'] . "',this," . $cnt . ",'" . $wl . "');\" title=\"Add to Wishlist\" data-toggle=\"tooltip\"><i class=\"fas fa-bookmark\"></i></button>";
    }

    $searchTitle = 'Searching for:<br><br><strong>' . (string)$item->ItemAttributes->Title . ' by' . $wlArtists . '</strong>';
    if (!empty($barcode)) {
        $searchTitle .= " (" . displayBarcode($barcode) . ")";
    }

    $str .= "  <button type=\"submit\" name=\"submit\" value=\"discogsSearch\" class=\"btn btn-primary m-1 btn-sm\" onclick=\"document.getElementById('discogsTitle').value = '" . addslashes((string)$item->ItemAttributes->Title) . "';document.getElementById('discogsArtist').value = '" . addslashes($searchArtists) . "';document.getElementById('discogsBarcode').value = '" . $barcode . "';progressBar('" . sanitizeInput2($searchTitle) . "');\" title=\"Search for Sales Offers\" data-toggle=\"tooltip\"><i class=\"fas fa-search\"></i></button>";
    $str .= "</span>";
    $str .= "</div>";
    $str .= "<span id=\"wishlistAdd" . $cnt . "\"></span>";
    $str .= "</div>";

    $modal .= "<div id=\"masterModal" . $cnt . "\" class=\"modal\">";
    $modal .= "<div class=\"modal-dialog\">";
    $modal .= "<div class=\"modal-content\">";
    $modal .= "<div class=\"modal-header bg-primary\">";
    $modal .= "<h4 class=\"modal-title mx-auto\">" . (string)$item->ItemAttributes->Title . " by " . $wlArtists . "</h4>";
    $modal .= "<button type=\"button\" class=\"close\" data-dismiss=\"modal\"><i class=\"fas fa-window-close btn-dismiss\"></i></button>";
    $modal .= "</div>";

    $modal .= "<div class=\"modal-body bg-white mx-auto\">";

    if (!empty($item->LargeImage->URL)) {
        $modal .= "<img class=\"responsive-image mx-auto mb-4\" src=\"" . (string)$item->LargeImage->URL . "\" alt=\"Cover Image\">";
    }

    $modal .= "<table class=\"table-borderless table-condensed small mx-auto\">";
    $modal .= "<tr><td class=\"px-1\">Title:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->Title . "</td></tr>";

    $modal .= "<tr><td class=\"px-1\">Artist:</td><td class=\"px-1\">" . join(", ", $artists) . "</td></tr>";
    if (!empty($creators)) {
        $modal .= "<tr><td class=\"px-1\">Creator:</td><td class=\"px-1\">" . join(", ", $creators) . "</td></tr>";
    }

    if (!empty($actors)) {
        $modal .= "<tr><td class=\"px-1\">Actor:</td><td class=\"px-1\">" . join(", ", $actors) . "</td></tr>";
    }

    if (!empty($directors)) {
        $modal .= "<tr><td class=\"px-1\">Director:</td><td class=\"px-1\">" . join(", ", $directors) . "</td></tr>";
    }

    if (!empty($authors)) {
        $modal .= "<tr><td class=\"px-1\">Author:</td><td class=\"px-1\">" . join(", ", $authors) . "</td></tr>";
    }

    if (!empty($item->ItemAttributes->Binding)) {
        $modal .= "<tr><td class=\"px-1\">Type:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->Binding . "</td></tr>";
    }

    if (!empty($item->ItemAttributes->MediaType)) {
        $modal .= "<tr><td class=\"px-1\">Media Type:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->MediaType . "</td></tr>";
    }

    if (!empty($barcode)) {
        $modal .= "<tr><td class=\"px-1\">Barcode:</td><td class=\"px-1\">" . displayBarcode($barcode) . "</td></tr>";
    }

    if (!empty($labels)) {
        $modal .= "<tr><td class=\"px-1\">Label:</td><td class=\"px-1\">" . $labels[0] . "</td></tr>";
    } else if (!empty($item->ItemAttributes->Publisher)) {
        $modal .= "<tr><td class=\"px-1\">Publisher:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->Publisher . "</td></tr>";
    } else if (!empty($item->ItemAttributes->Studio)) {
        $modal .= "<tr><td class=\"px-1\">Studio:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->Studio . "</td></tr>";
    }

    if (!empty($languages)) {
        $modal .= "<tr><td class=\"px-1\">Languages:</td><td class=\"px-1\">" . join(", ", $languages) . "</td></tr>";
    }

    if (!empty($item->ItemAttributes->PublicationDate)) {
        $modal .= "<tr><td class=\"px-1\">Publication Date:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->PublicationDate . "</td></tr>";
    }

    if (!empty($item->ItemAttributes->ReleaseDate)) {
        $modal .= "<tr><td class=\"px-1\">Release Date:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->ReleaseDate . "</td></tr>";
    }

    if (!empty($genres)) {
        $modal .= "<tr><td class=\"px-1\">Genre:</td><td class=\"px-1\">" . join(", ", $genres) . "</td></tr>";
    }

    if (!empty($item->ItemAttributes->NumberOfDiscs)) {
        $modal .= "<tr><td class=\"px-1\">Number of Discs:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->NumberOfDiscs . "</td></tr>";
    }

    if (!empty($item->ItemAttributes->NumberOfPages)) {
        $modal .= "<tr><td class=\"px-1\">Number of Pages:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->NumberOfPages . "</td></tr>";
    }

    if (!empty($item->ItemAttributes->RunningTime)) {
        $modal .= "<tr><td class=\"px-1\">Running Time:</td><td class=\"px-1\">" . $runningTime . "</td></tr>";
    }

    if (!empty($item->ItemAttributes->Edition)) {
        $modal .= "<tr><td class=\"px-1\">Edition:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->Edition . "</td></tr>";
    }

    if (!empty($item->ItemAttributes->AudienceRating)) {
        $modal .= "<tr><td class=\"px-1\">Rating:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->AudienceRating . "</td></tr>";
    }

    if (!empty($item->ItemAttributes->RegionCode)) {
        $modal .= "<tr><td class=\"px-1\">Region Code:</td><td class=\"px-1\">" . (string)$item->ItemAttributes->RegionCode . "</td></tr>";
    }

    if (!empty($item->Tracks)) {
        $modal .= "<tr><td colspan=\"2\" class=\"px-1\">Tracks:</td></tr>";
        $modal .= "<tr><td colspan=\"2\">";
        $modal .= "<ul class=\"pl-3 pt-0 small list-unstyled\">";
        foreach ($item->Tracks->Disc as $disc) {
            if ((int)$item->ItemAttributes->NumberOfDiscs > 1) {
                $modal .= "<li class=\"font-weight-bold\">Disc " . $disc->attributes() . ":</li>";
            }

            foreach($disc->Track as $track) {
                $modal .= "<li>" . $track->attributes() . ") " . $track . "</li>";
            }
        }
        $modal .= "</ul>";
        $modal .= "</td></tr>";
    }

    $modal .= "</table>";
    $modal .= "</div>";
    $modal .= "<div class=\"modal-footer bg-white justify-content-between\">";
    $modal .= "<span class=\"float-right\"><button type=\"button\" class=\"btn btn-danger\" data-dismiss=\"modal\">Close</button></span>";
    $modal .= "</div>";
    $modal .= "</div>";
    $modal .= "</div>";
    $modal .= "</div>";
    $str .= $modal;
    $str .= "</div>";

    return $str;
}

function getArtists($item) {
    $artists = [];

    if (!empty($item->ItemAttributes->Artist)) {
        foreach($item->ItemAttributes->Artist as $artist) {
            $artists[] = $artist;
        }
    }

    return $artists;
}

function getCreators($item) {
    $creators = [];
    
    if (!empty($item->ItemAttributes->Creator)) {
        foreach($item->ItemAttributes->Creator as $creator) {
            if ((string)$creator->attributes() == "Primary Contributor") {
                $artists[] = $creator;
            } else {
                $creators[] = $creator . " (" . $creator->attributes() . ")";
            }
        }
    }

    return $creators;
}