Rev 81 | Rev 86 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?phpinclude_once ('php/constants.php');error_reporting(E_ALL);// Get itunes listingsfunction get_amazon($query, $searchCondition) {$vendors = Vendors::getInstance();$config = $vendors->getVendor(Vendors::AMAZON);$needMatches = empty($_SESSION["discogs"]);$arrMusic = [];$arrDigital = [];$arrBooks = [];// Music$arrMusic = get_amazonCategory($config, $query, "Music", $needMatches);// Digital Musicif ($_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 listingsfunction 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 keyksort($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 "<br><br>$url<br><pre>";print_r($parsed_xml);echo "</pre>";// Check to see if the request found any resultsif (!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 arrayforeach($parsed_xml->Items->Item as $current){// [ProductGroup] => Digital Music Albumif ($searchIndex == "MP3Downloads" && !empty($current->ItemAttributes->TrackSequence)) {continue; // skip individual songs}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 if (strpos($current->ItemAttributes->Binding, "Paperback") !== false ||strpos($current->ItemAttributes->Binding, "Sheet") !== false ||strpos($current->ItemAttributes->Binding, "Hardcover") !== false) {$mediaType = "Book";} else {continue;}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") {$creators[] = $creator;} else {$creators[] = $creator . " (" . $creator->attributes() . ")";}}}return $creators;}