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;
}