chore: Converted to main method Invocation

parent 21520c62
package com.nisum.inventory; package com.nisum.inventory;
import com.nisum.inventory.service.InventoryService;
import org.apache.spark.sql.streaming.StreamingQueryException;
import org.springframework.boot.WebApplicationType; import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.builder.SpringApplicationBuilder;
import java.util.concurrent.TimeoutException;
@SpringBootApplication @SpringBootApplication
public class InventoryProcessApiApplication { public class InventoryProcessApiApplication {
public static void main(String[] args) { public static void main(String[] args) throws TimeoutException, StreamingQueryException {
new SpringApplicationBuilder(InventoryProcessApiApplication.class) new SpringApplicationBuilder(InventoryProcessApiApplication.class)
.web(WebApplicationType.REACTIVE) .web(WebApplicationType.REACTIVE)
.run(args); .run(args);
InventoryService inventoryService= new InventoryService();
String topicName="test-inventory3";
String batchId=inventoryService.readFromJsonAndPushToKafka(topicName);
inventoryService.readFromKafkaTransformIntoMongoDB(batchId,topicName);
} }
......
package com.nisum.inventory.controller;
import com.nisum.inventory.dto.KafkaPublisherResponse;
import com.nisum.inventory.dto.RawInventory;
import com.nisum.inventory.dto.Root;
import com.nisum.inventory.service.InventoryService;
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.sql.streaming.StreamingQueryException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import java.util.concurrent.TimeoutException;
@Slf4j
@RestController
@RequestMapping(path = "/inventory")
public class InventoryController {
@Autowired
private InventoryService inventoryService;
@PostMapping(value = "/upload-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value = HttpStatus.OK)
public Flux<KafkaPublisherResponse> upload(@RequestPart("files") Flux<FilePart> filePartFlux){
return inventoryService.saveAndProcess(filePartFlux);
}
@GetMapping(value = "/get",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
@ResponseStatus(value = HttpStatus.OK)
public Flux<RawInventory> getProductData(@RequestParam("batchId") String batchId) throws TimeoutException, StreamingQueryException {
return inventoryService.getProcessedInventory(batchId);
}
}
package com.nisum.inventory.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class FileUploadAttributes {
private String fileName;
private String fileContent;
}
package com.nisum.inventory.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class KafkaPublisherResponse {
private String topicName;
private String batchId;
private String status;
}
...@@ -43,91 +43,19 @@ import java.util.concurrent.TimeoutException; ...@@ -43,91 +43,19 @@ import java.util.concurrent.TimeoutException;
public class InventoryService implements Serializable { public class InventoryService implements Serializable {
@Autowired
private SparkSession sparkSession;
@Autowired
private StructType schema;
public String readFromJsonAndPushToKafka(String topicName) throws TimeoutException, StreamingQueryException {
public Flux<KafkaPublisherResponse> saveAndProcess(Flux<FilePart> filePartFlux) {
return filePartFlux.flatMap(filePart ->
filePart.content().map(dataBuffer -> {
byte[] bytes = new byte[dataBuffer.capacity()];
dataBuffer.read(bytes);
DataBufferUtils.release(dataBuffer);
return FileUploadAttributes.builder()
.fileContent(new String(bytes, StandardCharsets.UTF_8))
.fileName(filePart.filename())
.build();
})
.map(content -> saveAsFile(content))
.map(fileName -> readAndPublishDataToKafka(fileName))
.map(kafkaPublisherResponse -> kafkaPublisherResponse));
}
private String saveAsFile(FileUploadAttributes fileUploadAttributes) {
try {
FileUtils.deleteDirectory(new File("src/main/resources/data/CheckPointLocation"));
} catch (IOException e) {
log.error("Error while deleting checkpoint location dir {}", e.getMessage());
}
String batchId= new SimpleDateFormat("HHmmssSSS").format(new Date()); String batchId= new SimpleDateFormat("HHmmssSSS").format(new Date());
String dir="src/main/resources/data/"+batchId;
String fileName = dir+ File.separator + fileUploadAttributes.getFileName();
try {
FileUtils.forceMkdir(new File(dir));
FileUtils.writeStringToFile(new File(fileName)
, fileUploadAttributes.getFileContent(), StandardCharsets.UTF_8, true);
return batchId;
} catch (IOException e) {
if (e instanceof IOException)
log.error("Error while creating CSV... {}", e.getMessage());
return StringUtils.EMPTY;
}
}
private KafkaPublisherResponse readAndPublishDataToKafka(String batchId) {
if (StringUtils.isNotEmpty(batchId)) {
String topicName = "test-inventory2";
try {
populateInventoryDataUsingDFStruct(batchId, topicName);
return KafkaPublisherResponse.builder()
.topicName(topicName)
.batchId(batchId)
.status("File data pushed to Kafka topic.").build();
} catch (TimeoutException | StreamingQueryException e) {
if (e instanceof TimeoutException)
log.error("TimeoutException... {}", e.getMessage());
if (e instanceof StreamingQueryException)
log.error("StreamingQueryException {}", e.getMessage());
return KafkaPublisherResponse.builder().topicName(topicName).status(e.getMessage()).build();
}
}else
{
return KafkaPublisherResponse.builder().build();
}
}
public void populateInventoryDataUsingDFStruct(String batchId,String topicName) throws TimeoutException, StreamingQueryException {
StructType structType = Encoders.bean(Root.class).schema(); StructType structType = Encoders.bean(Root.class).schema();
Dataset<Row> df=sparkSession.readStream() Dataset<Row> df=sparkSession().readStream()
.format("json") .format("json")
.option("multiline",true) .option("multiline",true)
.schema(structType) .schema(structType)
.load("src/main/resources/data/"+batchId); .load("src/main/resources/json");
//df.printSchema(); //df.printSchema();
...@@ -147,18 +75,18 @@ public class InventoryService implements Serializable { ...@@ -147,18 +75,18 @@ public class InventoryService implements Serializable {
.start() .start()
.awaitTermination(5000); .awaitTermination(5000);
return batchId;
} }
public Flux<RawInventory> getProcessedInventory(String batchId) throws TimeoutException, StreamingQueryException { public void readFromKafkaTransformIntoMongoDB(String batchId,String topicName) throws TimeoutException, StreamingQueryException {
Dataset<Row> df = sparkSession Dataset<Row> df = sparkSession()
.readStream() .readStream()
.format("kafka") .format("kafka")
.option("kafka.bootstrap.servers", "HYD-LAP-00484.corp.nisum.com:9092") .option("kafka.bootstrap.servers", "HYD-LAP-00484.corp.nisum.com:9092")
.option("subscribe", "test-inventory2") .option("subscribe", topicName)
.option("startingOffsets", "earliest") .option("startingOffsets", "earliest")
.option("startingOffsets", "earliest") .option("startingOffsets", "earliest")
.option("failOnDataLoss", "false") .option("failOnDataLoss", "false")
...@@ -184,7 +112,7 @@ public class InventoryService implements Serializable { ...@@ -184,7 +112,7 @@ public class InventoryService implements Serializable {
.as(Encoders.bean(RawInventory.class)); .as(Encoders.bean(RawInventory.class));
CollectionAccumulator<RawInventory> rawInventories=sparkSession.sparkContext().collectionAccumulator("accList"); CollectionAccumulator<RawInventory> rawInventories=sparkSession().sparkContext().collectionAccumulator("accList");
StreamingQuery streamingQuery=inventoryList StreamingQuery streamingQuery=inventoryList
.writeStream() .writeStream()
...@@ -227,18 +155,18 @@ public class InventoryService implements Serializable { ...@@ -227,18 +155,18 @@ public class InventoryService implements Serializable {
streamingQuery.awaitTermination(); streamingQuery.awaitTermination();
try {
log.info("rawInventories : {}",rawInventories);
log.info("Awaiting main thread ......");
Thread.sleep(2000);
log.info("Resuming main thread ......");
} catch (InterruptedException e) {
e.printStackTrace();
}
return Flux.fromIterable(rawInventories.value());
} }
private SparkSession sparkSession()
{
return SparkSession
.builder()
.appName("Product info API")
.master("local[1]")
.getOrCreate();
}
} }
package com.nisum.inventory.utils;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;
@Configuration
@EnableReactiveMongoRepositories(basePackages = "com.nisum.inventory")
public class ReactiveMongoConfig extends AbstractReactiveMongoConfiguration{
@Override
public MongoClient reactiveMongoClient() {
return MongoClients.create();
}
@Override
protected String getDatabaseName() {
return "orderdb";
}
}
\ No newline at end of file
package com.nisum.inventory.utils;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.Metadata;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SchemaConfig {
@Bean
public StructType schema()
{
StructField[] structFields= new StructField[9];
structFields[0]= new StructField("imageUrl", DataTypes.StringType,true, Metadata.empty());
structFields[1]= new StructField("filename",DataTypes.StringType,true,Metadata.empty());
structFields[2]= new StructField("imageHash",DataTypes.StringType,true,Metadata.empty());
structFields[3]= new StructField("name",DataTypes.StringType,true,Metadata.empty());
structFields[4]= new StructField("description",DataTypes.StringType,true,Metadata.empty());
structFields[5]= new StructField("slug",DataTypes.StringType,true,Metadata.empty());
structFields[6]= new StructField("manufacturer",DataTypes.StringType,true,Metadata.empty());
structFields[7]= new StructField("itemType",DataTypes.StringType,true,Metadata.empty());
structFields[8]= new StructField("productImg",DataTypes.StringType,true,Metadata.empty());
return new StructType(structFields);
}
}
package com.nisum.inventory.utils;
import org.apache.spark.sql.SparkSession;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SparkConfiguaration {
@Bean
public SparkSession sparkSession()
{
return SparkSession
.builder()
.appName("Product info API")
.master("local[1]")
.getOrCreate();
}
}
v1
{"nextBatchWatermarkMs":0}
\ No newline at end of file
{"id":"8d4c9cc1-0b9c-4041-806e-06ec99fc1b98"}
\ No newline at end of file
v1
{"batchWatermarkMs":0,"batchTimestampMs":1687153256468,"conf":{"spark.sql.streaming.stateStore.providerClass":"org.apache.spark.sql.execution.streaming.state.HDFSBackedStateStoreProvider","spark.sql.streaming.join.stateFormatVersion":"2","spark.sql.streaming.stateStore.compression.codec":"lz4","spark.sql.streaming.stateStore.rocksdb.formatVersion":"5","spark.sql.streaming.flatMapGroupsWithState.stateFormatVersion":"2","spark.sql.streaming.multipleWatermarkPolicy":"min","spark.sql.streaming.aggregation.stateFormatVersion":"2","spark.sql.shuffle.partitions":"200"}}
{"logOffset":0}
\ No newline at end of file
v1
{"path":"file:///D:/Work/GitCodeBase/1606/inventory-process-api/src/main/resources/json/inventory_sample.json","timestamp":1686745257596,"batchId":0}
\ No newline at end of file
{
"inventoryList": [
{
"imageCredit": {
"artist": "Martin Wessely",
"link": "http://www.resplashed.com/photographer/martin_wessely/"
},
"tags": [
"Trees"
],
"imageUrl": "http://www.resplashed.com/img/400_002e1ecb8bd2.jpg",
"filename": "400_002e1ecb8bd2.jpg",
"imageHash": "2b1d5b5ef4b37b4f5d0dccade1b69987",
"price": 10.99,
"name": "Handcrafted Trees Mug",
"description": "enim corporis voluptatibus laudantium possimus alias dolorem voluptatem similique aut aliquam voluptatem voluptatem omnis id consequatur",
"slug": "Handcrafted-Trees-Mug",
"added": 1485723766805,
"manufacturer": "OHara-Group",
"itemType": "mug",
"productImg": "mug-400_002e1ecb8bd2.jpg"
},
{
"imageCredit": {
"artist": "Patrick Fore",
"link": "http://www.resplashed.com/photographer/patrick_fore/"
},
"tags": [
"Beach",
"Ocean",
"Water"
],
"imageUrl": "http://www.resplashed.com/img/400_00b425ea69e0.jpg",
"filename": "400_00b425ea69e0.jpg",
"imageHash": "9197d084a8309c5cc1c1860063bc4dda",
"price": 19.99,
"name": "Rustic Beach Mug",
"description": "totam at veritatis eligendi assumenda ex quia praesentium quibusdam ducimus",
"slug": "Rustic-Beach-Mug",
"added": 1481573896833,
"manufacturer": "Sipes-Inc",
"itemType": "mug",
"productImg": "mug-400_00b425ea69e0.jpg"
},
{
"imageCredit": {
"artist": "Adam Willoughby-Knox",
"link": "http://www.resplashed.com/photographer/adam_willoughby-knox/"
},
"tags": [
"Animal",
"Bear"
],
"imageUrl": "http://www.resplashed.com/img/400_016a0ffdc46d.jpg",
"filename": "400_016a0ffdc46d.jpg",
"imageHash": "7389141c2b2657f5b2531cfd8c290759",
"price": 17.99,
"name": "Handcrafted Bear Mug",
"description": "vitae mollitia et in accusantium est voluptas officiis est non",
"slug": "Handcrafted-Bear-Mug",
"added": 1485991071829,
"manufacturer": "Weissnat-Schowalter-and-Koelpin",
"itemType": "mug",
"productImg": "mug-400_016a0ffdc46d.jpg"
},
{
"imageCredit": {
"artist": "Eric Huang",
"link": "http://www.resplashed.com/photographer/eric_huang/"
},
"tags": [
"Road"
],
"imageUrl": "http://www.resplashed.com/img/400_01828ff91dc5.jpg",
"filename": "400_01828ff91dc5.jpg",
"imageHash": "acf59094c5fe008880e72aa4a16bd6ee",
"price": 15.99,
"name": "Refined Road Mug",
"description": "explicabo fugit magnam fugit dolorem itaque unde quidem est quia ut a veritatis sit facere possimus fugit ipsam",
"slug": "Refined-Road-Mug",
"added": 1482213983048,
"manufacturer": "Bernier-Hane",
"itemType": "mug",
"productImg": "mug-400_01828ff91dc5.jpg"
},
{
"imageCredit": {
"artist": "Olivia Henry",
"link": "http://www.resplashed.com/photographer/olivia_henry/"
},
"tags": [
"Ocean",
"Rocks"
],
"imageUrl": "http://www.resplashed.com/img/400_018cf84f5121.jpg",
"filename": "400_018cf84f5121.jpg",
"imageHash": "2967736ddb9ae0fdf18563622fccb2cc",
"price": 10.99,
"name": "Unbranded Ocean Mug",
"description": "facilis aut velit vitae sit dolorum illum nostrum pariatur dolorem vel atque quasi placeat qui",
"slug": "Unbranded-Ocean-Mug",
"added": 1483408192004,
"manufacturer": "Franecki---Gaylord",
"itemType": "mug",
"productImg": "mug-400_018cf84f5121.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Sunset",
"Beach",
"Ocean"
],
"imageUrl": "http://www.resplashed.com/img/400_01ca9c693d2c.jpg",
"filename": "400_01ca9c693d2c.jpg",
"imageHash": "0753f3afeee4eda16d0b6e5775ee2b29",
"price": 9.99,
"name": "Rustic Ocean Mug",
"description": "libero reprehenderit blanditiis quidem laborum ullam quae fuga consequuntur minima praesentium consequatur qui excepturi nostrum tempora sunt deleniti",
"slug": "Rustic-Ocean-Mug",
"added": 1485511118573,
"manufacturer": "Bayer-and-Sons",
"itemType": "mug",
"productImg": "mug-400_01ca9c693d2c.jpg"
},
{
"imageCredit": {
"artist": "jamie mink",
"link": "http://www.resplashed.com/photographer/jamie_mink/"
},
"tags": [
"Rust",
"Old",
"Car"
],
"imageUrl": "http://www.resplashed.com/img/400_01d403b11a9b.jpg",
"filename": "400_01d403b11a9b.jpg",
"imageHash": "40dd32ff718ba70b8b8a1850e530d2e2",
"price": 19.99,
"name": "Sleek Old Mug",
"description": "necessitatibus suscipit iure quia voluptates voluptas quidem ipsum laboriosam adipisci",
"slug": "Sleek-Old-Mug",
"added": 1485759837725,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_01d403b11a9b.jpg"
},
{
"imageCredit": {
"artist": "Justin Leibow",
"link": "http://www.resplashed.com/photographer/justin_leibow/"
},
"tags": [
"Coffee"
],
"imageUrl": "http://www.resplashed.com/img/400_01fdff8681fc.jpg",
"filename": "400_01fdff8681fc.jpg",
"imageHash": "abc437b613c34ab96391291112b6187b",
"price": 14.99,
"name": "Sleek Coffee Mug",
"description": "et adipisci explicabo consequatur rerum voluptas dolorem qui omnis vel",
"slug": "Sleek-Coffee-Mug",
"added": 1479259996312,
"manufacturer": "Franecki---Gaylord",
"itemType": "mug",
"productImg": "mug-400_01fdff8681fc.jpg"
},
{
"imageCredit": {
"artist": "Stefania Bonacasa",
"link": "http://www.resplashed.com/photographer/stefania_bonacasa/"
},
"tags": [
"Trees",
"Fog",
"People"
],
"imageUrl": "http://www.resplashed.com/img/400_026bcd988f43.jpg",
"filename": "400_026bcd988f43.jpg",
"imageHash": "119b67f433042dd6ee733e4cb4096077",
"price": 16.99,
"name": "Rustic Trees Mug",
"description": "ut architecto est similique sit nostrum sit sed ipsa itaque aliquam nesciunt reprehenderit et neque aut id nulla dolore sed sit facere eligendi",
"slug": "Rustic-Trees-Mug",
"added": 1480664800826,
"manufacturer": "Weissnat-Schowalter-and-Koelpin",
"itemType": "mug",
"productImg": "mug-400_026bcd988f43.jpg"
},
{
"imageCredit": {
"artist": "Dirk Sebregts",
"link": "http://www.resplashed.com/photographer/dirk_sebregts/"
},
"tags": [
"Sunset",
"Ocean",
"Dock"
],
"imageUrl": "http://www.resplashed.com/img/400_02a652e6d7b5.jpg",
"filename": "400_02a652e6d7b5.jpg",
"imageHash": "95f051dc9e6c3724889318ac07d7f6bd",
"price": 18.99,
"name": "Sleek Ocean Mug",
"description": "magnam maxime nostrum minima dolores repellat laborum pariatur et quia maiores quidem eos quod est voluptas voluptatem quia ipsum odit dolorem et blanditiis aut voluptates",
"slug": "Sleek-Ocean-Mug",
"added": 1485278625462,
"manufacturer": "Cruickshank-Bayer-and-Gerlach",
"itemType": "mug",
"productImg": "mug-400_02a652e6d7b5.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Person",
"Hills",
"Animals",
"Sheep"
],
"imageUrl": "http://www.resplashed.com/img/400_03426de5ad3d.jpg",
"filename": "400_03426de5ad3d.jpg",
"imageHash": "91e6a045e1df35a7fac02fe9e28bf216",
"price": 16.99,
"name": "Ergonomic Person Mug",
"description": "sunt id omnis nihil consectetur et porro ut molestias ab et rem quia omnis voluptatem est libero reiciendis voluptatem dolores excepturi",
"slug": "Ergonomic-Person-Mug",
"added": 1485835498313,
"manufacturer": "Rice-Inc",
"itemType": "mug",
"productImg": "mug-400_03426de5ad3d.jpg"
},
{
"imageCredit": {
"artist": "Taylor Leopold",
"link": "http://www.resplashed.com/photographer/taylor_leopold/"
},
"tags": [
"Fog",
"Lake",
"Water"
],
"imageUrl": "http://www.resplashed.com/img/400_0425cc46e03b.jpg",
"filename": "400_0425cc46e03b.jpg",
"imageHash": "98eb4a12a37feb52e2b6f77eb46f2fe4",
"price": 9.99,
"name": "Gorgeous Water Mug",
"description": "perspiciatis in qui et nemo nisi ad quam consequatur et dignissimos",
"slug": "Gorgeous-Water-Mug",
"added": 1485880263998,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_0425cc46e03b.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Person",
"Fog"
],
"imageUrl": "http://www.resplashed.com/img/400_043971bc342c.jpg",
"filename": "400_043971bc342c.jpg",
"imageHash": "b6beb3ba43a826daf115e7701dd64c80",
"price": 14.99,
"name": "Generic Fog Mug",
"description": "consectetur voluptas sint excepturi voluptas aut culpa qui excepturi dicta ut voluptas",
"slug": "Generic-Fog-Mug",
"added": 1484633915311,
"manufacturer": "McCullough---Lueilwitz",
"itemType": "mug",
"productImg": "mug-400_043971bc342c.jpg"
},
{
"imageCredit": {
"artist": "Sylwia Bartyzel",
"link": "http://www.resplashed.com/photographer/sylwia_bartyzel/"
},
"tags": [
"Building",
"Metal"
],
"imageUrl": "http://www.resplashed.com/img/400_04b2ced862ff.jpg",
"filename": "400_04b2ced862ff.jpg",
"imageHash": "d64b91cd71d94ba6e3632619041d4483",
"price": 11.99,
"name": "Gorgeous Building Mug",
"description": "quisquam maxime laudantium error totam unde commodi ullam qui quo sed aperiam",
"slug": "Gorgeous-Building-Mug",
"added": 1482336621275,
"manufacturer": "Sipes-Inc",
"itemType": "mug",
"productImg": "mug-400_04b2ced862ff.jpg"
},
{
"imageCredit": {
"artist": "Morgan Sessions",
"link": "http://www.resplashed.com/photographer/morgan_sessions/"
},
"tags": [
"Sunset",
"Person",
"Woman",
"Meadow"
],
"imageUrl": "http://www.resplashed.com/img/400_04fd54d3883a.jpg",
"filename": "400_04fd54d3883a.jpg",
"imageHash": "72d6644be34ea42f0a144db409ff77a1",
"price": 10.99,
"name": "Intelligent Sunset Mug",
"description": "qui ipsa hic voluptas et rem sed architecto reiciendis labore saepe fugit ab sed sed quos ut adipisci accusantium molestias",
"slug": "Intelligent-Sunset-Mug",
"added": 1484735389245,
"manufacturer": "Bernier-Hane",
"itemType": "mug",
"productImg": "mug-400_04fd54d3883a.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Person",
"Coffee"
],
"imageUrl": "http://www.resplashed.com/img/400_054141a0facb.jpg",
"filename": "400_054141a0facb.jpg",
"imageHash": "55643697fc9839d3bd89ccbe309e3e53",
"price": 11.99,
"name": "Unbranded Coffee Mug",
"description": "soluta eligendi harum quis molestiae omnis excepturi deserunt sed dolorum dolorum ea non dolor",
"slug": "Unbranded-Coffee-Mug",
"added": 1484144067274,
"manufacturer": "Lowe-Wunsch-and-Stoltenberg",
"itemType": "mug",
"productImg": "mug-400_054141a0facb.jpg"
},
{
"imageCredit": {
"artist": "Pavel Voinov",
"link": "http://www.resplashed.com/photographer/pavel_voinov/"
},
"tags": [
"Trees",
"Road"
],
"imageUrl": "http://www.resplashed.com/img/400_05902e9ad4b0.jpg",
"filename": "400_05902e9ad4b0.jpg",
"imageHash": "bdb55f06bcc209a72474d902cc5b60b2",
"price": 9.99,
"name": "Rustic Road Mug",
"description": "est ad ipsa et ipsum amet nemo cupiditate placeat praesentium qui illum harum",
"slug": "Rustic-Road-Mug",
"added": 1480653821277,
"manufacturer": "Metz---Kautzer",
"itemType": "mug",
"productImg": "mug-400_05902e9ad4b0.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Windows",
"Architecture",
"Building"
],
"imageUrl": "http://www.resplashed.com/img/400_0594b2a027c0.jpg",
"filename": "400_0594b2a027c0.jpg",
"imageHash": "9c29f87e053d9a8124fdb04c74d7a294",
"price": 17.99,
"name": "Sleek Building Mug",
"description": "in cumque suscipit et perspiciatis minima ut et consequatur ab neque rerum hic dolore a aut dignissimos",
"slug": "Sleek-Building-Mug",
"added": 1478843419299,
"manufacturer": "Feil-Dooley-and-Reinger",
"itemType": "mug",
"productImg": "mug-400_0594b2a027c0.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"House",
"Trees",
"Fog",
"Secluded"
],
"imageUrl": "http://www.resplashed.com/img/400_05e4bc8bae40.jpg",
"filename": "400_05e4bc8bae40.jpg",
"imageHash": "27abe66013bd259c11438f0870df13c1",
"price": 20.99,
"name": "Tasty Secluded Mug",
"description": "non et omnis accusantium ut non voluptatem sunt iusto cumque laudantium sunt laboriosam et sequi et totam voluptatem aut vero occaecati quia laudantium",
"slug": "Tasty-Secluded-Mug",
"added": 1482236584965,
"manufacturer": "Konopelski-Group",
"itemType": "mug",
"productImg": "mug-400_05e4bc8bae40.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Architecture",
"Wall"
],
"imageUrl": "http://www.resplashed.com/img/400_0653c10d6dd7.jpg",
"filename": "400_0653c10d6dd7.jpg",
"imageHash": "5408f3caebb3bf41ef1d633eb21b0fc8",
"price": 14.99,
"name": "Ergonomic Architecture Mug",
"description": "rerum sit voluptatibus sint voluptatem saepe delectus et quasi perferendis laborum et enim dolores quaerat iusto eos odio nisi",
"slug": "Ergonomic-Architecture-Mug",
"added": 1484099772336,
"manufacturer": "Franecki---Gaylord",
"itemType": "mug",
"productImg": "mug-400_0653c10d6dd7.jpg"
},
{
"imageCredit": {
"artist": "delfi de la Rua",
"link": "http://www.resplashed.com/photographer/delfi_de_la_rua/"
},
"tags": [
"Surf",
"Ocean",
"Waves"
],
"imageUrl": "http://www.resplashed.com/img/400_068d8b16aaed.jpg",
"filename": "400_068d8b16aaed.jpg",
"imageHash": "14d44fa1fb67fcf02a8564b459842013",
"price": 12.99,
"name": "Intelligent Waves Mug",
"description": "architecto amet doloremque sit ut repudiandae ducimus rerum enim aut veniam autem aut ut ea consectetur est excepturi explicabo aliquid",
"slug": "Intelligent-Waves-Mug",
"added": 1481166939534,
"manufacturer": "Metz---Kautzer",
"itemType": "mug",
"productImg": "mug-400_068d8b16aaed.jpg"
},
{
"imageCredit": {
"artist": "Ariana Prestes",
"link": "http://www.resplashed.com/photographer/ariana_prestes/"
},
"tags": [
"Bike",
"City",
"People"
],
"imageUrl": "http://www.resplashed.com/img/400_06e97ddd721b.jpg",
"filename": "400_06e97ddd721b.jpg",
"imageHash": "b140f42891b964fa6f26a9ca709e0164",
"price": 17.99,
"name": "Intelligent City Mug",
"description": "sit animi repellendus voluptas vitae consequatur accusantium optio cupiditate et",
"slug": "Intelligent-City-Mug",
"added": 1478209012932,
"manufacturer": "Weissnat-Schowalter-and-Koelpin",
"itemType": "mug",
"productImg": "mug-400_06e97ddd721b.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Sky",
"Fog"
],
"imageUrl": "http://www.resplashed.com/img/400_0714ae0188d2.jpg",
"filename": "400_0714ae0188d2.jpg",
"imageHash": "b1fe814797d65921498d6b78fb63a200",
"price": 18.99,
"name": "Refined Sky Mug",
"description": "non est voluptatem sint nulla dicta iste natus consequatur accusantium dolores dolore in et distinctio dolore similique",
"slug": "Refined-Sky-Mug",
"added": 1481150082814,
"manufacturer": "Konopelski-Group",
"itemType": "mug",
"productImg": "mug-400_0714ae0188d2.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Rust",
"Machine",
"Car"
],
"imageUrl": "http://www.resplashed.com/img/400_072315da7b27.jpg",
"filename": "400_072315da7b27.jpg",
"imageHash": "7f282c7ce86db46f09e9e4eca25169cf",
"price": 12.99,
"name": "Incredible Car Mug",
"description": "rerum vero cupiditate et est similique soluta ex sit ex esse repellat necessitatibus voluptatum corrupti et nihil quod",
"slug": "Incredible-Car-Mug",
"added": 1484684041316,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_072315da7b27.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Animal",
"Fur",
"Monkey"
],
"imageUrl": "http://www.resplashed.com/img/400_0730483320d1.jpg",
"filename": "400_0730483320d1.jpg",
"imageHash": "bb7357581a39fdbdddadbe6c0f569d3b",
"price": 15.99,
"name": "Gorgeous Animal Mug",
"description": "rerum consectetur magni sed enim eveniet et dolorem laudantium ut aut qui voluptatem praesentium soluta iste aliquid dolorem quibusdam veniam voluptas quaerat excepturi",
"slug": "Gorgeous-Animal-Mug",
"added": 1481333026774,
"manufacturer": "Hodkiewicz-Inc",
"itemType": "mug",
"productImg": "mug-400_0730483320d1.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Machine",
"Ocean"
],
"imageUrl": "http://www.resplashed.com/img/400_073a882ab243.jpg",
"filename": "400_073a882ab243.jpg",
"imageHash": "39eeffa4ff1219207fbc62f5ddde53c7",
"price": 13.99,
"name": "Ergonomic Machine Mug",
"description": "minus nihil ipsum explicabo pariatur adipisci harum quia ab et voluptate odio",
"slug": "Ergonomic-Machine-Mug",
"added": 1481307879405,
"manufacturer": "Nikolaus-Schinner",
"itemType": "mug",
"productImg": "mug-400_073a882ab243.jpg"
},
{
"imageCredit": {
"artist": "Jacob Valerio",
"link": "http://www.resplashed.com/photographer/jacob_valerio/"
},
"tags": [
"Planes",
"Sun",
"Clouds"
],
"imageUrl": "http://www.resplashed.com/img/400_080179bbc3fb.jpg",
"filename": "400_080179bbc3fb.jpg",
"imageHash": "0be8db2f83cce06ae8d20d982e42b66c",
"price": 15.99,
"name": "Licensed Clouds Mug",
"description": "maiores esse culpa qui fuga dignissimos officia aliquid perferendis consequatur possimus accusantium",
"slug": "Licensed-Clouds-Mug",
"added": 1481505340969,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_080179bbc3fb.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Beach",
"Television",
"Tv"
],
"imageUrl": "http://www.resplashed.com/img/400_089259cc2e9b.jpg",
"filename": "400_089259cc2e9b.jpg",
"imageHash": "f8f34b734312538fafbf7ca7775fb6bb",
"price": 11.99,
"name": "Awesome Television Mug",
"description": "tenetur perspiciatis necessitatibus eligendi perspiciatis et facilis expedita reiciendis et in corporis nostrum quam molestiae voluptatum soluta consequuntur nemo totam magnam doloremque adipisci architecto",
"slug": "Awesome-Television-Mug",
"added": 1483267004259,
"manufacturer": "Dickens-Franecki",
"itemType": "mug",
"productImg": "mug-400_089259cc2e9b.jpg"
},
{
"imageCredit": {
"artist": "Nigel Lo",
"link": "http://www.resplashed.com/photographer/nigel_lo/"
},
"tags": [
"Grass",
"Meadow",
"Plants"
],
"imageUrl": "http://www.resplashed.com/img/400_0965288ccf03.jpg",
"filename": "400_0965288ccf03.jpg",
"imageHash": "aeb4169bf705afae595b2ccdf0f1c0c2",
"price": 11.99,
"name": "Fantastic Grass Mug",
"description": "quod voluptas porro animi et praesentium velit aperiam ut officiis ut praesentium perspiciatis quia iste molestias voluptas",
"slug": "Fantastic-Grass-Mug",
"added": 1483834365140,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_0965288ccf03.jpg"
},
{
"imageCredit": {
"artist": "sam",
"link": "http://www.resplashed.com/photographer/sam/"
},
"tags": [
"People"
],
"imageUrl": "http://www.resplashed.com/img/400_0969cc43060c.jpg",
"filename": "400_0969cc43060c.jpg",
"imageHash": "f25bfe9910ab1c048ec846467a4c74da",
"price": 13.99,
"name": "Refined People Mug",
"description": "sequi aliquam sapiente quibusdam fugit consequuntur voluptatum sint reprehenderit est mollitia voluptas consequatur similique quibusdam dolorem rerum quis",
"slug": "Refined-People-Mug",
"added": 1482852590065,
"manufacturer": "Bayer-and-Sons",
"itemType": "mug",
"productImg": "mug-400_0969cc43060c.jpg"
},
{
"imageCredit": {
"artist": "Ma. Alejandra G",
"link": "http://www.resplashed.com/photographer/ma._alejandra_g/"
},
"tags": [
"Beach",
"Ocean"
],
"imageUrl": "http://www.resplashed.com/img/400_0a386dd2f7b1.jpg",
"filename": "400_0a386dd2f7b1.jpg",
"imageHash": "d6446b5bd637a1076fbacd979eb0076a",
"price": 13.99,
"name": "Practical Beach Mug",
"description": "dolorum quam nulla assumenda harum expedita est animi possimus a quod repellendus doloribus quae a in praesentium ut voluptatem quae esse consectetur et",
"slug": "Practical-Beach-Mug",
"added": 1483847156817,
"manufacturer": "Hodkiewicz-Inc",
"itemType": "mug",
"productImg": "mug-400_0a386dd2f7b1.jpg"
},
{
"imageCredit": {
"artist": "Christopher Skor",
"link": "http://www.resplashed.com/photographer/christopher_skor/"
},
"tags": [
"American",
"Sky",
"Patriotic",
"Flag"
],
"imageUrl": "http://www.resplashed.com/img/400_0a4d3ca524ea.jpg",
"filename": "400_0a4d3ca524ea.jpg",
"imageHash": "4a1ca3e7b37e1c3a8f1da9a5f42e95f3",
"price": 13.99,
"name": "Intelligent Patriotic Mug",
"description": "perspiciatis quia animi maxime modi non molestiae ab voluptas modi molestias non et sed repudiandae iste accusamus autem",
"slug": "Intelligent-Patriotic-Mug",
"added": 1479597182568,
"manufacturer": "Bayer-and-Sons",
"itemType": "mug",
"productImg": "mug-400_0a4d3ca524ea.jpg"
},
{
"imageCredit": {
"artist": "Jeff Sheldon",
"link": "http://www.resplashed.com/photographer/jeff_sheldon/"
},
"tags": [
"Desk",
"Office",
"Wood"
],
"imageUrl": "http://www.resplashed.com/img/400_0a5541b8888d.jpg",
"filename": "400_0a5541b8888d.jpg",
"imageHash": "f2e4dc3e6f1d7c7ed0f4f0f5ecde3a46",
"price": 16.99,
"name": "Unbranded Office Mug",
"description": "et qui sint modi expedita similique consequatur esse quis aliquam est aliquam architecto quidem rerum nihil",
"slug": "Unbranded-Office-Mug",
"added": 1481770180832,
"manufacturer": "Lowe-Wunsch-and-Stoltenberg",
"itemType": "mug",
"productImg": "mug-400_0a5541b8888d.jpg"
},
{
"imageCredit": {
"artist": "Jean-Marie Grange",
"link": "http://www.resplashed.com/photographer/jean-marie_grange/"
},
"tags": [
"City",
"Building"
],
"imageUrl": "http://www.resplashed.com/img/400_0b1a368eb748.jpg",
"filename": "400_0b1a368eb748.jpg",
"imageHash": "22165803b4df2ea0de9033b61d015ef9",
"price": 10.99,
"name": "Awesome City Mug",
"description": "sint voluptatem accusantium quae facilis ipsum numquam ut possimus eveniet quia autem repudiandae ipsa qui ratione molestiae id voluptatem sit",
"slug": "Awesome-City-Mug",
"added": 1479130102615,
"manufacturer": "Oberbrunner-Block-and-Mills",
"itemType": "mug",
"productImg": "mug-400_0b1a368eb748.jpg"
},
{
"imageCredit": {
"artist": "André Freitas",
"link": "http://www.resplashed.com/photographer/andr%C3%A9_freitas/"
},
"tags": [
"Mugs",
"Coffee",
"Wood"
],
"imageUrl": "http://www.resplashed.com/img/400_0b9d791fbfbc.jpg",
"filename": "400_0b9d791fbfbc.jpg",
"imageHash": "1815d77a53927677c53d86d0f416b955",
"price": 9.99,
"name": "Incredible Coffee Mug",
"description": "mollitia nostrum sequi aperiam quia nostrum aliquam expedita sint sit voluptatibus incidunt officia illum est doloribus",
"slug": "Incredible-Coffee-Mug",
"added": 1485255015871,
"manufacturer": "McCullough---Lueilwitz",
"itemType": "mug",
"productImg": "mug-400_0b9d791fbfbc.jpg"
},
{
"imageCredit": {
"artist": "Anders Jildén",
"link": "http://www.resplashed.com/photographer/anders_jild%C3%A9n/"
},
"tags": [
"Tree",
"Plant",
"Flowers"
],
"imageUrl": "http://www.resplashed.com/img/400_0bbf7812da25.jpg",
"filename": "400_0bbf7812da25.jpg",
"imageHash": "4fc40ce60eef41ab18c80f748879e9f9",
"price": 10.99,
"name": "Gorgeous Tree Mug",
"description": "ut enim et odit inventore sunt eos culpa incidunt laudantium magnam veniam sequi consequatur quia recusandae unde et incidunt quod et a",
"slug": "Gorgeous-Tree-Mug",
"added": 1477784601773,
"manufacturer": "Rice-Inc",
"itemType": "mug",
"productImg": "mug-400_0bbf7812da25.jpg"
},
{
"imageCredit": {
"artist": "Piotr Kwiatkowski",
"link": "http://www.resplashed.com/photographer/piotr_kwiatkowski/"
},
"tags": [
"Metal",
"Bridge",
"People"
],
"imageUrl": "http://www.resplashed.com/img/400_0be9d43a03cc.jpg",
"filename": "400_0be9d43a03cc.jpg",
"imageHash": "4b89c1588e23fc29c9a9369b1036a5ed",
"price": 17.99,
"name": "Fantastic Metal Mug",
"description": "qui minima et quibusdam accusantium facere doloribus culpa rerum eum accusamus nam",
"slug": "Fantastic-Metal-Mug",
"added": 1479359688647,
"manufacturer": "Boyle-LLC",
"itemType": "mug",
"productImg": "mug-400_0be9d43a03cc.jpg"
},
{
"imageCredit": {
"artist": "Alex Siale",
"link": "http://www.resplashed.com/photographer/alex_siale/"
},
"tags": [
"Nature",
"Ocean",
"Hillside"
],
"imageUrl": "http://www.resplashed.com/img/400_0c3a80d9f650.jpg",
"filename": "400_0c3a80d9f650.jpg",
"imageHash": "54ee68f3c87cf83f863ab53729145165",
"price": 14.99,
"name": "Licensed Hillside Mug",
"description": "ex corrupti vel esse perferendis non similique at quia voluptatem sit illo ut maiores et magni",
"slug": "Licensed-Hillside-Mug",
"added": 1485195149049,
"manufacturer": "Lowe-Wunsch-and-Stoltenberg",
"itemType": "mug",
"productImg": "mug-400_0c3a80d9f650.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Person",
"Raindrops",
"Hand"
],
"imageUrl": "http://www.resplashed.com/img/400_0c45f4b6518b.jpg",
"filename": "400_0c45f4b6518b.jpg",
"imageHash": "37d1bcc647554a153568000888046784",
"price": 10.99,
"name": "Intelligent Person Mug",
"description": "necessitatibus voluptas rerum ea ea pariatur aut enim nam voluptas voluptatem maxime dignissimos",
"slug": "Intelligent-Person-Mug",
"added": 1480379459639,
"manufacturer": "Bayer-and-Sons",
"itemType": "mug",
"productImg": "mug-400_0c45f4b6518b.jpg"
},
{
"imageCredit": {
"artist": "Geoffrey Arduini",
"link": "http://www.resplashed.com/photographer/geoffrey_arduini/"
},
"tags": [
"Snow",
"Chair lift",
"Ski",
"Snowboard",
"Mountain"
],
"imageUrl": "http://www.resplashed.com/img/400_0c52c54f2ffe.jpg",
"filename": "400_0c52c54f2ffe.jpg",
"imageHash": "525558b7e243e22e59355cb2023b10cd",
"price": 17.99,
"name": "Small Snow Mug",
"description": "laboriosam delectus accusamus aut aspernatur optio natus necessitatibus eos voluptas ut excepturi alias qui non et dolor in sint esse reprehenderit veniam consequatur",
"slug": "Small-Snow-Mug",
"added": 1486327799048,
"manufacturer": "Bayer-and-Sons",
"itemType": "mug",
"productImg": "mug-400_0c52c54f2ffe.jpg"
},
{
"imageCredit": {
"artist": "Oliver & Hen Pritchard-Barrett",
"link": "http://www.resplashed.com/photographer/oliver_%26_hen_pritchard-barrett/"
},
"tags": [
"Ocean",
"Waves"
],
"imageUrl": "http://www.resplashed.com/img/400_0c6f9f881f92.jpg",
"filename": "400_0c6f9f881f92.jpg",
"imageHash": "2b6a80b2c064a6c068754f5602fd7169",
"price": 17.99,
"name": "Intelligent Waves Mug",
"description": "aliquam odit iure porro facere ea adipisci laboriosam eligendi qui commodi officiis quia beatae dolorem ducimus aut et",
"slug": "Intelligent-Waves-Mug-1",
"added": 1479103379933,
"manufacturer": "Leuschke-Smith-and-Conroy",
"itemType": "mug",
"productImg": "mug-400_0c6f9f881f92.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Snow",
"Person",
"Reflection"
],
"imageUrl": "http://www.resplashed.com/img/400_0c86088784fd.jpg",
"filename": "400_0c86088784fd.jpg",
"imageHash": "5b83d7319b98f0064ca749fe8a00653f",
"price": 12.99,
"name": "Licensed Person Mug",
"description": "inventore ut dolores facilis soluta excepturi necessitatibus saepe et expedita omnis omnis nihil eos dignissimos harum sequi aliquid sed voluptatem illum porro",
"slug": "Licensed-Person-Mug",
"added": 1483379331438,
"manufacturer": "Metz---Kautzer",
"itemType": "mug",
"productImg": "mug-400_0c86088784fd.jpg"
},
{
"imageCredit": {
"artist": "Liam Andrew Cura",
"link": "http://www.resplashed.com/photographer/liam_andrew_cura/"
},
"tags": [
"Buildings",
"City"
],
"imageUrl": "http://www.resplashed.com/img/400_0ce2f1eedaab.jpg",
"filename": "400_0ce2f1eedaab.jpg",
"imageHash": "dc30fe53768eeecc76afe4a455959b7f",
"price": 20.99,
"name": "Handcrafted City Mug",
"description": "omnis nemo nisi praesentium cumque a est dolore distinctio porro asperiores ut non officia hic aut velit deleniti et nihil",
"slug": "Handcrafted-City-Mug",
"added": 1486194521970,
"manufacturer": "Bernier-Hane",
"itemType": "mug",
"productImg": "mug-400_0ce2f1eedaab.jpg"
},
{
"imageCredit": {
"artist": "Alexander Rotker",
"link": "http://www.resplashed.com/photographer/alexander_rotker/"
},
"tags": [
"Bridge",
"City"
],
"imageUrl": "http://www.resplashed.com/img/400_0d222f6aaeba.jpg",
"filename": "400_0d222f6aaeba.jpg",
"imageHash": "0f3f6be5402351c62b75e60e5c8c52b4",
"price": 15.99,
"name": "Intelligent Bridge Mug",
"description": "molestiae nostrum aliquid odit omnis id perspiciatis iure ut aperiam suscipit dolores",
"slug": "Intelligent-Bridge-Mug",
"added": 1484796278055,
"manufacturer": "Metz---Kautzer",
"itemType": "mug",
"productImg": "mug-400_0d222f6aaeba.jpg"
},
{
"imageCredit": {
"artist": "davide ragusa",
"link": "http://www.resplashed.com/photographer/davide_ragusa/"
},
"tags": [
"Architecture",
"Italy",
"Building"
],
"imageUrl": "http://www.resplashed.com/img/400_0d4cdf3af4bd.jpg",
"filename": "400_0d4cdf3af4bd.jpg",
"imageHash": "717df03e42a3925fc88d47b5b2c04612",
"price": 19.99,
"name": "Refined Building Mug",
"description": "et dolorum rerum provident nobis ipsam delectus qui et cupiditate est aut et",
"slug": "Refined-Building-Mug",
"added": 1485727487020,
"manufacturer": "Feil-Dooley-and-Reinger",
"itemType": "mug",
"productImg": "mug-400_0d4cdf3af4bd.jpg"
},
{
"imageCredit": {
"artist": "Drew Collins",
"link": "http://www.resplashed.com/photographer/drew_collins/"
},
"tags": [
"Sky",
"Night",
"Stars"
],
"imageUrl": "http://www.resplashed.com/img/400_0dc97e4f278b.jpg",
"filename": "400_0dc97e4f278b.jpg",
"imageHash": "071d989c40f8ae491029108bc65819e5",
"price": 18.99,
"name": "Practical Stars Mug",
"description": "fugit facere facilis laborum rerum culpa nulla nesciunt et ex error unde",
"slug": "Practical-Stars-Mug",
"added": 1483437823499,
"manufacturer": "Heathcote-Kautzer-and-Turner",
"itemType": "mug",
"productImg": "mug-400_0dc97e4f278b.jpg"
},
{
"imageCredit": {
"artist": "Zwaddi",
"link": "http://www.resplashed.com/photographer/zwaddi/"
},
"tags": [
"Fog",
"Forest"
],
"imageUrl": "http://www.resplashed.com/img/400_0e33407e3d59.jpg",
"filename": "400_0e33407e3d59.jpg",
"imageHash": "e6c5dbceb9aa800f8961176b17d97bdb",
"price": 10.99,
"name": "Small Forest Mug",
"description": "doloribus est odio nam magnam sed alias vitae sed non voluptates necessitatibus optio id voluptatem laborum aperiam quia est mollitia repellat accusamus",
"slug": "Small-Forest-Mug",
"added": 1480056059539,
"manufacturer": "Konopelski-Inc",
"itemType": "mug",
"productImg": "mug-400_0e33407e3d59.jpg"
}
]
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment