diff --git a/src/main/java/org/comixedproject/metadata/marvel/MarvelMetadataAdaptor.java b/src/main/java/org/comixedproject/metadata/marvel/MarvelMetadataAdaptor.java index 21440dc..a2a0e37 100644 --- a/src/main/java/org/comixedproject/metadata/marvel/MarvelMetadataAdaptor.java +++ b/src/main/java/org/comixedproject/metadata/marvel/MarvelMetadataAdaptor.java @@ -27,10 +27,7 @@ import lombok.extern.log4j.Log4j2; import org.comixedproject.metadata.MetadataException; import org.comixedproject.metadata.adaptors.AbstractMetadataAdaptor; -import org.comixedproject.metadata.marvel.actions.AbstractMarvelScrapingAction; -import org.comixedproject.metadata.marvel.actions.MarvelGetIssueAction; -import org.comixedproject.metadata.marvel.actions.MarvelGetIssueDetailsAction; -import org.comixedproject.metadata.marvel.actions.MarvelGetVolumesAction; +import org.comixedproject.metadata.marvel.actions.*; import org.comixedproject.metadata.model.IssueDetailsMetadata; import org.comixedproject.metadata.model.IssueMetadata; import org.comixedproject.metadata.model.VolumeMetadata; @@ -54,6 +51,7 @@ public class MarvelMetadataAdaptor extends AbstractMetadataAdaptor { MarvelGetVolumesAction getVolumesAction = new MarvelGetVolumesAction(); MarvelGetIssueAction getIssueAction = new MarvelGetIssueAction(); MarvelGetIssueDetailsAction getIssueDetailsAction = new MarvelGetIssueDetailsAction(); + MarvelGetAllIssuesAction getAllIssuesAction = new MarvelGetAllIssuesAction(); public MarvelMetadataAdaptor() { super("ComiXed Marvel Scraper", PROVIDER_NAME); @@ -80,33 +78,42 @@ public List getVolumes( final String seriesName, final Integer maxRecords, final MetadataSource metadataSource) throws MetadataException { log.debug("Fetching volumes from Marvel: name={}", seriesName); - getVolumesAction.setSeries(seriesName); getVolumesAction.setMaxRecords(maxRecords); doSetCommonProperties(getVolumesAction, metadataSource); - log.debug("Executing action"); + log.debug("Getting all volumes"); return getVolumesAction.execute(); } @Override public List getAllIssues( - final String volume, final MetadataSource metadataSource) throws MetadataException { - return List.of(); + final String seriesId, final MetadataSource metadataSource) throws MetadataException { + log.debug("Setting series id: {}", seriesId); + this.getAllIssuesAction.setSeriesId(seriesId); + + doSetCommonProperties(getAllIssuesAction, metadataSource); + + log.debug("Getting all issues for series"); + return this.getAllIssuesAction.execute(); } @Override public IssueDetailsMetadata getIssueDetails( final String issueId, final MetadataSource metadataSource) throws MetadataException { + log.debug("Setting issue id: {}:", issueId); this.getIssueDetailsAction.setComicId(issueId); + this.doSetCommonProperties(this.getIssueDetailsAction, metadataSource); + + log.debug("Getting issue details"); return this.getIssueDetailsAction.execute(); } @Override public String getReferenceId(final String webAddress) { - + log.debug("Parsing web addresss: {}", webAddress); final Pattern pattern = Pattern.compile(REFERENCE_ID_PATTERN); final Matcher matches = pattern.matcher(webAddress); String referenceId = null; diff --git a/src/main/java/org/comixedproject/metadata/marvel/actions/AbstractMarvelScrapingAction.java b/src/main/java/org/comixedproject/metadata/marvel/actions/AbstractMarvelScrapingAction.java index 1e7c51f..e579cbe 100644 --- a/src/main/java/org/comixedproject/metadata/marvel/actions/AbstractMarvelScrapingAction.java +++ b/src/main/java/org/comixedproject/metadata/marvel/actions/AbstractMarvelScrapingAction.java @@ -21,6 +21,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; import java.util.Optional; import lombok.Getter; import lombok.Setter; @@ -87,13 +88,24 @@ protected String doCreateUrl(final String path, final String parameters) { .getHashForRequest(timestamp, publicKey, privateKey)); } - protected Date doConverDate(final Optional date) { - if (date.isEmpty()) return null; - try { - return dateFormat.parse(date.get().getDate()); - } catch (ParseException error) { - log.error("Failed to parse date", error); - return null; + protected Date getCoverDate(final List dates) { + return this.findDate("focDate", dates); + } + + protected Date getStoreDate(final List dates) { + return this.findDate("onsaleDate", dates); + } + + private Date findDate(final String dateType, final List dates) { + final Optional result = + dates.stream().filter(entry -> entry.getType().equals(dateType)).findFirst(); + if (result.isPresent()) { + try { + return dateFormat.parse(result.get().getDate()); + } catch (ParseException error) { + log.error("Failed to parse date", error); + } } + return null; } } diff --git a/src/main/java/org/comixedproject/metadata/marvel/actions/MarvelGetAllIssuesAction.java b/src/main/java/org/comixedproject/metadata/marvel/actions/MarvelGetAllIssuesAction.java new file mode 100644 index 0000000..b17c686 --- /dev/null +++ b/src/main/java/org/comixedproject/metadata/marvel/actions/MarvelGetAllIssuesAction.java @@ -0,0 +1,102 @@ +/* + * ComiXed - A digital comic book library management application. + * Copyright (C) 2024, The ComiXed Project + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package org.comixedproject.metadata.marvel.actions; + +import static org.comixedproject.metadata.marvel.MarvelMetadataAdaptor.PUBLISHER_NAME; + +import java.util.ArrayList; +import java.util.List; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.log4j.Log4j2; +import org.apache.commons.lang3.StringUtils; +import org.comixedproject.metadata.MetadataException; +import org.comixedproject.metadata.marvel.models.MarvelGetAllIssuesQueryResponse; +import org.comixedproject.metadata.model.IssueDetailsMetadata; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +/** + * MarvelGetAllIssuesAction retrieves the metadata for all comics for a given volume. + * + * @author Darryl L. Pierce + */ +@Log4j2 +public class MarvelGetAllIssuesAction + extends AbstractMarvelScrapingAction> { + // URL: + // https://gateway.marvel.com:443/v1/public/series/2069/comics?noVariants=true&apikey=763df8a7c3c0f6d3bb7fcf088bbf6ee1 + + @Getter @Setter private String seriesId; + + @Override + public List execute() throws MetadataException { + this.doCheckSetup(); + + if (StringUtils.isBlank(this.seriesId)) throw new MetadataException("Missing series id"); + + final List result = new ArrayList<>(); + boolean done = false; + + while (!done) { + log.trace("Generating request URL: series id={}", this.seriesId); + final String url = + this.doCreateUrl(String.format("series/%s/comics", this.seriesId), "noVariants=true"); + final WebClient client = this.createWebClient(url); + final Mono request = + client.get().uri(url).retrieve().bodyToMono(MarvelGetAllIssuesQueryResponse.class); + MarvelGetAllIssuesQueryResponse response = null; + + try { + response = request.block(); + } catch (Exception error) { + throw new MetadataException("Failed to get response", error); + } + + if (response == null) { + throw new MetadataException("Failed to receive response"); + } + + log.debug("Received: {} volume(s)", response.getData().getResults().size()); + response + .getData() + .getResults() + .forEach( + issue -> { + log.trace("Processing volume record: {} name={}", issue.getId(), issue.getTitle()); + final IssueDetailsMetadata entry = new IssueDetailsMetadata(); + entry.setSourceId(issue.getId()); + entry.setPublisher(PUBLISHER_NAME); + entry.setSeries(issue.getSeries().getName()); + entry.setIssueNumber(issue.getIssueNumber()); + // TODO get the start year + // entry.setVolume(issue.getStartYear()); + entry.setVolume(""); + entry.setTitle(issue.getTitle()); + entry.setCoverDate(this.getCoverDate(issue.getDates())); + entry.setStoreDate(this.getStoreDate(issue.getDates())); + result.add(entry); + }); + done = isDone(response); + } + + log.debug("Returning {} volume(s)", result.size()); + return result; + } +} diff --git a/src/main/java/org/comixedproject/metadata/marvel/actions/MarvelGetIssueAction.java b/src/main/java/org/comixedproject/metadata/marvel/actions/MarvelGetIssueAction.java index f9b55d8..cebbe5d 100644 --- a/src/main/java/org/comixedproject/metadata/marvel/actions/MarvelGetIssueAction.java +++ b/src/main/java/org/comixedproject/metadata/marvel/actions/MarvelGetIssueAction.java @@ -84,16 +84,8 @@ public List execute() throws MetadataException { metadata.setVolumeName(issue.getSeries().getName()); metadata.setIssueNumber(issue.getIssueNumber()); metadata.setDescription(issue.getDescription()); - metadata.setCoverDate( - this.doConverDate( - issue.getDates().stream() - .filter(date -> date.getType().equals("onsaleDate")) - .findFirst())); - metadata.setCoverDate( - this.doConverDate( - issue.getDates().stream() - .filter(date -> date.getType().equals("onsaleDate")) - .findFirst())); + metadata.setCoverDate(this.getCoverDate(issue.getDates())); + metadata.setStoreDate(this.getStoreDate(issue.getDates())); metadata.setCoverUrl( String.format( "%s.%s", diff --git a/src/main/java/org/comixedproject/metadata/marvel/actions/MarvelGetIssueDetailsAction.java b/src/main/java/org/comixedproject/metadata/marvel/actions/MarvelGetIssueDetailsAction.java index 5dfab01..c445221 100644 --- a/src/main/java/org/comixedproject/metadata/marvel/actions/MarvelGetIssueDetailsAction.java +++ b/src/main/java/org/comixedproject/metadata/marvel/actions/MarvelGetIssueDetailsAction.java @@ -18,7 +18,6 @@ package org.comixedproject.metadata.marvel.actions; -import java.text.ParseException; import java.util.Optional; import lombok.Getter; import lombok.Setter; @@ -26,7 +25,6 @@ import org.apache.commons.lang3.StringUtils; import org.comixedproject.metadata.MetadataException; import org.comixedproject.metadata.marvel.MarvelMetadataAdaptor; -import org.comixedproject.metadata.marvel.models.MarvelDate; import org.comixedproject.metadata.marvel.models.MarvelGetIssueQueryResponse; import org.comixedproject.metadata.marvel.models.MarvelGetIssueRecord; import org.comixedproject.metadata.marvel.models.MarvelUrl; @@ -81,27 +79,8 @@ public IssueDetailsMetadata execute() throws MetadataException { result.setSeries(detail.getSeries().getName()); // TODO where to get the volume result.setVolume(?); result.setIssueNumber(detail.getIssueNumber()); - - Optional date = - detail.getDates().stream().filter(entry -> entry.getType().equals("focDate")).findFirst(); - if (date.isEmpty()) { - try { - result.setCoverDate(dateFormat.parse(date.get().getDate())); - } catch (ParseException error) { - log.error("Failed to parse cover date", error); - } - } - date = - detail.getDates().stream() - .filter(entry -> entry.getType().equals("onsaleDate")) - .findFirst(); - if (date.isPresent()) { - try { - result.setStoreDate(dateFormat.parse(date.get().getDate())); - } catch (ParseException error) { - log.error("Failed to parse store date", error); - } - } + result.setCoverDate(this.getCoverDate(detail.getDates())); + result.setStoreDate(this.getStoreDate(detail.getDates())); result.setDescription(detail.getDescription()); Optional address = detail.getUrls().stream().filter(entry -> entry.getType().equals(("detail"))).findFirst(); diff --git a/src/main/java/org/comixedproject/metadata/marvel/models/MarvelGetAllIssuesQueryResponse.java b/src/main/java/org/comixedproject/metadata/marvel/models/MarvelGetAllIssuesQueryResponse.java new file mode 100644 index 0000000..3ab6bf7 --- /dev/null +++ b/src/main/java/org/comixedproject/metadata/marvel/models/MarvelGetAllIssuesQueryResponse.java @@ -0,0 +1,28 @@ +/* + * ComiXed - A digital comic book library management application. + * Copyright (C) 2024, The ComiXed Project + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package org.comixedproject.metadata.marvel.models; + +/** + * MarvelGetAllIssuesQueryResponse represents the response body when retrieving all + * issues for a series. + * + * @author Darryl L. Pierce + */ +public class MarvelGetAllIssuesQueryResponse + extends BaseMarvelResponse {} diff --git a/src/main/java/org/comixedproject/metadata/marvel/models/MarvelIssueDetailRecord.java b/src/main/java/org/comixedproject/metadata/marvel/models/MarvelIssueDetailRecord.java index 043400c..5fc87cc 100644 --- a/src/main/java/org/comixedproject/metadata/marvel/models/MarvelIssueDetailRecord.java +++ b/src/main/java/org/comixedproject/metadata/marvel/models/MarvelIssueDetailRecord.java @@ -67,6 +67,7 @@ public class MarvelIssueDetailRecord { @JsonProperty("creators") @Getter private List creators; + /* TODO the following need fleshing out @JsonProperty("characters") @Getter private List characters; @JsonProperty("stories") @Getter private List stories; diff --git a/src/main/java/org/comixedproject/metadata/marvel/models/MarvelSeriesIssueCreators.java b/src/main/java/org/comixedproject/metadata/marvel/models/MarvelSeriesIssueCreators.java new file mode 100644 index 0000000..9c59907 --- /dev/null +++ b/src/main/java/org/comixedproject/metadata/marvel/models/MarvelSeriesIssueCreators.java @@ -0,0 +1,43 @@ +/* + * ComiXed - A digital comic book library management application. + * Copyright (C) 2024, The ComiXed Project + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package org.comixedproject.metadata.marvel.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import lombok.Getter; + +/** + * MarvelSeriesIssueCreators represents all credits for a single issue when scraping a + * series. + * + * @author Darryl L. Pierc + */ +public class MarvelSeriesIssueCreators { + @JsonProperty("available") + @Getter + private int available; + + @JsonProperty("collectionURI") + @Getter + private String collectionURI; + + @JsonProperty("items") + @Getter + private List items; +} diff --git a/src/main/java/org/comixedproject/metadata/marvel/models/MarvelSeriesIssueDetailRecord.java b/src/main/java/org/comixedproject/metadata/marvel/models/MarvelSeriesIssueDetailRecord.java new file mode 100644 index 0000000..8e14728 --- /dev/null +++ b/src/main/java/org/comixedproject/metadata/marvel/models/MarvelSeriesIssueDetailRecord.java @@ -0,0 +1,75 @@ +/* + * ComiXed - A digital comic book library management application. + * Copyright (C) 2024, The ComiXed Project + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package org.comixedproject.metadata.marvel.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import lombok.Getter; + +/** + * MarvelSeriesIssueDetailRecord represents a single record when scraping an entire + * series. + * + * @author Darryl L. Pierce + */ +public class MarvelSeriesIssueDetailRecord { + @JsonProperty("id") + @Getter + private String id; + + @JsonProperty("title") + @Getter + private String title; + + @JsonProperty("issueNumber") + @Getter + private String issueNumber; + + @JsonProperty("description") + @Getter + private String description; + + @JsonProperty("urls") + @Getter + private List urls; + + @JsonProperty("series") + @Getter + private MarvelSeries series; + + @JsonProperty("dates") + @Getter + private List dates; + + @JsonProperty("thumbnail") + @Getter + private MarvelThumbnail thumbnail; + + @JsonProperty("images") + @Getter + private List images; + + @JsonProperty("creators") + @Getter + private MarvelSeriesIssueCreators creators; + + /* + @JsonProperty("characters") @Getter private List characters; + @JsonProperty("stories") @Getter private List stories; + */ } diff --git a/src/test/java/org/comixedproject/metadata/marvel/MarvelMetadataAdaptorTest.java b/src/test/java/org/comixedproject/metadata/marvel/MarvelMetadataAdaptorTest.java index 8c52df8..89d49db 100644 --- a/src/test/java/org/comixedproject/metadata/marvel/MarvelMetadataAdaptorTest.java +++ b/src/test/java/org/comixedproject/metadata/marvel/MarvelMetadataAdaptorTest.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Set; import org.comixedproject.metadata.MetadataException; +import org.comixedproject.metadata.marvel.actions.MarvelGetAllIssuesAction; import org.comixedproject.metadata.marvel.actions.MarvelGetIssueAction; import org.comixedproject.metadata.marvel.actions.MarvelGetIssueDetailsAction; import org.comixedproject.metadata.marvel.actions.MarvelGetVolumesAction; @@ -47,7 +48,7 @@ public class MarvelMetadataAdaptorTest { private static final Integer TEST_MAX_RECORDS = 1000; private static final String TEST_SERIES = "The Series"; - private static final String TEST_VOLUME = "12345"; + private static final String TEST_SERIES_ID = "12345"; private static final String TEST_ISSUE_NUMBER = "17"; private static final String TEST_ISSUE_ID = "67890"; private static final String TEST_REFERENCE_ID = "97135"; @@ -62,11 +63,13 @@ public class MarvelMetadataAdaptorTest { @Mock private MarvelGetVolumesAction getVolumesAction; @Mock private MarvelGetIssueAction getIssueAction; @Mock private MarvelGetIssueDetailsAction getIssueDetailsAction; + @Mock private MarvelGetAllIssuesAction getAllIssuesAction; @Mock private MetadataSource metadataSource; @Mock private List volumeList; @Mock private IssueMetadata issue; @Mock private IssueDetailsMetadata issueDetailsMetadata; + @Mock private List allIssues; final Set metadataSourceProperties = new HashSet<>(); @@ -92,12 +95,13 @@ public void testDoGetIssue() throws MetadataException { Mockito.when(getIssueAction.execute()).thenReturn(issueList); - final IssueMetadata result = adaptor.doGetIssue(TEST_VOLUME, TEST_ISSUE_NUMBER, metadataSource); + final IssueMetadata result = + adaptor.doGetIssue(TEST_SERIES_ID, TEST_ISSUE_NUMBER, metadataSource); assertNotNull(result); assertSame(issue, result); - Mockito.verify(getIssueAction, Mockito.times(1)).setSeries(TEST_VOLUME); + Mockito.verify(getIssueAction, Mockito.times(1)).setSeries(TEST_SERIES_ID); Mockito.verify(getIssueAction, Mockito.times(1)).setIssueNumber(TEST_ISSUE_NUMBER); Mockito.verify(getIssueAction, Mockito.times(1)).setPublicKey(TEST_PUBLIC_KEY); Mockito.verify(getIssueAction, Mockito.times(1)).setPrivateKey(TEST_PRIVATE_KEY); @@ -119,9 +123,13 @@ public void testGetVolumes() throws MetadataException { @Test public void testGetAllIssues() throws MetadataException { - final List result = adaptor.getAllIssues(TEST_VOLUME, metadataSource); + Mockito.when(getAllIssuesAction.execute()).thenReturn(allIssues); + + final List result = adaptor.getAllIssues(TEST_SERIES_ID, metadataSource); assertNotNull(result); + + Mockito.verify(getAllIssuesAction, Mockito.times(1)).setSeriesId(TEST_SERIES_ID); } @Test diff --git a/src/test/java/org/comixedproject/metadata/marvel/actions/MarvelGetAllIssuesActionTest.java b/src/test/java/org/comixedproject/metadata/marvel/actions/MarvelGetAllIssuesActionTest.java new file mode 100644 index 0000000..c02f54e --- /dev/null +++ b/src/test/java/org/comixedproject/metadata/marvel/actions/MarvelGetAllIssuesActionTest.java @@ -0,0 +1,111 @@ +/* + * ComiXed - A digital comic book library management application. + * Copyright (C) 2024, The ComiXed Project + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package org.comixedproject.metadata.marvel.actions; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.util.List; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import org.comixedproject.metadata.MetadataException; +import org.comixedproject.metadata.model.IssueDetailsMetadata; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; + +@RunWith(MockitoJUnitRunner.class) +public class MarvelGetAllIssuesActionTest { + private static final String TEST_SERIES_ID = "2069"; + private static final String TEST_PUBLIC_KEY = "The.Public.Key"; + private static final String TEST_PRIVATE_KEY = "The.Private.Key"; + private static final String TEST_BAD_RESPONSE = "This is not good data"; + private static final String TEST_GOOD_RESPONSE = + "{\"code\":200,\"status\":\"Ok\",\"copyright\":\"© 2024 MARVEL\",\"attributionText\":\"Data provided by Marvel. © 2024 MARVEL\",\"attributionHTML\":\"Data provided by Marvel. © 2024 MARVEL\",\"etag\":\"5fea672058c29c0a58cc4761bb91b7edd03cbf60\",\"data\":{\"offset\":0,\"limit\":20,\"total\":20,\"count\":20,\"results\":[{\"id\":10864,\"digitalId\":58756,\"title\":\"Spider-Man (1990) #98\",\"issueNumber\":98,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"2021-11-18T00:10:33-0500\",\"isbn\":\"\",\"upc\":\"759606013211009811\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":0,\"textObjects\":[{\"type\":\"issue_solicit_text\",\"language\":\"en-us\",\"text\":\"Mister Fantastic saves Aunt May from Osborn’s doomsday device. \"}],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10864\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10864/spider-man_1990_98?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"},{\"type\":\"reader\",\"url\":\"http://marvel.com/digitalcomics/view.htm?iid=58756&utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-11-01T00:00:00-0500\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"},{\"type\":\"unlimitedDate\",\"date\":\"2021-11-18T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/3/a0/619575b272fb3\",\"extension\":\"jpg\"},\"images\":[{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/3/a0/619575b272fb3\",\"extension\":\"jpg\"}],\"creators\":{\"available\":5,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10864/creators\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/362\",\"name\":\"Scott Hanna\",\"role\":\"inker\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/1286\",\"name\":\"Howard Mackie\",\"role\":\"writer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/13196\",\"name\":\"John Romita Jr.\",\"role\":\"penciler\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/350\",\"name\":\"Richard Starkings\",\"role\":\"letterer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/5237\",\"name\":\"Gregory Wright\",\"role\":\"colorist\"}],\"returned\":5},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10864/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":4,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10864/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23942\",\"name\":\"Cover #23942\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23943\",\"name\":\"Cover #23943\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23944\",\"name\":\"The Final Chapter (Part 4 of 4)\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23945\",\"name\":\"Crawl Space\",\"type\":\"letters\"}],\"returned\":4},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10864/events\",\"items\":[],\"returned\":0}},{\"id\":10863,\"digitalId\":58755,\"title\":\"Spider-Man (1990) #97\",\"issueNumber\":97,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"2021-11-18T00:09:53-0500\",\"isbn\":\"\",\"upc\":\"759606013211009711\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":0,\"textObjects\":[{\"type\":\"issue_solicit_text\",\"language\":\"en-us\",\"text\":\"This is it. A souped up Green Goblin unleashes vengeance on Spider-Man.\"}],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10863\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10863/spider-man_1990_97?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"},{\"type\":\"reader\",\"url\":\"http://marvel.com/digitalcomics/view.htm?iid=58755&utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-11-01T00:00:00-0500\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"},{\"type\":\"unlimitedDate\",\"date\":\"2021-11-18T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/6/a0/619575b1ec7c3\",\"extension\":\"jpg\"},\"images\":[{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/6/a0/619575b1ec7c3\",\"extension\":\"jpg\"}],\"creators\":{\"available\":5,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10863/creators\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/362\",\"name\":\"Scott Hanna\",\"role\":\"inker\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/1286\",\"name\":\"Howard Mackie\",\"role\":\"writer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/13196\",\"name\":\"John Romita Jr.\",\"role\":\"penciler\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/350\",\"name\":\"Richard Starkings\",\"role\":\"letterer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/5237\",\"name\":\"Gregory Wright\",\"role\":\"colorist\"}],\"returned\":5},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10863/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":4,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10863/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23938\",\"name\":\"Cover #23938\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23939\",\"name\":\"Let the Heavens Tremble at the Power of the Goblin! (The Final Chapter, Part 2 of 4)\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23940\",\"name\":\"Crawl Space\",\"type\":\"letters\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23941\",\"name\":\"Statement of Ownership\",\"type\":\"statement of ownership\"}],\"returned\":4},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10863/events\",\"items\":[],\"returned\":0}},{\"id\":10862,\"digitalId\":58754,\"title\":\"Spider-Man (1990) #96\",\"issueNumber\":96,\"variantDescription\":\"\",\"description\":\"Madame Web has her own vision for Peter Parker’s life. And maybe an answer or two on how to deal with Green Goblin...\",\"modified\":\"2021-11-18T00:09:18-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":36,\"textObjects\":[{\"type\":\"issue_solicit_text\",\"language\":\"en-us\",\"text\":\"Madame Web has her own vision for Peter Parker’s life. And maybe an answer or two on how to deal with Green Goblin...\"}],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10862\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10862/spider-man_1990_96?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"},{\"type\":\"reader\",\"url\":\"http://marvel.com/digitalcomics/view.htm?iid=58754&utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-09-10T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"},{\"type\":\"unlimitedDate\",\"date\":\"2021-11-18T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":1.99}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/3/a0/619575d1155dd\",\"extension\":\"jpg\"},\"images\":[{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/3/a0/619575d1155dd\",\"extension\":\"jpg\"}],\"creators\":{\"available\":11,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10862/creators\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/807\",\"name\":\"Comicraft\",\"role\":\"letterer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/2529\",\"name\":\"Liz Agraphiotis\",\"role\":\"letterer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/350\",\"name\":\"Richard Starkings\",\"role\":\"letterer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/362\",\"name\":\"Scott Hanna\",\"role\":\"inker\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/375\",\"name\":\"Bob Harras\",\"role\":\"editor\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/4131\",\"name\":\"Matt Hicks\",\"role\":\"editor\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/1282\",\"name\":\"Ralph Macchio\",\"role\":\"editor\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/1286\",\"name\":\"Howard Mackie\",\"role\":\"writer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/3919\",\"name\":\"Atomic Paintbrush\",\"role\":\"colorist\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/5237\",\"name\":\"Gregory Wright\",\"role\":\"colorist\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/13196\",\"name\":\"John Romita Jr.\",\"role\":\"penciller (cover)\"}],\"returned\":11},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10862/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":3,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10862/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23935\",\"name\":\"Cover #23935\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23936\",\"name\":\"Who Was Joey Z?\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23937\",\"name\":\"Crawl Space\",\"type\":\"letters\"}],\"returned\":3},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10862/events\",\"items\":[],\"returned\":0}},{\"id\":10861,\"digitalId\":0,\"title\":\"Spider-Man (1990) #95\",\"issueNumber\":95,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"-0001-11-30T00:00:00-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":36,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10861\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10861/spider-man_1990_95?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-09-01T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available\",\"extension\":\"jpg\"},\"images\":[],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10861/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10861/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":3,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10861/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23932\",\"name\":\"Cover #23932\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23933\",\"name\":\"Free Fall\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23934\",\"name\":\"Crawl Space\",\"type\":\"letters\"}],\"returned\":3},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10861/events\",\"items\":[],\"returned\":0}},{\"id\":10860,\"digitalId\":0,\"title\":\"Spider-Man (1990) #94\",\"issueNumber\":94,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"-0001-11-30T00:00:00-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":0,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10860\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10860/spider-man_1990_94?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-08-01T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available\",\"extension\":\"jpg\"},\"images\":[],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10860/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10860/characters\",\"items\":[],\"returned\":0},\"stories\":{\"available\":3,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10860/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23931\",\"name\":\"\",\"type\":\"\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/67035\",\"name\":\"Spider-Man 94 cover\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/153330\",\"name\":\"story from Spider-Man (1990) #94\",\"type\":\"interiorStory\"}],\"returned\":3},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10860/events\",\"items\":[],\"returned\":0}},{\"id\":10859,\"digitalId\":0,\"title\":\"Spider-Man (1990) #93\",\"issueNumber\":93,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"-0001-11-30T00:00:00-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":36,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10859\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10859/spider-man_1990_93?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-07-01T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available\",\"extension\":\"jpg\"},\"images\":[],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10859/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10859/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":3,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10859/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23928\",\"name\":\"Cover #23928\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23929\",\"name\":\"Reborn Again\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23930\",\"name\":\"Crawl Space\",\"type\":\"letters\"}],\"returned\":3},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10859/events\",\"items\":[],\"returned\":0}},{\"id\":10858,\"digitalId\":47308,\"title\":\"Spider-Man (1990) #92\",\"issueNumber\":92,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"2021-11-18T00:05:57-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":0,\"textObjects\":[{\"type\":\"issue_solicit_text\",\"language\":\"en-us\",\"text\":\"Spider-Man is \\\"stuck in the middle” as his battle with the Trapster continues.\"}],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10858\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10858/spider-man_1990_92?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"},{\"type\":\"reader\",\"url\":\"http://marvel.com/digitalcomics/view.htm?iid=47308&utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-06-01T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"},{\"type\":\"unlimitedDate\",\"date\":\"2021-11-18T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/d/f0/619575b187119\",\"extension\":\"jpg\"},\"images\":[{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/d/f0/619575b187119\",\"extension\":\"jpg\"}],\"creators\":{\"available\":2,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10858/creators\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/1286\",\"name\":\"Howard Mackie\",\"role\":\"writer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/13196\",\"name\":\"John Romita Jr.\",\"role\":\"penciller (cover)\"}],\"returned\":2},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10858/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":3,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10858/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23925\",\"name\":\"Cover #23925\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23926\",\"name\":\"Stuck in the Middle with You! (Identity Crisis [Part 2])\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23927\",\"name\":\"Crawl Space\",\"type\":\"letters\"}],\"returned\":3},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10858/events\",\"items\":[],\"returned\":0}},{\"id\":10857,\"digitalId\":47307,\"title\":\"Spider-Man (1990) #91\",\"issueNumber\":91,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"2021-11-18T00:05:21-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":0,\"textObjects\":[{\"type\":\"issue_solicit_text\",\"language\":\"en-us\",\"text\":\"Peter Parker is undergoing an “Identity Crisis,” and a run-in with the Trapster and Shocker doesn’t make things any easier.\"}],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10857\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10857/spider-man_1990_91?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"},{\"type\":\"reader\",\"url\":\"http://marvel.com/digitalcomics/view.htm?iid=47307&utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-05-01T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"},{\"type\":\"unlimitedDate\",\"date\":\"2021-11-18T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/1/10/619575b16f457\",\"extension\":\"jpg\"},\"images\":[{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/1/10/619575b16f457\",\"extension\":\"jpg\"}],\"creators\":{\"available\":2,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10857/creators\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/1286\",\"name\":\"Howard Mackie\",\"role\":\"writer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/13196\",\"name\":\"John Romita Jr.\",\"role\":\"penciller (cover)\"}],\"returned\":2},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10857/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":4,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10857/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23921\",\"name\":\"Cover #23921\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23922\",\"name\":\"Cover #23922\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23923\",\"name\":\"Undercover (Identity Crisis [Part 1])\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23924\",\"name\":\"Crawl Space\",\"type\":\"letters\"}],\"returned\":4},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10857/events\",\"items\":[],\"returned\":0}},{\"id\":10856,\"digitalId\":47230,\"title\":\"Spider-Man (1990) #90\",\"issueNumber\":90,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"2021-11-18T00:02:46-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":0,\"textObjects\":[{\"type\":\"issue_solicit_text\",\"language\":\"en-us\",\"text\":\"What does a cosmic enemy like Blastaar want with a Friendly Neighborhood Wall-Crawler? Find out here.\"}],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10856\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10856/spider-man_1990_90?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"},{\"type\":\"reader\",\"url\":\"http://marvel.com/digitalcomics/view.htm?iid=47230&utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-04-01T00:00:00-0500\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"},{\"type\":\"unlimitedDate\",\"date\":\"2021-11-18T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/e/20/6195759716c15\",\"extension\":\"jpg\"},\"images\":[{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/e/20/6195759716c15\",\"extension\":\"jpg\"}],\"creators\":{\"available\":2,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10856/creators\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/1286\",\"name\":\"Howard Mackie\",\"role\":\"writer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/13196\",\"name\":\"John Romita Jr.\",\"role\":\"penciller (cover)\"}],\"returned\":2},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10856/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":3,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10856/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23918\",\"name\":\"Cover #23918\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23919\",\"name\":\"It Started on Yancy Street ... Again!\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23920\",\"name\":\"Crawl Space\",\"type\":\"letters\"}],\"returned\":3},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10856/events\",\"items\":[],\"returned\":0}},{\"id\":10854,\"digitalId\":47229,\"title\":\"Spider-Man (1990) #89\",\"issueNumber\":89,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"2021-11-18T11:48:58-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":0,\"textObjects\":[{\"type\":\"issue_solicit_text\",\"language\":\"en-us\",\"text\":\"Guest-starring Punisher! Spider-Man is pulled into a “spider-hunt” when he becomes the criminal world’s Most Wanted.\"}],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10854\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10854/spider-man_1990_89?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"},{\"type\":\"reader\",\"url\":\"http://marvel.com/digitalcomics/view.htm?iid=47229&utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-03-01T00:00:00-0500\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"},{\"type\":\"unlimitedDate\",\"date\":\"2021-11-18T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/e/a0/6195759717c94\",\"extension\":\"jpg\"},\"images\":[{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/e/a0/6195759717c94\",\"extension\":\"jpg\"}],\"creators\":{\"available\":2,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10854/creators\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/1286\",\"name\":\"Howard Mackie\",\"role\":\"writer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/13196\",\"name\":\"John Romita Jr.\",\"role\":\"penciller (cover)\"}],\"returned\":2},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10854/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":4,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10854/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23913\",\"name\":\"Cover #23913\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23914\",\"name\":\"Cover #23914\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23915\",\"name\":\"Spider, Spider (Spiderhunt, Part 3)\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23916\",\"name\":\"Crawl Space\",\"type\":\"letters\"}],\"returned\":4},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10854/events\",\"items\":[],\"returned\":0}},{\"id\":10853,\"digitalId\":47228,\"title\":\"Spider-Man (1990) #88\",\"issueNumber\":88,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"2021-11-18T11:47:41-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":0,\"textObjects\":[{\"type\":\"issue_solicit_text\",\"language\":\"en-us\",\"text\":\"An aspect of Green Goblin haunts Spider-Man in a ghoulish fray.\"}],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10853\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10853/spider-man_1990_88?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"},{\"type\":\"reader\",\"url\":\"http://marvel.com/digitalcomics/view.htm?iid=47228&utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-02-01T00:00:00-0500\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"},{\"type\":\"unlimitedDate\",\"date\":\"2021-11-18T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/1/00/6195759716c3a\",\"extension\":\"jpg\"},\"images\":[{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/1/00/6195759716c3a\",\"extension\":\"jpg\"}],\"creators\":{\"available\":2,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10853/creators\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/1286\",\"name\":\"Howard Mackie\",\"role\":\"writer\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/creators/13196\",\"name\":\"John Romita Jr.\",\"role\":\"penciller (cover)\"}],\"returned\":2},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10853/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":3,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10853/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23910\",\"name\":\"Cover #23910\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23911\",\"name\":\"Who Did Joey Z?\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23912\",\"name\":\"Crawl Space\",\"type\":\"letters\"}],\"returned\":3},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10853/events\",\"items\":[],\"returned\":0}},{\"id\":10852,\"digitalId\":0,\"title\":\"Spider-Man (1990) #87\",\"issueNumber\":87,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"-0001-11-30T00:00:00-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":36,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10852\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10852/spider-man_1990_87?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1998-01-01T00:00:00-0500\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available\",\"extension\":\"jpg\"},\"images\":[],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10852/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10852/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":3,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10852/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23907\",\"name\":\"Cover #23907\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23908\",\"name\":\"Enemies ... A Love Story?\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23909\",\"name\":\"Crawl Space\",\"type\":\"letters\"}],\"returned\":3},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10852/events\",\"items\":[],\"returned\":0}},{\"id\":10851,\"digitalId\":0,\"title\":\"Spider-Man (1990) #86\",\"issueNumber\":86,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"-0001-11-30T00:00:00-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":36,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10851\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10851/spider-man_1990_86?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1997-12-01T00:00:00-0500\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available\",\"extension\":\"jpg\"},\"images\":[],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10851/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10851/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":4,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10851/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23903\",\"name\":\"Cover #23903\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23904\",\"name\":\"The Span of Years\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23905\",\"name\":\"Crawl Space\",\"type\":\"letters\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23906\",\"name\":\"Statement of Ownership\",\"type\":\"statement of ownership\"}],\"returned\":4},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10851/events\",\"items\":[],\"returned\":0}},{\"id\":10850,\"digitalId\":0,\"title\":\"Spider-Man (1990) #85\",\"issueNumber\":85,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"-0001-11-30T00:00:00-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":36,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10850\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10850/spider-man_1990_85?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1997-11-01T00:00:00-0500\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available\",\"extension\":\"jpg\"},\"images\":[],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10850/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10850/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":3,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10850/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23900\",\"name\":\"Cover #23900\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23901\",\"name\":\"Little Lies\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23902\",\"name\":\"Crawl Space\",\"type\":\"letters\"}],\"returned\":3},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10850/events\",\"items\":[],\"returned\":0}},{\"id\":10849,\"digitalId\":0,\"title\":\"Spider-Man (1990) #84\",\"issueNumber\":84,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"-0001-11-30T00:00:00-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":36,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10849\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10849/spider-man_1990_84?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1997-10-01T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available\",\"extension\":\"jpg\"},\"images\":[],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10849/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10849/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":5,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10849/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23897\",\"name\":\"Cover #23897\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23898\",\"name\":\"Nothing Stops the Juggernaut!\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23899\",\"name\":\"Crawl Space\",\"type\":\"letters\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/153328\",\"name\":\"cover from Spider-Man (1990) #84\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/153329\",\"name\":\"story from Spider-Man (1990) #84\",\"type\":\"interiorStory\"}],\"returned\":5},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10849/events\",\"items\":[],\"returned\":0}},{\"id\":10848,\"digitalId\":0,\"title\":\"Spider-Man (1990) #83\",\"issueNumber\":83,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"-0001-11-30T00:00:00-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":36,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10848\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10848/spider-man_1990_83?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1997-09-01T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available\",\"extension\":\"jpg\"},\"images\":[],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10848/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10848/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":5,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10848/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23894\",\"name\":\"Cover #23894\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23895\",\"name\":\"Vertigo\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23896\",\"name\":\"Crawl Space\",\"type\":\"letters\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/153326\",\"name\":\"cover from Spider-Man (1990) #83\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/153327\",\"name\":\"story from Spider-Man (1990) #83\",\"type\":\"interiorStory\"}],\"returned\":5},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10848/events\",\"items\":[],\"returned\":0}},{\"id\":10847,\"digitalId\":0,\"title\":\"Spider-Man (1990) #82\",\"issueNumber\":82,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"-0001-11-30T00:00:00-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":36,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10847\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10847/spider-man_1990_82?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1997-08-01T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available\",\"extension\":\"jpg\"},\"images\":[],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10847/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10847/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":5,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10847/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23891\",\"name\":\"Cover #23891\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23892\",\"name\":\"You've Got to Have Friends (of Humanity?)\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23893\",\"name\":\"Crawl Space\",\"type\":\"letters\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/153324\",\"name\":\"cover from Spider-Man (1990) #82\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/153325\",\"name\":\"story from Spider-Man (1990) #82\",\"type\":\"interiorStory\"}],\"returned\":5},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10847/events\",\"items\":[],\"returned\":0}},{\"id\":10766,\"digitalId\":71833,\"title\":\"Spider-Man (1990) #-1\",\"issueNumber\":-1,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"2024-12-10T15:44:31-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":0,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10766\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10766/spider-man_1990_-1?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"},{\"type\":\"purchase\",\"url\":\"http://comicstore.marvel.com/Spider-Man-1/digital-comic/71833?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"},{\"type\":\"reader\",\"url\":\"http://marvel.com/digitalcomics/view.htm?iid=71833&utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1997-07-01T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"},{\"type\":\"unlimitedDate\",\"date\":\"2024-12-10T00:00:00-0500\"},{\"type\":\"digitalPurchaseDate\",\"date\":\"2024-12-10T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/9/a0/6758d28d3d3ab\",\"extension\":\"jpg\"},\"images\":[{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/9/a0/6758d28d3d3ab\",\"extension\":\"jpg\"}],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10766/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":2,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10766/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009325\",\"name\":\"Norman Osborn\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":2},\"stories\":{\"available\":5,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10766/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23741\",\"name\":\"Cover #23741\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23742\",\"name\":\"A Prelude in Red\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23743\",\"name\":\"Post It to Peter!\",\"type\":\"letters\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/178907\",\"name\":\"cover #-1\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/178908\",\"name\":\"story #-1\",\"type\":\"interiorStory\"}],\"returned\":5},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10766/events\",\"items\":[],\"returned\":0}},{\"id\":10846,\"digitalId\":0,\"title\":\"Spider-Man (1990) #81\",\"issueNumber\":81,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"-0001-11-30T00:00:00-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":36,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10846\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10846/spider-man_1990_81?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1997-06-01T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available\",\"extension\":\"jpg\"},\"images\":[],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10846/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10846/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":5,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10846/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23888\",\"name\":\"Cover #23888\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23889\",\"name\":\"Shadow of the Cat\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23890\",\"name\":\"Crawl Space\",\"type\":\"letters\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/153322\",\"name\":\"cover from Spider-Man (1990) #81\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/153323\",\"name\":\"story from Spider-Man (1990) #81\",\"type\":\"interiorStory\"}],\"returned\":5},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10846/events\",\"items\":[],\"returned\":0}},{\"id\":10845,\"digitalId\":0,\"title\":\"Spider-Man (1990) #80\",\"issueNumber\":80,\"variantDescription\":\"\",\"description\":\"\",\"modified\":\"-0001-11-30T00:00:00-0500\",\"isbn\":\"\",\"upc\":\"\",\"diamondCode\":\"\",\"ean\":\"\",\"issn\":\"\",\"format\":\"Comic\",\"pageCount\":36,\"textObjects\":[],\"resourceURI\":\"http://gateway.marvel.com/v1/public/comics/10845\",\"urls\":[{\"type\":\"detail\",\"url\":\"http://marvel.com/comics/issue/10845/spider-man_1990_80?utm_campaign=apiRef&utm_source=763df8a7c3c0f6d3bb7fcf088bbf6ee1\"}],\"series\":{\"resourceURI\":\"http://gateway.marvel.com/v1/public/series/2069\",\"name\":\"Spider-Man (1990 - 1998)\"},\"variants\":[],\"collections\":[],\"collectedIssues\":[],\"dates\":[{\"type\":\"onsaleDate\",\"date\":\"1997-05-01T00:00:00-0400\"},{\"type\":\"focDate\",\"date\":\"-0001-11-30T00:00:00-0500\"}],\"prices\":[{\"type\":\"printPrice\",\"price\":0}],\"thumbnail\":{\"path\":\"http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available\",\"extension\":\"jpg\"},\"images\":[],\"creators\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10845/creators\",\"items\":[],\"returned\":0},\"characters\":{\"available\":1,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10845/characters\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/characters/1009610\",\"name\":\"Spider-Man (Peter Parker)\"}],\"returned\":1},\"stories\":{\"available\":5,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10845/stories\",\"items\":[{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23885\",\"name\":\"Cover #23885\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23886\",\"name\":\"Blood Simple\",\"type\":\"interiorStory\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/23887\",\"name\":\"Crawl Space\",\"type\":\"letters\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/153320\",\"name\":\"cover from Spider-Man (1990) #80\",\"type\":\"cover\"},{\"resourceURI\":\"http://gateway.marvel.com/v1/public/stories/153321\",\"name\":\"story from Spider-Man (1990) #80\",\"type\":\"interiorStory\"}],\"returned\":5},\"events\":{\"available\":0,\"collectionURI\":\"http://gateway.marvel.com/v1/public/comics/10845/events\",\"items\":[],\"returned\":0}}]}}"; + + @InjectMocks private MarvelGetAllIssuesAction action; + + public MockWebServer marvelServer; + + @Before + public void setUp() throws IOException { + marvelServer = new MockWebServer(); + marvelServer.start(); + + final String hostname = String.format("http://localhost:%s", this.marvelServer.getPort()); + action.setBaseUrl(hostname); + action.setPublicKey(TEST_PUBLIC_KEY); + action.setPrivateKey(TEST_PRIVATE_KEY); + action.setSeriesId(TEST_SERIES_ID); + } + + @After + public void tearDown() throws IOException { + marvelServer.shutdown(); + } + + @Test(expected = MetadataException.class) + public void testExecute_noPublicKeyDefined() throws MetadataException { + action.setPublicKey(""); + + action.execute(); + } + + @Test(expected = MetadataException.class) + public void testExecute_noPrivateKeyDefined() throws MetadataException { + action.setPrivateKey(""); + action.execute(); + } + + @Test(expected = MetadataException.class) + public void testExecute_noSeriesDefined() throws MetadataException { + action.setSeriesId(""); + + action.execute(); + } + + @Test(expected = MetadataException.class) + public void testExecute_badResponse() throws MetadataException { + this.marvelServer.enqueue( + new MockResponse() + .setBody(TEST_BAD_RESPONSE) + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)); + + action.execute(); + } + + @Test + public void testExecute() throws MetadataException { + this.marvelServer.enqueue( + new MockResponse() + .setBody(TEST_GOOD_RESPONSE) + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)); + + final List result = action.execute(); + + assertNotNull(result); + assertFalse(result.isEmpty()); + } +} diff --git a/src/test/java/org/comixedproject/metadata/marvel/actions/MarvelGetVolumesActionTest.java b/src/test/java/org/comixedproject/metadata/marvel/actions/MarvelGetVolumesActionTest.java index 2a69844..20cccdb 100644 --- a/src/test/java/org/comixedproject/metadata/marvel/actions/MarvelGetVolumesActionTest.java +++ b/src/test/java/org/comixedproject/metadata/marvel/actions/MarvelGetVolumesActionTest.java @@ -18,7 +18,8 @@ package org.comixedproject.metadata.marvel.actions; -import static org.junit.Assert.*; +import static junit.framework.TestCase.assertFalse; +import static junit.framework.TestCase.assertNotNull; import java.io.IOException; import java.util.List;