test: inline xml and json files for better readability

This commit is contained in:
Gauthier Roebroeck 2023-03-15 11:42:14 +08:00
parent 7255caabae
commit 867f89514d
16 changed files with 301 additions and 271 deletions

View file

@ -4,7 +4,6 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper
import com.fasterxml.jackson.module.kotlin.readValue
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.core.io.ClassPathResource
class ComicInfoTest {
@ -12,8 +11,47 @@ class ComicInfoTest {
@Test
fun `given valid xml file when deserializing then properties are available`() {
val file = ClassPathResource("comicrack/ComicInfo.xml")
val comicInfo = mapper.readValue<ComicInfo>(file.url)
// language=XML
val xml = """
<?xml version="1.0"?>
<ComicInfo>
<Title>v01 - Preludes &amp; Nocturnes - 30th Anniversary Edition</Title>
<Series>Sandman</Series>
<Web>https://www.comixology.com/Sandman/digital-comic/727888</Web>
<Summary>Neil Gaiman's seminal series, THE SANDMAN, celebrates its 30th anniversary with an all-new edition of THE
SANDMAN VOL. 1: PRELUDES &amp; NOCTURNES!
 New York Times best-selling author Neil Gaiman's transcendent series THE SANDMAN is often hailed as the
definitive Vertigo title and one of the finest achievements in graphic storytelling. Gaiman created an
unforgettable tale of the forces that exist beyond life and death by weaving ancient mythology, folklore and
fairy tales with his own distinct narrative vision.
 In PRELUDES &amp; NOCTURNES, an occultist attempting to capture Death to bargain for eternal life traps her
younger brother Dream instead. After his 70 year imprisonment and eventual escape, Dream, also known as
Morpheus, goes on a quest for his lost objects of power. On his arduous journey Morpheus encounters Lucifer,
John Constantine, and an all-powerful madman.
 This book also includes the story "The Sound of Her Wings," which introduces us to the pragmatic and perky goth
girl Death.
 Collects THE SANDMAN #1-8.</Summary>
<Notes>Scraped metadata from Comixology [CMXDB727888], [RELDATE:2018-10-30]</Notes>
<Translator>The translator</Translator>
<Publisher>DC</Publisher>
<Imprint>Vertigo</Imprint>
<Count>10</Count>
<Genre>Fantasy, Supernatural/Occult, Horror, Mature, Superhero, Mythology, Drama</Genre>
<Tags>dark, Occult</Tags>
<PageCount>237</PageCount>
<LanguageISO>en</LanguageISO>
<AgeRating>Mature 17+</AgeRating>
<BlackAndWhite>No</BlackAndWhite>
<Manga>No</Manga>
<SeriesGroup>Sandman</SeriesGroup>
<ScanInformation></ScanInformation>
</ComicInfo>
""".trimIndent()
val comicInfo = mapper.readValue<ComicInfo>(xml)
with(comicInfo) {
assertThat(title).isEqualTo("v01 - Preludes & Nocturnes - 30th Anniversary Edition")
@ -39,8 +77,48 @@ class ComicInfoTest {
@Test
fun `given another valid xml file when deserializing then properties are available`() {
val file = ClassPathResource("comicrack/ComicInfo2.xml")
val comicInfo = mapper.readValue<ComicInfo>(file.url)
// language=XML
val xml = """
<?xml version="1.0"?>
<ComicInfo>
<Title>v01 - Preludes &amp; Nocturnes - 30th Anniversary Edition</Title>
<Series>Sandman</Series>
<Web>https://www.comixology.com/Sandman/digital-comic/727888</Web>
<Summary>Neil Gaiman's seminal series, THE SANDMAN, celebrates its 30th anniversary with an all-new edition of THE
SANDMAN VOL. 1: PRELUDES &amp; NOCTURNES!
 New York Times best-selling author Neil Gaiman's transcendent series THE SANDMAN is often hailed as the
definitive Vertigo title and one of the finest achievements in graphic storytelling. Gaiman created an
unforgettable tale of the forces that exist beyond life and death by weaving ancient mythology, folklore and
fairy tales with his own distinct narrative vision.
 In PRELUDES &amp; NOCTURNES, an occultist attempting to capture Death to bargain for eternal life traps her
younger brother Dream instead. After his 70 year imprisonment and eventual escape, Dream, also known as
Morpheus, goes on a quest for his lost objects of power. On his arduous journey Morpheus encounters Lucifer,
John Constantine, and an all-powerful madman.
 This book also includes the story "The Sound of Her Wings," which introduces us to the pragmatic and perky goth
girl Death.
 Collects THE SANDMAN #1-8.
</Summary>
<Notes>Scraped metadata from Comixology [CMXDB727888], [RELDATE:2018-10-30]</Notes>
<Publisher>DC</Publisher>
<Imprint>Vertigo</Imprint>
<Genre>Fantasy, Supernatural/Occult, Horror, Mature, Superhero, Mythology, Drama</Genre>
<PageCount>237</PageCount>
<LanguageISO>en</LanguageISO>
<AgeRating>MA15+</AgeRating>
<BlackAndWhite>No</BlackAndWhite>
<Year>2018</Year>
<Month>10</Month>
<Day>30</Day>
<Manga>No</Manga>
<SeriesGroup>Sandman</SeriesGroup>
<ScanInformation></ScanInformation>
</ComicInfo>
""".trimIndent()
val comicInfo = mapper.readValue<ComicInfo>(xml)
with(comicInfo) {
assertThat(title).isEqualTo("v01 - Preludes & Nocturnes - 30th Anniversary Edition")
@ -67,8 +145,16 @@ class ComicInfoTest {
@Test
fun `given incorrect enum values when deserializing then it is ignored`() {
val file = ClassPathResource("comicrack/InvalidEnumValues.xml")
val comicInfo = mapper.readValue<ComicInfo>(file.url)
// language=XML
val xml = """
<?xml version="1.0"?>
<ComicInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AgeRating>Non existent</AgeRating>
<BlackAndWhite>Non existent</BlackAndWhite>
<Manga>Non existent</Manga>
</ComicInfo>
""".trimIndent()
val comicInfo = mapper.readValue<ComicInfo>(xml)
with(comicInfo) {
assertThat(ageRating).isNull()
@ -79,8 +165,15 @@ class ComicInfoTest {
@Test
fun `given valid xml file with StoryArc fields when deserializing then properties are available`() {
val file = ClassPathResource("comicrack/ComicInfo_StoryArc.xml")
val comicInfo = mapper.readValue<ComicInfo>(file.url)
// language=XML
val xml = """
<?xml version="1.0"?>
<ComicInfo>
<StoryArc>Arc</StoryArc>
<StoryArcNumber>2</StoryArcNumber>
</ComicInfo>
""".trimIndent()
val comicInfo = mapper.readValue<ComicInfo>(xml)
with(comicInfo) {
assertThat(storyArc).isEqualTo("Arc")

View file

@ -4,7 +4,6 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper
import com.fasterxml.jackson.module.kotlin.readValue
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.core.io.ClassPathResource
class ReadingListTest {
@ -12,8 +11,29 @@ class ReadingListTest {
@Test
fun `given valid xml file when deserializing then properties are available`() {
val file = ClassPathResource("comicrack/ReadingList.xml")
val readingList = mapper.readValue<ReadingList>(file.url)
// language=XML
val cbl = """
<?xml version="1.0"?>
<ReadingList>
<Name>Civil War</Name>
<Books>
<Book Series="Civil War" Number="1" Volume="2006" Year="2006">
<Id>1b21c8c4-e8d7-44f6-992d-97d24ce8123e</Id>
<FileName>Civil War Vol.2006 #01 (July, 2006)</FileName>
</Book>
<Book Series="Wolverine" Number="42" Volume="2003" Year="2006">
<Id>29a69cbf-af64-471d-889c-8fc0f0080f7c</Id>
<FileName>Wolverine Vol.2003 #42 (July, 2006)</FileName>
</Book>
<Book Series="X-Factor" Number="HS" Volume="2006" Year="2006">
<Id>ec70e585-5a80-428c-a67e-fd22b668449b</Id>
<FileName>X-Factor Vol.2006 #08 (August, 2006)</FileName>
</Book>
</Books>
<Matchers />
</ReadingList>
""".trimIndent()
val readingList = mapper.readValue<ReadingList>(cbl)
with(readingList) {
assertThat(name).isEqualTo("Civil War")
@ -47,9 +67,23 @@ class ReadingListTest {
@Test
fun `given valid xml file for smart list when deserializing then properties are available`() {
val file = ClassPathResource("comicrack/ReadingList_SmartList.xml")
val mapper = XmlMapper()
val readingList = mapper.readValue<ReadingList>(file.url)
// language=XML
val cbl = """
<?xml version="1.0"?>
<ReadingList xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>Golden Age</Name>
<Books />
<Matchers>
<ComicBookMatcher xsi:type="ComicBookSeriesMatcher" MatchOperator="4">
<MatchValue>Marvel Masterworks</MatchValue>
</ComicBookMatcher>
<ComicBookMatcher xsi:type="ComicBookSeriesMatcher" MatchOperator="1">
<MatchValue>Golden Age</MatchValue>
</ComicBookMatcher>
</Matchers>
</ReadingList>
""".trimIndent()
val readingList = mapper.readValue<ReadingList>(cbl)
with(readingList) {
assertThat(name).isEqualTo("Golden Age")

View file

@ -10,9 +10,12 @@ import org.gotson.komga.infrastructure.metadata.mylar.dto.AgeRating
import org.gotson.komga.infrastructure.metadata.mylar.dto.MylarMetadata
import org.gotson.komga.infrastructure.metadata.mylar.dto.Series
import org.gotson.komga.infrastructure.metadata.mylar.dto.Status
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.Test
import org.springframework.core.io.ClassPathResource
import org.junit.jupiter.api.io.TempDir
import java.io.File
import java.nio.file.Files
import java.nio.file.Path
class MylarSeriesProviderTest {
@ -20,7 +23,13 @@ class MylarSeriesProviderTest {
private val mylarSeriesProvider = MylarSeriesProvider(mockMapper)
private val series = makeSeries("series", url = ClassPathResource("mylar").url)
private lateinit var series: org.gotson.komga.domain.model.Series
@BeforeAll
fun setupSeries(@TempDir dir: Path) {
Files.createFile(dir.resolve("series.json"))
series = makeSeries("series", url = dir.toUri().toURL())
}
@Test
fun `given seriesJson when getting series metadata then metadata patch is valid`() {

View file

@ -10,7 +10,6 @@ import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.core.io.ClassPathResource
import org.springframework.test.context.junit.jupiter.SpringExtension
@ExtendWith(SpringExtension::class)
@ -21,8 +20,31 @@ class SeriesTest(
@Test
fun `given valid json file when deserializing then properties are available`() {
val file = ClassPathResource("mylar/series.json")
val seriesJson = mapper.readValue<Series>(file.url)
// language=JSON
val json = """
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"publisher": "DC Comics",
"imprint": null,
"name": "American Vampire 1976",
"cid": 130865,
"year": 2020,
"description_text": "Nine issue mini-series, the closing chapter of American Vampire",
"description_formatted": "Nine issue mini-series, the closing chapter of American Vampire",
"volume": null,
"booktype": "Print",
"age_rating": "Adult",
"collects": null,
"ComicImage": "https://comicvine.gamespot.com/a/uploads/scale_large/6/67663/7603293-01.jpg",
"total_issues": 9,
"publication_run": "December 2020 - Present",
"status": "Continuing"
}
}
""".trimIndent()
val seriesJson = mapper.readValue<Series>(json)
assertThat(seriesJson.metadata).isNotNull
with(seriesJson.metadata) {
@ -46,8 +68,31 @@ class SeriesTest(
@Test
fun `given another valid json file when deserializing then properties are available`() {
val file = ClassPathResource("mylar/series1.json")
val seriesJson = mapper.readValue<Series>(file.url)
// language=JSON
val json = """
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"publisher": "IDW Publishing",
"imprint": null,
"name": "Usagi Yojimbo",
"comicid": 119731,
"year": 2019,
"description_text": null,
"description_formatted": null,
"volume": 4,
"booktype": "Print",
"age_rating": null,
"collects": null,
"ComicImage": "https://comicvine1.cbsistatic.com/uploads/scale_large/6/67663/6974029-01a.jpg",
"total_issues": 20,
"publication_run": "June 2019 - Present",
"status": "Ended"
}
}
""".trimIndent()
val seriesJson = mapper.readValue<Series>(json)
assertThat(seriesJson.metadata).isNotNull
with(seriesJson.metadata) {
@ -71,8 +116,31 @@ class SeriesTest(
@Test
fun `given yet another valid json file when deserializing then properties are available`() {
val file = ClassPathResource("mylar/series-gh961.json")
val seriesJson = mapper.readValue<Series>(file.url)
// language=JSON
val json = """
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"publisher": "Kodansha Comics USA",
"imprint": null,
"name": "Vinland Saga",
"comicid": 69157,
"year": 2013,
"description_text": "English translation of Vinland Saga (ヴィンランド・サガ).Vinland Saga is the first series from Kodansha Comics USA to be released in hardcovers, each collection collects and translates two volumes of the original Japanese manga",
"description_formatted": "English translation of Vinland Saga (ヴィンランド・サガ).Vinland Saga is the first series from Kodansha Comics USA to be released in hardcovers, each collection collects and translates two volumes of the original Japanese manga",
"volume": null,
"booktype": "Print",
"age_rating": null,
"collects": null,
"ComicImage": "https://comicvine.gamespot.com/a/uploads/scale_large/6/67663/3439178-01.jpg",
"total_issues": 12,
"publication_run": "November 2013 - December 2021",
"status": "Ended"
}
}
""".trimIndent()
val seriesJson = mapper.readValue<Series>(json)
assertThat(seriesJson.metadata).isNotNull
with(seriesJson.metadata) {
@ -96,24 +164,91 @@ class SeriesTest(
@Test
fun `given invalid json file missing year when deserializing then it fails`() {
val file = ClassPathResource("mylar/series-missing-year.json")
val thrown = catchThrowable { mapper.readValue<Series>(file.url) }
// language=JSON
val json = """
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"publisher": "IDW Publishing",
"imprint": null,
"name": "Usagi Yojimbo",
"comicid": 119731,
"description_text": null,
"description_formatted": null,
"volume": 4,
"booktype": "Print",
"age_rating": null,
"collects": null,
"ComicImage": "https://comicvine1.cbsistatic.com/uploads/scale_large/6/67663/6974029-01a.jpg",
"total_issues": 20,
"publication_run": "June 2019 - Present",
"status": "Ended"
}
}
""".trimIndent()
val thrown = catchThrowable { mapper.readValue<Series>(json) }
assertThat(thrown).isInstanceOf(MismatchedInputException::class.java)
}
@Test
fun `given invalid json file missing publisher when deserializing then it fails`() {
val file = ClassPathResource("mylar/series-missing-publisher.json")
val thrown = catchThrowable { mapper.readValue<Series>(file.url) }
// language=JSON
val json = """
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"imprint": null,
"name": "Usagi Yojimbo",
"comicid": 119731,
"year": 2019,
"description_text": null,
"description_formatted": null,
"volume": 4,
"booktype": "Print",
"age_rating": null,
"collects": null,
"ComicImage": "https://comicvine1.cbsistatic.com/uploads/scale_large/6/67663/6974029-01a.jpg",
"total_issues": 20,
"publication_run": "June 2019 - Present",
"status": "Ended"
}
}
""".trimIndent()
val thrown = catchThrowable { mapper.readValue<Series>(json) }
assertThat(thrown).isInstanceOf(MissingKotlinParameterException::class.java)
}
@Test
fun `given invalid json file missing status when deserializing then it fails`() {
val file = ClassPathResource("mylar/series-missing-status.json")
val thrown = catchThrowable { mapper.readValue<Series>(file.url) }
// language=JSON
val json = """
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"publisher": "IDW Publishing",
"imprint": null,
"name": "Usagi Yojimbo",
"comicid": 119731,
"year": 2019,
"description_text": null,
"description_formatted": null,
"volume": 4,
"booktype": "Print",
"age_rating": null,
"collects": null,
"ComicImage": "https://comicvine1.cbsistatic.com/uploads/scale_large/6/67663/6974029-01a.jpg",
"total_issues": 20,
"publication_run": "June 2019 - Present"
}
}
""".trimIndent()
val thrown = catchThrowable { mapper.readValue<Series>(json) }
assertThat(thrown).isInstanceOf(MissingKotlinParameterException::class.java)
}

View file

@ -1,37 +0,0 @@
<?xml version="1.0"?>
<ComicInfo>
<Title>v01 - Preludes &amp; Nocturnes - 30th Anniversary Edition</Title>
<Series>Sandman</Series>
<Web>https://www.comixology.com/Sandman/digital-comic/727888</Web>
<Summary>Neil Gaiman's seminal series, THE SANDMAN, celebrates its 30th anniversary with an all-new edition of THE
SANDMAN VOL. 1: PRELUDES &amp; NOCTURNES!
 New York Times best-selling author Neil Gaiman's transcendent series THE SANDMAN is often hailed as the
definitive Vertigo title and one of the finest achievements in graphic storytelling. Gaiman created an
unforgettable tale of the forces that exist beyond life and death by weaving ancient mythology, folklore and
fairy tales with his own distinct narrative vision.
 In PRELUDES &amp; NOCTURNES, an occultist attempting to capture Death to bargain for eternal life traps her
younger brother Dream instead. After his 70 year imprisonment and eventual escape, Dream, also known as
Morpheus, goes on a quest for his lost objects of power. On his arduous journey Morpheus encounters Lucifer,
John Constantine, and an all-powerful madman.
 This book also includes the story "The Sound of Her Wings," which introduces us to the pragmatic and perky goth
girl Death.
 Collects THE SANDMAN #1-8.</Summary>
<Notes>Scraped metadata from Comixology [CMXDB727888], [RELDATE:2018-10-30]</Notes>
<Translator>The translator</Translator>
<Publisher>DC</Publisher>
<Imprint>Vertigo</Imprint>
<Count>10</Count>
<Genre>Fantasy, Supernatural/Occult, Horror, Mature, Superhero, Mythology, Drama</Genre>
<Tags>dark, Occult</Tags>
<PageCount>237</PageCount>
<LanguageISO>en</LanguageISO>
<AgeRating>Mature 17+</AgeRating>
<BlackAndWhite>No</BlackAndWhite>
<Manga>No</Manga>
<SeriesGroup>Sandman</SeriesGroup>
<ScanInformation></ScanInformation>
</ComicInfo>

View file

@ -1,38 +0,0 @@
<?xml version="1.0"?>
<ComicInfo>
<Title>v01 - Preludes &amp; Nocturnes - 30th Anniversary Edition</Title>
<Series>Sandman</Series>
<Web>https://www.comixology.com/Sandman/digital-comic/727888</Web>
<Summary>Neil Gaiman's seminal series, THE SANDMAN, celebrates its 30th anniversary with an all-new edition of THE
SANDMAN VOL. 1: PRELUDES &amp; NOCTURNES!
 New York Times best-selling author Neil Gaiman's transcendent series THE SANDMAN is often hailed as the
definitive Vertigo title and one of the finest achievements in graphic storytelling. Gaiman created an
unforgettable tale of the forces that exist beyond life and death by weaving ancient mythology, folklore and
fairy tales with his own distinct narrative vision.
 In PRELUDES &amp; NOCTURNES, an occultist attempting to capture Death to bargain for eternal life traps her
younger brother Dream instead. After his 70 year imprisonment and eventual escape, Dream, also known as
Morpheus, goes on a quest for his lost objects of power. On his arduous journey Morpheus encounters Lucifer,
John Constantine, and an all-powerful madman.
 This book also includes the story "The Sound of Her Wings," which introduces us to the pragmatic and perky goth
girl Death.
 Collects THE SANDMAN #1-8.
</Summary>
<Notes>Scraped metadata from Comixology [CMXDB727888], [RELDATE:2018-10-30]</Notes>
<Publisher>DC</Publisher>
<Imprint>Vertigo</Imprint>
<Genre>Fantasy, Supernatural/Occult, Horror, Mature, Superhero, Mythology, Drama</Genre>
<PageCount>237</PageCount>
<LanguageISO>en</LanguageISO>
<AgeRating>MA15+</AgeRating>
<BlackAndWhite>No</BlackAndWhite>
<Year>2018</Year>
<Month>10</Month>
<Day>30</Day>
<Manga>No</Manga>
<SeriesGroup>Sandman</SeriesGroup>
<ScanInformation></ScanInformation>
</ComicInfo>

View file

@ -1,5 +0,0 @@
<?xml version="1.0"?>
<ComicInfo>
<StoryArc>Arc</StoryArc>
<StoryArcNumber>2</StoryArcNumber>
</ComicInfo>

View file

@ -1,6 +0,0 @@
<?xml version="1.0"?>
<ComicInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AgeRating>Non existent</AgeRating>
<BlackAndWhite>Non existent</BlackAndWhite>
<Manga>Non existent</Manga>
</ComicInfo>

View file

@ -1,19 +0,0 @@
<?xml version="1.0"?>
<ReadingList>
<Name>Civil War</Name>
<Books>
<Book Series="Civil War" Number="1" Volume="2006" Year="2006">
<Id>1b21c8c4-e8d7-44f6-992d-97d24ce8123e</Id>
<FileName>Civil War Vol.2006 #01 (July, 2006)</FileName>
</Book>
<Book Series="Wolverine" Number="42" Volume="2003" Year="2006">
<Id>29a69cbf-af64-471d-889c-8fc0f0080f7c</Id>
<FileName>Wolverine Vol.2003 #42 (July, 2006)</FileName>
</Book>
<Book Series="X-Factor" Number="HS" Volume="2006" Year="2006">
<Id>ec70e585-5a80-428c-a67e-fd22b668449b</Id>
<FileName>X-Factor Vol.2006 #08 (August, 2006)</FileName>
</Book>
</Books>
<Matchers />
</ReadingList>

View file

@ -1,13 +0,0 @@
<?xml version="1.0"?>
<ReadingList xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>Golden Age</Name>
<Books />
<Matchers>
<ComicBookMatcher xsi:type="ComicBookSeriesMatcher" MatchOperator="4">
<MatchValue>Marvel Masterworks</MatchValue>
</ComicBookMatcher>
<ComicBookMatcher xsi:type="ComicBookSeriesMatcher" MatchOperator="1">
<MatchValue>Golden Age</MatchValue>
</ComicBookMatcher>
</Matchers>
</ReadingList>

View file

@ -1,21 +0,0 @@
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"publisher": "Kodansha Comics USA",
"imprint": null,
"name": "Vinland Saga",
"comicid": 69157,
"year": 2013,
"description_text": "English translation of Vinland Saga (ヴィンランド・サガ).Vinland Saga is the first series from Kodansha Comics USA to be released in hardcovers, each collection collects and translates two volumes of the original Japanese manga",
"description_formatted": "English translation of Vinland Saga (ヴィンランド・サガ).Vinland Saga is the first series from Kodansha Comics USA to be released in hardcovers, each collection collects and translates two volumes of the original Japanese manga",
"volume": null,
"booktype": "Print",
"age_rating": null,
"collects": null,
"ComicImage": "https://comicvine.gamespot.com/a/uploads/scale_large/6/67663/3439178-01.jpg",
"total_issues": 12,
"publication_run": "November 2013 - December 2021",
"status": "Ended"
}
}

View file

@ -1,20 +0,0 @@
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"imprint": null,
"name": "Usagi Yojimbo",
"comicid": 119731,
"year": 2019,
"description_text": null,
"description_formatted": null,
"volume": 4,
"booktype": "Print",
"age_rating": null,
"collects": null,
"ComicImage": "https://comicvine1.cbsistatic.com/uploads/scale_large/6/67663/6974029-01a.jpg",
"total_issues": 20,
"publication_run": "June 2019 - Present",
"status": "Ended"
}
}

View file

@ -1,20 +0,0 @@
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"publisher": "IDW Publishing",
"imprint": null,
"name": "Usagi Yojimbo",
"comicid": 119731,
"year": 2019,
"description_text": null,
"description_formatted": null,
"volume": 4,
"booktype": "Print",
"age_rating": null,
"collects": null,
"ComicImage": "https://comicvine1.cbsistatic.com/uploads/scale_large/6/67663/6974029-01a.jpg",
"total_issues": 20,
"publication_run": "June 2019 - Present"
}
}

View file

@ -1,20 +0,0 @@
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"publisher": "IDW Publishing",
"imprint": null,
"name": "Usagi Yojimbo",
"comicid": 119731,
"description_text": null,
"description_formatted": null,
"volume": 4,
"booktype": "Print",
"age_rating": null,
"collects": null,
"ComicImage": "https://comicvine1.cbsistatic.com/uploads/scale_large/6/67663/6974029-01a.jpg",
"total_issues": 20,
"publication_run": "June 2019 - Present",
"status": "Ended"
}
}

View file

@ -1,21 +0,0 @@
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"publisher": "DC Comics",
"imprint": null,
"name": "American Vampire 1976",
"cid": 130865,
"year": 2020,
"description_text": "Nine issue mini-series, the closing chapter of American Vampire",
"description_formatted": "Nine issue mini-series, the closing chapter of American Vampire",
"volume": null,
"booktype": "Print",
"age_rating": "Adult",
"collects": null,
"ComicImage": "https://comicvine.gamespot.com/a/uploads/scale_large/6/67663/7603293-01.jpg",
"total_issues": 9,
"publication_run": "December 2020 - Present",
"status": "Continuing"
}
}

View file

@ -1,21 +0,0 @@
{
"version": "1.0.1",
"metadata": {
"type": "comicSeries",
"publisher": "IDW Publishing",
"imprint": null,
"name": "Usagi Yojimbo",
"comicid": 119731,
"year": 2019,
"description_text": null,
"description_formatted": null,
"volume": 4,
"booktype": "Print",
"age_rating": null,
"collects": null,
"ComicImage": "https://comicvine1.cbsistatic.com/uploads/scale_large/6/67663/6974029-01a.jpg",
"total_issues": 20,
"publication_run": "June 2019 - Present",
"status": "Ended"
}
}