From 69d3b9fb1fc4f063cb53d60d9d91bcc053cc4328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Dos=C3=A9?= Date: Tue, 9 Apr 2024 20:16:48 -0700 Subject: [PATCH 01/13] Simple boundary setup --- lib/ambry.ex | 40 +++++++++++++++++++++++++ lib/ambry/metadata/audible.ex | 23 +++++++------- lib/ambry/metadata/goodreads.ex | 25 ++++++++-------- lib/ambry/search.ex | 3 ++ lib/ambry_app.ex | 6 ++++ lib/{ambry => ambry_app}/application.ex | 8 ++--- lib/ambry_schema.ex | 1 + lib/ambry_scraping.ex | 12 ++++++++ lib/ambry_scraping/audible.ex | 11 +++++++ lib/ambry_scraping/audnexus.ex | 11 +++++++ lib/ambry_scraping/goodreads.ex | 13 ++++++++ lib/ambry_web.ex | 1 + mix.exs | 4 ++- mix.lock | 1 + 14 files changed, 130 insertions(+), 29 deletions(-) create mode 100644 lib/ambry_app.ex rename lib/{ambry => ambry_app}/application.ex (92%) create mode 100644 lib/ambry_scraping/audible.ex create mode 100644 lib/ambry_scraping/audnexus.ex create mode 100644 lib/ambry_scraping/goodreads.ex diff --git a/lib/ambry.ex b/lib/ambry.ex index 842be977..15648408 100644 --- a/lib/ambry.ex +++ b/lib/ambry.ex @@ -6,4 +6,44 @@ defmodule Ambry do Contexts are also responsible for managing your data, regardless if it comes from the database, an external API or others. """ + use Boundary, + deps: [AmbryScraping], + exports: [ + Accounts, + Accounts.User, + Authors, + Authors.Author, + Books, + Books.Book, + DataCase, + Factory, + FileBrowser, + FileBrowser.File, + FileBrowser.FolderNode, + FileUtils, + FirstTimeSetup, + Hashids, + Media, + Media.Audit, + Media.Chapters, + Media.Media, + Media.PlayerState, + Media.Processor, + Media.ProcessorJob, + Metadata.Audible, + Metadata.GoodReads, + Narrators, + Narrators.Narrator, + Paths, + People, + People.Person, + PubSub, + PubSub.Message, + Repo, + Search, + Series, + Series.Series, + Series.SeriesBook, + SupplementalFile + ] end diff --git a/lib/ambry/metadata/audible.ex b/lib/ambry/metadata/audible.ex index e678aacf..25b80bcb 100644 --- a/lib/ambry/metadata/audible.ex +++ b/lib/ambry/metadata/audible.ex @@ -9,35 +9,36 @@ defmodule Ambry.Metadata.Audible do alias Ambry.Metadata.Audible.Cache alias Ambry.Repo - alias AmbryScraping.Audible.Products - alias AmbryScraping.Audnexus.Authors - alias AmbryScraping.Audnexus.Books + alias AmbryScraping.Audible + alias AmbryScraping.Audnexus def search_books(query, refresh \\ false) def search_books(query, true), - do: clear_get_and_cache(query, &Products.search/1, &search_books_key/1) + do: clear_get_and_cache(query, &Audible.search_books/1, &search_books_key/1) - def search_books(query, false), do: cache_get(query, &Products.search/1, &search_books_key/1) + def search_books(query, false), + do: cache_get(query, &Audible.search_books/1, &search_books_key/1) defp search_books_key(query_string), do: "search:#{query_string}" def search_authors(query, refresh \\ false) def search_authors(query, true), - do: clear_get_and_cache(query, &Authors.search/1, &search_authors_key/1) + do: clear_get_and_cache(query, &Audnexus.search_authors/1, &search_authors_key/1) - def search_authors(query, false), do: cache_get(query, &Authors.search/1, &search_authors_key/1) + def search_authors(query, false), + do: cache_get(query, &Audnexus.search_authors/1, &search_authors_key/1) defp search_authors_key(query_string), do: "search_authors:#{query_string}" def author(asin, refresh \\ false) - def author(asin, true), do: clear_get_and_cache(asin, &Authors.details/1) - def author(asin, false), do: cache_get(asin, &Authors.details/1) + def author(asin, true), do: clear_get_and_cache(asin, &Audnexus.author_details/1) + def author(asin, false), do: cache_get(asin, &Audnexus.author_details/1) def chapters(asin, refresh \\ false) - def chapters(asin, true), do: clear_get_and_cache(asin, &Books.chapters/1) - def chapters(asin, false), do: cache_get(asin, &Books.chapters/1) + def chapters(asin, true), do: clear_get_and_cache(asin, &Audnexus.book_chapters/1) + def chapters(asin, false), do: cache_get(asin, &Audnexus.book_chapters/1) defp clear_get_and_cache(arg, fetch_fun, key_fun \\ &Function.identity/1) do Repo.delete_all(from c in Cache, where: [key: ^key_fun.(arg)]) diff --git a/lib/ambry/metadata/goodreads.ex b/lib/ambry/metadata/goodreads.ex index 0ab0062d..c454c1c4 100644 --- a/lib/ambry/metadata/goodreads.ex +++ b/lib/ambry/metadata/goodreads.ex @@ -9,38 +9,39 @@ defmodule Ambry.Metadata.GoodReads do alias Ambry.Metadata.GoodReads.Cache alias Ambry.Repo - alias AmbryScraping.GoodReads.Authors - alias AmbryScraping.GoodReads.Books + alias AmbryScraping.GoodReads def search_books(query, refresh \\ false) def search_books(query, true), - do: clear_get_and_cache(query, &Books.search/1, &search_books_key/1) + do: clear_get_and_cache(query, &GoodReads.search_books/1, &search_books_key/1) - def search_books(query, false), do: cache_get(query, &Books.search/1, &search_books_key/1) + def search_books(query, false), + do: cache_get(query, &GoodReads.search_books/1, &search_books_key/1) defp search_books_key(query_string), do: "search_books:#{query_string}" def editions(id, refresh \\ false) - def editions(id, true), do: clear_get_and_cache(id, &Books.editions/1) - def editions(id, false), do: cache_get(id, &Books.editions/1) + def editions(id, true), do: clear_get_and_cache(id, &GoodReads.book_editions/1) + def editions(id, false), do: cache_get(id, &GoodReads.book_editions/1) def edition_details(id, refresh \\ false) - def edition_details(id, true), do: clear_get_and_cache(id, &Books.edition_details/1) - def edition_details(id, false), do: cache_get(id, &Books.edition_details/1) + def edition_details(id, true), do: clear_get_and_cache(id, &GoodReads.book_edition_details/1) + def edition_details(id, false), do: cache_get(id, &GoodReads.book_edition_details/1) def search_authors(query, refresh \\ false) def search_authors(query, true), - do: clear_get_and_cache(query, &Authors.search/1, &search_authors_key/1) + do: clear_get_and_cache(query, &GoodReads.search_authors/1, &search_authors_key/1) - def search_authors(query, false), do: cache_get(query, &Authors.search/1, &search_authors_key/1) + def search_authors(query, false), + do: cache_get(query, &GoodReads.search_authors/1, &search_authors_key/1) defp search_authors_key(query_string), do: "search_authors:#{query_string}" def author(id, refresh \\ false) - def author(id, true), do: clear_get_and_cache(id, &Authors.details/1) - def author(id, false), do: cache_get(id, &Authors.details/1) + def author(id, true), do: clear_get_and_cache(id, &GoodReads.author_details/1) + def author(id, false), do: cache_get(id, &GoodReads.author_details/1) defp clear_get_and_cache(arg, fetch_fun, key_fun \\ &Function.identity/1) do Repo.delete_all(from c in Cache, where: [key: ^key_fun.(arg)]) diff --git a/lib/ambry/search.ex b/lib/ambry/search.ex index 2d299b7b..7ba53b67 100644 --- a/lib/ambry/search.ex +++ b/lib/ambry/search.ex @@ -10,12 +10,15 @@ defmodule Ambry.Search do alias Ambry.People alias Ambry.People.Person alias Ambry.Repo + alias Ambry.Search.Index alias Ambry.Search.Record alias Ambry.Series alias Ambry.Series.Series, as: SeriesSchema @results_limit 36 + defdelegate refresh_entire_index!, to: Index + def search(query_string) do query_string |> query() diff --git a/lib/ambry_app.ex b/lib/ambry_app.ex new file mode 100644 index 00000000..55ea48c4 --- /dev/null +++ b/lib/ambry_app.ex @@ -0,0 +1,6 @@ +defmodule AmbryApp do + @moduledoc """ + Ambry OTP application. + """ + use Boundary, deps: [Ambry, AmbryWeb, AmbryScraping], exports: [] +end diff --git a/lib/ambry/application.ex b/lib/ambry_app/application.ex similarity index 92% rename from lib/ambry/application.ex rename to lib/ambry_app/application.ex index 20f21d7a..214146b1 100644 --- a/lib/ambry/application.ex +++ b/lib/ambry_app/application.ex @@ -1,12 +1,10 @@ -defmodule Ambry.Application do +defmodule AmbryApp.Application do # See https://hexdocs.pm/elixir/Application.html # for more information on OTP Applications @moduledoc false use Application - alias Ambry.Search - @impl Application def start(_type, _args) do # ensures all migrations have been run on application start @@ -45,9 +43,9 @@ defmodule Ambry.Application do shared_children() ++ [ # Start the Search Index Manager - {Search.IndexManager, []}, + {Ambry.Search.IndexManager, []}, # Search index refresher/warmer - {Task, &Search.Index.refresh_entire_index!/0}, + {Task, &Ambry.Search.refresh_entire_index!/0}, # Headless browser for web-scraping AmbryScraping.Marionette.Supervisor ] diff --git a/lib/ambry_schema.ex b/lib/ambry_schema.ex index ed6ebceb..7cc3ae7a 100644 --- a/lib/ambry_schema.ex +++ b/lib/ambry_schema.ex @@ -1,6 +1,7 @@ defmodule AmbrySchema do @moduledoc false + use Boundary, deps: [Ambry], exports: [PlugHelpers] use Absinthe.Schema use Absinthe.Relay.Schema, :modern diff --git a/lib/ambry_scraping.ex b/lib/ambry_scraping.ex index d14d9046..eca7c4c4 100644 --- a/lib/ambry_scraping.ex +++ b/lib/ambry_scraping.ex @@ -1,5 +1,17 @@ defmodule AmbryScraping do @moduledoc false + use Boundary, + deps: [], + exports: [ + Audible, + Audible.Products.Product, + Audnexus, + GoodReads, + GoodReads.Books.Editions.Edition, + GoodReads.Books.Search.Book, + GoodReads.PublishedDate + ] + alias AmbryScraping.Marionette.Connection def web_scraping_available? do diff --git a/lib/ambry_scraping/audible.ex b/lib/ambry_scraping/audible.ex new file mode 100644 index 00000000..0bc34cd2 --- /dev/null +++ b/lib/ambry_scraping/audible.ex @@ -0,0 +1,11 @@ +defmodule AmbryScraping.Audible do + @moduledoc false + + alias AmbryScraping.Audible.Authors + alias AmbryScraping.Audible.Products + + defdelegate author_details(id), to: Authors, as: :details + defdelegate search_authors(query), to: Authors, as: :search + + defdelegate search_books(query), to: Products, as: :search +end diff --git a/lib/ambry_scraping/audnexus.ex b/lib/ambry_scraping/audnexus.ex new file mode 100644 index 00000000..e2d083cd --- /dev/null +++ b/lib/ambry_scraping/audnexus.ex @@ -0,0 +1,11 @@ +defmodule AmbryScraping.Audnexus do + @moduledoc false + + alias AmbryScraping.Audnexus.Authors + alias AmbryScraping.Audnexus.Books + + defdelegate author_details(id), to: Authors, as: :details + defdelegate search_authors(query), to: Authors, as: :search + + defdelegate book_chapters(asin), to: Books, as: :chapters +end diff --git a/lib/ambry_scraping/goodreads.ex b/lib/ambry_scraping/goodreads.ex new file mode 100644 index 00000000..04e7802d --- /dev/null +++ b/lib/ambry_scraping/goodreads.ex @@ -0,0 +1,13 @@ +defmodule AmbryScraping.GoodReads do + @moduledoc false + + alias AmbryScraping.GoodReads.Authors + alias AmbryScraping.GoodReads.Books + + defdelegate author_details(id), to: Authors, as: :details + defdelegate search_authors(query), to: Authors, as: :search + + defdelegate search_books(query), to: Books, as: :search + defdelegate book_editions(work_id), to: Books, as: :editions + defdelegate book_edition_details(edition_id), to: Books, as: :edition_details +end diff --git a/lib/ambry_web.ex b/lib/ambry_web.ex index 29dbc767..999bc98b 100644 --- a/lib/ambry_web.ex +++ b/lib/ambry_web.ex @@ -16,6 +16,7 @@ defmodule AmbryWeb do below. Instead, define additional modules and import those modules here. """ + use Boundary, deps: [Ambry, AmbrySchema, AmbryScraping], exports: [Endpoint] def static_paths, do: ~w(assets favicon.svg favicon.png favicon-32x32.png favicon-96x96.png robots.txt) diff --git a/mix.exs b/mix.exs index 8f105440..35a5fecd 100644 --- a/mix.exs +++ b/mix.exs @@ -7,6 +7,7 @@ defmodule Ambry.MixProject do version: "1.2.0", elixir: "~> 1.14", elixirc_paths: elixirc_paths(Mix.env()), + compilers: [:boundary] ++ Mix.compilers(), start_permanent: Mix.env() == :prod, aliases: aliases(), deps: deps(), @@ -28,7 +29,7 @@ defmodule Ambry.MixProject do # Type `mix help compile.app` for more information. def application do [ - mod: {Ambry.Application, []}, + mod: {AmbryApp.Application, []}, extra_applications: [:logger, :runtime_tools, :os_mon] ] end @@ -48,6 +49,7 @@ defmodule Ambry.MixProject do {:absinthe, "~> 1.7"}, {:argon2_elixir, "~> 4.0"}, {:bandit, "~> 1.0"}, + {:boundary, "~> 0.10", runtime: false}, {:credo, "~> 1.6", only: [:dev, :test], runtime: false}, {:dataloader, "~> 2.0"}, {:dialyxir, "~> 1.0", only: [:dev], runtime: false}, diff --git a/mix.lock b/mix.lock index 8ab7b0de..9835c7bb 100644 --- a/mix.lock +++ b/mix.lock @@ -4,6 +4,7 @@ "absinthe_relay": {:hex, :absinthe_relay, "1.5.2", "cfb8aed70f4e4c7718d3f1c212332d2ea728f17c7fc0f68f1e461f0f5f0c4b9a", [:mix], [{:absinthe, "~> 1.5.0 or ~> 1.6.0 or ~> 1.7.0", [hex: :absinthe, repo: "hexpm", optional: false]}, {:ecto, "~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "0587ee913afa31512e1457a5064ee88427f8fe7bcfbeeecd41c71d9cff0b62b6"}, "argon2_elixir": {:hex, :argon2_elixir, "4.0.0", "7f6cd2e4a93a37f61d58a367d82f830ad9527082ff3c820b8197a8a736648941", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "f9da27cf060c9ea61b1bd47837a28d7e48a8f6fa13a745e252556c14f9132c7f"}, "bandit": {:hex, :bandit, "1.5.0", "3bc864a0da7f013ad3713a7f550c6a6ec0e19b8d8715ec678256a0dc197d5539", [:mix], [{:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "92d18d9a7228a597e0d4661ef69a874ea82d63ff49c7d801a5c68cb18ebbbd72"}, + "boundary": {:hex, :boundary, "0.10.3", "43c15d67a3a1ba863d0995de1c300e82aeb3cfec592d0a6a88a5aa2cf95d3c32", [:mix], [], "hexpm", "a037f12b28b2baf971f7e986e642967c94ff7bf74f25ad6a4d7c52e7e8739850"}, "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "castore": {:hex, :castore, "1.0.7", "b651241514e5f6956028147fe6637f7ac13802537e895a724f90bf3e36ddd1dd", [:mix], [], "hexpm", "da7785a4b0d2a021cd1292a60875a784b6caef71e76bf4917bdee1f390455cf5"}, "comeonin": {:hex, :comeonin, "5.4.0", "246a56ca3f41d404380fc6465650ddaa532c7f98be4bda1b4656b3a37cc13abe", [:mix], [], "hexpm", "796393a9e50d01999d56b7b8420ab0481a7538d0caf80919da493b4a6e51faf1"}, From a97a3247d08523a6e550eebf18f04c1fa310e920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Dos=C3=A9?= Date: Tue, 9 Apr 2024 23:26:33 -0700 Subject: [PATCH 02/13] Clean up and strictify ambry_scraping boundaries --- lib/ambry.ex | 1 + lib/ambry_app/application.ex | 2 +- lib/ambry_scraping.ex | 29 ++++--------- lib/ambry_scraping/audible.ex | 4 ++ lib/ambry_scraping/audnexus.ex | 2 + lib/ambry_scraping/goodreads.ex | 8 ++++ lib/ambry_scraping/html_to_md.ex | 2 + lib/ambry_scraping/image.ex | 2 + lib/ambry_scraping/marionette.ex | 46 +++++++++++++++++++++ lib/ambry_scraping/marionette/supervisor.ex | 29 ------------- lib/ambry_web.ex | 4 +- mix.exs | 5 +++ 12 files changed, 82 insertions(+), 52 deletions(-) create mode 100644 lib/ambry_scraping/marionette.ex delete mode 100644 lib/ambry_scraping/marionette/supervisor.ex diff --git a/lib/ambry.ex b/lib/ambry.ex index 15648408..575612a1 100644 --- a/lib/ambry.ex +++ b/lib/ambry.ex @@ -41,6 +41,7 @@ defmodule Ambry do PubSub.Message, Repo, Search, + Search.IndexManager, Series, Series.Series, Series.SeriesBook, diff --git a/lib/ambry_app/application.ex b/lib/ambry_app/application.ex index 214146b1..c05ae6c9 100644 --- a/lib/ambry_app/application.ex +++ b/lib/ambry_app/application.ex @@ -47,7 +47,7 @@ defmodule AmbryApp.Application do # Search index refresher/warmer {Task, &Ambry.Search.refresh_entire_index!/0}, # Headless browser for web-scraping - AmbryScraping.Marionette.Supervisor + AmbryScraping.Marionette ] end diff --git a/lib/ambry_scraping.ex b/lib/ambry_scraping.ex index eca7c4c4..803815af 100644 --- a/lib/ambry_scraping.ex +++ b/lib/ambry_scraping.ex @@ -1,25 +1,12 @@ defmodule AmbryScraping do - @moduledoc false - use Boundary, - deps: [], - exports: [ - Audible, - Audible.Products.Product, - Audnexus, - GoodReads, - GoodReads.Books.Editions.Edition, - GoodReads.Books.Search.Book, - GoodReads.PublishedDate - ] + @moduledoc """ + Provides web and API scraping for GoodReads, Audible, and Audnexus. + """ - alias AmbryScraping.Marionette.Connection + use Boundary, + type: :strict, + deps: [Jason, Floki, Logger, Req], + exports: [{Audible, []}, {Audnexus, []}, {GoodReads, []}, Image, Marionette] - def web_scraping_available? do - Connection - |> Process.whereis() - |> then(fn - nil -> false - pid -> Process.alive?(pid) - end) - end + defdelegate web_scraping_available?, to: AmbryScraping.Marionette end diff --git a/lib/ambry_scraping/audible.ex b/lib/ambry_scraping/audible.ex index 0bc34cd2..2e6ea649 100644 --- a/lib/ambry_scraping/audible.ex +++ b/lib/ambry_scraping/audible.ex @@ -1,6 +1,10 @@ defmodule AmbryScraping.Audible do @moduledoc false + use Boundary, + deps: [AmbryScraping.HTMLToMD, AmbryScraping.Image, AmbryScraping.Marionette], + exports: [Products.Product] + alias AmbryScraping.Audible.Authors alias AmbryScraping.Audible.Products diff --git a/lib/ambry_scraping/audnexus.ex b/lib/ambry_scraping/audnexus.ex index e2d083cd..7920322d 100644 --- a/lib/ambry_scraping/audnexus.ex +++ b/lib/ambry_scraping/audnexus.ex @@ -1,6 +1,8 @@ defmodule AmbryScraping.Audnexus do @moduledoc false + use Boundary, deps: [AmbryScraping.Image] + alias AmbryScraping.Audnexus.Authors alias AmbryScraping.Audnexus.Books diff --git a/lib/ambry_scraping/goodreads.ex b/lib/ambry_scraping/goodreads.ex index 04e7802d..3d801e00 100644 --- a/lib/ambry_scraping/goodreads.ex +++ b/lib/ambry_scraping/goodreads.ex @@ -1,6 +1,14 @@ defmodule AmbryScraping.GoodReads do @moduledoc false + use Boundary, + deps: [AmbryScraping.HTMLToMD, AmbryScraping.Image, AmbryScraping.Marionette], + exports: [ + Books.Editions.Edition, + Books.Search.Book, + PublishedDate + ] + alias AmbryScraping.GoodReads.Authors alias AmbryScraping.GoodReads.Books diff --git a/lib/ambry_scraping/html_to_md.ex b/lib/ambry_scraping/html_to_md.ex index 6ac2a1f9..0a3edcb4 100644 --- a/lib/ambry_scraping/html_to_md.ex +++ b/lib/ambry_scraping/html_to_md.ex @@ -5,6 +5,8 @@ defmodule AmbryScraping.HTMLToMD do It doesn't work great in all cases... """ + use Boundary + def html_to_md(html_string) when is_binary(html_string) do html_string |> Floki.parse_document!() diff --git a/lib/ambry_scraping/image.ex b/lib/ambry_scraping/image.ex index 18b78904..f55ea861 100644 --- a/lib/ambry_scraping/image.ex +++ b/lib/ambry_scraping/image.ex @@ -1,6 +1,8 @@ defmodule AmbryScraping.Image do @moduledoc false + use Boundary + defstruct [:src, :data_url] def fetch_from_source(src) do diff --git a/lib/ambry_scraping/marionette.ex b/lib/ambry_scraping/marionette.ex new file mode 100644 index 00000000..2d0d09ca --- /dev/null +++ b/lib/ambry_scraping/marionette.ex @@ -0,0 +1,46 @@ +defmodule AmbryScraping.Marionette do + @moduledoc false + + use Boundary, exports: [Browser] + use Supervisor + + alias AmbryScraping.Marionette.Browser + alias AmbryScraping.Marionette.Connection + + def start_link(init_arg) do + Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__) + end + + @impl Supervisor + def init(_init_arg) do + case Application.fetch_env(:ambry, Connection) do + :error -> + :ignore + + {:ok, config} -> + children = [ + # Connection for sending commands to the browser + {Connection, config}, + # Higher-level interface for serializing commands to the browser + Browser + ] + + Supervisor.init(children, strategy: :rest_for_one) + end + end + + @doc """ + Checks if the web scraping service is available. + + GoodReads depends on web scraping; if this returns false then GoodReads + scraping will not be available. Audible and Audnexus will still be available. + """ + def web_scraping_available? do + Connection + |> Process.whereis() + |> then(fn + nil -> false + pid -> Process.alive?(pid) + end) + end +end diff --git a/lib/ambry_scraping/marionette/supervisor.ex b/lib/ambry_scraping/marionette/supervisor.ex deleted file mode 100644 index 99c51fd2..00000000 --- a/lib/ambry_scraping/marionette/supervisor.ex +++ /dev/null @@ -1,29 +0,0 @@ -defmodule AmbryScraping.Marionette.Supervisor do - @moduledoc false - - use Supervisor - - alias AmbryScraping.Marionette - - def start_link(init_arg) do - Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__) - end - - @impl Supervisor - def init(_init_arg) do - case Application.fetch_env(:ambry, Marionette.Connection) do - :error -> - :ignore - - {:ok, config} -> - children = [ - # Connection for sending commands to the browser - {Marionette.Connection, config}, - # Higher-level interface for serializing commands to the browser - Marionette.Browser - ] - - Supervisor.init(children, strategy: :rest_for_one) - end - end -end diff --git a/lib/ambry_web.ex b/lib/ambry_web.ex index 999bc98b..7967602e 100644 --- a/lib/ambry_web.ex +++ b/lib/ambry_web.ex @@ -16,7 +16,9 @@ defmodule AmbryWeb do below. Instead, define additional modules and import those modules here. """ - use Boundary, deps: [Ambry, AmbrySchema, AmbryScraping], exports: [Endpoint] + use Boundary, + deps: [Ambry, AmbrySchema, AmbryScraping], + exports: [Endpoint, Presence, Telemetry] def static_paths, do: ~w(assets favicon.svg favicon.png favicon-32x32.png favicon-96x96.png robots.txt) diff --git a/mix.exs b/mix.exs index 35a5fecd..4e6de64d 100644 --- a/mix.exs +++ b/mix.exs @@ -20,6 +20,11 @@ defmodule Ambry.MixProject do ], dialyzer: [ plt_add_apps: [:mix, :ex_unit] + ], + boundary: [ + default: [ + check: [aliases: true] + ] ] ] end From 34bd7535e487ddc404da0c687577e27970a5fb52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Dos=C3=A9?= Date: Wed, 10 Apr 2024 18:54:06 -0700 Subject: [PATCH 03/13] Refactor AmbryScraping boundaries some more --- lib/ambry/metadata/goodreads.ex | 8 +- lib/ambry_app.ex | 1 + lib/ambry_scraping/audible.ex | 66 ++++++++++- lib/ambry_scraping/audible/authors.ex | 23 ++-- lib/ambry_scraping/audible/products.ex | 40 +------ lib/ambry_scraping/audnexus.ex | 49 +++++++- lib/ambry_scraping/audnexus/authors.ex | 21 +--- lib/ambry_scraping/audnexus/books.ex | 22 +--- lib/ambry_scraping/goodreads.ex | 107 ++++++++++++++++-- lib/ambry_scraping/goodreads/authors.ex | 12 +- lib/ambry_scraping/goodreads/books.ex | 56 +-------- .../goodreads/books/edition_details.ex | 33 ++---- .../goodreads/books/editions.ex | 37 ++---- lib/ambry_scraping/goodreads/books/search.ex | 23 +--- .../{published_date.ex => books/shared.ex} | 13 ++- lib/ambry_scraping/html_to_md.ex | 2 +- lib/ambry_scraping/image.ex | 4 +- lib/ambry_scraping/marionette.ex | 4 +- lib/ambry_scraping/marionette/browser.ex | 6 +- lib/ambry_scraping/marionette/connection.ex | 7 +- lib/ambry_web/components/admin/components.ex | 6 +- 21 files changed, 280 insertions(+), 260 deletions(-) rename lib/ambry_scraping/goodreads/{published_date.ex => books/shared.ex} (90%) diff --git a/lib/ambry/metadata/goodreads.ex b/lib/ambry/metadata/goodreads.ex index c454c1c4..6d84fd5c 100644 --- a/lib/ambry/metadata/goodreads.ex +++ b/lib/ambry/metadata/goodreads.ex @@ -22,12 +22,12 @@ defmodule Ambry.Metadata.GoodReads do defp search_books_key(query_string), do: "search_books:#{query_string}" def editions(id, refresh \\ false) - def editions(id, true), do: clear_get_and_cache(id, &GoodReads.book_editions/1) - def editions(id, false), do: cache_get(id, &GoodReads.book_editions/1) + def editions(id, true), do: clear_get_and_cache(id, &GoodReads.editions/1) + def editions(id, false), do: cache_get(id, &GoodReads.editions/1) def edition_details(id, refresh \\ false) - def edition_details(id, true), do: clear_get_and_cache(id, &GoodReads.book_edition_details/1) - def edition_details(id, false), do: cache_get(id, &GoodReads.book_edition_details/1) + def edition_details(id, true), do: clear_get_and_cache(id, &GoodReads.edition_details/1) + def edition_details(id, false), do: cache_get(id, &GoodReads.edition_details/1) def search_authors(query, refresh \\ false) diff --git a/lib/ambry_app.ex b/lib/ambry_app.ex index 55ea48c4..e039d6da 100644 --- a/lib/ambry_app.ex +++ b/lib/ambry_app.ex @@ -2,5 +2,6 @@ defmodule AmbryApp do @moduledoc """ Ambry OTP application. """ + use Boundary, deps: [Ambry, AmbryWeb, AmbryScraping], exports: [] end diff --git a/lib/ambry_scraping/audible.ex b/lib/ambry_scraping/audible.ex index 2e6ea649..3ba18430 100644 --- a/lib/ambry_scraping/audible.ex +++ b/lib/ambry_scraping/audible.ex @@ -1,15 +1,71 @@ defmodule AmbryScraping.Audible do - @moduledoc false + @moduledoc """ + A mix of web scraping and API scraping for Audible. + """ use Boundary, deps: [AmbryScraping.HTMLToMD, AmbryScraping.Image, AmbryScraping.Marionette], - exports: [Products.Product] + exports: [AuthorDetails, Author, Product, Narrator, Series] alias AmbryScraping.Audible.Authors alias AmbryScraping.Audible.Products - defdelegate author_details(id), to: Authors, as: :details - defdelegate search_authors(query), to: Authors, as: :search + defmodule Author do + @moduledoc "Author name and ID only" + defstruct [:id, :name] + end - defdelegate search_books(query), to: Products, as: :search + defmodule AuthorDetails do + @moduledoc "Author details including name, description, and image" + defstruct [:id, :name, :description, :image] + end + + defmodule Narrator do + @moduledoc "Narrator name" + defstruct [:name] + end + + defmodule Series do + @moduledoc "Series title and the sequence number of the book in the series" + defstruct [:id, :sequence, :title] + end + + defmodule Product do + @moduledoc "Audiobook details" + defstruct [ + :id, + :title, + :authors, + :narrators, + :series, + :description, + :cover_image, + :format, + :published, + :publisher, + :language + ] + end + + @doc """ + Searches for authors by name. + + This function uses web scraping to search for authors on the Audible website. + """ + def search_authors(query), do: Authors.search(query) + + @doc """ + Fetches the details of an author by their ID (ASIN). + + This functions uses web scraping to fetch the details of an author from the + Audible website. + """ + def author_details(id), do: Authors.details(id) + + @doc """ + Searches for audiobooks by name. + + This function uses the public Audible API to search for audiobooks. + """ + def search_books(query), do: Products.search(query) end diff --git a/lib/ambry_scraping/audible/authors.ex b/lib/ambry_scraping/audible/authors.ex index c86560c5..afe27413 100644 --- a/lib/ambry_scraping/audible/authors.ex +++ b/lib/ambry_scraping/audible/authors.ex @@ -1,22 +1,12 @@ defmodule AmbryScraping.Audible.Authors do - @moduledoc """ - Audible web-scraping API for authors - """ + @moduledoc false + alias AmbryScraping.Audible.Author + alias AmbryScraping.Audible.AuthorDetails alias AmbryScraping.Audible.Browser alias AmbryScraping.HTMLToMD alias AmbryScraping.Image - defmodule Author do - @moduledoc false - defstruct [:id, :name, :description, :image] - end - - defmodule SearchResult do - @moduledoc false - defstruct [:id, :name] - end - def details(id) do with {:ok, author_html} <- Browser.get_page_html("/author/#{id}"), {:ok, author_document} <- Floki.parse_document(author_html) do @@ -25,7 +15,7 @@ defmodule AmbryScraping.Audible.Authors do end defp parse_author_details(id, author_document) do - %Author{ + %AuthorDetails{ id: id, name: parse_name(author_document), description: parse_description(author_document), @@ -70,7 +60,7 @@ defmodule AmbryScraping.Audible.Authors do path = "/search" |> URI.new!() |> URI.append_query(query) |> URI.to_string() downcased_query_words = - query + name |> String.downcase() |> String.split(" ", trim: true) |> Enum.reject(&(String.length(&1) < 2)) @@ -87,7 +77,7 @@ defmodule AmbryScraping.Audible.Authors do uri = URI.parse(url) id = Path.basename(uri.path) - %SearchResult{ + %Author{ id: id, name: name } @@ -95,6 +85,7 @@ defmodule AmbryScraping.Audible.Authors do |> Enum.uniq_by(& &1.id) |> Enum.filter(fn author -> downcased_name = String.downcase(author.name) + Enum.any?(downcased_query_words, &String.contains?(downcased_name, &1)) end)} end diff --git a/lib/ambry_scraping/audible/products.ex b/lib/ambry_scraping/audible/products.ex index 2977e862..871b66bd 100644 --- a/lib/ambry_scraping/audible/products.ex +++ b/lib/ambry_scraping/audible/products.ex @@ -1,8 +1,10 @@ defmodule AmbryScraping.Audible.Products do - @moduledoc """ - Audible JSON API for products - """ + @moduledoc false + alias AmbryScraping.Audible.Author + alias AmbryScraping.Audible.Narrator + alias AmbryScraping.Audible.Product + alias AmbryScraping.Audible.Series alias AmbryScraping.HTMLToMD alias AmbryScraping.Image @@ -27,38 +29,6 @@ defmodule AmbryScraping.Audible.Products do sku ) - defmodule Product do - @moduledoc false - defstruct [ - :id, - :title, - :authors, - :narrators, - :series, - :description, - :cover_image, - :format, - :published, - :publisher, - :language - ] - end - - defmodule Author do - @moduledoc false - defstruct [:id, :name] - end - - defmodule Narrator do - @moduledoc false - defstruct [:name] - end - - defmodule Series do - @moduledoc false - defstruct [:id, :sequence, :title] - end - @doc """ Returns product details for a given title search query. """ diff --git a/lib/ambry_scraping/audnexus.ex b/lib/ambry_scraping/audnexus.ex index 7920322d..68d66a9c 100644 --- a/lib/ambry_scraping/audnexus.ex +++ b/lib/ambry_scraping/audnexus.ex @@ -1,13 +1,52 @@ defmodule AmbryScraping.Audnexus do - @moduledoc false + @moduledoc """ + Audnexus Authors and Chapters API. - use Boundary, deps: [AmbryScraping.Image] + This is much faster than the Audible scraping API and returns the same data. + """ + + use Boundary, deps: [AmbryScraping.Image], exports: [Author, AuthorDetails, Chapters, Chapter] alias AmbryScraping.Audnexus.Authors alias AmbryScraping.Audnexus.Books - defdelegate author_details(id), to: Authors, as: :details - defdelegate search_authors(query), to: Authors, as: :search + defmodule Author do + @moduledoc "Author name and ID only" + defstruct [:id, :name] + end + + defmodule AuthorDetails do + @moduledoc "Author details including name, description, and image" + defstruct [:id, :name, :description, :image] + end + + defmodule Chapters do + @moduledoc "Audiobook chapters" + defstruct [:asin, :brand_intro_duration_ms, :brand_outro_duration_ms, :chapters] + end + + defmodule Chapter do + @moduledoc "Audiobook chapter details" + defstruct [ + :length_ms, + :start_offset_ms, + :start_offset_sec, + :title + ] + end + + @doc """ + Searches for authors by name. + """ + def search_authors(query), do: Authors.search(query) + + @doc """ + Fetches the details of an author by their ID (ASIN). + """ + def author_details(id), do: Authors.details(id) - defdelegate book_chapters(asin), to: Books, as: :chapters + @doc """ + Fetches the chapters of an audiobook by its ID (ASIN). + """ + def book_chapters(asin), do: Books.chapters(asin) end diff --git a/lib/ambry_scraping/audnexus/authors.ex b/lib/ambry_scraping/audnexus/authors.ex index 8eb90202..df288275 100644 --- a/lib/ambry_scraping/audnexus/authors.ex +++ b/lib/ambry_scraping/audnexus/authors.ex @@ -1,26 +1,15 @@ defmodule AmbryScraping.Audnexus.Authors do - @moduledoc """ - Audnexus Authors API. + @moduledoc false - This is much faster than the Audible scraping API and returns the same data. - """ + alias AmbryScraping.Audnexus.Author + alias AmbryScraping.Audnexus.AuthorDetails @url "https://api.audnex.us/authors" - defmodule Author do - @moduledoc false - defstruct [:id, :name, :description, :image] - end - - defmodule SearchResult do - @moduledoc false - defstruct [:id, :name] - end - def details(id) do with {:ok, %{body: attrs}} <- Req.get("#{@url}/#{id}") do {:ok, - %Author{ + %AuthorDetails{ id: attrs["asin"], name: attrs["name"], description: attrs["description"], @@ -40,7 +29,7 @@ defmodule AmbryScraping.Audnexus.Authors do {:ok, response.body |> Enum.map(fn attrs -> - %SearchResult{ + %Author{ id: attrs["asin"], name: attrs["name"] } diff --git a/lib/ambry_scraping/audnexus/books.ex b/lib/ambry_scraping/audnexus/books.ex index 53c10f5a..44727672 100644 --- a/lib/ambry_scraping/audnexus/books.ex +++ b/lib/ambry_scraping/audnexus/books.ex @@ -1,24 +1,10 @@ defmodule AmbryScraping.Audnexus.Books do - @moduledoc """ - Audnexus Books API. - """ + @moduledoc false - @url "https://api.audnex.us/books" - - defmodule Chapters do - @moduledoc false - defstruct [:asin, :brand_intro_duration_ms, :brand_outro_duration_ms, :chapters] - end + alias AmbryScraping.Audnexus.Chapter + alias AmbryScraping.Audnexus.Chapters - defmodule Chapter do - @moduledoc false - defstruct [ - :length_ms, - :start_offset_ms, - :start_offset_sec, - :title - ] - end + @url "https://api.audnex.us/books" def chapters(asin) do case Req.get("#{@url}/#{asin}/chapters", retry: false) do diff --git a/lib/ambry_scraping/goodreads.ex b/lib/ambry_scraping/goodreads.ex index 3d801e00..2db878b8 100644 --- a/lib/ambry_scraping/goodreads.ex +++ b/lib/ambry_scraping/goodreads.ex @@ -1,21 +1,110 @@ defmodule AmbryScraping.GoodReads do - @moduledoc false + @moduledoc """ + GoodReads web-scraping API + """ use Boundary, deps: [AmbryScraping.HTMLToMD, AmbryScraping.Image, AmbryScraping.Marionette], exports: [ - Books.Editions.Edition, - Books.Search.Book, - PublishedDate + AuthorDetails, + Contributor, + Edition, + EditionDetails, + Editions, + PublishedDate, + Series, + Work ] alias AmbryScraping.GoodReads.Authors alias AmbryScraping.GoodReads.Books - defdelegate author_details(id), to: Authors, as: :details - defdelegate search_authors(query), to: Authors, as: :search + defmodule AuthorDetails do + @moduledoc "Author details including name, description, and image" + defstruct [:id, :name, :description, :image] + end - defdelegate search_books(query), to: Books, as: :search - defdelegate book_editions(work_id), to: Books, as: :editions - defdelegate book_edition_details(edition_id), to: Books, as: :edition_details + defmodule Contributor do + @moduledoc "A contributor (e.g. author, narrator, illustrator, etc.)" + defstruct [:id, :name, :type] + end + + defmodule Edition do + @moduledoc "Book edition" + defstruct [ + :id, + :title, + :published, + :publisher, + :format, + :contributors, + :language, + :thumbnail + # Possible future improvements: + # :isbn + # :isbn10 + # :asin + ] + end + + defmodule EditionDetails do + @moduledoc "Details for a specific edition of a book" + defstruct [ + :id, + :title, + :authors, + :series, + :description, + :cover_image, + :format, + :published, + :publisher, + :language + ] + end + + defmodule Editions do + @moduledoc "Search results for book editions" + defstruct [:id, :title, :primary_author, :first_published, :editions] + end + + defmodule PublishedDate do + @moduledoc "Published date of a book edition" + defstruct [:date, :display_format] + end + + defmodule Series do + @moduledoc "Book series and sequence number in the series" + defstruct [:id, :name, :number] + end + + defmodule Work do + @moduledoc "An individual work" + defstruct [:id, :title, :contributors, :thumbnail] + end + + @doc """ + Searches for authors by name. + """ + def search_authors(query), do: Authors.search(query) + + @doc """ + Fetches the details of an author by their ID. + """ + def author_details(id), do: Authors.details(id) + + @doc """ + Returns book search results for a given query + """ + def search_books(query), do: Books.search(query) + + @doc """ + Returns list of editions for a given book + """ + def editions(work_id), do: Books.editions(work_id) + + @doc """ + Returns the details for a given edition of a book + """ + def edition_details(edition_id), do: Books.edition_details(edition_id) end diff --git a/lib/ambry_scraping/goodreads/authors.ex b/lib/ambry_scraping/goodreads/authors.ex index 693310b1..1abe0b83 100644 --- a/lib/ambry_scraping/goodreads/authors.ex +++ b/lib/ambry_scraping/goodreads/authors.ex @@ -1,18 +1,12 @@ defmodule AmbryScraping.GoodReads.Authors do - @moduledoc """ - GoodReads web-scraping API for authors - """ + @moduledoc false + alias AmbryScraping.GoodReads.AuthorDetails alias AmbryScraping.GoodReads.Books alias AmbryScraping.GoodReads.Browser alias AmbryScraping.HTMLToMD alias AmbryScraping.Image - defmodule Author do - @moduledoc false - defstruct [:id, :name, :description, :image] - end - def details("author:" <> id = full_id) do with {:ok, author_html} <- Browser.get_page_html("/author/show/#{id}"), {:ok, photos_html} <- Browser.get_page_html("/photo/author/#{id}"), @@ -23,7 +17,7 @@ defmodule AmbryScraping.GoodReads.Authors do end defp parse_author_details(full_id, author_document, photos_document) do - maybe_error(%Author{ + maybe_error(%AuthorDetails{ id: full_id, name: parse_name(author_document), description: parse_description(author_document), diff --git a/lib/ambry_scraping/goodreads/books.ex b/lib/ambry_scraping/goodreads/books.ex index 224386bc..005ed6b1 100644 --- a/lib/ambry_scraping/goodreads/books.ex +++ b/lib/ambry_scraping/goodreads/books.ex @@ -1,59 +1,11 @@ defmodule AmbryScraping.GoodReads.Books do - @moduledoc """ - GoodReads web-scraping API for books - """ + @moduledoc false alias AmbryScraping.GoodReads.Books.EditionDetails alias AmbryScraping.GoodReads.Books.Editions alias AmbryScraping.GoodReads.Books.Search - @doc """ - Returns book search results for a given query - - ## Examples - - iex> search("lord of the rings") - {:ok, - %AmbryScraping.GoodReads.Books.Search{ - query: "lord of the rings", - results: [ - %AmbryScraping.GoodReads.Books.Search.Book{ - id: "work:1540236-the-hobbit", - title: "The Hobbit (The Lord of the Rings, #0)", - contributors: [ - %AmbryScraping.GoodReads.Books.Search.Contributor{ - id: "author:656983.J_R_R_Tolkien", - name: "J.R.R. Tolkien", - type: "author" - } - ] - }, - %AmbryScraping.GoodReads.Books.Search.Book{ - id: "work:3204327-the-lord-of-the-rings-the-fellowship-of-the-ring", - title: "The Fellowship of the Ring (The Lord of the Rings, #1)", - contributors: [ - %AmbryScraping.GoodReads.Books.Search.Contributor{ - id: "author:656983.J_R_R_Tolkien", - name: "J.R.R. Tolkien", - type: "author" - } - ] - }, - ... - ] - } - """ - defdelegate search(query), to: Search - - ### - - @doc """ - Returns list of editions for a given book - """ - defdelegate editions(work_id), to: Editions - - @doc """ - Returns the details for a given edition of a book - """ - defdelegate edition_details(edition_id), to: EditionDetails + def search(query), do: Search.search(query) + def editions(work_id), do: Editions.editions(work_id) + def edition_details(edition_id), do: EditionDetails.edition_details(edition_id) end diff --git a/lib/ambry_scraping/goodreads/books/edition_details.ex b/lib/ambry_scraping/goodreads/books/edition_details.ex index 49b7a605..49fa87af 100644 --- a/lib/ambry_scraping/goodreads/books/edition_details.ex +++ b/lib/ambry_scraping/goodreads/books/edition_details.ex @@ -1,34 +1,15 @@ defmodule AmbryScraping.GoodReads.Books.EditionDetails do @moduledoc false + import AmbryScraping.GoodReads.Books.Shared, only: [parse_date: 1] + alias AmbryScraping.GoodReads.Browser - alias AmbryScraping.GoodReads.PublishedDate + alias AmbryScraping.GoodReads.Contributor + alias AmbryScraping.GoodReads.EditionDetails + alias AmbryScraping.GoodReads.Series alias AmbryScraping.HTMLToMD alias AmbryScraping.Image - defstruct [ - :id, - :title, - :authors, - :series, - :description, - :cover_image, - :format, - :published, - :publisher, - :language - ] - - defmodule Contributor do - @moduledoc false - defstruct [:id, :name, :type] - end - - defmodule Series do - @moduledoc false - defstruct [:id, :name, :number] - end - def edition_details("edition:" <> id = full_id) do with {:ok, page_html} <- Browser.get_page_html("/book/show/#{id}", @@ -55,7 +36,7 @@ defmodule AmbryScraping.GoodReads.Books.EditionDetails do attrs = Enum.reduce(work_details_rows ++ edition_details_rows, attrs, &add_details/2) - struct!(__MODULE__, attrs) + struct!(EditionDetails, attrs) end defp parse_book_title(html) do @@ -131,7 +112,7 @@ defmodule AmbryScraping.GoodReads.Books.EditionDetails do defp parse_published(published_string) do case Regex.run(@published_regex, published_string) do [_match, date_string, publisher_string] -> - {PublishedDate.new(date_string), publisher_string} + {parse_date(date_string), publisher_string} _else -> {nil, nil} diff --git a/lib/ambry_scraping/goodreads/books/editions.ex b/lib/ambry_scraping/goodreads/books/editions.ex index 002c6839..66657749 100644 --- a/lib/ambry_scraping/goodreads/books/editions.ex +++ b/lib/ambry_scraping/goodreads/books/editions.ex @@ -1,35 +1,14 @@ defmodule AmbryScraping.GoodReads.Books.Editions do @moduledoc false + import AmbryScraping.GoodReads.Books.Shared, only: [parse_date: 1] + alias AmbryScraping.GoodReads.Browser - alias AmbryScraping.GoodReads.PublishedDate + alias AmbryScraping.GoodReads.Contributor + alias AmbryScraping.GoodReads.Edition + alias AmbryScraping.GoodReads.Editions alias AmbryScraping.Image - defstruct [:id, :title, :primary_author, :first_published, :editions] - - defmodule Contributor do - @moduledoc false - defstruct [:id, :name, :type] - end - - defmodule Edition do - @moduledoc false - defstruct [ - :id, - :title, - :published, - :publisher, - :format, - :contributors, - :language, - :thumbnail - # Possible future improvements: - # :isbn - # :isbn10 - # :asin - ] - end - def editions("work:" <> id = full_id) do query = URI.encode_query(%{utf8: "✓", per_page: 100}) path = "/work/editions/#{id}" |> URI.new!() |> URI.append_query(query) |> URI.to_string() @@ -41,7 +20,7 @@ defmodule AmbryScraping.GoodReads.Books.Editions do end defp parse_page(id, html) do - %__MODULE__{ + %Editions{ id: id, title: parse_book_title(html), primary_author: parse_primary_author(html), @@ -73,7 +52,7 @@ defmodule AmbryScraping.GoodReads.Books.Editions do case published_text do "" -> nil - "First published " <> date_string -> date_string |> clean_string() |> PublishedDate.new() + "First published " <> date_string -> date_string |> clean_string() |> parse_date() _else -> nil end end @@ -123,7 +102,7 @@ defmodule AmbryScraping.GoodReads.Books.Editions do case Regex.run(@published_regex, string) do [_match, date_string, publisher_string] -> - {PublishedDate.new(date_string), publisher_string} + {parse_date(date_string), publisher_string} _else -> {nil, nil} diff --git a/lib/ambry_scraping/goodreads/books/search.ex b/lib/ambry_scraping/goodreads/books/search.ex index cfc15dcb..b0c38f49 100644 --- a/lib/ambry_scraping/goodreads/books/search.ex +++ b/lib/ambry_scraping/goodreads/books/search.ex @@ -1,26 +1,11 @@ defmodule AmbryScraping.GoodReads.Books.Search do - @moduledoc """ - GoodReads book search results - """ + @moduledoc false alias AmbryScraping.GoodReads.Browser + alias AmbryScraping.GoodReads.Contributor + alias AmbryScraping.GoodReads.Work alias AmbryScraping.Image - defmodule Book do - @moduledoc false - defstruct [:id, :title, :contributors, :thumbnail] - end - - defmodule Contributor do - @moduledoc false - defstruct [:id, :name, :type] - end - - defmodule Thumbnail do - @moduledoc false - defstruct [:src, :data_url] - end - def search(""), do: {:ok, []} def search(query_string) do @@ -40,7 +25,7 @@ defmodule AmbryScraping.GoodReads.Books.Search do end defp parse_book(book_html) do - %Book{ + %Work{ id: "work:" <> parse_work_id(book_html), title: parse_book_title(book_html), contributors: parse_contributors(book_html), diff --git a/lib/ambry_scraping/goodreads/published_date.ex b/lib/ambry_scraping/goodreads/books/shared.ex similarity index 90% rename from lib/ambry_scraping/goodreads/published_date.ex rename to lib/ambry_scraping/goodreads/books/shared.ex index 83ddeb68..93f0dada 100644 --- a/lib/ambry_scraping/goodreads/published_date.ex +++ b/lib/ambry_scraping/goodreads/books/shared.ex @@ -1,8 +1,9 @@ -defmodule AmbryScraping.GoodReads.PublishedDate do +defmodule AmbryScraping.GoodReads.Books.Shared do @moduledoc false - defstruct [:date, :display_format] - def new(date_string) do + alias AmbryScraping.GoodReads.PublishedDate + + def parse_date(date_string) do with :error <- parse_full_date(date_string), :error <- parse_year_month(date_string), :error <- parse_year(date_string) do @@ -15,7 +16,7 @@ defmodule AmbryScraping.GoodReads.PublishedDate do with [_match, month, day, year] <- Regex.run(@full_date_regex, date_string), {:ok, month} <- parse_month(month), {:ok, date} <- Date.new(String.to_integer(year), month, String.to_integer(day)) do - %__MODULE__{ + %PublishedDate{ date: date, display_format: :full } @@ -29,7 +30,7 @@ defmodule AmbryScraping.GoodReads.PublishedDate do with [_match, month, year] <- Regex.run(@year_month_regex, date_string), {:ok, month} <- parse_month(month), {:ok, date} <- Date.new(String.to_integer(year), month, 1) do - %__MODULE__{ + %PublishedDate{ date: date, display_format: :year_month } @@ -42,7 +43,7 @@ defmodule AmbryScraping.GoodReads.PublishedDate do defp parse_year(date_string) do with [_match, year] <- Regex.run(@year_regex, date_string), {:ok, date} <- Date.new(String.to_integer(year), 1, 1) do - %__MODULE__{ + %PublishedDate{ date: date, display_format: :year } diff --git a/lib/ambry_scraping/html_to_md.ex b/lib/ambry_scraping/html_to_md.ex index 0a3edcb4..6eb965e8 100644 --- a/lib/ambry_scraping/html_to_md.ex +++ b/lib/ambry_scraping/html_to_md.ex @@ -1,6 +1,6 @@ defmodule AmbryScraping.HTMLToMD do @moduledoc """ - A very simple/naive HTML to Markdown converter. + A very simple/naive HTML to Markdown converter It doesn't work great in all cases... """ diff --git a/lib/ambry_scraping/image.ex b/lib/ambry_scraping/image.ex index f55ea861..be0bc42a 100644 --- a/lib/ambry_scraping/image.ex +++ b/lib/ambry_scraping/image.ex @@ -1,5 +1,7 @@ defmodule AmbryScraping.Image do - @moduledoc false + @moduledoc """ + An image fetched from a URL + """ use Boundary diff --git a/lib/ambry_scraping/marionette.ex b/lib/ambry_scraping/marionette.ex index 2d0d09ca..198df0c4 100644 --- a/lib/ambry_scraping/marionette.ex +++ b/lib/ambry_scraping/marionette.ex @@ -1,5 +1,7 @@ defmodule AmbryScraping.Marionette do - @moduledoc false + @moduledoc """ + Interface to FireFox headless browser using the marionette protocol + """ use Boundary, exports: [Browser] use Supervisor diff --git a/lib/ambry_scraping/marionette/browser.ex b/lib/ambry_scraping/marionette/browser.ex index 06066307..1c1e2e54 100644 --- a/lib/ambry_scraping/marionette/browser.ex +++ b/lib/ambry_scraping/marionette/browser.ex @@ -2,7 +2,7 @@ defmodule AmbryScraping.Marionette.Browser do @moduledoc """ Headless browser interface for web-scraping. - This serializes all access to the Marionette.Connection so that simultaneous + This serializes all access to the headless browser so that simultaneous requests can't interfere with each other. """ @@ -22,6 +22,10 @@ defmodule AmbryScraping.Marionette.Browser do GenServer.start_link(__MODULE__, [], name: __MODULE__) end + @doc """ + Returns the full page HTML of the given URL after having performed the given + actions. + """ def get_page_html(url, actions \\ []) do GenServer.call(__MODULE__, {:get_page_html, url, actions}, :infinity) end diff --git a/lib/ambry_scraping/marionette/connection.ex b/lib/ambry_scraping/marionette/connection.ex index 17dd35bd..f99a9850 100644 --- a/lib/ambry_scraping/marionette/connection.ex +++ b/lib/ambry_scraping/marionette/connection.ex @@ -1,9 +1,8 @@ defmodule AmbryScraping.Marionette.Connection do - @moduledoc """ - TCP socket connection for Marionette. + @moduledoc false - List of WebDriver commands: https://searchfox.org/mozilla-central/source/remote/marionette/driver.sys.mjs#3288 - """ + # TCP socket connection for Marionette. + # List of WebDriver commands: https://searchfox.org/mozilla-central/source/remote/marionette/driver.sys.mjs#3288 @behaviour :gen_statem diff --git a/lib/ambry_web/components/admin/components.ex b/lib/ambry_web/components/admin/components.ex index 12b91b3e..4f7e9dea 100644 --- a/lib/ambry_web/components/admin/components.ex +++ b/lib/ambry_web/components/admin/components.ex @@ -490,7 +490,7 @@ defmodule AmbryWeb.Admin.Components do attr :book, :any, required: true slot :actions - def book_card(%{book: %AmbryScraping.GoodReads.Books.Search.Book{}} = assigns) do + def book_card(%{book: %AmbryScraping.GoodReads.Work{}} = assigns) do ~H"""
@@ -512,7 +512,7 @@ defmodule AmbryWeb.Admin.Components do """ end - def book_card(%{book: %AmbryScraping.GoodReads.Books.Editions.Edition{}} = assigns) do + def book_card(%{book: %AmbryScraping.GoodReads.Edition{}} = assigns) do ~H"""
@@ -538,7 +538,7 @@ defmodule AmbryWeb.Admin.Components do """ end - def book_card(%{book: %AmbryScraping.Audible.Products.Product{}} = assigns) do + def book_card(%{book: %AmbryScraping.Audible.Product{}} = assigns) do ~H"""
From 63e850dd3bafae048f77e2d9c3f549a8d563d0cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Dos=C3=A9?= Date: Thu, 11 Apr 2024 17:55:26 -0700 Subject: [PATCH 04/13] Cleaned up AmbryScraping boundary and implementation some more and added tests --- .formatter.exs | 2 +- coveralls.json | 15 +- lib/ambry_app.ex | 2 +- lib/ambry_app/application.ex | 2 - lib/ambry_scraping.ex | 2 +- lib/ambry_scraping/audible.ex | 2 +- lib/ambry_scraping/audible/authors.ex | 21 +- lib/ambry_scraping/audible/client.ex | 20 + lib/ambry_scraping/audible/products.ex | 28 +- lib/ambry_scraping/audnexus.ex | 2 +- lib/ambry_scraping/audnexus/authors.ex | 35 +- lib/ambry_scraping/audnexus/books.ex | 8 +- lib/ambry_scraping/audnexus/client.ex | 19 + lib/ambry_scraping/goodreads.ex | 2 +- lib/ambry_scraping/goodreads/authors.ex | 9 +- .../goodreads/books/edition_details.ex | 4 +- .../goodreads/books/editions.ex | 3 +- lib/ambry_scraping/goodreads/books/search.ex | 3 +- lib/ambry_scraping/image.ex | 28 - lib/ambry_web/components/admin/components.ex | 6 +- .../book_live/form/audible_import_form.ex | 2 +- .../form/audible_import_form.html.heex | 2 +- .../book_live/form/goodreads_import_form.ex | 2 +- .../form/goodreads_import_form.html.heex | 2 +- .../admin/person_live/form/import_form.ex | 2 +- .../person_live/form/import_form.html.heex | 2 +- lib/ambry_web/user_auth.ex | 2 + mix.exs | 2 + mix.lock | 6 + .../mocks/author_details_not_found.html | 110423 +++++++++ .../mocks/author_details_stephen_king.html | 176525 ++++++++++++++ .../mocks/search_authors_stephen_king.html | 177515 +++++++++++++++ .../audible/mocks/search_books_jaws.json | 3225 + test/ambry_scraping/audible_test.exs | 92 + .../mocks/author_details_stephen_king.json | 1 + .../audnexus/mocks/book_chapters_jaws.json | 1 + .../mocks/search_authors_stephen_king.json | 1 + test/ambry_scraping/audnexus_test.exs | 105 + .../mocks/author_details_not_found.html | 454 + .../author_details_photos_stephen_king.html | 491 + .../mocks/author_details_stephen_king.html | 4400 + .../mocks/edition_details_the_shining.html | 54 + .../goodreads/mocks/editions_the_shining.html | 12366 + .../mocks/search_authors_stephen_king.html | 1666 + .../mocks/search_books_the_shining.html | 1665 + test/ambry_scraping/goodreads_test.exs | 171 + test/ambry_scraping_test.exs | 9 + test/test_helper.exs | 1 + 48 files changed, 489292 insertions(+), 108 deletions(-) create mode 100644 lib/ambry_scraping/audible/client.ex create mode 100644 lib/ambry_scraping/audnexus/client.ex delete mode 100644 lib/ambry_scraping/image.ex create mode 100644 test/ambry_scraping/audible/mocks/author_details_not_found.html create mode 100644 test/ambry_scraping/audible/mocks/author_details_stephen_king.html create mode 100644 test/ambry_scraping/audible/mocks/search_authors_stephen_king.html create mode 100644 test/ambry_scraping/audible/mocks/search_books_jaws.json create mode 100644 test/ambry_scraping/audible_test.exs create mode 100644 test/ambry_scraping/audnexus/mocks/author_details_stephen_king.json create mode 100644 test/ambry_scraping/audnexus/mocks/book_chapters_jaws.json create mode 100644 test/ambry_scraping/audnexus/mocks/search_authors_stephen_king.json create mode 100644 test/ambry_scraping/audnexus_test.exs create mode 100644 test/ambry_scraping/goodreads/mocks/author_details_not_found.html create mode 100644 test/ambry_scraping/goodreads/mocks/author_details_photos_stephen_king.html create mode 100644 test/ambry_scraping/goodreads/mocks/author_details_stephen_king.html create mode 100644 test/ambry_scraping/goodreads/mocks/edition_details_the_shining.html create mode 100644 test/ambry_scraping/goodreads/mocks/editions_the_shining.html create mode 100644 test/ambry_scraping/goodreads/mocks/search_authors_stephen_king.html create mode 100644 test/ambry_scraping/goodreads/mocks/search_books_the_shining.html create mode 100644 test/ambry_scraping/goodreads_test.exs create mode 100644 test/ambry_scraping_test.exs diff --git a/.formatter.exs b/.formatter.exs index 9729a7c3..2d0d0787 100644 --- a/.formatter.exs +++ b/.formatter.exs @@ -1,5 +1,5 @@ [ - import_deps: [:absinthe, :ecto, :ecto_sql, :phoenix], + import_deps: [:absinthe, :ecto, :ecto_sql, :phoenix, :mneme], subdirectories: ["priv/*/migrations"], plugins: [ Styler, diff --git a/coveralls.json b/coveralls.json index 156ed56a..d592ba06 100644 --- a/coveralls.json +++ b/coveralls.json @@ -1,7 +1,16 @@ { "coverage_options": { "treat_no_relevant_lines_as_covered": true, - "minimum_coverage": 30, - "html_filter_full_covered": true - } + "minimum_coverage": 30 + }, + "skip_files": [ + "ambry_app/application.ex", + "ambry_scraping/audible/browser.ex", + "ambry_scraping/audible/client.ex", + "ambry_scraping/audnexus/client.ex", + "ambry_scraping/goodreads/browser.ex", + "ambry_scraping/marionette.ex", + "ambry_scraping/marionette", + "ambry/search/index_manager.ex" + ] } diff --git a/lib/ambry_app.ex b/lib/ambry_app.ex index e039d6da..14145ebd 100644 --- a/lib/ambry_app.ex +++ b/lib/ambry_app.ex @@ -3,5 +3,5 @@ defmodule AmbryApp do Ambry OTP application. """ - use Boundary, deps: [Ambry, AmbryWeb, AmbryScraping], exports: [] + use Boundary, deps: [Ambry, AmbryWeb, AmbryScraping], exports: [Application] end diff --git a/lib/ambry_app/application.ex b/lib/ambry_app/application.ex index c05ae6c9..20f786cb 100644 --- a/lib/ambry_app/application.ex +++ b/lib/ambry_app/application.ex @@ -55,9 +55,7 @@ defmodule AmbryApp.Application do # whenever the application is updated. @impl Application def config_change(changed, _new, removed) do - # coveralls-ignore-start AmbryWeb.Endpoint.config_change(changed, removed) - # coveralls-ignore-stop :ok end diff --git a/lib/ambry_scraping.ex b/lib/ambry_scraping.ex index 803815af..eb6f4e6c 100644 --- a/lib/ambry_scraping.ex +++ b/lib/ambry_scraping.ex @@ -6,7 +6,7 @@ defmodule AmbryScraping do use Boundary, type: :strict, deps: [Jason, Floki, Logger, Req], - exports: [{Audible, []}, {Audnexus, []}, {GoodReads, []}, Image, Marionette] + exports: [{Audible, []}, {Audnexus, []}, {GoodReads, []}, Marionette] defdelegate web_scraping_available?, to: AmbryScraping.Marionette end diff --git a/lib/ambry_scraping/audible.ex b/lib/ambry_scraping/audible.ex index 3ba18430..6c92f9ea 100644 --- a/lib/ambry_scraping/audible.ex +++ b/lib/ambry_scraping/audible.ex @@ -4,7 +4,7 @@ defmodule AmbryScraping.Audible do """ use Boundary, - deps: [AmbryScraping.HTMLToMD, AmbryScraping.Image, AmbryScraping.Marionette], + deps: [AmbryScraping.HTMLToMD, AmbryScraping.Marionette], exports: [AuthorDetails, Author, Product, Narrator, Series] alias AmbryScraping.Audible.Authors diff --git a/lib/ambry_scraping/audible/authors.ex b/lib/ambry_scraping/audible/authors.ex index afe27413..06404200 100644 --- a/lib/ambry_scraping/audible/authors.ex +++ b/lib/ambry_scraping/audible/authors.ex @@ -5,24 +5,26 @@ defmodule AmbryScraping.Audible.Authors do alias AmbryScraping.Audible.AuthorDetails alias AmbryScraping.Audible.Browser alias AmbryScraping.HTMLToMD - alias AmbryScraping.Image def details(id) do with {:ok, author_html} <- Browser.get_page_html("/author/#{id}"), {:ok, author_document} <- Floki.parse_document(author_html) do - {:ok, parse_author_details(id, author_document)} + parse_author_details(id, author_document) end end defp parse_author_details(id, author_document) do - %AuthorDetails{ + maybe_error(%AuthorDetails{ id: id, name: parse_name(author_document), description: parse_description(author_document), image: parse_image(author_document) - } + }) end + defp maybe_error(%{name: "", description: nil, image: nil}), do: {:error, :not_found} + defp maybe_error(author), do: {:ok, author} + defp parse_name(document) do document |> Floki.find("h1.bc-size-extra-large") |> Floki.text() end @@ -44,12 +46,8 @@ defmodule AmbryScraping.Audible.Authors do case document |> Floki.find("div.image-mask img.author-image-outline") |> Floki.attribute("src") do - [src] -> - src = String.replace(src, @src_trailing, ".") - Image.fetch_from_source(src) - - _else -> - nil + [src] -> String.replace(src, @src_trailing, ".") + _else -> nil end end @@ -86,7 +84,8 @@ defmodule AmbryScraping.Audible.Authors do |> Enum.filter(fn author -> downcased_name = String.downcase(author.name) - Enum.any?(downcased_query_words, &String.contains?(downcased_name, &1)) + author.id != "search" and + Enum.any?(downcased_query_words, &String.contains?(downcased_name, &1)) end)} end end diff --git a/lib/ambry_scraping/audible/client.ex b/lib/ambry_scraping/audible/client.ex new file mode 100644 index 00000000..0c89c5a9 --- /dev/null +++ b/lib/ambry_scraping/audible/client.ex @@ -0,0 +1,20 @@ +defmodule AmbryScraping.Audible.Client do + @moduledoc false + + require Logger + + @url "https://api.audible.com/1.0" + + def get(path, params) do + query = URI.encode_query(params) + url = "#{@url}#{path}" |> URI.new!() |> URI.append_query(query) |> URI.to_string() + + Logger.debug(fn -> "[Audible.Client] requesting #{url}" end) + + {micros, response} = :timer.tc(fn -> Req.get(url) end) + + Logger.debug(fn -> "[Audible.Client] got response in #{micros / 1_000_000} seconds" end) + + response + end +end diff --git a/lib/ambry_scraping/audible/products.ex b/lib/ambry_scraping/audible/products.ex index 871b66bd..2e98d0e0 100644 --- a/lib/ambry_scraping/audible/products.ex +++ b/lib/ambry_scraping/audible/products.ex @@ -2,13 +2,12 @@ defmodule AmbryScraping.Audible.Products do @moduledoc false alias AmbryScraping.Audible.Author + alias AmbryScraping.Audible.Client alias AmbryScraping.Audible.Narrator alias AmbryScraping.Audible.Product alias AmbryScraping.Audible.Series alias AmbryScraping.HTMLToMD - alias AmbryScraping.Image - @url "https://api.audible.com/1.0" @response_groups ~w( category_ladders claim_code_url @@ -35,17 +34,14 @@ defmodule AmbryScraping.Audible.Products do def search(""), do: {:ok, []} def search(query) do - query = - URI.encode_query(%{ - title: query, - response_groups: Enum.join(@response_groups, ","), - products_sort_by: "Relevance", - image_sizes: "900" - }) - - url = "#{@url}/catalog/products" |> URI.new!() |> URI.append_query(query) |> URI.to_string() + params = %{ + title: query, + response_groups: Enum.join(@response_groups, ","), + products_sort_by: "Relevance", + image_sizes: "900" + } - case Req.get(url) do + case Client.get("/catalog/products", params) do {:ok, %{status: status} = response} when status in 200..299 -> parse_response(response.body) {:ok, response} -> {:error, response} {:error, reason} -> {:error, reason} @@ -114,15 +110,9 @@ defmodule AmbryScraping.Audible.Products do end defp parse_description(nil), do: nil - defp parse_description(html), do: HTMLToMD.html_to_md(html) - defp parse_image(%{"900" => url}) when is_binary(url) do - src = String.replace(url, "._SL900_", "") - - Image.fetch_from_source(src) - end - + defp parse_image(%{"900" => url}) when is_binary(url), do: String.replace(url, "._SL900_", "") defp parse_image(_else), do: nil defp parse_published(nil), do: nil diff --git a/lib/ambry_scraping/audnexus.ex b/lib/ambry_scraping/audnexus.ex index 68d66a9c..061e3c01 100644 --- a/lib/ambry_scraping/audnexus.ex +++ b/lib/ambry_scraping/audnexus.ex @@ -5,7 +5,7 @@ defmodule AmbryScraping.Audnexus do This is much faster than the Audible scraping API and returns the same data. """ - use Boundary, deps: [AmbryScraping.Image], exports: [Author, AuthorDetails, Chapters, Chapter] + use Boundary, deps: [], exports: [Author, AuthorDetails, Chapters, Chapter] alias AmbryScraping.Audnexus.Authors alias AmbryScraping.Audnexus.Books diff --git a/lib/ambry_scraping/audnexus/authors.ex b/lib/ambry_scraping/audnexus/authors.ex index df288275..be9553d4 100644 --- a/lib/ambry_scraping/audnexus/authors.ex +++ b/lib/ambry_scraping/audnexus/authors.ex @@ -3,31 +3,40 @@ defmodule AmbryScraping.Audnexus.Authors do alias AmbryScraping.Audnexus.Author alias AmbryScraping.Audnexus.AuthorDetails - - @url "https://api.audnex.us/authors" + alias AmbryScraping.Audnexus.Client def details(id) do - with {:ok, %{body: attrs}} <- Req.get("#{@url}/#{id}") do - {:ok, - %AuthorDetails{ - id: attrs["asin"], - name: attrs["name"], - description: attrs["description"], - image: image(attrs["image"]) - }} + case Client.get("/authors/#{id}") do + {:ok, %{status: status, body: attrs}} when status in 200..299 -> + {:ok, + %AuthorDetails{ + id: attrs["asin"], + name: attrs["name"], + description: attrs["description"], + image: image(attrs["image"]) + }} + + {:ok, %{status: status}} when status in 400..499 -> + {:error, :not_found} + + {:ok, response} -> + {:error, response} + + {:error, reason} -> + {:error, reason} end end defp image(nil), do: nil defp image(""), do: nil - defp image(src), do: AmbryScraping.Image.fetch_from_source(src) + defp image(src), do: src def search(""), do: {:ok, []} def search(name) do - with {:ok, response} <- Req.get(@url, params: [name: name]) do + with {:ok, %{status: 200, body: body}} <- Client.get("/authors", params: [name: name]) do {:ok, - response.body + body |> Enum.map(fn attrs -> %Author{ id: attrs["asin"], diff --git a/lib/ambry_scraping/audnexus/books.ex b/lib/ambry_scraping/audnexus/books.ex index 44727672..671183f0 100644 --- a/lib/ambry_scraping/audnexus/books.ex +++ b/lib/ambry_scraping/audnexus/books.ex @@ -3,14 +3,16 @@ defmodule AmbryScraping.Audnexus.Books do alias AmbryScraping.Audnexus.Chapter alias AmbryScraping.Audnexus.Chapters - - @url "https://api.audnex.us/books" + alias AmbryScraping.Audnexus.Client def chapters(asin) do - case Req.get("#{@url}/#{asin}/chapters", retry: false) do + case Client.get("/books/#{asin}/chapters", retry: false) do {:ok, %{status: status} = response} when status in 200..299 -> parse_chapter_info(response.body) + {:ok, %{status: status}} when status in 400..499 -> + {:error, :not_found} + {:ok, response} -> {:error, response} diff --git a/lib/ambry_scraping/audnexus/client.ex b/lib/ambry_scraping/audnexus/client.ex new file mode 100644 index 00000000..8a35c723 --- /dev/null +++ b/lib/ambry_scraping/audnexus/client.ex @@ -0,0 +1,19 @@ +defmodule AmbryScraping.Audnexus.Client do + @moduledoc false + + require Logger + + @url "https://api.audnex.us" + + def get(path, opts \\ []) do + url = "#{@url}#{path}" + + Logger.debug(fn -> "[Audnexus.Client] requesting #{url}" end) + + {micros, response} = :timer.tc(fn -> Req.get(url, opts) end) + + Logger.debug(fn -> "[Audnexus.Client] got response in #{micros / 1_000_000} seconds" end) + + response + end +end diff --git a/lib/ambry_scraping/goodreads.ex b/lib/ambry_scraping/goodreads.ex index 2db878b8..b84b8200 100644 --- a/lib/ambry_scraping/goodreads.ex +++ b/lib/ambry_scraping/goodreads.ex @@ -4,7 +4,7 @@ defmodule AmbryScraping.GoodReads do """ use Boundary, - deps: [AmbryScraping.HTMLToMD, AmbryScraping.Image, AmbryScraping.Marionette], + deps: [AmbryScraping.HTMLToMD, AmbryScraping.Marionette], exports: [ AuthorDetails, Contributor, diff --git a/lib/ambry_scraping/goodreads/authors.ex b/lib/ambry_scraping/goodreads/authors.ex index 1abe0b83..ba20e28b 100644 --- a/lib/ambry_scraping/goodreads/authors.ex +++ b/lib/ambry_scraping/goodreads/authors.ex @@ -5,7 +5,6 @@ defmodule AmbryScraping.GoodReads.Authors do alias AmbryScraping.GoodReads.Books alias AmbryScraping.GoodReads.Browser alias AmbryScraping.HTMLToMD - alias AmbryScraping.Image def details("author:" <> id = full_id) do with {:ok, author_html} <- Browser.get_page_html("/author/show/#{id}"), @@ -46,12 +45,8 @@ defmodule AmbryScraping.GoodReads.Authors do defp parse_image(document) do case document |> Floki.find("ul.photoList li.profile img") |> Floki.attribute("src") do - [src] -> - src = String.replace(src, "p2", "p8") - Image.fetch_from_source(src) - - _else -> - nil + [src] -> String.replace(src, "p2", "p8") + _else -> nil end end diff --git a/lib/ambry_scraping/goodreads/books/edition_details.ex b/lib/ambry_scraping/goodreads/books/edition_details.ex index 49fa87af..6e415f3b 100644 --- a/lib/ambry_scraping/goodreads/books/edition_details.ex +++ b/lib/ambry_scraping/goodreads/books/edition_details.ex @@ -8,7 +8,6 @@ defmodule AmbryScraping.GoodReads.Books.EditionDetails do alias AmbryScraping.GoodReads.EditionDetails alias AmbryScraping.GoodReads.Series alias AmbryScraping.HTMLToMD - alias AmbryScraping.Image def edition_details("edition:" <> id = full_id) do with {:ok, page_html} <- @@ -77,8 +76,7 @@ defmodule AmbryScraping.GoodReads.Books.EditionDetails do defp parse_cover_image(html) do [src | _rest] = html |> Floki.find("div.BookPage__bookCover img") |> Floki.attribute("src") - - Image.fetch_from_source(src) + src end defp add_details(row, attrs) do diff --git a/lib/ambry_scraping/goodreads/books/editions.ex b/lib/ambry_scraping/goodreads/books/editions.ex index 66657749..bf200783 100644 --- a/lib/ambry_scraping/goodreads/books/editions.ex +++ b/lib/ambry_scraping/goodreads/books/editions.ex @@ -7,7 +7,6 @@ defmodule AmbryScraping.GoodReads.Books.Editions do alias AmbryScraping.GoodReads.Contributor alias AmbryScraping.GoodReads.Edition alias AmbryScraping.GoodReads.Editions - alias AmbryScraping.Image def editions("work:" <> id = full_id) do query = URI.encode_query(%{utf8: "✓", per_page: 100}) @@ -113,7 +112,7 @@ defmodule AmbryScraping.GoodReads.Books.Editions do defp parse_thumbnail(edition_html) do [src] = edition_html |> Floki.find("div.leftAlignedImage img") |> Floki.attribute("src") - Image.fetch_from_source(src) + src end defp parse_authors(data_rows) do diff --git a/lib/ambry_scraping/goodreads/books/search.ex b/lib/ambry_scraping/goodreads/books/search.ex index b0c38f49..39a6d004 100644 --- a/lib/ambry_scraping/goodreads/books/search.ex +++ b/lib/ambry_scraping/goodreads/books/search.ex @@ -4,7 +4,6 @@ defmodule AmbryScraping.GoodReads.Books.Search do alias AmbryScraping.GoodReads.Browser alias AmbryScraping.GoodReads.Contributor alias AmbryScraping.GoodReads.Work - alias AmbryScraping.Image def search(""), do: {:ok, []} @@ -79,7 +78,7 @@ defmodule AmbryScraping.GoodReads.Books.Search do defp parse_thumbnail(book_html) do [src] = book_html |> Floki.find("img.bookCover") |> Floki.attribute("src") - Image.fetch_from_source(src) + src end defp parse_work_id(book_html) do diff --git a/lib/ambry_scraping/image.ex b/lib/ambry_scraping/image.ex deleted file mode 100644 index be0bc42a..00000000 --- a/lib/ambry_scraping/image.ex +++ /dev/null @@ -1,28 +0,0 @@ -defmodule AmbryScraping.Image do - @moduledoc """ - An image fetched from a URL - """ - - use Boundary - - defstruct [:src, :data_url] - - def fetch_from_source(src) do - %__MODULE__{ - src: src, - data_url: build_data_url(src) - } - end - - defp build_data_url(src) do - case Req.get(src) do - {:ok, %Req.Response{status: 200} = response} -> - mime = Req.Response.get_header(response, "content-type") - data = Base.encode64(response.body) - "data:#{mime};base64,#{data}" - - _else -> - nil - end - end -end diff --git a/lib/ambry_web/components/admin/components.ex b/lib/ambry_web/components/admin/components.ex index 4f7e9dea..61ea8365 100644 --- a/lib/ambry_web/components/admin/components.ex +++ b/lib/ambry_web/components/admin/components.ex @@ -493,7 +493,7 @@ defmodule AmbryWeb.Admin.Components do def book_card(%{book: %AmbryScraping.GoodReads.Work{}} = assigns) do ~H"""
- +

<%= @book.title %>

@@ -515,7 +515,7 @@ defmodule AmbryWeb.Admin.Components do def book_card(%{book: %AmbryScraping.GoodReads.Edition{}} = assigns) do ~H"""

- +

<%= @book.title %>

@@ -541,7 +541,7 @@ defmodule AmbryWeb.Admin.Components do def book_card(%{book: %AmbryScraping.Audible.Product{}} = assigns) do ~H"""

- +

<%= @book.title %>

diff --git a/lib/ambry_web/live/admin/book_live/form/audible_import_form.ex b/lib/ambry_web/live/admin/book_live/form/audible_import_form.ex index dc16c31b..17180845 100644 --- a/lib/ambry_web/live/admin/book_live/form/audible_import_form.ex +++ b/lib/ambry_web/live/admin/book_live/form/audible_import_form.ex @@ -131,7 +131,7 @@ defmodule AmbryWeb.Admin.BookLive.Form.AudibleImportForm do {"use_cover_image", "true"}, acc -> Map.merge(acc, %{ "image_type" => "url_import", - "image_import_url" => book.cover_image.src + "image_import_url" => book.cover_image }) _else, acc -> diff --git a/lib/ambry_web/live/admin/book_live/form/audible_import_form.html.heex b/lib/ambry_web/live/admin/book_live/form/audible_import_form.html.heex index 71b4e488..5406c92a 100644 --- a/lib/ambry_web/live/admin/book_live/form/audible_import_form.html.heex +++ b/lib/ambry_web/live/admin/book_live/form/audible_import_form.html.heex @@ -91,7 +91,7 @@ <.image_with_size :if={selected_book.cover_image} id={@form[:use_cover_image].id} - src={selected_book.cover_image.src} + src={selected_book.cover_image} class="h-48 rounded-sm" /> diff --git a/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.ex b/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.ex index d404b6ef..55ca248f 100644 --- a/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.ex +++ b/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.ex @@ -181,7 +181,7 @@ defmodule AmbryWeb.Admin.BookLive.Form.GoodreadsImportForm do {"use_cover_image", "true"}, acc -> Map.merge(acc, %{ "image_type" => "url_import", - "image_import_url" => book.cover_image.src + "image_import_url" => book.cover_image }) _else, acc -> diff --git a/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.html.heex b/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.html.heex index 7f4eb55b..106463d6 100644 --- a/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.html.heex +++ b/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.html.heex @@ -133,7 +133,7 @@ <.image_with_size :if={edition_details.cover_image} id={@form[:use_cover_image].id} - src={edition_details.cover_image.src} + src={edition_details.cover_image} class="h-48 rounded-sm" /> diff --git a/lib/ambry_web/live/admin/person_live/form/import_form.ex b/lib/ambry_web/live/admin/person_live/form/import_form.ex index 78cd4b9c..ab9bc436 100644 --- a/lib/ambry_web/live/admin/person_live/form/import_form.ex +++ b/lib/ambry_web/live/admin/person_live/form/import_form.ex @@ -111,7 +111,7 @@ defmodule AmbryWeb.Admin.PersonLive.Form.ImportForm do Map.put(acc, "description", author.description) {"use_image", "true"}, acc -> - Map.merge(acc, %{"image_type" => "url_import", "image_import_url" => author.image.src}) + Map.merge(acc, %{"image_type" => "url_import", "image_import_url" => author.image}) _else, acc -> acc diff --git a/lib/ambry_web/live/admin/person_live/form/import_form.html.heex b/lib/ambry_web/live/admin/person_live/form/import_form.html.heex index 9bdc8762..b20c742f 100644 --- a/lib/ambry_web/live/admin/person_live/form/import_form.html.heex +++ b/lib/ambry_web/live/admin/person_live/form/import_form.html.heex @@ -51,7 +51,7 @@ <.image_with_size :if={author.image} id={@form[:use_image].id} - src={author.image.src} + src={author.image} class="h-40 w-40 rounded-full object-cover object-top" /> diff --git a/lib/ambry_web/user_auth.ex b/lib/ambry_web/user_auth.ex index 9058c59e..21271dbf 100644 --- a/lib/ambry_web/user_auth.ex +++ b/lib/ambry_web/user_auth.ex @@ -63,6 +63,8 @@ defmodule AmbryWeb.UserAuth do # end # defp renew_session(conn) do + delete_csrf_token() + conn |> configure_session(renew: true) |> clear_session() diff --git a/mix.exs b/mix.exs index 4e6de64d..c5056d7c 100644 --- a/mix.exs +++ b/mix.exs @@ -74,9 +74,11 @@ defmodule Ambry.MixProject do {:gettext, "~> 0.20"}, {:hashids, "~> 2.0"}, {:jason, "~> 1.2"}, + {:mneme, ">= 0.0.0", only: [:dev, :test]}, {:natural_order, "~> 0.3"}, {:npm_deps, "~> 0.3", runtime: false}, {:oban, "~> 2.11"}, + {:patch, "~> 0.13", only: [:test]}, {:phoenix_ecto, "~> 4.4"}, {:phoenix_html, "~> 4.0", override: true}, {:phoenix_live_dashboard, "~> 0.8"}, diff --git a/mix.lock b/mix.lock index 9835c7bb..e8ab0031 100644 --- a/mix.lock +++ b/mix.lock @@ -31,11 +31,13 @@ "finch": {:hex, :finch, "0.18.0", "944ac7d34d0bd2ac8998f79f7a811b21d87d911e77a786bc5810adb75632ada4", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "69f5045b042e531e53edc2574f15e25e735b522c37e2ddb766e15b979e03aa65"}, "floki": {:hex, :floki, "0.36.1", "712b7f2ba19a4d5a47dfe3e74d81876c95bbcbee44fe551f0af3d2a388abb3da", [:mix], [], "hexpm", "21ba57abb8204bcc70c439b423fc0dd9f0286de67dc82773a14b0200ada0995f"}, "gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"}, + "glob_ex": {:hex, :glob_ex, "0.1.6", "3a311ade50f6b71d638af660edcc844c3ab4eb2a2c816cfebb73a1d521bb2f9d", [:mix], [], "hexpm", "fda1e90e10f6029bd72967fef0c9891d0d14da89ca7163076e6028bfcb2c42fa"}, "hashids": {:hex, :hashids, "2.1.0", "aabbcc4f9fa0b460cc6ef629f5bcbc35e7e87b382fee79f9c50be40b86574288", [:mix], [], "hexpm", "172163b1642d415881ef1c6e1f1be12d4e92b0711d5bbbd8854f82a1ce32d60b"}, "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, "mint": {:hex, :mint, "1.5.2", "4805e059f96028948870d23d7783613b7e6b0e2fb4e98d720383852a760067fd", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "d77d9e9ce4eb35941907f1d3df38d8f750c357865353e21d335bdcdf6d892a02"}, + "mneme": {:hex, :mneme, "0.5.0", "773c575fa3d7408a8970016351a8ae92f2c4457193bdf1bcf9a5f0adf06b9695", [:mix], [{:nimble_options, "~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:owl, "~> 0.8.0", [hex: :owl, repo: "hexpm", optional: false]}, {:rewrite, "~> 0.7", [hex: :rewrite, repo: "hexpm", optional: false]}, {:sourceror, "~> 0.12", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "c25ef684985c1036560b507e3fd87d44818320ae541c6f1c017caab37d15f325"}, "natural_order": {:hex, :natural_order, "0.3.0", "a0e3e7aeb8daa50f0463ce6967e94d47ab227a02cca0e1d03b8828b2d480c74b", [:mix], [], "hexpm", "0f0a0f65bb8e313d0e60e37862e9357038386fa48febf8f96ab36375f678afd8"}, "nimble_options": {:hex, :nimble_options, "1.1.0", "3b31a57ede9cb1502071fade751ab0c7b8dbe75a9a4c2b5bbb0943a690b63172", [:mix], [], "hexpm", "8bbbb3941af3ca9acc7835f5655ea062111c9c27bcac53e004460dfd19008a99"}, "nimble_ownership": {:hex, :nimble_ownership, "0.3.1", "99d5244672fafdfac89bfad3d3ab8f0d367603ce1dc4855f86a1c75008bce56f", [:mix], [], "hexpm", "4bf510adedff0449a1d6e200e43e57a814794c8b5b6439071274d248d272a549"}, @@ -44,6 +46,8 @@ "npm_deps": {:hex, :npm_deps, "0.3.3", "a084273e9d26614bb8fc0603889a1539c132f6c35bb0f79985d2934fe5f10799", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "ce726ead4982f24ab6cdd7a1e8cd0d0eb641d135acdb2edd4d93610c961a547f"}, "number": {:hex, :number, "1.0.4", "3e6e6032a3c1d4c3760e77a42c580a57a15545dd993af380809da30fe51a032c", [:mix], [{:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "16f7516584ef2be812af4f33f2eaf3f9b9f6ed8892f45853eb93113f83721e42"}, "oban": {:hex, :oban, "2.17.9", "5bfbd9c1cbdf1322accfa4a651525a5ae288f1f798296a47c1b69658114f506d", [:mix], [{:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f4fa9e962d85a6d875641a9b644ed16567023f0915dc057107420f8dd3ad7bc9"}, + "owl": {:hex, :owl, "0.8.0", "0ef925cb784311093d4e3734822960cbdbdb13b095d748bb5bc82abcd5b56732", [:mix], [], "hexpm", "0a5586ceb1a12f4bbda90e330c20e6ea034552335d09466c10e4218c98977529"}, + "patch": {:hex, :patch, "0.13.0", "da48728f9086a835956200a671210fe88f67ff48bb1f92626989886493ac2081", [:mix], [], "hexpm", "d65a840d485dfa05bf6673269b56680e7537a05050684e713de125a351b28112"}, "phoenix": {:hex, :phoenix, "1.7.12", "1cc589e0eab99f593a8aa38ec45f15d25297dd6187ee801c8de8947090b5a9d3", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "d646192fbade9f485b01bc9920c139bfdd19d0f8df3d73fd8eaf2dfbe0d2837c"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.5.1", "6fdbc334ea53620e71655664df6f33f670747b3a7a6c4041cdda3e2c32df6257", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ebe43aa580db129e54408e719fb9659b7f9e0d52b965c5be26cdca416ecead28"}, "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"}, @@ -56,6 +60,8 @@ "plug_crypto": {:hex, :plug_crypto, "2.0.0", "77515cc10af06645abbfb5e6ad7a3e9714f805ae118fa1a70205f80d2d70fe73", [:mix], [], "hexpm", "53695bae57cc4e54566d993eb01074e4d894b65a3766f1c43e2c61a1b0f45ea9"}, "postgrex": {:hex, :postgrex, "0.17.5", "0483d054938a8dc069b21bdd636bf56c487404c241ce6c319c1f43588246b281", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "50b8b11afbb2c4095a3ba675b4f055c416d0f3d7de6633a595fc131a828a67eb"}, "req": {:hex, :req, "0.4.14", "103de133a076a31044e5458e0f850d5681eef23dfabf3ea34af63212e3b902e2", [:mix], [{:aws_signature, "~> 0.3.2", [hex: :aws_signature, repo: "hexpm", optional: true]}, {:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:nimble_ownership, "~> 0.2.0 or ~> 0.3.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "2ddd3d33f9ab714ced8d3c15fd03db40c14dbf129003c4a3eb80fac2cc0b1b08"}, + "rewrite": {:hex, :rewrite, "0.10.0", "5d756b6dc67679e7156ff6055f9654be02dbaeb177aaf1ff6af7ee8da8718248", [:mix], [{:glob_ex, "~> 0.1", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:sourceror, "~> 0.13", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "68d7808cf549e7bf51b0119a8edc14d50970bad479115249030baa580c1d7b50"}, + "sourceror": {:hex, :sourceror, "0.14.1", "c6fb848d55bd34362880da671debc56e77fd722fa13b4dcbeac89a8998fc8b09", [:mix], [], "hexpm", "8b488a219e4c4d7d9ff29d16346fd4a5858085ccdd010e509101e226bbfd8efc"}, "styler": {:hex, :styler, "0.11.9", "2595393b94e660cd6e8b582876337cc50ff047d184ccbed42fdad2bfd5d78af5", [:mix], [], "hexpm", "8b7806ba1fdc94d0a75127c56875f91db89b75117fcc67572661010c13e1f259"}, "swoosh": {:hex, :swoosh, "1.16.4", "d407768b3b68e3d1ff8d43b575a20c13bea338647143e241a324894cdb5af0b2", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.1.0", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.4 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a38798368c09b09d7108803c42f24bb051d3e87bc1b81e6f09b20bf5a31c6676"}, "table_rex": {:hex, :table_rex, "4.0.0", "3c613a68ebdc6d4d1e731bc973c233500974ec3993c99fcdabb210407b90959b", [:mix], [], "hexpm", "c35c4d5612ca49ebb0344ea10387da4d2afe278387d4019e4d8111e815df8f55"}, diff --git a/test/ambry_scraping/audible/mocks/author_details_not_found.html b/test/ambry_scraping/audible/mocks/author_details_not_found.html new file mode 100644 index 00000000..02e29678 --- /dev/null +++ b/test/ambry_scraping/audible/mocks/author_details_not_found.html @@ -0,0 +1,110423 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page not found error, Audible.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+ +
+
+ +
+
+ + + + + +
+ + +
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Audible Premium Plus. $0.99/month for the first 3-months. Get this deal! $14.95 a month after 3 months. Cancel anytime. Offers ends May 1, 2024 11:59pm + + + + + + + + + + +
+ + +
+ +
+ + + +
+
+ + + + + +
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + + +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +"It was the best of times, it was the worst of times" +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +A Tale of Two Cities, Charles Dickens +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +Oops — we can’t find the page you’re looking for. Head back to the Audible homepage and try again. +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +If you've tried finding the page multiple times and are still having trouble, let us know. +
+ +
+ +
+ +
+
+ +
+ + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+
+ + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/test/ambry_scraping/audible/mocks/author_details_stephen_king.html b/test/ambry_scraping/audible/mocks/author_details_stephen_king.html new file mode 100644 index 00000000..b928aa18 --- /dev/null +++ b/test/ambry_scraping/audible/mocks/author_details_stephen_king.html @@ -0,0 +1,176525 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stephen King – Audio Books, Best Sellers, Author Bio | Audible.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + + +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stephen King + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +AUTHOR + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Stephen King

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +Literature & Fiction + + + + + + + + + | + + + + + + + + + + + + + + +Mystery, Thriller & Suspense + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tap the gear icon above to manage new release emails. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + +Stephen King is the author of more than fifty books, all of them worldwide bestsellers. His first crime thriller featuring Bill Hodges, MR MERCEDES, won the Edgar Award for best novel and was shortlisted for the CWA Gold Dagger Award. Both MR MERCEDES and END OF WATCH received the Goodreads Choice Award for the Best Mystery and Thriller of 2014 and 2016 respectively. + +King co-wrote the bestselling novel Sleeping Beauties with his son Owen King, and many of King's books have been turned into celebrated films and television series including The Shawshank Redemption, Gerald's Game and It. + +King was the recipient of America's prestigious 2014 National Medal of Arts and the 2003 National Book Foundation Medal for distinguished contribution to American Letters. In 2007 he also won the Grand Master Award from the Mystery Writers of America. He lives with his wife Tabitha King in Maine. +
+ + + + + + + + + + + + + + + Read more + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Read less + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ +
+ + + +
+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + You're getting a free audiobook + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + +
+ + + + +
You're getting a free audiobook. + + +
+ + + +

+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + $14.95 per month after 30 days. Cancel anytime. + + +
+ + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+ +
+ + + +
+
+ + + + + +
+ + + +
+ +
+
+ + + + + + + + + +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

A Quote by Stephen King

A change is as good as a rest.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
Stephen King
Hearts in Atlantis

Discover more great inspirational quotes. +

+ + +
+ + +
+ + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Featured Article: 35+ Inspirational Quotes About Hope

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
Hope is one of life’s greatest miracles. The human ability to hold onto belief in the possibility of a better scenario, even when presented with overwhelming evidence to the contrary, is truly phenomenal. It’s easy to understand why so many writers have featured hope in their works, and why hope continues to inspire us. Whether you’re up against a challenge or just looking for inspiration, these quotes about hope can help you find your faith. Here we’ve gathered the most inspirational quotes from some of our favorite audiobooks. +

+ + +
+ + +
+ + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Best Sellers

+ + + + + +
+ +
+ +
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ +
+ Product List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Stories + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Will Patton + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 20 hrs + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 05-21-24 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + +Not rated yet + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $33.07 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$33.07 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pre-order: Free with 30-day trial + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Seth Numrich, Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 24 hrs and 6 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 09-06-22 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +70,573 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $26.24 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$26.24 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Grover Gardner + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 47 hrs and 47 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 02-14-12 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +75,760 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $40.50 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$40.50 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +A Novel + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Craig Wasson + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 30 hrs and 40 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 11-08-11 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +68,025 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $29.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$29.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +The Gunslinger + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + George Guidall + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + The Dark Tower, Book 1 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 7 hrs and 20 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-01-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +39,054 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $14.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$14.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Justine Lupe, Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + Holly Gibney, Book 3 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 15 hrs and 24 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 09-05-23 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4 out of 5 stars + + + + + + +8,805 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.49 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.49 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Wizard and Glass + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Frank Muller + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + The Dark Tower, Book 4 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 27 hrs and 35 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-01-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +5 out of 5 stars + + + + + + +22,273 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $29.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$29.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +The Waste Lands + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Frank Muller + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + The Dark Tower, Book 3 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 18 hrs and 14 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-01-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +5 out of 5 stars + + + + + + +24,277 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.49 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.49 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +The Drawing of the Three + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Frank Muller + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + The Dark Tower, Book 2 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 12 hrs and 47 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-01-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +5 out of 5 stars + + + + + + +26,474 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $17.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$17.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +A Novel + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Raul Esparza + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 34 hrs and 24 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 10-20-09 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +28,188 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $29.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$29.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +The Dark Tower VII + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + George Guidall + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + The Dark Tower, Book 7 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 28 hrs and 50 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 09-16-04 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +5 out of 5 stars + + + + + + +23,176 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $33.71 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$33.71 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Stephen King, Matthew Broderick, Michael C. Hall, Paul Giamatti, Will Patton, Norbert Leo Butz, Lois Smith, Dylan Baker + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 22 hrs and 29 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 07-05-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +5,442 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.49 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.49 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Steven Weber + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 44 hrs and 55 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-01-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +60,815 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $29.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$29.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King, Peter Straub + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Frank Muller + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + Jack Sawyer , Book 1 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 28 hrs + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 11-06-12 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +16,164 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.49 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.49 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Frank Muller + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 13 hrs and 53 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 12-16-99 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +5 out of 5 stars + + + + + + +12,953 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.46 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.46 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +A Novel + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Santino Fontana + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 18 hrs and 59 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 09-10-19 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +46,805 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.49 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.49 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Jeffrey DeMunn + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 22 hrs and 47 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 02-20-01 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +10,020 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $26.24 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$26.24 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Will Patton + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + Holly Gibney, Book 1 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 18 hrs and 41 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 05-22-18 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +62,328 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.49 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.49 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 25 hrs and 11 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-01-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +10,742 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $29.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$29.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +A Novel + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Will Patton + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + Bill Hodges Trilogy, Book 3 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 12 hrs and 53 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 06-07-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +29,510 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $17.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$17.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + + +
    + + +
  • + + +
+
+ +
+ +
+ + + + + +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Looking for a thrill? Try listening to one of these authors + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Looking for a thrill? Try listening
to one of these authors

+ + + + + + + + + + + + + + + + + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Explore + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+ +
+ + + +
+
+ + + + + +
+ + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Listeners also enjoy

+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Are you an author?

+ + + + +Help us improve our Author Pages by updating your bibliography and submitting a new or current image and biography. + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ +
+
+ +
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+
+ + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/test/ambry_scraping/audible/mocks/search_authors_stephen_king.html b/test/ambry_scraping/audible/mocks/search_authors_stephen_king.html new file mode 100644 index 00000000..4c7cc74e --- /dev/null +++ b/test/ambry_scraping/audible/mocks/search_authors_stephen_king.html @@ -0,0 +1,177515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Audiobooks matching keywords Stephen King | Audible.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + +
+ +
+
+ + + + + + +
+ + +
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Audible Premium Plus. $0.99/month for the first 3-months. Get this deal! $14.95 a month after 3 months. Cancel anytime. Offers ends May 1, 2024 11:59pm + + + + + + + + + + +
+ + +
+ +
+ + + +
+
+ + + + + +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Showing results + for "Stephen King" in All Categories

+ + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ Skip to product listSkip to product list pagination + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Categories

+ + + + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +1 - 20 of over 2,000 results +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +Sort by + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ +
+ Product List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Stories + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Will Patton + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 20 hrs + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 05-21-24 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + +Not rated yet + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $33.07 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$33.07 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pre-order: Free with 30-day trial + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Seth Numrich, Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 24 hrs and 6 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 09-06-22 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +70,570 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $26.24 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$26.24 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +A Novel + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Craig Wasson + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 30 hrs and 40 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 11-08-11 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +68,025 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $29.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$29.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen R. King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Virtual Voice + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 4 hrs and 1 min + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-09-24 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +3 out of 5 stars + + + + + + +38 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $6.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$6.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Included in Plus membership + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Grover Gardner + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 47 hrs and 47 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 02-14-12 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +75,760 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $40.50 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$40.50 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Paul Sparks + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 16 hrs and 57 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 08-03-21 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +32,270 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.49 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.49 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Campbell Scott + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + The Shining, Book 1 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 15 hrs and 50 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 08-07-12 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +38,633 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.50 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.50 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +The Gunslinger + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + George Guidall + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + The Dark Tower, Book 1 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 7 hrs and 20 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-01-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +39,054 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $14.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$14.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Will Patton + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + Holly Gibney, Book 1 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 18 hrs and 41 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 05-22-18 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +62,328 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.49 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.49 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Steven Weber + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 44 hrs and 55 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-01-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +60,815 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $29.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$29.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Michael C. Hall + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 15 hrs and 41 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 03-27-18 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +5 out of 5 stars + + + + + + +27,097 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.49 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.49 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +A Novel + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Santino Fontana + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 18 hrs and 59 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 09-10-19 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +46,805 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.49 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.49 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Justine Lupe, Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Series: + + + + + + + + + + + + + + + + + + + + + + + Holly Gibney, Book 3 + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 15 hrs and 24 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 09-05-23 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4 out of 5 stars + + + + + + +8,805 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.49 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.49 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen R. King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Virtual Voice + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 3 hrs and 13 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-09-24 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4 out of 5 stars + + + + + + +4 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $6.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$6.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Included in Plus membership + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 25 hrs and 11 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-01-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +10,742 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $29.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$29.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen R. King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Virtual Voice + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 3 hrs and 34 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-09-24 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4 out of 5 stars + + + + + + +8 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $6.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$6.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Included in Plus membership + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Kirby Heyborne + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 10 hrs and 44 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-01-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +7,063 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $17.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$17.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +A Novel + +
    • + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Raul Esparza + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 34 hrs and 24 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 10-20-09 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4.5 out of 5 stars + + + + + + +28,188 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $29.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$29.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Frank Muller + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 13 hrs and 53 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 12-16-99 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +5 out of 5 stars + + + + + + +12,953 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $22.46 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$22.46 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + +
    + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + By: + Stephen King + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + Narrated by: + Eli Wallach + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Length: 25 hrs and 39 mins + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Release date: + 01-01-16 + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + +Language: + English + + +
    • + + + + + + + + + + + + + + + + + + + + + + +
    • + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +4 out of 5 stars + + + + + + +7,806 ratings + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + + + + + + + + + + + + + + +
    • + + + +
    • + + + + + + + + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Regular price: + + + + + + $29.99 + + + + + + + + + or 1 credit + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + +Sale price: + + + + +$29.99 + + + + + + + + or 1 credit + + +

    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try for $0.00 + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + + +
    + + + + + + +
    + + +
  • + + +
+
+ +
+ +
+ + + + + +
+ + +
+
+
+ +
+
+
+
+
+ + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ People also search for +

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dean koontz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + unknown + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + horror + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + holly + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dune + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + harry potter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + it + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the stand + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + joe hill + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mr mercedes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the shining + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + john grisham + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dark tower + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + game of thrones + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + james patterson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + brandon sanderson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the outsider + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pet sematary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + neil gaiman + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + star wars + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + Show more + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Show less + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + +
+
+ + + + + + + + + + +
\ No newline at end of file diff --git a/test/ambry_scraping/audible/mocks/search_books_jaws.json b/test/ambry_scraping/audible/mocks/search_books_jaws.json new file mode 100644 index 00000000..64aea8a3 --- /dev/null +++ b/test/ambry_scraping/audible/mocks/search_books_jaws.json @@ -0,0 +1,3225 @@ +{ + "product_filters": [], + "products": [ + { + "title": "Jaws", + "is_purchasability_suppressed": false, + "is_listenable": true, + "merchandising_summary": "Jaws is the classic, blockbuster thriller that inspired the three-time Academy Award-winning Steven Spielberg movie and made millions of beachgoers afraid to go into the water....", + "relationships": [ + { + "asin": "B002V8N3NA", + "relationship_to_product": "child", + "relationship_type": "component", + "sort": "2" + }, + { + "asin": "B091G3LNPG", + "content_delivery_type": "BookSeries", + "relationship_to_product": "parent", + "relationship_type": "series", + "sequence": "1", + "sku": "SE_RIES_054008", + "sku_lite": "SE_RIES_054008", + "sort": "1", + "title": "Jaws", + "url": "/pd/Jaws-Audiobook/B091G3LNPG" + }, + { + "asin": "B002V8LFL2", + "relationship_to_product": "child", + "relationship_type": "component", + "sort": "1" + } + ], + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/41kQFsjfY5L._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C41kQFsjfY5L.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/41kQFsjfY5L._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C41kQFsjfY5L.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBJaws,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBPeter%20Benchley,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/41kQFsjfY5L._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C41kQFsjfY5L.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255.jpg" + }, + "release_date": "2009-04-07", + "thesaurus_subject_keywords": [ + "la_confidential", + "literature-and-fiction" + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18574426011", + "name": "Literature & Fiction" + }, + { + "id": "18574427011", + "name": "Action & Adventure" + }, + { + "id": "18574429011", + "name": "Mystery, Thriller & Suspense" + }, + { + "id": "18574433011", + "name": "Thriller & Suspense" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18574426011", + "name": "Literature & Fiction" + }, + { + "id": "18574456011", + "name": "Genre Fiction" + }, + { + "id": "18574475011", + "name": "Psychological" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18574426011", + "name": "Literature & Fiction" + }, + { + "id": "18574490011", + "name": "Horror" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18574597011", + "name": "Mystery, Thriller & Suspense" + }, + { + "id": "18574621011", + "name": "Thriller & Suspense" + }, + { + "id": "18574631011", + "name": "Psychological" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18574597011", + "name": "Mystery, Thriller & Suspense" + }, + { + "id": "18574621011", + "name": "Thriller & Suspense" + }, + { + "id": "18574639011", + "name": "Suspense" + } + ], + "root": "Genres" + } + ], + "has_children": true, + "series": [ + { + "asin": "B091G3LNPG", + "sequence": "1", + "title": "Jaws", + "url": "/pd/Jaws-Audiobook/B091G3LNPG" + } + ], + "is_adult_product": false, + "format_type": "unabridged", + "product_images": { + "900": "https://m.media-amazon.com/images/I/81p4-VU2BXL._SL900_.jpg" + }, + "runtime_length_min": 579, + "sku": "BK_BBCA_000359", + "issue_date": "2009-04-07", + "narrators": [ + { + "asin": "B0C9MBF86L", + "name": "Erik Steele" + } + ], + "asset_details": [], + "language": "english", + "publication_name": "Jaws", + "plans": [ + { + "end_date": "2020-09-13T00:00:00.000-00:00", + "plan_name": "Rodizio", + "start_date": "2015-09-03T00:00:00.000-00:00" + }, + { + "end_date": "2203-10-13T00:00:00.000-00:00", + "plan_name": "Radio", + "start_date": "2016-05-03T00:00:00.000-00:00" + }, + { + "end_date": "2024-12-31T12:00:00.00000Z", + "plan_name": "US Minerva", + "start_date": "2020-07-02T01:15:00.00015Z" + } + ], + "authors": [ + { + "asin": "B000APWADA", + "name": "Peter Benchley" + } + ], + "available_codecs": [ + { + "enhanced_codec": "LC_32_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_32" + }, + { + "enhanced_codec": "format4", + "format": "Format4", + "is_kindle_enhanced": false, + "name": "format4" + }, + { + "enhanced_codec": "LC_64_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_64" + }, + { + "enhanced_codec": "piff2232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "piff_22_32" + }, + { + "enhanced_codec": "mp42264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_64" + }, + { + "enhanced_codec": "piff2264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "piff_22_64" + }, + { + "enhanced_codec": "mp42232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_32" + }, + { + "enhanced_codec": "aax", + "format": "Enhanced", + "is_kindle_enhanced": false, + "name": "aax" + } + ], + "price": { + "credit_price": 1.0, + "list_price": { + "base": 20.239999771118164, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + }, + "lowest_price": { + "base": 20.239999771118164, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + } + }, + "sku_lite": "BK_BBCA_000359", + "is_vvab": false, + "publisher_summary": "

Jaws is the classic, blockbuster thriller that inspired the three-time Academy Award-winning Steven Spielberg movie and made millions of beachgoers afraid to go into the water. Experience the thrill of helpless horror again - or for the first time!

Jaws was number 48 in the American Film Institute's 100 Years...100 Movies, and the film earned the coveted number-one spot on the Bravo network's 100 Scariest Movie Moments countdown.

This timeless tale of man-eating terror that spawned a movie franchise, two video games, a Universal Studios theme park attraction, and two musicals is finally available on audio for the first time ever!

", + "content_delivery_type": "MultiPartBook", + "content_type": "Product", + "publisher_name": "Blackstone Audio, Inc.", + "sample_url": "https://samples.audible.com/bk/bbca/000359/bk_bbca_000359_sample.mp3", + "asin": "B002V8ODY8", + "rating": { + "num_reviews": 548, + "overall_distribution": { + "average_rating": 4.321256038647343, + "display_average_rating": "4.3", + "display_stars": 4.5, + "num_five_star_ratings": 3973, + "num_four_star_ratings": 1803, + "num_one_star_ratings": 113, + "num_ratings": 7038, + "num_three_star_ratings": 925, + "num_two_star_ratings": 224 + }, + "performance_distribution": { + "average_rating": 4.596147513994073, + "display_average_rating": "4.6", + "display_stars": 4.5, + "num_five_star_ratings": 4286, + "num_four_star_ratings": 1265, + "num_one_star_ratings": 39, + "num_ratings": 6074, + "num_three_star_ratings": 420, + "num_two_star_ratings": 64 + }, + "story_distribution": { + "average_rating": 4.263781471120619, + "display_average_rating": "4.3", + "display_stars": 4.5, + "num_five_star_ratings": 3393, + "num_four_star_ratings": 1444, + "num_one_star_ratings": 149, + "num_ratings": 6077, + "num_three_star_ratings": 839, + "num_two_star_ratings": 252 + } + }, + "publication_datetime": "2009-04-07T02:57:06Z" + }, + { + "title": "Jaws", + "is_purchasability_suppressed": false, + "is_listenable": true, + "merchandising_summary": "

There's a silent epidemic in Western civilization, and it is right under our noses. Our jaws are getting smaller and our teeth crooked and crowded, creating not only aesthetic challenges but also difficulties with breathing....

", + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/51X4YHPShjL._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C51X4YHPShjL.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/51X4YHPShjL._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C51X4YHPShjL.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBJaws,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBSandra%20Kahn%252C%20Paul%20R.%20Erhli...,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/51X4YHPShjL._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C51X4YHPShjL.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255.jpg" + }, + "subtitle": "The Story of a Hidden Epidemic", + "release_date": "2018-09-19", + "thesaurus_subject_keywords": [ + "la_confidential" + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18580540011", + "name": "Science & Engineering" + }, + { + "id": "18580555011", + "name": "Science" + }, + { + "id": "18580571011", + "name": "Biological Sciences" + }, + { + "id": "18580572011", + "name": "Anatomy & Physiology" + } + ], + "root": "Genres" + } + ], + "has_children": false, + "is_adult_product": false, + "format_type": "unabridged", + "product_images": { + "900": "https://m.media-amazon.com/images/I/81hxfVq+fVL._SL900_.jpg" + }, + "runtime_length_min": 274, + "sku": "BK_TANT_012926", + "issue_date": "2018-09-19", + "narrators": [ + { + "name": "Gregg Rizzo" + } + ], + "asset_details": [], + "language": "english", + "plans": [ + { + "end_date": "2025-09-30T12:00:00.00000Z", + "plan_name": "US Minerva", + "start_date": "2023-01-16T08:00:00.00000Z" + } + ], + "authors": [ + { + "name": "Sandra Kahn" + }, + { + "name": "Paul R. Erhlich" + }, + { + "name": "Robert Sapolsky - foreword" + } + ], + "available_codecs": [ + { + "enhanced_codec": "LC_32_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_32" + }, + { + "enhanced_codec": "LC_64_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_64" + }, + { + "enhanced_codec": "format4", + "format": "Format4", + "is_kindle_enhanced": false, + "name": "format4" + }, + { + "enhanced_codec": "piff2232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "piff_22_32" + }, + { + "enhanced_codec": "mp42264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_64" + }, + { + "enhanced_codec": "mp42232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_32" + }, + { + "enhanced_codec": "piff2264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "piff_22_64" + }, + { + "enhanced_codec": "aax", + "format": "Enhanced", + "is_kindle_enhanced": false, + "name": "aax" + } + ], + "price": { + "credit_price": 1.0, + "list_price": { + "base": 11.170000076293945, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + }, + "lowest_price": { + "base": 11.170000076293945, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + } + }, + "sku_lite": "BK_TANT_012926", + "is_vvab": false, + "publisher_summary": "

There's a silent epidemic in Western civilization, and it is right under our noses. Our jaws are getting smaller and our teeth crooked and crowded, creating not only aesthetic challenges but also difficulties with breathing. Modern orthodontics has persuaded us that braces and oral devices can correct these problems. While teeth can certainly be straightened, what about the underlying causes of this rapid shift in oral evolution and the health risks posed by obstructed airways?  

Sandra Kahn and Paul R. Ehrlich, a pioneering orthodontist and a world-renowned evolutionist, respectively, present the biological, dietary, and cultural changes that have driven us toward this major health challenge. They propose simple adjustments that can alleviate this developing crisis, as well as a major alternative to orthodontics that promises more significant long-term relief. 

Jaws will change your life. Every parent should listen to this audiobook.

", + "content_delivery_type": "SinglePartBook", + "content_type": "Product", + "publisher_name": "Tantor Audio", + "sample_url": "https://samples.audible.com/bk/tant/012926/bk_tant_012926_sample.mp3", + "asin": "1541447417", + "rating": { + "num_reviews": 53, + "overall_distribution": { + "average_rating": 4.3468634686346865, + "display_average_rating": "4.3", + "display_stars": 4.5, + "num_five_star_ratings": 167, + "num_four_star_ratings": 59, + "num_one_star_ratings": 9, + "num_ratings": 271, + "num_three_star_ratings": 26, + "num_two_star_ratings": 10 + }, + "performance_distribution": { + "average_rating": 4.076923076923077, + "display_average_rating": "4.1", + "display_stars": 4.0, + "num_five_star_ratings": 129, + "num_four_star_ratings": 41, + "num_one_star_ratings": 15, + "num_ratings": 234, + "num_three_star_ratings": 32, + "num_two_star_ratings": 17 + }, + "story_distribution": { + "average_rating": 4.431623931623932, + "display_average_rating": "4.4", + "display_stars": 4.5, + "num_five_star_ratings": 152, + "num_four_star_ratings": 47, + "num_one_star_ratings": 5, + "num_ratings": 234, + "num_three_star_ratings": 24, + "num_two_star_ratings": 6 + } + }, + "publication_datetime": "2018-09-19T07:00:00Z" + }, + { + "asin": "B096HHRG1L", + "asset_details": [], + "authors": [ + { + "name": "Patrick Jankiewicz" + } + ], + "available_codecs": [ + { + "enhanced_codec": "LC_64_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_64" + }, + { + "enhanced_codec": "LC_32_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_32" + }, + { + "enhanced_codec": "format4", + "format": "Format4", + "is_kindle_enhanced": false, + "name": "format4" + }, + { + "enhanced_codec": "LC_64_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_64" + }, + { + "enhanced_codec": "LC_128_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_128" + }, + { + "enhanced_codec": "mp42232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_32" + }, + { + "enhanced_codec": "mp42264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_64" + }, + { + "enhanced_codec": "mp44464", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_44_64" + }, + { + "enhanced_codec": "mp444128", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_44_128" + }, + { + "enhanced_codec": "aax", + "format": "Enhanced", + "is_kindle_enhanced": false, + "name": "aax" + } + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18571910011", + "name": "Arts & Entertainment" + }, + { + "id": "18571923011", + "name": "Entertainment & Performing Arts" + }, + { + "id": "18571933011", + "name": "Film & TV" + } + ], + "root": "Genres" + } + ], + "content_delivery_type": "SinglePartBook", + "content_type": "Product", + "format_type": "unabridged", + "has_children": false, + "is_adult_product": false, + "is_listenable": true, + "is_purchasability_suppressed": false, + "is_vvab": false, + "issue_date": "2021-07-06", + "language": "english", + "merchandising_summary": "

Everything you always wanted to know about the 1975 monster-movie hit Jaws and the other monsters that swam in its wake....

", + "narrators": [ + { + "name": "Nat Segaloff" + } + ], + "plans": [ + { + "end_date": "2024-12-31T12:00:00.00000Z", + "plan_name": "US Minerva", + "start_date": "2021-06-11T17:41:00.00041Z" + } + ], + "price": { + "credit_price": 1.0, + "list_price": { + "base": 20.0, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + }, + "lowest_price": { + "base": 20.0, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + } + }, + "product_images": { + "900": "https://m.media-amazon.com/images/I/81CCfGRjLQS._SL900_.jpg" + }, + "publication_datetime": "2021-07-06T07:00:00Z", + "publisher_name": "BearManor Media", + "publisher_summary": "

Everything you always wanted to know about the 1975 monster-movie hit Jaws and the other monsters that swam in its wake.

", + "rating": { + "num_reviews": 12, + "overall_distribution": { + "average_rating": 4.475728155339806, + "display_average_rating": "4.5", + "display_stars": 4.5, + "num_five_star_ratings": 67, + "num_four_star_ratings": 23, + "num_one_star_ratings": 2, + "num_ratings": 103, + "num_three_star_ratings": 10, + "num_two_star_ratings": 1 + }, + "performance_distribution": { + "average_rating": 4.546391752577319, + "display_average_rating": "4.5", + "display_stars": 4.5, + "num_five_star_ratings": 70, + "num_four_star_ratings": 17, + "num_one_star_ratings": 2, + "num_ratings": 97, + "num_three_star_ratings": 5, + "num_two_star_ratings": 3 + }, + "story_distribution": { + "average_rating": 4.51063829787234, + "display_average_rating": "4.5", + "display_stars": 4.5, + "num_five_star_ratings": 66, + "num_four_star_ratings": 15, + "num_one_star_ratings": 1, + "num_ratings": 94, + "num_three_star_ratings": 9, + "num_two_star_ratings": 3 + } + }, + "release_date": "2021-07-06", + "runtime_length_min": 307, + "sample_url": "https://samples.audible.com/bk/blak/017306/bk_blak_017306_sample.mp3", + "sku": "BK_BLAK_017306", + "sku_lite": "BK_BLAK_017306", + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/51vInIFxomS._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C51vInIFxomS.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/51vInIFxomS._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C51vInIFxomS.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBJust%20When%20You%20Thought%20I...,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBPatrick%20Jankiewicz,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/51vInIFxomS._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C51vInIFxomS.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255.jpg" + }, + "subtitle": "A Jaws Companion", + "title": "Just When You Thought It Was Safe" + }, + { + "title": "Jenny and the Jaws of Life", + "is_purchasability_suppressed": false, + "is_listenable": true, + "merchandising_summary": "

In these wonderfully funny and poignant stories, Willett’s eccentric, complex characters think and do the unconventional. With a unique voice and dry humor, Willett gives us a new insight into human existence, showing us those moments in relationships when life suddenly becomes visible....

", + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/51Di1+2yqzL._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C51Di1+2yqzL.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/51Di1+2yqzL._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C51Di1+2yqzL.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBJenny%20and%20the%20Jaws%20of%20Life,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBJincy%20Willett,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/51Di1+2yqzL._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C51Di1+2yqzL.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255.jpg" + }, + "subtitle": "Short Stories", + "release_date": "2022-05-24", + "thesaurus_subject_keywords": [ + "literature-and-fiction" + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18574426011", + "name": "Literature & Fiction" + }, + { + "id": "18574446011", + "name": "Anthologies & Short Stories" + }, + { + "id": "18574448011", + "name": "Short Stories" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "24427740011", + "name": "Comedy & Humor" + }, + { + "id": "18574496011", + "name": "Literature & Fiction" + }, + { + "id": "18574497011", + "name": "Dark Humor" + } + ], + "root": "Genres" + } + ], + "has_children": false, + "is_adult_product": false, + "format_type": "unabridged", + "product_images": { + "900": "https://m.media-amazon.com/images/I/91rngnbg6PL._SL900_.jpg" + }, + "runtime_length_min": 484, + "sku": "BK_BLAK_019072", + "issue_date": "2022-05-24", + "narrators": [ + { + "name": "Hillary Huber" + }, + { + "name": "Gabra Zackman" + }, + { + "name": "Jonathan Davis" + }, + { + "name": "Sarah Naughton" + }, + { + "name": "Robert Fass" + }, + { + "name": "Tavia Gilbert" + } + ], + "asset_details": [], + "language": "english", + "plans": [ + { + "end_date": "2024-12-31T12:00:00.00000Z", + "plan_name": "US Minerva", + "start_date": "2023-10-31T02:00:00.00000Z" + } + ], + "authors": [ + { + "asin": "B001HD0XL0", + "name": "Jincy Willett" + } + ], + "available_codecs": [ + { + "enhanced_codec": "LC_128_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_128" + }, + { + "enhanced_codec": "LC_32_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_32" + }, + { + "enhanced_codec": "LC_64_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_64" + }, + { + "enhanced_codec": "LC_64_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_64" + }, + { + "enhanced_codec": "format4", + "format": "Format4", + "is_kindle_enhanced": false, + "name": "format4" + }, + { + "enhanced_codec": "mp42264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_64" + }, + { + "enhanced_codec": "mp44464", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_44_64" + }, + { + "enhanced_codec": "mp42232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_32" + }, + { + "enhanced_codec": "mp444128", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_44_128" + }, + { + "enhanced_codec": "aax", + "format": "Enhanced", + "is_kindle_enhanced": false, + "name": "aax" + } + ], + "price": { + "credit_price": 1.0, + "list_price": { + "base": 15.5600004196167, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + }, + "lowest_price": { + "base": 15.5600004196167, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + } + }, + "sku_lite": "BK_BLAK_019072", + "is_vvab": false, + "publisher_summary": "

In these wonderfully funny and poignant stories, Willett’s eccentric, complex characters think and do the unconventional. Soft, euphonic women gradually grow old; weak, unhappy men confront love and their own mortality; and abominable children desperately try to grow up with grace. With a unique voice and dry humor, Willett gives us a new insight into human existence, showing us those specific moments in relationships when life suddenly becomes visible.

Critically acclaimed when it was first published in 1987, Jenny and the Jaws of Life is being brought back due to popular demand. It’s a timeless collection filled with a certain freshness and wit that ring just as loudly today.

", + "content_delivery_type": "SinglePartBook", + "content_type": "Product", + "publisher_name": "Blackstone Publishing", + "sample_url": "https://samples.audible.com/bk/blak/019072/bk_blak_019072_sample.mp3", + "asin": "B09V725QZX", + "rating": { + "num_reviews": 0, + "overall_distribution": { + "average_rating": 5.0, + "display_average_rating": "5.0", + "display_stars": 5.0, + "num_five_star_ratings": 1, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 1, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "performance_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "publication_datetime": "2022-05-24T07:00:00Z" + }, + { + "asin": "B09TQ1HFH8", + "asset_details": [], + "authors": [ + { + "asin": "B001H6SSTQ", + "name": "Janet Riehecky" + }, + { + "name": "Barbara Fox" + }, + { + "name": "Jackie Gai DVM" + } + ], + "available_codecs": [ + { + "enhanced_codec": "format4", + "format": "Format4", + "is_kindle_enhanced": false, + "name": "format4" + }, + { + "enhanced_codec": "LC_64_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_64" + }, + { + "enhanced_codec": "LC_64_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_64" + }, + { + "enhanced_codec": "LC_128_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_128" + }, + { + "enhanced_codec": "LC_32_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_32" + }, + { + "enhanced_codec": "mp44464", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_44_64" + }, + { + "enhanced_codec": "mp42264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_64" + }, + { + "enhanced_codec": "mp444128", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_44_128" + }, + { + "enhanced_codec": "mp42232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_32" + }, + { + "enhanced_codec": "aax", + "format": "Enhanced", + "is_kindle_enhanced": false, + "name": "aax" + } + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18572091011", + "name": "Children's Audiobooks" + }, + { + "id": "18572561011", + "name": "Science & Technology" + } + ], + "root": "Genres" + } + ], + "content_delivery_type": "SinglePartBook", + "content_type": "Product", + "format_type": "unabridged", + "has_children": false, + "is_adult_product": false, + "is_listenable": true, + "is_purchasability_suppressed": false, + "is_vvab": false, + "issue_date": "2022-03-02", + "language": "english", + "merchandising_summary": "

In the game of survival, these animals take a bite out of the competition. Piercing teeth, sharp claws, and powerful jaws can fight off the most daunting enemy and help catch the cleverest prey. Learn about some of nature’s most fearsome opponents....

", + "narrators": [ + { + "name": "anonymous" + } + ], + "plans": [ + { + "end_date": "2027-01-01T12:00:00.00000Z", + "plan_name": "US Minerva", + "start_date": "2022-03-15T22:22:00.00022Z" + } + ], + "price": { + "credit_price": 1.0, + "list_price": { + "base": 3.109999895095825, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + }, + "lowest_price": { + "base": 3.109999895095825, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + } + }, + "product_images": { + "900": "https://m.media-amazon.com/images/I/81n-WkGmwfL._SL900_.jpg" + }, + "publication_datetime": "2022-03-02T02:13:00Z", + "publisher_name": "Capstone Publishers, Inc.", + "publisher_summary": "

In the game of survival, these animals take a bite out of the competition. Piercing teeth, sharp claws, and powerful jaws can fight off the most daunting enemy and help catch the cleverest prey. Learn about some of nature’s most fearsome opponents.

", + "rating": { + "num_reviews": 0, + "overall_distribution": { + "average_rating": 4.0, + "display_average_rating": "4.0", + "display_stars": 4.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 1, + "num_one_star_ratings": 0, + "num_ratings": 1, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "performance_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "release_date": "2022-03-02", + "runtime_length_min": 6, + "sample_url": "https://samples.audible.com/bk/caps/003586/bk_caps_003586_sample.mp3", + "sku": "BK_CAPS_003586", + "sku_lite": "BK_CAPS_003586", + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/61RMP48-5+L._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C61RMP48-5+L.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/61RMP48-5+L._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C61RMP48-5+L.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBTeeth%252C%20Claws%252C%20and%20Jaws,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBJanet%20Riehecky%252C%20Barbara%20Fo...,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/61RMP48-5+L._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C61RMP48-5+L.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255.jpg" + }, + "subtitle": "Animal Weapons and Defenses", + "title": "Teeth, Claws, and Jaws" + }, + { + "title": "The Jaws Obsession", + "is_purchasability_suppressed": true, + "is_listenable": false, + "merchandising_summary": "To share with you, prove to you, convince you, or remind you, that JAWS is the greatest movie of all time. Let‘s make JAWS history.", + "relationships": [ + { + "asin": "B0CCLGCPTK", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "65" + }, + { + "asin": "B0BRBRLP7Z", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "50" + }, + { + "asin": "B0B17H255M", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "21" + }, + { + "asin": "B0B8F2MKBW", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "32" + }, + { + "asin": "B09NF5GPDR", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "2" + }, + { + "asin": "B0BRP4MSHR", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "51" + }, + { + "asin": "B0BLKF1RRP", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "44" + }, + { + "asin": "B0BBTHBT6T", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "37" + }, + { + "asin": "B0CQ94Y42Z", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "73" + }, + { + "asin": "B0CM5PL7WZ", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "71" + }, + { + "asin": "B0BM3QM52T", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "45" + }, + { + "asin": "B09WZMBGWY", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "15" + }, + { + "asin": "B0CL91PKYN", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "70" + }, + { + "asin": "B0BV936CMP", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "56" + }, + { + "asin": "B0BYXNRVT7", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "57" + }, + { + "asin": "B09VYJPCGD", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "13" + }, + { + "asin": "B0BT16PDH3", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "53" + }, + { + "asin": "B09Z64GGYS", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "19" + }, + { + "asin": "B0C8F2LXXW", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "62" + }, + { + "asin": "B0BKTWX91F", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "43" + }, + { + "asin": "B0BH45KDB7", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "41" + }, + { + "asin": "B0B4BRVHZ6", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "25" + }, + { + "asin": "B09YPQH4NF", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "18" + }, + { + "asin": "B0CJC2DGXD", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "74" + }, + { + "asin": "B0BSCQLF4P", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "52" + }, + { + "asin": "B0C2NNGF84", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "59" + }, + { + "asin": "B0B64P93GW", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "28" + }, + { + "asin": "B09T94L3B5", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "11" + }, + { + "asin": "B0CZ7YTRZW", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "76" + }, + { + "asin": "B0C149SXVV", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "61" + }, + { + "asin": "B0BQPZSRLM", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "49" + }, + { + "asin": "B0CFJ2G75J", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "66" + }, + { + "asin": "B09SRL1KB2", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "10" + }, + { + "asin": "B0BNH61TGL", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "47" + }, + { + "asin": "B0B2PXYXZN", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "35" + }, + { + "asin": "B0BF9KZL8P", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "39" + }, + { + "asin": "B09ZBBCB7K", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "58" + }, + { + "asin": "B0BJW1XLGV", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "42" + }, + { + "asin": "B0CNBHVRPK", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "72" + }, + { + "asin": "B0B7HTD567", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "30" + }, + { + "asin": "B09W326FN6", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "14" + }, + { + "asin": "B09S13NZ7Y", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "9" + }, + { + "asin": "B0B4FG7ZCL", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "26" + }, + { + "asin": "B0CBN831W4", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "64" + }, + { + "asin": "B0BPMZSSLP", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "48" + }, + { + "asin": "B09NF5JV18", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "1" + }, + { + "asin": "B0B5BJ8QNS", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "27" + }, + { + "asin": "B09QRXJ5G8", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "6" + }, + { + "asin": "B0CV73195J", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "75" + }, + { + "asin": "B09KN7DX9G", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "3" + }, + { + "asin": "B0B93PCPR6", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "33" + }, + { + "asin": "B0CKGD9TTZ", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "69" + }, + { + "asin": "B0BVTG5G9C", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "55" + }, + { + "asin": "B0C56TX239", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "60" + }, + { + "asin": "B0B381L45W", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "24" + }, + { + "asin": "B0BD8TYJF1", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "38" + }, + { + "asin": "B0B2FDKPLQ", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "23" + }, + { + "asin": "B0BB29NV4Q", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "34" + }, + { + "asin": "B0C96VM8XC", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "63" + }, + { + "asin": "B09RG9XRLT", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "7" + }, + { + "asin": "B0BN2BZFPP", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "46" + }, + { + "asin": "B0CJL1W5NB", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "68" + }, + { + "asin": "B0CGW43CBS", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "67" + }, + { + "asin": "B09NF3W2BV", + "relationship_to_product": "child", + "relationship_type": "season", + "sort": "1" + }, + { + "asin": "B09PFPJGWH", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "4" + }, + { + "asin": "B09Q85C7D6", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "5" + }, + { + "asin": "B0B1W8KZ6K", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "22" + }, + { + "asin": "B0B84K5GMP", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "31" + }, + { + "asin": "B09RVLXQNB", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "8" + }, + { + "asin": "B09XJKJDRJ", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "16" + }, + { + "asin": "B0BG9DYLPM", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "40" + }, + { + "asin": "B09Y4BJGDV", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "17" + }, + { + "asin": "B09TZL9TWK", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "12" + }, + { + "asin": "B0BBSHNBZ4", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "36" + }, + { + "asin": "B09ZQMF24S", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "20" + }, + { + "asin": "B0BV13PF9D", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "54" + }, + { + "asin": "B0B6TC1WP8", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "29" + } + ], + "new_episode_added_date": "2024-03-27T21:10:36.00010Z", + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/41DLn4DFqKL._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C41DLn4DFqKL.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255_PJAdblSocialShare-PodcastIcon-Small,TopLeft,1094,50.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/41DLn4DFqKL._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C41DLn4DFqKL.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBThe%20Jaws%20Obsession,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBJaws%20Obsession,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/41DLn4DFqKL._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C41DLn4DFqKL.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255_PJAdblSocialShare-PodcastIcon-Small,TopLeft,929,45.jpg" + }, + "release_date": "2023-03-25", + "thesaurus_subject_keywords": [ + "podcast_film_history", + "podcast_tv_and_film", + "podcast_show" + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18571910011", + "name": "Arts & Entertainment" + }, + { + "id": "18571913011", + "name": "Art" + } + ], + "root": "Genres" + } + ], + "has_children": true, + "is_adult_product": false, + "format_type": "original_recording", + "product_images": { + "900": "https://m.media-amazon.com/images/I/61Bw20BEAWL._SL900_.jpg" + }, + "sku": "PD_8001_005340", + "issue_date": "2023-03-25", + "asset_details": [], + "language": "english", + "plans": [ + { + "end_date": "2099-12-31T05:00:00.00000Z", + "plan_name": "Free Tier", + "start_date": "2023-03-25T21:52:53.00052Z" + } + ], + "generic_keyword": "672b35f0-852b-4ea7-9a4c-d73f37881d1f", + "authors": [ + { + "name": "Jaws Obsession" + } + ], + "episode_count": 76, + "price": {}, + "sku_lite": "PD_8001_005340", + "is_vvab": false, + "publisher_summary": "To share with you, prove to you, convince you, or remind you, that JAWS is the greatest movie of all time. Let‘s make JAWS history.", + "content_delivery_type": "PodcastParent", + "content_type": "Podcast", + "asin": "B08JJPZFC2", + "continuity": "episodic", + "music_id": "672b35f0-852b-4ea7-9a4c-d73f37881d1f", + "rating": { + "num_reviews": 5, + "overall_distribution": { + "average_rating": 4.857142857142857, + "display_average_rating": "4.9", + "display_stars": 5.0, + "num_five_star_ratings": 6, + "num_four_star_ratings": 1, + "num_one_star_ratings": 0, + "num_ratings": 7, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "performance_distribution": { + "average_rating": 4.857142857142857, + "display_average_rating": "4.9", + "display_stars": 5.0, + "num_five_star_ratings": 6, + "num_four_star_ratings": 1, + "num_one_star_ratings": 0, + "num_ratings": 7, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 5.0, + "display_average_rating": "5.0", + "display_stars": 5.0, + "num_five_star_ratings": 7, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 7, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "publication_datetime": "2023-03-25T21:52:53Z" + }, + { + "title": "Adventures in Amity", + "is_purchasability_suppressed": false, + "is_listenable": true, + "merchandising_summary": "

Set sail with author Dustin McNeill as he goes behind the scenes of Captain Jake’s Amity Boat Tours! Adventures in Amity is the ultimate guide to the legendary attraction that once stood at Universal Studios Florida....

", + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/51-mbvQhNQS._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C51-mbvQhNQS.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/51-mbvQhNQS._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C51-mbvQhNQS.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBAdventures%20in%20Amity,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBDustin%20McNeill,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/51-mbvQhNQS._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C51-mbvQhNQS.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255.jpg" + }, + "subtitle": "Tales from the Jaws Ride", + "release_date": "2021-06-08", + "category_ladders": [ + { + "ladder": [ + { + "id": "18581095011", + "name": "Travel & Tourism" + } + ], + "root": "Genres" + } + ], + "has_children": false, + "is_adult_product": false, + "format_type": "unabridged", + "product_images": { + "900": "https://m.media-amazon.com/images/I/81TRfigapQS._SL900_.jpg" + }, + "runtime_length_min": 413, + "sku": "BK_ACX0_261794", + "issue_date": "2021-06-08", + "narrators": [ + { + "name": "Christian Francis" + } + ], + "asset_details": [], + "language": "english", + "plans": [], + "authors": [ + { + "asin": "B00JUL1EBY", + "name": "Dustin McNeill" + } + ], + "available_codecs": [ + { + "enhanced_codec": "LC_64_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_64" + }, + { + "enhanced_codec": "format4", + "format": "Format4", + "is_kindle_enhanced": false, + "name": "format4" + }, + { + "enhanced_codec": "LC_64_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_64" + }, + { + "enhanced_codec": "LC_32_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_32" + }, + { + "enhanced_codec": "LC_128_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_128" + }, + { + "enhanced_codec": "mp444128", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_44_128" + }, + { + "enhanced_codec": "mp44464", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_44_64" + }, + { + "enhanced_codec": "mp42264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_64" + }, + { + "enhanced_codec": "mp42232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_32" + }, + { + "enhanced_codec": "aax", + "format": "Enhanced", + "is_kindle_enhanced": false, + "name": "aax" + } + ], + "price": { + "credit_price": 1.0, + "list_price": { + "base": 19.950000762939453, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + }, + "lowest_price": { + "base": 19.950000762939453, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + } + }, + "sku_lite": "BK_ACX0_261794", + "is_vvab": false, + "publisher_summary": "

You're Cleared for Departure, Amity Six. Have a Good Trip.

Set sail with author Dustin McNeill as he goes behind the scenes of Captain Jake’s Amity Boat Tours! Adventures in Amity is the ultimate guide to the legendary attraction that once stood at Universal Studios Florida. The book contains over 30 new interviews with the ride’s designers, engineers, and skippers for unprecedented insight into its creation and operation. Hear the untold story of the Jaws ride for the first time ever from those who were actually there!

Points of interest:

  • Introduction by filmmaker J. Michael Roddy (“The Shark is Still Working\" documentary)
  • Hear from park execs about the disastrous opening of both Jaws and Universal Florida
  • Hear about the seldom seen 1990 Jaws ride that closed down shortly after the park opened
  • Trace the evolution of the spiel script starting with its original and vastly different 1987 pitch
  • Learn how engineers guaranteed the ride’s operational reliability upon its 1993 re-opening
  • Hear stories from the 1990/1993 opening teams as well as the 2012 closing team
  • Hear from skippers about working with the sometimes temperamental mechanical sharks
  • Contains stories about other classic Universal Studios Florida attractions including Kongfrontation, Earthquake: The Big One, and the E.T. Adventure
  • Hear tales of breakdowns malfunctions, pranks, celebrity guests, and falling overboard
  • Contains coverage of the Jaws ride still operating in Osaka, Japan
", + "content_delivery_type": "SinglePartBook", + "content_type": "Product", + "publisher_name": "Encyclopocalypse Publications", + "sample_url": "https://samples.audible.com/bk/acx0/261794/bk_acx0_261794_sample.mp3", + "asin": "B096T55MPH", + "editorial_reviews": [ + "" + ], + "rating": { + "num_reviews": 2, + "overall_distribution": { + "average_rating": 4.75, + "display_average_rating": "4.8", + "display_stars": 5.0, + "num_five_star_ratings": 6, + "num_four_star_ratings": 2, + "num_one_star_ratings": 0, + "num_ratings": 8, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "performance_distribution": { + "average_rating": 4.75, + "display_average_rating": "4.8", + "display_stars": 5.0, + "num_five_star_ratings": 6, + "num_four_star_ratings": 2, + "num_one_star_ratings": 0, + "num_ratings": 8, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 5.0, + "display_average_rating": "5.0", + "display_stars": 5.0, + "num_five_star_ratings": 8, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 8, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "publication_datetime": "2021-06-08T21:00:00Z" + }, + { + "asin": "B00ATSFMV0", + "asset_details": [], + "authors": [ + { + "name": "Mr. Ron Thomas" + } + ], + "available_codecs": [ + { + "enhanced_codec": "LC_32_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_32" + }, + { + "enhanced_codec": "LC_64_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_64" + }, + { + "enhanced_codec": "format4", + "format": "Format4", + "is_kindle_enhanced": false, + "name": "format4" + }, + { + "enhanced_codec": "mp42232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_32" + }, + { + "enhanced_codec": "mp42264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_64" + }, + { + "enhanced_codec": "piff2264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "piff_22_64" + }, + { + "enhanced_codec": "piff2232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "piff_22_32" + }, + { + "enhanced_codec": "aax", + "format": "Enhanced", + "is_kindle_enhanced": false, + "name": "aax" + } + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18572029011", + "name": "Business & Careers" + }, + { + "id": "18572049011", + "name": "Management & Leadership" + }, + { + "id": "18572053011", + "name": "Management" + } + ], + "root": "Genres" + } + ], + "content_delivery_type": "SinglePartBook", + "content_type": "Radio/TV Program", + "format_type": "original_recording", + "has_children": false, + "is_adult_product": false, + "is_listenable": true, + "is_purchasability_suppressed": false, + "is_vvab": false, + "issue_date": "2012-12-28", + "language": "english", + "merchandising_summary": "TOP DOG RADIO speaks with film producer, writer, theatre director and Academy Award winner David Brown (1916 – 2010)....", + "narrators": [ + { + "name": "Mr. Ron Thomas" + }, + { + "name": "Mrs. Marian Burnbaum" + }, + { + "name": "Mr. David Brown" + } + ], + "plans": [], + "price": { + "credit_price": 1.0, + "list_price": { + "base": 2.069999933242798, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + }, + "lowest_price": { + "base": 2.069999933242798, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + } + }, + "product_images": { + "900": "https://m.media-amazon.com/images/I/416ktVop70L._SL900_.jpg" + }, + "publication_datetime": "2012-12-28T09:52:00Z", + "publisher_name": "On Air Radio Archive", + "publisher_summary": "

TOP DOG RADIO speaks with film producer, writer, theatre director and Academy Award winner David Brown (1916 – 2010). Brown formed his own film production company in the early 1970s and went on to produce over a dozen blockbuster hits, including The Sting (1973), Jaws (1975), Cocoon (1985) and Driving Miss Daisy (1989). Saying that “every setback is an opportunity,” Brown discusses an issue important to those dreaming of starting their own business. Namely, the right time to quit where you’re at and strike out on your own. Brown also focuses on the changing business of film and movie production, the increasing importance of marketing, and the ability to “read an audience.” For entrepreneurs interested in the entertainment industry, Brown’s insights are beyond valuable.

TOP DOG RADIO features exclusive interviews with legendary business leaders, sharing their inner-most secrets on financial and personal success. TOP DOG RADIO is proud to showcase their expertise to entrepreneurs all over the world who want to learn leading business strategies and maximize their potential.We welcome any feedback. For comments or questions, email Topdogradio@gmail.com. TOP DOG RADIO – Where business legends speak.

", + "rating": { + "num_reviews": 2, + "overall_distribution": { + "average_rating": 4.0, + "display_average_rating": "4.0", + "display_stars": 4.0, + "num_five_star_ratings": 3, + "num_four_star_ratings": 2, + "num_one_star_ratings": 1, + "num_ratings": 6, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "performance_distribution": { + "average_rating": 4.0, + "display_average_rating": "4.0", + "display_stars": 4.0, + "num_five_star_ratings": 3, + "num_four_star_ratings": 2, + "num_one_star_ratings": 1, + "num_ratings": 6, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 4.0, + "display_average_rating": "4.0", + "display_stars": 4.0, + "num_five_star_ratings": 3, + "num_four_star_ratings": 2, + "num_one_star_ratings": 1, + "num_ratings": 6, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "release_date": "2012-12-28", + "runtime_length_min": 21, + "sample_url": "https://samples.audible.com/bk/btwd/000005/bk_btwd_000005_sample.mp3", + "sku": "BK_BTWD_000005", + "sku_lite": "BK_BTWD_000005", + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/416ktVop70L._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C416ktVop70L.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/416ktVop70L._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C416ktVop70L.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBHow%20to%20Produce%20Blockbus...,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBMr.%20Ron%20Thomas,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/416ktVop70L._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C416ktVop70L.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255.jpg" + }, + "title": "How to Produce Blockbuster Movies with JAWS' David Brown" + }, + { + "title": "Animal Fun Facts for Kids", + "is_purchasability_suppressed": false, + "is_listenable": true, + "merchandising_summary": "

Embark on an extraordinary journey through the animal kingdom with Animal Fun Facts! This captivating book is a treasure trove of fascinating information that will leave young listeners in awe....

", + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/610bSTAS0gL._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C610bSTAS0gL.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/610bSTAS0gL._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C610bSTAS0gL.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBAnimal%20Fun%20Facts%20for%20Kids,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBKids%20SLT%20Publications,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/610bSTAS0gL._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C610bSTAS0gL.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255.jpg" + }, + "subtitle": "Paws, Claws & Jaws: Roar, Hop, and Stomp Through a World of Amazing Facts About Dinosaurs, Bunnies, Kangaroos, Bears, Lions, Llamas, Sloths, & More!", + "release_date": "2023-07-28", + "category_ladders": [ + { + "ladder": [ + { + "id": "18572091011", + "name": "Children's Audiobooks" + }, + { + "id": "18572099011", + "name": "Animals & Nature" + }, + { + "id": "18572100011", + "name": "Animals" + }, + { + "id": "18572107011", + "name": "Bears" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18572091011", + "name": "Children's Audiobooks" + }, + { + "id": "18572099011", + "name": "Animals & Nature" + }, + { + "id": "18572100011", + "name": "Animals" + }, + { + "id": "18572119011", + "name": "Dinosaurs" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18572091011", + "name": "Children's Audiobooks" + }, + { + "id": "18572099011", + "name": "Animals & Nature" + }, + { + "id": "18572100011", + "name": "Animals" + }, + { + "id": "18572143011", + "name": "Lions, Tigers & Leopards" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18572091011", + "name": "Children's Audiobooks" + }, + { + "id": "18572099011", + "name": "Animals & Nature" + }, + { + "id": "18572100011", + "name": "Animals" + }, + { + "id": "18572158011", + "name": "Rabbits" + } + ], + "root": "Genres" + } + ], + "has_children": false, + "is_adult_product": false, + "format_type": "unabridged", + "product_images": { + "900": "https://m.media-amazon.com/images/I/91NEZkFx7uL._SL900_.jpg" + }, + "runtime_length_min": 173, + "sku": "BK_ACX0_360575", + "issue_date": "2023-07-28", + "narrators": [ + { + "name": "Mike Baranowski" + } + ], + "asset_details": [], + "language": "english", + "plans": [], + "authors": [ + { + "name": "Kids SLT Publications" + } + ], + "available_codecs": [ + { + "enhanced_codec": "LC_64_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_64" + }, + { + "enhanced_codec": "LC_64_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_64" + }, + { + "enhanced_codec": "LC_32_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_32" + }, + { + "enhanced_codec": "LC_128_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_128" + }, + { + "enhanced_codec": "aax", + "format": "Enhanced", + "is_kindle_enhanced": false, + "name": "aax" + } + ], + "price": { + "credit_price": 1.0, + "list_price": { + "base": 6.949999809265137, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + }, + "lowest_price": { + "base": 6.949999809265137, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + } + }, + "sku_lite": "BK_ACX0_360575", + "is_vvab": false, + "publisher_summary": "

Embark on an extraordinary journey through the animal kingdom with Animal Fun Facts: Roar, Hop, and Stomp Through a World of Amazing Facts About Dinosaurs, Bunnies, Kangaroos, Bears, Lions, Llamas, Sloths, & More! This captivating book is a treasure trove of fascinating information that will leave young listeners in awe.

Discover the wonders of the prehistoric era as you delve into the incredible world of dinosaurs. Uncover jaw-dropping facts about their size, diet, and unique characteristics.

Hop into the realm of bunnies and explore their adorable habits and playful nature. Learn about their diverse species, habitats, and how they adapt to survive in various environments. Delight in their energetic hops and discover the secrets behind their fluffy tails.

Leap into the world of kangaroos and witness their incredible jumping abilities. Marvel at their pouches, which serve as a cozy home for their little joeys. Unearth interesting facts about their social structures, breeding habits, and the fascinating ways they communicate.

Roar alongside the kings and queens of the animal kingdom—bears and lions. Uncover their predatory prowess, hunting techniques, and the unique roles they play within their respective ecosystems. Immerse yourself in their majestic presence through vivid anecdotes and captivating trivia.

Join the curious llamas on their enchanting journey and explore their role in various cultures. Discover their remarkable ability to adapt to harsh environments, their pack dynamics, and the important roles they play in transportation and wool production.

Ease into the slow-paced world of sloths and witness their unique lifestyles. Delve into the fascinating details of their tree-dwelling habits, their slow movements, and the intriguing reasons behind their leisurely pace.

Packed with mesmerizing facts, vivid illustrations, and captivating narratives, Animal Fun Facts: Roar, Hop, and Stomp Through a World of Amazing Facts About Dinosaurs, Bunnies, Kangaroos, Bears, Lions, Llamas, Sloths, & More! is a delightful guide that introduces young listeners to a myriad of fascinating creatures. Whether it's dinosaurs, bunnies, kangaroos, bears, lions, llamas, sloths, or more, this book will ignite a love for animals and leave children eager to explore the wonders of the animal kingdom.

", + "content_delivery_type": "SinglePartBook", + "content_type": "Product", + "publisher_name": "Kids SLT Publications", + "sample_url": "https://samples.audible.com/bk/acx0/360575/bk_acx0_360575_sample.mp3", + "asin": "B0CD2ZD53R", + "editorial_reviews": [ + "" + ], + "rating": { + "num_reviews": 21, + "overall_distribution": { + "average_rating": 5.0, + "display_average_rating": "5.0", + "display_stars": 5.0, + "num_five_star_ratings": 21, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 21, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "performance_distribution": { + "average_rating": 5.0, + "display_average_rating": "5.0", + "display_stars": 5.0, + "num_five_star_ratings": 21, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 21, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 5.0, + "display_average_rating": "5.0", + "display_stars": 5.0, + "num_five_star_ratings": 21, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 21, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "publication_datetime": "2023-07-28T21:22:00Z" + }, + { + "title": "Jaws of Hell", + "is_purchasability_suppressed": false, + "is_listenable": true, + "merchandising_summary": "

Ex-SAS trooper and army padre Alex Carter has killed men and slayed demons. Now all he has to do is save humanity from total annihilation....

", + "relationships": [ + { + "asin": "B0956WZVF9", + "content_delivery_type": "BookSeries", + "relationship_to_product": "parent", + "relationship_type": "series", + "sequence": "3", + "sku": "SE_RIES_055343", + "sku_lite": "SE_RIES_055343", + "sort": "3", + "title": "Padre", + "url": "/pd/Padre-Audiobook/B0956WZVF9" + } + ], + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/5107PXUrplL._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C5107PXUrplL.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/5107PXUrplL._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C5107PXUrplL.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBJaws%20of%20Hell,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBDavid%20J.%20Gatward,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/5107PXUrplL._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C5107PXUrplL.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255.jpg" + }, + "subtitle": "Padre, Book 3", + "release_date": "2023-03-23", + "thesaurus_subject_keywords": [ + "literature-and-fiction" + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18574426011", + "name": "Literature & Fiction" + }, + { + "id": "18574427011", + "name": "Action & Adventure" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18574426011", + "name": "Literature & Fiction" + }, + { + "id": "18574490011", + "name": "Horror" + } + ], + "root": "Genres" + } + ], + "has_children": false, + "series": [ + { + "asin": "B0956WZVF9", + "sequence": "3", + "title": "Padre", + "url": "/pd/Padre-Audiobook/B0956WZVF9" + } + ], + "is_adult_product": false, + "format_type": "unabridged", + "product_images": { + "900": "https://m.media-amazon.com/images/I/91akdJUg4QL._SL900_.jpg" + }, + "runtime_length_min": 377, + "sku": "BK_ACX0_346514", + "issue_date": "2023-03-23", + "narrators": [ + { + "name": "Aubrey Parsons" + } + ], + "asset_details": [], + "language": "english", + "publication_name": "Padre", + "plans": [], + "authors": [ + { + "asin": "B085T5XR83", + "name": "David J. Gatward" + } + ], + "available_codecs": [ + { + "enhanced_codec": "LC_32_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_32" + }, + { + "enhanced_codec": "LC_128_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_128" + }, + { + "enhanced_codec": "LC_64_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_64" + }, + { + "enhanced_codec": "LC_64_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_64" + }, + { + "enhanced_codec": "mp444128", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_44_128" + }, + { + "enhanced_codec": "mp44464", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_44_64" + }, + { + "enhanced_codec": "mp42232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_32" + }, + { + "enhanced_codec": "mp42264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_64" + }, + { + "enhanced_codec": "aax", + "format": "Enhanced", + "is_kindle_enhanced": false, + "name": "aax" + } + ], + "price": { + "credit_price": 1.0, + "list_price": { + "base": 19.950000762939453, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + }, + "lowest_price": { + "base": 19.950000762939453, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + } + }, + "sku_lite": "BK_ACX0_346514", + "is_vvab": false, + "publisher_summary": "

Tarantino meets Andy McNab meets the mother of all Korean gore fests!

Ex-SAS trooper and army padre Alex Carter has killed men and slayed demons. Now all he has to do is save humanity from total annihilation.

Thrust into a world of Nazis, demonic forces, and the occult, Alex will lead his team into the very heart of darkness to carry out the most audacious rescue mission in history.

If they survive, it will be a miracle. If they don’t? Not even the dead will walk the Earth.

Jaws of Hell is the third book in the Padre series. Perfect for fans of Jonathan Maberry, Stephen Leather, Larry Correia, Karl Drinkwater, Guy N. Smith, and F. Paul Wilson.

", + "content_delivery_type": "SinglePartBook", + "content_type": "Product", + "publisher_name": "David Gatward", + "sample_url": "https://samples.audible.com/bk/acx0/346514/bk_acx0_346514_sample.mp3", + "asin": "B0BZDYV2CZ", + "editorial_reviews": [ + "" + ], + "rating": { + "num_reviews": 0, + "overall_distribution": { + "average_rating": 3.5, + "display_average_rating": "3.5", + "display_stars": 3.5, + "num_five_star_ratings": 1, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 2, + "num_three_star_ratings": 0, + "num_two_star_ratings": 1 + }, + "performance_distribution": { + "average_rating": 5.0, + "display_average_rating": "5.0", + "display_stars": 5.0, + "num_five_star_ratings": 1, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 1, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 5.0, + "display_average_rating": "5.0", + "display_stars": 5.0, + "num_five_star_ratings": 1, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 1, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "publication_datetime": "2023-03-23T23:08:00Z" + }, + { + "asin": "B0CC5NNPDQ", + "asset_details": [], + "category_ladders": [], + "content_delivery_type": "PodcastEpisode", + "content_type": "Podcast", + "episode_type": "full", + "format_type": "original_recording", + "generic_keyword": "4dec0f7c-a9ae-4610-b104-c3195595fa1c", + "has_children": false, + "is_adult_product": false, + "is_listenable": true, + "is_purchasability_suppressed": true, + "is_vvab": false, + "issue_date": "2023-07-18", + "merchandising_summary": "⛵️ We're back after taking a short hiatus, this week bringing you Jaws 2! Join us as we take a trip to Amity Island for this completely ridiculous...", + "music_id": "4dec0f7c-a9ae-4610-b104-c3195595fa1c", + "plans": [ + { + "end_date": "2099-12-31T05:00:00.00000Z", + "plan_name": "Free Tier", + "start_date": "2023-03-29T08:03:34.00003Z" + } + ], + "price": {}, + "product_images": { + "900": "https://m.media-amazon.com/images/I/71-QwomtiML._SL900_.jpg" + }, + "publication_datetime": "2023-07-18T12:00:00Z", + "publisher_summary": "

⛵️ We're back after taking a short hiatus, this week bringing you Jaws 2! Join us as we take a trip to Amity Island for this completely ridiculous sequel where we'll catch some waterskiing, sailing, and erratically shoot bullets at bluefish. Oh yeah, we'll also choose which character was most deserving to die... if we can figure out any of their names.

● ● ●

▶️ Watch the Video Podcast

☑️ Vote in the Cherry Picker

● ● ●

📷 Follow The Cherry Picker on Instagram

🐦 Follow The Cherry Picker on Twitter

● ● ●

▶️ Check out Zack's Main YouTube Channel

📷 Follow Zack on Instagram

🐦 Follow Zack on Twitter

● ● ●

▶️ Check Out Eddie's Main YouTube Channel

📷 Follow Eddie on Instagram

● ● ●

💲 Support on Patreon

Support the show", + "rating": { + "num_reviews": 0, + "overall_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "performance_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "relationships": [ + { + "asin": "B09RKNVXC3", + "content_delivery_type": "PodcastParent", + "relationship_to_product": "parent", + "relationship_type": "episode", + "sku": "PD_8001_364915", + "sku_lite": "PD_8001_364915", + "sort": "75", + "title": "The Cherry Picker", + "url": "/podcast/The-Cherry-Picker/B09RKNVXC3" + } + ], + "release_date": "2023-07-18", + "runtime_length_min": 103, + "sku": "PC_801K_380124", + "sku_lite": "PC_801K_380124", + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/519H2OeoJUL._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C519H2OeoJUL.jpg%7C0,0,1200,630+107,79,402,402_PJAdblSocialShare-Gradientoverlay-smallasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,576,270_OU01_ZBLISTENING%20ON,593,216,52,500,AudibleSansMd,30,255,255,255_PJAdblSocialShare-PodcastIcon-Small,TopLeft,1094,50_ZBEpisode%2075%20%7C%20Jaws%202%20%281978%29,106,519,48,404,AudibleSansMd,24,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/519H2OeoJUL._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C519H2OeoJUL.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBEpisode%2075%20%7C%20Jaws%202%20%281978%29,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBThe%20Cherry%20Picker,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/519H2OeoJUL._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C519H2OeoJUL.jpg%7C0,0,1024,512+97,64,320,320_PJAdblSocialShare-Gradientoverlay-twitter-smallasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255_PJAdblSocialShare-PodcastIcon-Small,TopLeft,929,45_ZBEpisode%2075%20%7C%20Jaws%202...,96,417,54,320,AudibleSansMd,24,255,255,255.jpg" + }, + "title": "Episode 75 | Jaws 2 (1978)" + }, + { + "title": "Inside Jaws", + "is_purchasability_suppressed": true, + "is_listenable": false, + "merchandising_summary": "From the creators of Inside Psycho and Inside the Exorcist comes a new story about a classic movie and its inspirations. A tale of a modest thriller ...", + "relationships": [ + { + "asin": "B08JM8D4WZ", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "2" + }, + { + "asin": "B08JMB9GTW", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "1" + }, + { + "asin": "B08JJHJKR7", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "6" + }, + { + "asin": "B0D14LNT9C", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "4" + }, + { + "asin": "B08JMB9C9R", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "5" + }, + { + "asin": "B0CTQ598DC", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "3" + }, + { + "asin": "B08JJPZ6B4", + "relationship_to_product": "child", + "relationship_type": "season", + "sort": "1" + } + ], + "new_episode_added_date": "2024-04-08T08:09:02.00009Z", + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/51Sng56SxhL._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C51Sng56SxhL.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255_PJAdblSocialShare-PodcastIcon-Small,TopLeft,1094,50.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/51Sng56SxhL._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C51Sng56SxhL.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBInside%20Jaws,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBWondery,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/51Sng56SxhL._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C51Sng56SxhL.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255_PJAdblSocialShare-PodcastIcon-Small,TopLeft,929,45.jpg" + }, + "release_date": "2020-09-30", + "thesaurus_subject_keywords": [ + "podcast_society_and_culture", + "podcast_film_history", + "history_&_criticism", + "podcast_documentary", + "podcast_tv_and_film", + "podcast_show" + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18571910011", + "name": "Arts & Entertainment" + }, + { + "id": "18571913011", + "name": "Art" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18573518011", + "name": "History" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18574641011", + "name": "Politics & Social Sciences" + }, + { + "id": "18574731011", + "name": "Social Sciences" + } + ], + "root": "Genres" + } + ], + "has_children": true, + "is_adult_product": false, + "format_type": "original_recording", + "product_images": { + "900": "https://m.media-amazon.com/images/I/9180iMILw9L._SL900_.jpg" + }, + "sku": "PD_8001_135127", + "issue_date": "2020-09-30", + "asset_details": [], + "language": "english", + "plans": [ + { + "end_date": "2099-12-31T05:00:00.00000Z", + "plan_name": "Free Tier", + "start_date": "2020-09-30T19:26:46.00026Z" + } + ], + "generic_keyword": "af174534-1d1f-4ba0-9423-bc9f5ec9888e", + "authors": [ + { + "name": "Wondery" + } + ], + "episode_count": 6, + "price": {}, + "sku_lite": "PD_8001_135127", + "is_vvab": false, + "publisher_summary": "

From the creators of Inside Psycho and Inside the Exorcist comes a new story about a classic movie and its inspirations. A tale of a modest thriller that became an ordeal and then a disaster and then a phenomenon and then a classic. A story of one man, a fresh-faced, inexperienced director who nearly wrecked his promising career and became the most important filmmaker of our era. This is Inside JAWS.


You can binge all episodes of Inside Jaws exclusively and ad-free on Wondery+. Find Wondery+ in the Wondery App or on Apple Podcasts.


", + "content_delivery_type": "PodcastParent", + "content_type": "Podcast", + "asin": "B08JJPWDJ5", + "continuity": "serial", + "music_id": "af174534-1d1f-4ba0-9423-bc9f5ec9888e", + "rating": { + "num_reviews": 0, + "overall_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "performance_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "publication_datetime": "2020-09-30T19:26:46Z" + }, + { + "title": "The Jaws of Hell", + "is_purchasability_suppressed": false, + "is_listenable": true, + "merchandising_summary": "

Scott Flawless was certain a return to the friendly confines of the ring was what he needed. But he didn't count on the murderers' row sharing this tournament bracket with him.

", + "relationships": [ + { + "asin": "B099KLLPTN", + "content_delivery_type": "BookSeries", + "relationship_to_product": "parent", + "relationship_type": "series", + "sequence": "4", + "sku": "SE_RIES_056820", + "sku_lite": "SE_RIES_056820", + "sort": "4", + "title": "Titan Wars", + "url": "/pd/Titan-Wars-Audiobook/B099KLLPTN" + } + ], + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/51hsvHzdRHL._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C51hsvHzdRHL.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/51hsvHzdRHL._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C51hsvHzdRHL.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBThe%20Jaws%20of%20Hell,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBSamuel%20Gately,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/51hsvHzdRHL._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C51hsvHzdRHL.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255.jpg" + }, + "subtitle": "Titan Wars, Book 4", + "release_date": "2024-02-12", + "thesaurus_subject_keywords": [ + "literature-and-fiction" + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18580606011", + "name": "Science Fiction & Fantasy" + }, + { + "id": "18580607011", + "name": "Fantasy" + }, + { + "id": "18580615011", + "name": "Epic" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18580606011", + "name": "Science Fiction & Fantasy" + }, + { + "id": "18580607011", + "name": "Fantasy" + }, + { + "id": "18580619011", + "name": "Humorous" + } + ], + "root": "Genres" + } + ], + "has_children": false, + "series": [ + { + "asin": "B099KLLPTN", + "sequence": "4", + "title": "Titan Wars", + "url": "/pd/Titan-Wars-Audiobook/B099KLLPTN" + } + ], + "is_adult_product": false, + "format_type": "unabridged", + "product_images": { + "900": "https://m.media-amazon.com/images/I/81StZivSs9L._SL900_.jpg" + }, + "runtime_length_min": 356, + "sku": "BK_ACX0_386007", + "issue_date": "2024-02-12", + "narrators": [ + { + "name": "Sean Slater" + } + ], + "asset_details": [], + "language": "english", + "publication_name": "Titan Wars", + "plans": [], + "authors": [ + { + "asin": "B06VX2Y25G", + "name": "Samuel Gately" + } + ], + "available_codecs": [ + { + "enhanced_codec": "LC_128_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_128" + }, + { + "enhanced_codec": "LC_32_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_32" + }, + { + "enhanced_codec": "LC_64_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_64" + }, + { + "enhanced_codec": "LC_64_44100_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_44_64" + }, + { + "enhanced_codec": "aax", + "format": "Enhanced", + "is_kindle_enhanced": false, + "name": "aax" + } + ], + "price": { + "credit_price": 1.0, + "list_price": { + "base": 19.950000762939453, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + }, + "lowest_price": { + "base": 19.950000762939453, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + } + }, + "sku_lite": "BK_ACX0_386007", + "is_vvab": false, + "publisher_summary": "

Step into the Jaws of Hell. Only the Lucky Survive.

Scott Flawless was certain a return to the friendly confines of the ring was what he needed. But he didn't count on the murderers' row sharing this tournament bracket with him. The underground circuit is a dangerous place, and with titans like the scheming Dursham Brothers, the mighty Bell King, and the savage Fog of War, he'll be lucky to make it out of the Jaws of Hell alive.

The Jaws of Hell concludes the Titan Wars tag-team of books featuring Scott Flawless.

", + "content_delivery_type": "SinglePartBook", + "content_type": "Product", + "publisher_name": "Samuel Gately", + "sample_url": "https://samples.audible.com/bk/acx0/386007/bk_acx0_386007_sample.mp3", + "asin": "B0CVJP6MVL", + "editorial_reviews": [ + "" + ], + "rating": { + "num_reviews": 0, + "overall_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "performance_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "publication_datetime": "2024-02-12T23:35:00Z" + }, + { + "title": "JAWS UNLEASHED: The Podiatry Podcast", + "is_purchasability_suppressed": true, + "is_listenable": false, + "merchandising_summary": "Unleashing the background knowledge of PODIATRY with Dr Wagner.", + "relationships": [ + { + "asin": "B0CN9T1R95", + "relationship_to_product": "child", + "relationship_type": "season", + "sort": "1" + }, + { + "asin": "B0CN9TFQL2", + "relationship_to_product": "child", + "relationship_type": "episode", + "sort": "1" + } + ], + "new_episode_added_date": "2023-11-14T19:49:19.00049Z", + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/31Qmp3pRfDL._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C31Qmp3pRfDL.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255_PJAdblSocialShare-PodcastIcon-Small,TopLeft,1094,50.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/31Qmp3pRfDL._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C31Qmp3pRfDL.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBJAWS%20UNLEASHED%3A%20The%20Pod...,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBAbraham%20Wagner%20D.P.M.,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/31Qmp3pRfDL._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C31Qmp3pRfDL.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255_PJAdblSocialShare-PodcastIcon-Small,TopLeft,929,45.jpg" + }, + "release_date": "2023-11-14", + "thesaurus_subject_keywords": [ + "podcast_health_and_fitness", + "podcast_medicine", + "podcast_education", + "podcast_courses", + "podcast_show" + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18573267011", + "name": "Education & Learning" + }, + { + "id": "18573268011", + "name": "Education" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18573370011", + "name": "Health & Wellness" + }, + { + "id": "18573454011", + "name": "Physical Illness & Disease" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18573370011", + "name": "Health & Wellness" + }, + { + "id": "88083132011", + "name": "Hygiene & Healthy Living" + } + ], + "root": "Genres" + } + ], + "has_children": true, + "is_adult_product": false, + "format_type": "original_recording", + "product_images": { + "900": "https://m.media-amazon.com/images/I/41l5rqX7gBL._SL900_.jpg" + }, + "sku": "PD_8001_839498", + "issue_date": "2023-11-14", + "asset_details": [], + "language": "english", + "plans": [ + { + "end_date": "2099-12-31T05:00:00.00000Z", + "plan_name": "Free Tier", + "start_date": "2023-11-14T19:49:02.00049Z" + } + ], + "generic_keyword": "572e3082-b177-4bbd-bddb-9d0b3eb85e16", + "authors": [ + { + "name": "Abraham Wagner D.P.M." + } + ], + "episode_count": 1, + "price": {}, + "sku_lite": "PD_8001_839498", + "is_vvab": false, + "publisher_summary": "

Unleashing the background knowledge of PODIATRY with Dr Wagner.

", + "content_delivery_type": "PodcastParent", + "content_type": "Podcast", + "asin": "B0CN9T99W1", + "continuity": "episodic", + "music_id": "572e3082-b177-4bbd-bddb-9d0b3eb85e16", + "rating": { + "num_reviews": 0, + "overall_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "performance_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 0.0, + "display_average_rating": "0.0", + "display_stars": 0.0, + "num_five_star_ratings": 0, + "num_four_star_ratings": 0, + "num_one_star_ratings": 0, + "num_ratings": 0, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "publication_datetime": "2023-11-14T19:49:02Z" + }, + { + "title": "Into the Jaws of the Lion", + "is_purchasability_suppressed": false, + "is_listenable": true, + "merchandising_summary": "

Into the Jaws of the Lion finds the Arkana agents on a new adventure in India where they search for a jewel-encrusted figurine that holds a clue to an even more priceless artifact. Beating the Nephilim to the prize is the least of their worries....

", + "relationships": [ + { + "asin": "B0843WN957", + "content_delivery_type": "BookSeries", + "relationship_to_product": "parent", + "relationship_type": "series", + "sequence": "5", + "sku": "SE_RIES_044324", + "sku_lite": "SE_RIES_044324", + "sort": "5", + "title": "Arkana Archaeology Mystery Thriller Series", + "url": "/pd/Arkana-Archaeology-Mystery-Thriller-Series-Audiobook/B0843WN957" + } + ], + "social_media_images": { + "facebook": "https://m.media-amazon.com/images/I/61QF4TpupkL._SL10_UR1600,800_CR200,50,1200,630_CLa%7C1200,630%7C61QF4TpupkL.jpg%7C0,0,1200,630+82,82,465,465_PJAdblSocialShare-Gradientoverlay-largeasin-0to70,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Large,TopLeft,600,270_OU01_ZBLISTENING%20ON,617,216,52,500,AudibleSansMd,30,255,255,255.jpg", + "ig_static_with_bg": "https://m.media-amazon.com/images/I/61QF4TpupkL._SL200_BL80_UR1080,2160_CLa%7C1080,2160%7C61QF4TpupkL.jpg%7C0,0,1080,2160+288,614,500,500_PJAdblSocialShare-Gradientoverlay-Radial,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Small,TopLeft,290,461_ZBLISTENING%20ON,290,410,52,500,AudibleSansMd,34,255,255,255_ZBInto%20the%20Jaws%20of%20the%20Lion,290,1183,52,500,AudibleSansSm,32,255,255,255_ZBN.%20S.%20Wikarski,290,1247,52,500,AudibleSansRg,28,255,255,255.jpg", + "twitter": "https://m.media-amazon.com/images/I/61QF4TpupkL._SL10_UR1600,800_CR200,50,1024,512_CLa%7C1024,512%7C61QF4TpupkL.jpg%7C0,0,1024,512+67,67,376,376_PJAdblSocialShare-Gradientoverlay-twitter-largeasin-0to60,TopLeft,0,0_PJAdblSocialShare-AudibleLogo-Medium,TopLeft,490,223_OU01_ZBLISTENING%20ON,483,152,55,450,AudibleSansMd,32,255,255,255.jpg" + }, + "subtitle": "Arkana Archaeology Mystery Thriller Series, Book 5", + "release_date": "2020-05-12", + "thesaurus_subject_keywords": [ + "literature-and-fiction" + ], + "category_ladders": [ + { + "ladder": [ + { + "id": "18580715011", + "name": "Teen & Young Adult" + }, + { + "id": "18580894011", + "name": "Literature & Fiction" + }, + { + "id": "18580895011", + "name": "Action & Adventure" + } + ], + "root": "Genres" + }, + { + "ladder": [ + { + "id": "18580715011", + "name": "Teen & Young Adult" + }, + { + "id": "18580961011", + "name": "Mystery, Thriller & Suspense" + }, + { + "id": "18580967011", + "name": "Thrillers & Suspense" + } + ], + "root": "Genres" + } + ], + "has_children": false, + "series": [ + { + "asin": "B0843WN957", + "sequence": "5", + "title": "Arkana Archaeology Mystery Thriller Series", + "url": "/pd/Arkana-Archaeology-Mystery-Thriller-Series-Audiobook/B0843WN957" + } + ], + "is_adult_product": false, + "format_type": "unabridged", + "product_images": { + "900": "https://m.media-amazon.com/images/I/91d1dv7+LpL._SL900_.jpg" + }, + "runtime_length_min": 542, + "sku": "BK_ACX0_195606", + "issue_date": "2020-05-12", + "narrators": [ + { + "name": "Bryan Stansbury" + } + ], + "asset_details": [], + "language": "english", + "publication_name": "Arkana Archaeology Mystery Thriller Series", + "plans": [], + "authors": [ + { + "asin": "B001K8RR5W", + "name": "N. S. Wikarski" + } + ], + "available_codecs": [ + { + "enhanced_codec": "format4", + "format": "Format4", + "is_kindle_enhanced": false, + "name": "format4" + }, + { + "enhanced_codec": "LC_32_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_32" + }, + { + "enhanced_codec": "LC_64_22050_stereo", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "aax_22_64" + }, + { + "enhanced_codec": "piff2264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "piff_22_64" + }, + { + "enhanced_codec": "mp42232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_32" + }, + { + "enhanced_codec": "mp42264", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "mp4_22_64" + }, + { + "enhanced_codec": "piff2232", + "format": "Enhanced", + "is_kindle_enhanced": true, + "name": "piff_22_32" + }, + { + "enhanced_codec": "aax", + "format": "Enhanced", + "is_kindle_enhanced": false, + "name": "aax" + } + ], + "price": { + "credit_price": 1.0, + "list_price": { + "base": 19.950000762939453, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + }, + "lowest_price": { + "base": 19.950000762939453, + "currency_code": "USD", + "merchant_id": "A2ZO8JX97D5MN9", + "type": "list" + } + }, + "sku_lite": "BK_ACX0_195606", + "is_vvab": false, + "publisher_summary": "
  • Award-Nominated Series Finale. Best Mystery of the Month (L.A.S. Reviews, February 2017)
  • For fans of archaeology adventure, alternative history thrillers, and treasure hunt mysteries

The Arkana Series

College freshman Cassie Forsythe wakes from a disturbing nightmare after seeing her sister being murdered by a man in a cowboy hat who demands something called \"the key\". Her dream morphs into frightening reality when her sister is found dead, exactly as her vision foretold.

Cassie's life takes an even more bizarre turn once she learns that her dead sister, an antique dealer, has discovered the location of a cache of priceless Minoan artifacts. A secret society called the Arkana and a fanatical religious cult known as the Blessed Nephilim are each determined to claim the prize.

Caught squarely between these rival factions is Cassie herself after she stumbles across the only known map to the treasure. The girl allies herself with the Arkana in hopes of staying alive. With Nephilim assassins on her trail, that's easier said than done.

Volume 5 - Into the Jaws of the Lion

Into the Jaws of the Lion finds the Arkana agents on a new adventure in India where they search for a jewel-encrusted figurine that holds a clue to an even more priceless artifact. Beating the Nephilim to the prize is the least of their worries. Back in the States, the cult's leader has evolved a plan to release a deadly plague on an unsuspecting world just as his henchman zeroes in on the whereabouts of his child bride. Every effort to throw the hunter off the girl's trail only draws him nearer to his prey.

A rift among the members of the Arkana crew threatens to destroy the relic quest altogether. Held captive on a frigid mountaintop in the Himalayas, they are forced to summon all their resources not merely to complete their mission but simply to survive the night. If you thought you knew where this saga was headed, be prepared for a shocking twist when the Arkana team wanders blindly into the lion's jaws.

", + "content_delivery_type": "SinglePartBook", + "content_type": "Product", + "publisher_name": "N. S. Wikarski", + "sample_url": "https://samples.audible.com/bk/acx0/195606/bk_acx0_195606_sample.mp3", + "asin": "B088C3FP7L", + "editorial_reviews": [ + "" + ], + "rating": { + "num_reviews": 1, + "overall_distribution": { + "average_rating": 4.666666666666667, + "display_average_rating": "4.7", + "display_stars": 4.5, + "num_five_star_ratings": 2, + "num_four_star_ratings": 1, + "num_one_star_ratings": 0, + "num_ratings": 3, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "performance_distribution": { + "average_rating": 4.666666666666667, + "display_average_rating": "4.7", + "display_stars": 4.5, + "num_five_star_ratings": 2, + "num_four_star_ratings": 1, + "num_one_star_ratings": 0, + "num_ratings": 3, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + }, + "story_distribution": { + "average_rating": 4.666666666666667, + "display_average_rating": "4.7", + "display_stars": 4.5, + "num_five_star_ratings": 2, + "num_four_star_ratings": 1, + "num_one_star_ratings": 0, + "num_ratings": 3, + "num_three_star_ratings": 0, + "num_two_star_ratings": 0 + } + }, + "publication_datetime": "2020-05-12T00:21:00Z" + } + ], + "response_groups": [ + "claim_code_url", + "rating", + "media", + "product_attrs", + "sample", + "relationships", + "product_desc", + "always-returned", + "product_extended_attrs", + "contributors", + "provided_review", + "product_plans", + "price", + "series", + "category_ladders", + "sku", + "product_plan_details" + ], + "total_results": 44 +} diff --git a/test/ambry_scraping/audible_test.exs b/test/ambry_scraping/audible_test.exs new file mode 100644 index 00000000..e5b9c117 --- /dev/null +++ b/test/ambry_scraping/audible_test.exs @@ -0,0 +1,92 @@ +defmodule AmbryScraping.AudibleTest do + use ExUnit.Case, async: false + use Patch + use Mneme + + alias AmbryScraping.Audible + alias AmbryScraping.Audible.Author + alias AmbryScraping.Audible.AuthorDetails + alias AmbryScraping.Audible.Browser + alias AmbryScraping.Audible.Client + alias AmbryScraping.Audible.Narrator + alias AmbryScraping.Audible.Product + alias AmbryScraping.Audible.Series + + describe "search_authors/1" do + test "searches for authors given a query" do + patch(Browser, :get_page_html, fn _path, _actions -> + {:ok, File.read!("test/ambry_scraping/audible/mocks/search_authors_stephen_king.html")} + end) + + assert {:ok, [author | _rest]} = Audible.search_authors("Stephen King") + auto_assert %Author{id: "B000AQ0842", name: "Stephen King"} <- author + end + + test "returns an empty list if given an empty query" do + assert {:ok, []} = Audible.search_authors("") + end + end + + describe "author_details/1" do + test "fetches the details of an author by their ID" do + patch(Browser, :get_page_html, fn _path, _actions -> + {:ok, File.read!("test/ambry_scraping/audible/mocks/author_details_stephen_king.html")} + end) + + assert {:ok, author_details} = Audible.author_details("B000AQ0842") + + auto_assert %AuthorDetails{ + description: + "Stephen King is the author of more than fifty books, all of them worldwide bestsellers. His first crime thriller featuring Bill Hodges, MR MERCEDES, won the Edgar Award for best novel and was shortlisted for the CWA Gold Dagger Award. Both MR MERCEDES and END OF WATCH received the Goodreads Choice Award for the Best Mystery and Thriller of 2014 and 2016 respectively.\n\nKing co-wrote the bestselling novel Sleeping Beauties with his son Owen King, and many of King's books have been turned into celebrated films and television series including The Shawshank Redemption, Gerald's Game and It.\n\nKing was the recipient of America's prestigious 2014 National Medal of Arts and the 2003 National Book Foundation Medal for distinguished contribution to American Letters. In 2007 he also won the Grand Master Award from the Mystery Writers of America. He lives with his wife Tabitha King in Maine.", + id: "B000AQ0842", + image: + "https://images-na.ssl-images-amazon.com/images/S/amzn-author-media-prod/fkeglaqq0pic05a0v6ieqt4iv5.jpg", + name: "Stephen King" + } <- author_details + end + + test "returns an error when the given ID doesn't find an author" do + patch(Browser, :get_page_html, fn _path, _actions -> + {:ok, File.read!("test/ambry_scraping/audible/mocks/author_details_not_found.html")} + end) + + assert {:error, :not_found} = Audible.author_details("foo") + end + end + + describe "search_books/1" do + test "searches for books given a query" do + patch(Client, :get, fn _url, _params -> + {:ok, + %{ + status: 200, + body: + "test/ambry_scraping/audible/mocks/search_books_jaws.json" + |> File.read!() + |> Jason.decode!() + }} + end) + + assert {:ok, [book | _rest]} = Audible.search_books("Jaws") + + auto_assert %Product{ + authors: [%Author{id: "B000APWADA", name: "Peter Benchley"}], + cover_image: "https://m.media-amazon.com/images/I/81p4-VU2BXL.jpg", + description: + "_Jaws_ is the classic, blockbuster thriller that inspired the three-time Academy Award-winning Steven Spielberg movie and made millions of beachgoers afraid to go into the water. Experience the thrill of helpless horror again - or for the first time!\n \nJaws was number 48 in the American Film Institute's 100 Years...100 Movies, and the film earned the coveted number-one spot on the Bravo network's 100 Scariest Movie Moments countdown.\n \nThis timeless tale of man-eating terror that spawned a movie franchise, two video games, a Universal Studios theme park attraction, and two musicals is finally available on audio for the first time ever!", + format: "unabridged", + id: "B002V8ODY8", + language: "english", + narrators: [%Narrator{name: "Erik Steele"}], + published: ~D[2009-04-07], + publisher: "Blackstone Audio, Inc.", + series: [%Series{id: "B091G3LNPG", sequence: "1", title: "Jaws"}], + title: "Jaws" + } <- book + end + + test "returns an empty list if given an empty query" do + assert {:ok, []} = Audible.search_books("") + end + end +end diff --git a/test/ambry_scraping/audnexus/mocks/author_details_stephen_king.json b/test/ambry_scraping/audnexus/mocks/author_details_stephen_king.json new file mode 100644 index 00000000..727f44b4 --- /dev/null +++ b/test/ambry_scraping/audnexus/mocks/author_details_stephen_king.json @@ -0,0 +1 @@ +{"asin":"B000AQ0842","description":"Stephen King is the author of more than fifty books, all of them worldwide bestsellers. His first crime thriller featuring Bill Hodges, MR MERCEDES, won the Edgar Award for best novel and was shortlisted for the CWA Gold Dagger Award. Both MR MERCEDES and END OF WATCH received the Goodreads Choice Award for the Best Mystery and Thriller of 2014 and 2016 respectively. King co-wrote the bestselling novel Sleeping Beauties with his son Owen King, and many of King's books have been turned into celebrated films and television series including The Shawshank Redemption, Gerald's Game and It. King was the recipient of America's prestigious 2014 National Medal of Arts and the 2003 National Book Foundation Medal for distinguished contribution to American Letters. In 2007 he also won the Grand Master Award from the Mystery Writers of America. He lives with his wife Tabitha King in Maine.","genres":[{"asin":"18574426011","name":"Literature & Fiction","type":"genre"},{"asin":"18574597011","name":"Mystery, Thriller & Suspense","type":"genre"}],"image":"https://images-na.ssl-images-amazon.com/images/S/amzn-author-media-prod/fkeglaqq0pic05a0v6ieqt4iv5.jpg","name":"Stephen King","region":"us","similar":[{"asin":"B001KDY1WY","name":"Bev Vincent"},{"asin":"B001IGFHW6","name":"Brandon Sanderson"},{"asin":"B000APG4T6","name":"Dean Koontz"},{"asin":"B000APIGH4","name":"George R. R. Martin"},{"asin":"B001IGSNRW","name":"Joe Hill"},{"asin":"B00MZFCIBC","name":"Richard Chizmar"},{"asin":"B000AQ3IYE","name":"Shirley Jackson"},{"asin":"B000AQ1LJI","name":"William Peter Blatty"}]} \ No newline at end of file diff --git a/test/ambry_scraping/audnexus/mocks/book_chapters_jaws.json b/test/ambry_scraping/audnexus/mocks/book_chapters_jaws.json new file mode 100644 index 00000000..5cccc195 --- /dev/null +++ b/test/ambry_scraping/audnexus/mocks/book_chapters_jaws.json @@ -0,0 +1 @@ +{"asin":"B002V8ODY8","brandIntroDurationMs":2043,"brandOutroDurationMs":5061,"chapters":[{"lengthMs":879200,"startOffsetMs":0,"startOffsetSec":0,"title":"Chapter 1"},{"lengthMs":1906497,"startOffsetMs":879200,"startOffsetSec":879,"title":"Chapter 2"},{"lengthMs":2508962,"startOffsetMs":2785697,"startOffsetSec":2786,"title":"Chapter 3"},{"lengthMs":3322032,"startOffsetMs":5294659,"startOffsetSec":5295,"title":"Chapter 4"},{"lengthMs":3517172,"startOffsetMs":8616691,"startOffsetSec":8617,"title":"Chapter 5"},{"lengthMs":1363893,"startOffsetMs":12133863,"startOffsetSec":12134,"title":"Chapter 6"},{"lengthMs":3061551,"startOffsetMs":13497756,"startOffsetSec":13498,"title":"Chapter 7"},{"lengthMs":2935141,"startOffsetMs":16559307,"startOffsetSec":16559,"title":"Chapter 8"},{"lengthMs":1954887,"startOffsetMs":19494448,"startOffsetSec":19494,"title":"Chapter 9"},{"lengthMs":3701818,"startOffsetMs":21449335,"startOffsetSec":21449,"title":"Chapter 10"},{"lengthMs":1651821,"startOffsetMs":25151153,"startOffsetSec":25151,"title":"Chapter 11"},{"lengthMs":2373636,"startOffsetMs":26802974,"startOffsetSec":26803,"title":"Chapter 12"},{"lengthMs":3924079,"startOffsetMs":29176610,"startOffsetSec":29177,"title":"Chapter 13"},{"lengthMs":1671371,"startOffsetMs":33100689,"startOffsetSec":33101,"title":"Chapter 14"}],"isAccurate":true,"region":"us","runtimeLengthMs":34772060,"runtimeLengthSec":34772} \ No newline at end of file diff --git a/test/ambry_scraping/audnexus/mocks/search_authors_stephen_king.json b/test/ambry_scraping/audnexus/mocks/search_authors_stephen_king.json new file mode 100644 index 00000000..40ad2ddf --- /dev/null +++ b/test/ambry_scraping/audnexus/mocks/search_authors_stephen_king.json @@ -0,0 +1 @@ +[{"asin":"B000AQ0842","name":"Stephen King"},{"asin":"B000AQ0842","name":"Stephen King"},{"asin":"B000AQ0842","name":"Stephen King"},{"asin":"B000AQ0842","name":"Stephen King"},{"asin":"B000AQ0842","name":"Stephen King"},{"asin":"B000AQ0842","name":"Stephen King"},{"asin":"B000AQ0842","name":"Stephen King"},{"asin":"B0033FJS84","name":"Stephen D. King"},{"asin":"B01H12CQWE","name":"Stephen B King"},{"asin":"B072LNGBBY","name":"Samantha King"},{"asin":"B00J1HLTHQ","name":"Stephen Fuchs"},{"asin":"B001HCW4YK","name":"Lily King"},{"asin":"B001JP2E7M","name":"Iain King"},{"asin":"B01ES3ZIAG","name":"Stephen Hanselman"},{"asin":"B001JP4TZC","name":"Ruth King"},{"asin":"B000AP701W","name":"Stephen Coonts"},{"asin":"B01K5XUUQ0","name":"Jasmine King"},{"asin":"B004IGN4LY","name":"Simon King"},{"asin":"B000AP5LY0","name":"Stephen Frey"},{"asin":"B0028ORQ1W","name":"Stephen Purcell"},{"asin":"B001HCVZX6","name":"Peter King"},{"asin":"B09BG4DL43","name":"Stephen Perrine"},{"asin":"B00CHY349G","name":"Stephen Tvedten"},{"asin":"B001HPPJ8A","name":"Cassandra King"},{"asin":"B0173BFWWO","name":"Stephen Frederick"}] \ No newline at end of file diff --git a/test/ambry_scraping/audnexus_test.exs b/test/ambry_scraping/audnexus_test.exs new file mode 100644 index 00000000..b79032b9 --- /dev/null +++ b/test/ambry_scraping/audnexus_test.exs @@ -0,0 +1,105 @@ +defmodule AmbryScraping.AudnexusTest do + use ExUnit.Case, async: false + use Patch + use Mneme + + alias AmbryScraping.Audnexus + alias AmbryScraping.Audnexus.Author + alias AmbryScraping.Audnexus.AuthorDetails + alias AmbryScraping.Audnexus.Chapter + alias AmbryScraping.Audnexus.Chapters + alias AmbryScraping.Audnexus.Client + + describe "search_authors" do + test "searches for authors given a query" do + patch(Client, :get, fn _path, _opts -> + {:ok, + %{ + status: 200, + body: + "test/ambry_scraping/audnexus/mocks/search_authors_stephen_king.json" + |> File.read!() + |> Jason.decode!() + }} + end) + + assert {:ok, [author | _rest]} = Audnexus.search_authors("Stephen King") + auto_assert %Author{id: "B000AQ0842", name: "Stephen King"} <- author + end + + test "returns an empty list if given an empty query" do + assert {:ok, []} = Audnexus.search_authors("") + end + end + + describe "author_details" do + test "fetches the details of an author by their ID" do + patch(Client, :get, fn _path -> + {:ok, + %{ + status: 200, + body: + "test/ambry_scraping/audnexus/mocks/author_details_stephen_king.json" + |> File.read!() + |> Jason.decode!() + }} + end) + + assert {:ok, author_details} = Audnexus.author_details("B000AQ0842") + + auto_assert %AuthorDetails{ + description: + "Stephen King is the author of more than fifty books, all of them worldwide bestsellers. His first crime thriller featuring Bill Hodges, MR MERCEDES, won the Edgar Award for best novel and was shortlisted for the CWA Gold Dagger Award. Both MR MERCEDES and END OF WATCH received the Goodreads Choice Award for the Best Mystery and Thriller of 2014 and 2016 respectively. King co-wrote the bestselling novel Sleeping Beauties with his son Owen King, and many of King's books have been turned into celebrated films and television series including The Shawshank Redemption, Gerald's Game and It. King was the recipient of America's prestigious 2014 National Medal of Arts and the 2003 National Book Foundation Medal for distinguished contribution to American Letters. In 2007 he also won the Grand Master Award from the Mystery Writers of America. He lives with his wife Tabitha King in Maine.", + id: "B000AQ0842", + image: + "https://images-na.ssl-images-amazon.com/images/S/amzn-author-media-prod/fkeglaqq0pic05a0v6ieqt4iv5.jpg", + name: "Stephen King" + } <- author_details + end + + test "returns an error when the given ID doesn't find an author" do + patch(Client, :get, fn _path -> {:ok, %{status: 400}} end) + + assert {:error, :not_found} = Audnexus.author_details("foo") + end + end + + describe "book_chapters" do + test "fetches the chapters of an audiobook by its ID" do + patch(Client, :get, fn _path, _opts -> + {:ok, + %{ + status: 200, + body: + "test/ambry_scraping/audnexus/mocks/book_chapters_jaws.json" + |> File.read!() + |> Jason.decode!() + }} + end) + + assert {:ok, chapters} = Audnexus.book_chapters("B002V8ODY8") + + auto_assert %Chapters{ + asin: "B002V8ODY8", + brand_intro_duration_ms: 2043, + brand_outro_duration_ms: 5061, + chapters: _chapters + } <- chapters + + %Chapters{chapters: [chapter | _rest]} = chapters + + auto_assert %Chapter{ + length_ms: 879_200, + start_offset_ms: 0, + start_offset_sec: 0, + title: "Chapter 1" + } <- chapter + end + + test "returns an error when the given ID doesn't find a book" do + patch(Client, :get, fn _path, _opts -> {:ok, %{status: 400}} end) + + assert {:error, :not_found} = Audnexus.book_chapters("foo") + end + end +end diff --git a/test/ambry_scraping/goodreads/mocks/author_details_not_found.html b/test/ambry_scraping/goodreads/mocks/author_details_not_found.html new file mode 100644 index 00000000..5d67fe37 --- /dev/null +++ b/test/ambry_scraping/goodreads/mocks/author_details_not_found.html @@ -0,0 +1,454 @@ + + Page not found + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + +
+ + + + +
+ +
+ +
+ + + + +
+ +
+ +

Yarr, the page you requested can’t be charted on any known map.

+ +
+ + The Pirates! In an Adventure with Scientists cover image + + + Gideon Defoe + +
+ +

+ “It would be a lot quicker than that if we could just sail straight there, but I was looking at the nautical charts, and there’s a dirty great sea serpent right in the middle of the ocean!

FitzRoy frowned. “I think they just draw those on maps to add a bit of decoration. It doesn’t actually mean there’s a sea serpent there.”

The galley went rather quiet. A few of the pirate crew stared intently out of the portholes, embarrassed at their Captain’s mistake. But to everyone’s relief, instead of running somebody through, the Pirate Captain just narrowed his eyes thoughtfully.

“That explains a lot,” he said. “I suppose it’s also why we’ve never glimpsed that giant compass in the corner of the Atlantic. I have to say, I’m a little disappointed.”
+
+ — Gideon Defoe, The Pirates! In an Adventure with Scientists +

+ +

+ Back to the Goodreads homepage +

+ +
+ +
+
+
+
+
+ + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/ambry_scraping/goodreads/mocks/author_details_photos_stephen_king.html b/test/ambry_scraping/goodreads/mocks/author_details_photos_stephen_king.html new file mode 100644 index 00000000..e40d2e77 --- /dev/null +++ b/test/ambry_scraping/goodreads/mocks/author_details_photos_stephen_king.html @@ -0,0 +1,491 @@ + + Photos of Stephen King - Author Profile Photo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ + + +
+ + + + +
+ +
+ +
+ + + + +
+ + +

+ Stephen King > + Photos > + Profile Photo +

+ +
+ + +
    +
  • + Profile photo +
  • +
+ +
+ + + + +
+ + +
+
+ + +
+ Uploaded at: Mar 08, 2013 11:29PM +     + flag +
+ +
+

+ Profile photo. +

+
+ + +
+ +
+ + + + + Back to author »
+ +

+

+

+
+ +
+
+
+
+
+ + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/ambry_scraping/goodreads/mocks/author_details_stephen_king.html b/test/ambry_scraping/goodreads/mocks/author_details_stephen_king.html new file mode 100644 index 00000000..81116ce7 --- /dev/null +++ b/test/ambry_scraping/goodreads/mocks/author_details_stephen_king.html @@ -0,0 +1,4400 @@ + + Stephen King (Author of The Shining) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ + + +
+ + + + +
+
+ +
+ +
+ +
+ +
+ + + + +
+ + + + + + + + + + +
+
+ Stephen King + +
+ +
+ + + + +
+
+#1 most followed + +
+ +
+ + +

Stephen King’s Followers (844,041)

member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
member photo
+
+ +
+ +
+ +
+ + +
+
Gerald's Game | Official Trailer [HD] | Netflix
+
+ + + 1 comment +
+ + +
+
THE DARK TOWER - Official Trailer (HD)
+
+ + + Add a comment +
+ + +
+ More videos… +
+ +
+
+ Michael +
+
+ Michael
+
+ 3,025 books + | + 2,197 friends +
+
+
+
+ Silvia +
+
+ Silvia
+
+ 1,579 books + | + 37 friends +
+
+
+
+ Cindy (... +
+ + 2,690 books + | + 60 friends +
+
+
+
+ Sarah Sims +
+ + 815 books + | + 48 friends +
+
+
+
+ Meigan +
+
+ Meigan
+
+ 5,030 books + | + 568 friends +
+
+
+
+ Angie +
+
+ Angie
+
+ 1,249 books + | + 38 friends +
+
+
+
+ Dex +
+
+ Dex
+
+ 450 books + | + 29 friends +
+
+
+
+ Andy +
+
+ Andy
+
+ 3,095 books + | + 230 friends +
+
+
+ + More friends… +
+
+ + + + + + +
+
+
+
+
+
+ +
+
+ +
+

+ Stephen King +

+ +

Goodreads Author

+
+
+ +
Born
+ in Portland, Maine, The United States +
+ + +
Website
+ +
+ + +
Genre
+ +
+ +
Influences
+ +
+ +
Member Since
+
December 2013
+
+ + +
+
+ edit data +
+
+ +Stephen Edwin King was born the second son of Donald and Nellie Ruth Pillsbury King. After his father left them when Stephen was two, he and his older brother, David, were raised by his mother. Parts of his childhood were spent in Fort Wayne, Indiana, where his father's family was at the time, and in Stratford, Connecticut. When Stephen was eleven, his mother brought her children back to Durham, Maine, for good. Her parents, Guy and Nellie Pillsbury, had become incapacitated with old age, and Ruth King was persuaded by her sisters to take over the physical care of them. Other family members provided a small house in Durham and financial support. After Stephen's grandparents passed away, Mrs. King found work in the kitchens of Pineland, a ne + + ...more + +
+ +
+ +
+Stephen King +is currently not accepting new questions. +
+
+

Popular Answered Questions

+
+
+ +
+
+
+
+ +
+
+ +Stephen King + + +My favorite movie this Christmas is TRAIN TO BUSAN, because to me, nothing says Christmas like zombies on a South Korean express train. + +
+
+
+ +
+flag +
+ +
+ + + +
+ +
+
+ +
+ +
+
+ +
+
+
+
+ +
+
+ +Stephen King + + +Favorite new horror writers? Well, of course, Joe Hill—I’m allowed to be proud of him because he’s my son, but I’m also a fan. Benjamin Percy (RED MOO…moreFavorite new horror writers? Well, of course, Joe Hill—I’m allowed to be proud of him because he’s my son, but I’m also a fan. Benjamin Percy (RED MOON) is terrific, and so is Paul Tremblay, whose novel about a case of possible demonic possession (A HEAD FULL OF GHOSTS) ranks with the best of Shirley Jackson.
(less)
+
+
+
+
+ +
+flag +
+ +
+ + + +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + Average rating: + 4.07 + + + · + 19,423,238 + ratings + · + 916,550 + reviews + · 2,469 distinct works + • Similar authors +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + The Shining (The Shining, #1) +
+
+
+ + 4.27 avg rating — 1,488,519 ratings + — + published + 1977 + — + 247 editions + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+ + It +
+
+
+ + 4.24 avg rating — 1,110,514 ratings + — + published + 1986 + — + 402 editions + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+ + The Stand +
+
+ by + + +
+
+ + 4.35 avg rating — 760,455 ratings + — + published + 1990 + — + 383 editions + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+ + Misery +
+
+
+ + 4.21 avg rating — 698,098 ratings + — + published + 1987 + — + 366 editions + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+ + Carrie +
+
+
+ + 3.99 avg rating — 721,409 ratings + — + published + 1974 + — + 81 editions + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+ + Pet Sematary +
+
+
+ + 4.06 avg rating — 591,497 ratings + — + published + 1983 + — + 180 editions + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+ + The Gunslinger (The Dark To... +
+
+
+ + 3.92 avg rating — 610,713 ratings + — + published + 1982 + — + 359 editions + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+ + 11/22/63 +
+
+
+ + 4.33 avg rating — 540,545 ratings + — + published + 2011 + — + 8 editions + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+ + ’Salem’s Lot +
+
+
+ + 4.06 avg rating — 455,770 ratings + — + published + 1975 + — + 384 editions + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+ + The Green Mile +
+
+
+ + 4.48 avg rating — 320,196 ratings + — + published + 1996 + — + 344 editions + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+ + More books by Stephen King… +
+ + +
+ +
+
+ + +
+

+ Stephen Reads from YOU LIKE IT DARKER +

+
+ Tune in to the YouTube Premiere of Stephen reading an excerpt from his upcoming collection You Like It Darker on April 18th at 2pm EST.



YouTube



(Don't worry, you can still see it after the premiere!)
+
+ +
+ + 178 likes ·  + + + +  •  + 6 comments + +  •  + flag + +
+ + + +
+
+ + + +
+ +
+ Share on Twitter +
+ + +
+ + +
+
+
+ Published on April 03, 2024 17:53 + +
+
+ + +
+ +
+
+ +
+ The Gunslinger + The Drawing of the Three + The Waste Lands + Wizard and Glass + Wolves of the Calla + Song of Susannah + The Dark Tower +
+ +
+ + + (8 books) + +
+ by + + +
+ + 4.12 avg rating — 1,949,270 ratings + +
+ +
+
+
+ +
+ The Shining + Doctor Sleep + Before the Play: Prequel to... +
+ +
+ + + (3 books) + +
+ by + + +
+ + 4.25 avg rating — 1,750,416 ratings + +
+ +
+
+
+ +
+ Mr. Mercedes + Finders Keepers + End of Watch +
+ +
+ + + (3 books) + +
+ by + + +
+ + 4.05 avg rating — 604,386 ratings + +
+ +
+
+
+ +
+ The Two Dead Girls + The Mouse on the Mile + Coffey's Hands + The Bad Death of Eduard Del... + Night Journey + Coffey on the Mile +
+ +
+ + + (6 books) + +
+ by + + +
+ + 4.49 avg rating — 442,545 ratings + +
+ +
+
+
+ +
+ The Talisman + Black House +
+ +
+ + + (2 books) + +
+ by + + +
+ + 4.10 avg rating — 197,218 ratings + +
+ +
+
+ + More series by Stephen King… + +
+ +

Related News

+ + + + + + + + +Spring is a great time to dig into some new books, if for no other reason than those expanded daylight hours. Outdoor reading is one of...
270 likes · 89 comments
+ + + +Tia Williams has been coming up with love stories ever since she was a kid, secretly reading her mom’s stash of paperback romances. Her debut...
45 likes · 5 comments
+ + + +“Speculative fiction” has emerged as the classy consensus term for that clustering of genres that treats our everyday reality as optional—a...
210 likes · 36 comments
+ + + + + +

Stephen’s Recent Updates

+ + + + + + + + + + + + + + +
+
+ +Stephen King + +wrote a new blog post +
+ +
+

+ YOU LIKE IT DARKER Readers Announced +

+
+ Exciting casting news: award-winning narrator Will Patton will read the audiobook edition of YOU LIKE IT DARKER with select stories read by Stephen Ki + Read more of this blog post » +
+
+ +
+ + + + + +
+ + + + More of Stephen's books… +
+ + + +
+ + Quotes by Stephen King + + +  (?) +
+ Quotes are added by the Goodreads community and are not verified by Goodreads. + (Learn more) +
+ +
+
+
+

+
+
+ +
+ “Books are a uniquely portable magic.” +
+ ― + + Stephen King, + + + On Writing: A Memoir of the Craft + +
+ + +
+
+ tags: + books, + magic, + reading +
+ +
+ +
+
+ Like +
+
+
+ +
+
+ +
+ “If you don't have time to read, you don't have the time (or the tools) to write. Simple as that.” +
+ ― + + Stephen King + +
+ + +
+
+ tags: + reading, + writing +
+ +
+ +
+
+ Like +
+
+
+ +
+
+ +
+ “Get busy living or get busy dying.” +
+ ― + + Stephen King, + + + Different Seasons + +
+ + +
+
+ tags: + life +
+ +
+ +
+
+ Like +
+
+
+ + + +
+ +

Polls

+ +
+
BOTM Poll for Feb 2018 - Bookshelf Catch-Up
Please pick your preferred group read below!
You can change your vote any time up until closing of the poll. Polls will be open for one week.
+
+
+ +
+
 
+   + + 240 votes, + 30.6% + +
+
+
+
+ +
+
+
 
+   + + 160 votes, + 20.4% + +
+
+
+ +
+
 
+   + + 135 votes, + 17.2% + +
+
+
+ +
+
 
+   + + 129 votes, + 16.4% + +
+
+
+ +
+
 
+   + + 121 votes, + 15.4% + +
+
+
+ + + + + + +
+ + + + + More... +
+
+

Topics Mentioning This Author

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
topicspostsviewslast activity 
+ + Study Buddies: + + + Freezer Books + + 6 + + 452Oct 23, 2008 07:47AM +   +
+ + The Book Challenge: + + + Sarah's 2008 Book Challenge v2.0 - Fini! + + 5 + + 1792Dec 29, 2008 09:31AM +   +
+ + 100+ Books in 2024: + + + Jennifer D's 100 of 08 + + 10 + + 254Dec 30, 2008 03:28PM +   +
+ + Goodreads Librari...: + + + Combine Question + + 8 + + 228Jan 15, 2009 11:35AM +   +
+ + 75 Books...More o...: + + This topic has been closed to new comments. + + Authors you love + + 17 + + 2245Jan 27, 2009 04:14AM +   +
+ + Glens Falls (NY) ...: + + + Jim's post about a Stephen King Interview... + + 4 + + 107Feb 10, 2009 11:19AM +   +
+ + SciFi and Fantasy...: + + + The Road -- The Stand Vs The Road + + 58 + + 209Feb 14, 2009 10:21PM +   +
+ +
+ More… +
+
+ +
+ + + + + +
+ + +
+
+ + + + + +
+
+
+ Comments (showing 17-66) + + +    + post a comment » +
+
+ dateUp arrow +    + newest » +
+
+
+
+
+ + +
+
+
+
+ message 66: + by + + Sandy + +
+ +
+
+
+ Sandy Parsons + "Was he big, or was he real big?" -from Big Driver, that scary moment when you realize there's an even bigger one. Yikes!

Happy Birthday to the biggest of them all. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 65: + by + + G.A. + +
+ +
+
+
+ G.A. Miller + Happy Birthday Mr. King! Hope you find enjoyment in all you do today. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 64: + by + + Doreen + +
+ +
+
+
+ Doreen Petersen + Reading through the Dark Tower series. Loving every bit of it. Thank you for writing it. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 63: + by + + G.A. + +
+ +
+
+
+ G.A. Miller + Now that you've shared the path that Danny Torrance took as he grew up, I sincerely hope you'll wonder whatever became of Mark Petrie, and whether he ever decided to return and find out if the fire was as cleansing as Ben thought it would be...
'Salem's Lot was my introduction to your work, and will always be my favorite. No matter where life takes us, we always remember our first. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 62: + by + + Ann Marie + +
+ +
+
+
+ Ann Marie + Happy birthday to my second favourite author (my first being my kids... who also read your books)!!! Keep being wonderful and have a lovely day! xo +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 61: + by + + Karen + +
+ +
+
+
+ Karen Malena + Okay, this isn't going to be an "I'm your number one fan" note. I want to tell you what your writing has meant to me. I've read your books since I was in my twenties. Through my life, I've always wanted to write my own stories but was laughed at even by family members. Flash forward to about eight years ago when I read your amazing book, "On Writing." A true life-changer! Not only is that the handbook for anyone interested in penning a more crisp style of writing, but re-reading my favorite books of yours every couple years also is like sitting with you in a schoolroom, watching the master spin his craft.

I'm near the end of "Doctor Sleep" which is a brilliant piece of writing. I have "The Shining" sitting right next to it as a reference book, and am amazed at your settings, sentence structure, extremely powerful writing. As always, this book is a winner.

Here's to you my teacher! Keep doing what you're chosen to do. Oh, and by the way, I am your number one fan. Karen Malena +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 60: + by + + Doreen + +
+ +
+
+
+ Doreen Petersen + Looking forward to seeing you and Lee Childs at the Harvard Bookstore on Sept. 9. I'm sure it will be a great evening! +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 59: + by + + Doreen + +
+ +
+
+
+ Doreen Petersen + Just finishing up Full Dark, No Stars. So close to the end that I just can't put it down until I finish. Today was a rough day for me. The 11th yr anniversary of my Dad's death and I was feeling really low but reading your book Mr. King helped get me through the day. Thank you so much and hope all is well with you. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 58: + by + + Tanja + +
+ +
+
+
+ Tanja Hal + Sorry that I`m late..Happy, happy, happy birthday and best wishes:) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 57: + by + + Celeste + +
+ +
+
+
+ Celeste + Happy Birthday!! *.*
Thank you for sharing your wonderful imagination with us.

-Celeste. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 56: + by + + May + +
+ +
+
+
+ May Kasahara + Happy Birthday Mr. King!!! +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 55: + by + + Doreen + +
+ +
+
+
+ Doreen Petersen + Just finished reading Dr. Sleep tonight and all I can say is WOW! There were parts you put it there that I never expected and kept me totally addicted to the book! I would definitely recommend your writing to everyone. You are the master Mr. King! +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 54: + by + + Aloy + +
+ +
+
+
+ Aloy + Stephen King = THE KING +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 53: + by + + Antuan + +
+ +
+
+
+ Antuan Vance + Thank you for accepting my request. It made my day. You are my favorite author. You have been an inspiration. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 52: + by + + Gayathri + +
+ +
+
+
+ Gayathri Arun Kumar + Thanks for accepting my request. My best birthday gift this year is friendship with my favourite author. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 51: + by + + Sharon + +
+ +
+
+
+ Sharon + Finally able to put an advanced hold on Mr. Mercedes with my library. Cannot wait to read it! +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 50: + by + + Bonnie + +
+ +
+
+
+ Bonnie Domrois + Thank you Mr. King for accepting my friend request. I look forward to discussing all things literary with a fellow bibliophile. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 49: + by + + Heather + +
+ +
+
+
+ Heather Walsh + Hi Stephen,

I am honored that you accepted my friend request. I'm reading On Writing for the third time. Hands down my favorite book on writing after Elements of Style (but I think you'll forgive me for putting that one first).

-Heather +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 48: + by + + Jovi + +
+ +
+
+
+ Jovi + Hello! :) Thank you for accepting my request. Like the rest of your followers, I, too, am a fan since HS after reading "Needful Things". Getting hooked in your books made me write books for my own pleasure. I did two and, I suspect, will remain unpublished. "One day", I keep telling myself :)

I sometimes muse over the possibility of you working with John Ajvide Lindqvist one day. That may be a long shot, but a girl can dream, right? ;)

Stay safe always! :) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 47: + by + + Nayeomi + +
+ +
+
+
+ Nayeomi + Thank you Stephen King for accepting my friend request. A long time ago, a gangly 14 year old me picked up your book IT and haven't been the same ever since. If i could produce a quarter for all the nightmares your books gave me! But i still keep reading them.

I am very much honored, sir. Looking forward to meeting you someday and shaking your hand. And ask for a book sign of course. Well, duh. :) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 46: + by + + Camila + +
+ +
+
+
+ Camila Zagal + Hey Stephen, thank you so much for accepting my friend request! I really enjoy The Shinning and Pet Sematary so much and hoping to read the rest. i am a big fan.
- Camila from Mexico City ;D +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 45: + by + + Paolo + +
+ +
+
+
+ Paolo + Hey Stephen, thank you for accepting my friend request! So happy.
-CR from Mexico City +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 44: + by + + James + +
+ +
+
+
+ James Lawless + Thanks for accepting my friend request Stephen. I just finished your book On Writing which I enjoyed; particularly hilarious -- the scene about the the wild feminist lesbian.
Best wishes,
james
www.jameslawless.net +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 43: + by + + C.J. + +
+ +
+
+
+ C.J. Anderson + Thank you for all that you do. Carrie is on my reading list next. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 42: + by + + Gillian + +
+ +
+
+
+ Gillian + Thanks for excepting my friends request. I've read and loved loads of your books. The Shining was the first one of your books that I read many years ago, I've been a big fan of horror ever since.

I've read one of your Son's books as well, he is also a very talented author. It must run in your family! :) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 41: + by + + Karen + +
+ +
+
+
+ Karen Malena + Thank you kindly for accepting my friend request! You are a teacher to me, the greatest storyteller, and now, a friend on Goodreads. Karen Malena, Monroeville, PA +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 40: + by + + Vane + +
+ +
+
+
+ Vane + Thanks for accepting my friend request.
I´m so happy !
Grettings from Peru ;) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 39: + by + + Debbie + +
+ +
+
+
+ Debbie + Thank you for adding me as a friend! I am so thrilled. I love reading your books. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 38: + by + + Mike + +
+ +
+
+
+ Mike Marsbergen + Thanks for adding me as a friend! You're an absolute inspiration. The way you weave your 'world' and have it all connect-- it changed how I approach my own writing. Thank you, and I hope you continue to write stories for many more years. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 37: + by + + ManaChelle + +
+ +
+
+
+ ManaChelle + Thank you for accepting my friend request! Is it lame that I got really excited to see that I was like # 2 thousand something?!
You're work is Amazing. Top 5 favorite author. I know when one of your books come out I'm not going to be disappointed . Also, I know I probably won't sleep till the book is done..but, it's always worth it :)
Amanda +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 36: + by + + S. + +
+ +
+
+
+ S. Rutherford + Thank you for accepting my friend request. :) You have always been, and will always be, my idol (no seriously!). I have never found someone to be considered my idol until I first picked up Carrie in school. From then on, you've been my guy.

I've read your book On Writing, and even though I loved the story of Carrie, On Writing has got to be my favorite of them all--purely because of the knowledge you instilled within it. Learning about your background has made me feel more comfortable with mine (we share a very similar history with writing). Everything you've taught, I've taken to heart. My copy looks worse than any textbook I've ever owned because of all the highlighting, marginal notes, and dog ears I've done to it, but it just goes to show how strongly I find your word on the craft. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 35: + by + + Denise + +
+ +
+
+
+ Denise + Thank you for adding me to your friends. I love your writing, especially the way you write about young people growing up. You are the best. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 34: + by + + Constanza + + + (last edited Apr 09, 2014 02:19PM) + +
+ +
+
+
+ Constanza + Thank you for accepting my friend request and for all the wonderful stories you've giving us through the years! greetings from Chile! :) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 33: + by + + Ann Marie + +
+ +
+
+
+ Ann Marie + Oh my gosh I'm so star struck! Thank you for accepting my friend request!

I just want to say that I sold 'On Writing' to a whole lineup of people at a coffee shop as I laughed my ass off while reading it at a nearby table. So great! Thank you! +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 32: + by + + Tamás + + + (last edited Apr 09, 2014 01:28PM) + +
+ +
+
+
+ Tamás + The usual "thanks for accepting the friend request", but a little more too:

Your books got me into reading, when I was something like 10 years old. I'm on a mission to read everything you ever published, and I'm crazy with anticipation for every new book you announce. "On Writing" was a great insight, and helped me a lot...
You are my idol. (Well, one of my idols, anyway... :D But there aren't a lot. :D) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 31: + by + + Jasmina + +
+ +
+
+
+ Jasmina Jurišić + Thanks for accepting my friend request!
Woohoo, you're the best. <3
Greetings from Croatia! +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 30: + by + + Marko + +
+ +
+
+
+ Marko Rančić + Thank you for accepting my friend request, Mr. King! Greetings from Serbia!!! +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 29: + by + + Vanessa + +
+ +
+
+
+ Vanessa + If this is the real Stephen King, then I am over the moon that you accepted my friend request :D This is so awesome! :) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 28: + by + + Christopher + +
+ +
+
+
+ Christopher Mechling + Dear Mr. King,

Thanks for choosing to be my friend on Goodreads. You've accomplished so much as an author, and it's an honor for me, as a debut author, to connect with you this way.

Best Regards
Christopher Mechling +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 27: + by + + Darren + +
+ +
+
+
+ Darren + Thank you for accepting my friend request. You made my day! +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 26: + by + + Mai + +
+ +
+
+
+ Mai AbdelWahab + thanx for accepting my request , greetings from Egypt ^_^ +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 25: + by + + J.P. + +
+ +
+
+
+ J.P. Mac + Appreciate your accepting my friend request. Your work has had a huge influence on me.

Plus we share a mutual acquaintance in Greg Shepherd who used to work at ABC. After your accident, he said ABC wanted to send you some horror movies and asked me for recommendations. I think I suggested, among others, "Curse of the Demon" and "The Cat People."

All the best! +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 24: + by + + Sara + +
+ +
+
+
+ Sara Ribeiro + Thanks for accepting my friend request :) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 23: + by + + Sarah + +
+ +
+
+
+ Sarah + Thank you for accepting, made my day! :) Hope you're well. I haven't seen the lights on at your house much lately when I drive by; you must still be in Florida. +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+ +
+  ♕ ❤  ♕ Princess pink diamonds posh bird LINZY.x.♕ ❤ ♕ + Thank you Stephen,It's an honour to be your friend.I'm writing my first book,a drama,and my dream is to be as famous as you one day.
You're the greatest and your surname king does you justice.I re-watched 'Misery" for the umpteenth time as I watch and read them all.
Have a great day.
Princess.:0) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 21: + by + + László + +
+ +
+
+
+ László + Mr. King, thanks for the friend request acception! I turly respect this moment. :) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 20: + by + + Jose + +
+ +
+
+
+ Jose + Thank you for accepting my friend request! You made my day! :D +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 19: + by + + Lisa + +
+ +
+
+
+ Lisa Reads & Reviews + Thanks for accepting my friend request. You're my writing hero author guy! +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 18: + by + + Derrolyn + +
+ +
+
+
+ Derrolyn Anderson + Thanks for friending.
I could start gushing about how much your books have meant to me throughout my reading life, but you've already heard that a million times. You made my day :) +

+
+
+
+ reply + | + + flag +
+
+
+
+ + +
+
+
+
+ message 17: + by + + Aric + + + (last edited Mar 22, 2014 08:06PM) + +
+ +
+
+
+ Aric Cushing + I loved this book. It was very difficult to stop reading between my Le Bistro, automatic pet feeder meals. Very, very difficult. It didn't have that amazing lead character (like in Cujo), but I like this even better. Mr. King, can't you write a sequel, like you did with The Shining? Everyone seems to love sequels these days, even pugs. Very few novels can keep me from my meals, but this one, unlike others, did.
[image error]the Pug's SALEM'S LOT photo photo_zpsd6623426.jpg"> +

+
+
+
+ reply + | + + flag +
+
+
+
+ +
+
« previous 1
+ + + back to top + + +
+
+ + +




+ +
+
+ + + + + +
+
+
+
+
+
+ + +
+ + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/ambry_scraping/goodreads/mocks/edition_details_the_shining.html b/test/ambry_scraping/goodreads/mocks/edition_details_the_shining.html new file mode 100644 index 00000000..456209a9 --- /dev/null +++ b/test/ambry_scraping/goodreads/mocks/edition_details_the_shining.html @@ -0,0 +1,54 @@ +The Shining (The Shining, #1) by Stephen King | Goodreads
Jump to ratings and reviews
Rate this book

The Shining #1

The Shining

Rate this book
Jack Torrance's new job at the Overlook Hotel is the perfect chance for a fresh start. As the off-season caretaker at the atmospheric old hotel, he'll have plenty of time to spend reconnecting with his family and working on his writing. But as the harsh winter weather sets in, the idyllic location feels ever more remote...and more sinister. And the only one to notice the strange and terrible forces gathering around the Overlook is Danny Torrance, a uniquely gifted five-year-old.

497 pages, Paperback

First published January 28, 1977

This edition

Format
497 pages, Paperback
Published
July 1, 1980 by New English Library (Hodder & Stoughton)
ISBN
9780450040184 (ISBN10: 0450040186)
Language
English

Loading...

More information

35.1k people are currently reading
897k people want to read

About the author

Stephen King

2,471 books844k followers
Stephen Edwin King was born the second son of Donald and Nellie Ruth Pillsbury King. After his father left them when Stephen was two, he and his older brother, David, were raised by his mother. Parts of his childhood were spent in Fort Wayne, Indiana, where his father's family was at the time, and in Stratford, Connecticut. When Stephen was eleven, his mother brought her children back to Durham, Maine, for good. Her parents, Guy and Nellie Pillsbury, had become incapacitated with old age, and Ruth King was persuaded by her sisters to take over the physical care of them. Other family members provided a small house in Durham and financial support. After Stephen's grandparents passed away, Mrs. King found work in the kitchens of Pineland, a nearby residential facility for the mentally challenged.

Stephen attended the grammar school in Durham and Lisbon Falls High School, graduating in 1966. From his sophomore year at the University of Maine at Orono, he wrote a weekly column for the school newspaper, THE MAINE CAMPUS. He was also active in student politics, serving as a member of the Student Senate. He came to support the anti-war movement on the Orono campus, arriving at his stance from a conservative view that the war in Vietnam was unconstitutional. He graduated in 1970, with a B.A. in English and qualified to teach on the high school level. A draft board examination immediately post-graduation found him 4-F on grounds of high blood pressure, limited vision, flat feet, and punctured eardrums.

He met Tabitha Spruce in the stacks of the Fogler Library at the University, where they both worked as students; they married in January of 1971. As Stephen was unable to find placement as a teacher immediately, the Kings lived on his earnings as a laborer at an industrial laundry, and her student loan and savings, with an occasional boost from a short story sale to men's magazines.

Stephen made his first professional short story sale ("The Glass Floor") to Startling Mystery Stories in 1967. Throughout the early years of his marriage, he continued to sell stories to men's magazines. Many were gathered into the Night Shift collection or appeared in other anthologies.

In the fall of 1971, Stephen began teaching English at Hampden Academy, the public high school in Hampden, Maine. Writing in the evenings and on the weekends, he continued to produce short stories and to work on novels.

Ratings & Reviews

What do you think?
Rate this book

Friends & Following

Create a free account to discover what your friends think of this book!

Community Reviews

5 stars
753,812 (50%)
4 stars
477,828 (32%)
3 stars
188,069 (12%)
2 stars
42,534 (2%)
1 star
26,408 (1%)
Displaying 1 - 30 of 38,814 reviews
Profile Image for Will Byrnes.
1,326 reviews121k followers
October 31, 2022
If you had not read The Shining already, the 2013 publication of Doctor Sleep, the sequel, presented an opportunity to revisit one of the best ghost stories of our time, a perfect justification for stepping through those bat-wing doors for the first time.

description
1st Edition cover – Published January 28, 1977 – 447 pps

It has been a lifetime since I read The Shining for the first time, over thirty years ago. I enjoyed it then for its effectiveness in telling a scary, no, a very scary story. Reading it now is colored, as is all of life, by our accumulation (or lack of accumulation) of experience. We see, or appreciate colors, textures, shapes, structures, and feelings with more experienced, educated eyes. We have seen, or are at least aware of real world things that are scarier than any fictional spectres. So, what does it look like through old, cloudy lenses?

It remains a very scary story. The things that stand out for me now are not so much the deader rising up out of a bathtub to pursue a curious child, although that is still pretty creepy, or the mobile topiary, which still works pretty well at making the hair on one’s neck and arms stand at attention. But King was using the haunted house trope to look at more personal demons. And those shine through more clearly now.

description
From Allyn Scura’s blog

He had some drinking issues at the time he wrote the book, when he was 30, and concern about that is major here. Jack Torrance is an alcoholic, no question. He also has issues with anger management, not that the little shit he clocks while teaching at a New England prep school didn’t have it coming. He did. But one cannot do that to a student, however deserving, and expect to remain employed for long. His little boy, however, most certainly did not deserve a broken arm. Jack is very remorseful, and wants to make things right. He manages to get a gig taking care of the Overlook Hotel in Colorado over the winter. It will offer him a chance to get something right after a string of getting things wrong, offer a chance to save his marriage, and offer an opportunity to work on his unfinished play. Risky? Sure. But a gamble worth taking. And his wife, Wendy, agrees, despite having serious misgivings. There are no attractive alternatives.

Of course, we all know that the Overlook is not your typical residence. Odd things happen, sounds are heard, thoughts from somewhere outside find their way into your mind. Jack is targeted, and boy is he vulnerable.

But five-year-old Danny is the real key here. He is the proud possessor of an unusual talent, the shining of the book’s title. Danny can not only do a bit of mind-reading, he can also see things that other people cannot. And for a little guy he has a huge talent. He also has an invisible friend named Tony with whom only he can communicate.

It is difficult to think about the book without finding our mental screens flickering with the images of Jack Nicholson in full cartoonish psycho rage, the very effective sound of a Big Wheel followed by a steadicam coursing through the long halls of the hotel, and the best casting decision ever in choosing Scatman Crothers to play Dick Halloran. By the way, the hotel is based on a real-world place, the Stanley Hotel, in Estes Park, Colorado. And the Overlook’s spooky room 217 was inspired by the supposedly haunted room 217 at the Stanley.


This image is from the hotel’s site – they clearly embrace the spectral connection

The room number was changed in the film to 237, at the request of the Timberline hotel, which was used for exterior shots. There is so much that differentiates Kubrick’s film from the book that they are almost entirely different entities. The differences do require a bit of attention here. First, and foremost, the book of The Shining is about the disintegration of a family due to alcoholism and anger issues. How a child survives in a troubled family is key. The film is pretty much pure spook house, well-done spook house, but solely spook house, nonetheless, IMHO. There is considerable back-story to Jack and Wendy that gets no screen time. You have to read the book to get that. Jack is a victim, as much as Wendy and Danny. You would never get that from the slobbering Jack of the film. The maze in the book was pretty cool, right? I liked it too, but it does not exist in the book. I believe it was put in to replace the talented topiary, which is the definition of a bad trade. There is significant violence in the book that never made its way into Kubrick’s film, but which very much raises a specter of domestic violence that is terrorizing real people living in real horror stories. There are a few lesser elements. Jack wielded a roque mallet, not an axe. Danny is not interrupted in his travels through the corridors by Arbus-like twin sisters. And the sisters in question are not even twins. There are plenty more, but you get the idea. An interesting film, for sure, but not really the most faithful



interpretation of the book. King saw that a film that more closely reflected what he had written reached TV screens in 1997, with a six-hour mini-series version.

Irrelevancies of a personal nature
The opening shot was filmed on the Going–to-the-Sun Road in Montana’s Glacier National Park in Montana. I have had the pleasure (7 times in one visit) and recommend the drive wholeheartedly. It is a pretty narrow road though, so you will have to drive carefully. Bring along the appropriate musical media for the best effect, Wendy Carlos’s Rocky Mountain, and dress warmly. It was below freezing when I reached the top of the road, in August. Some exteriors for Kubrick’s film were shot at the Timberline Lodge on Mount Hood in Oregon. I visited but did not stay there back in 2008. Sadly I do not have any decent personal photos from the place. I can report, though, on a bit


This shot was found on Wikimedia

of kitsch. There is a place in the hotel where an ax is lodged in a block of wood, with HEEEEERE’s JOHNNY on the ax, a tourist photo-op. And yes, I did. Sadly, or luckily, the shot did not come out well, so you will be spared.

Back to the book, Danny’s talent is a two-edged sword. He is afflicted with seeing more than anyone his age should have to see, but on the other hand, he has a tool he can use to try to save them all. Whether he can or not is a core tension element here.

King is fond of placing his stories in literary context. He peppers the text with references to various relevant books and authors. I expect these are meant to let us know his influences. Horace Walpole, author of The Castle of Otranto, a Gothic classic, is mentioned, as is Shirley Jackson, of Hill House fame. King had used a quote from this book in Salem’s Lot. A family saga rich with death and destruction, Cashelmara is mentioned as are some more contemporary items, like The Walton Family, the idealized antithesis to the Torrance Family, Where the Wild Things Are and novelist Frank Norris. The primary literary reference here is Poe’s The Masque of the Red Death, which is cited many times. There had been a costume ball back in hotel’s history and it is the impending climax of that party, the unmasking, that looms here. And toss in nods to Treasure Island and Bluebeard for good measure.

King often includes writers in his work, avatars for himself.
I write about writers because I know the territory. Also, you know it's a great job for a protagonist in a book. Without having to hold down a steady job, writers can have all sorts of adventures. Also, if they disappear, it's a long time before they are missed. Heh-heh-heh. – from an AOL interview +
Jack Torrance is a writer as well as a teacher. The play that Jack is writing undergoes a transformation that mirrors Jack’s own. In fact, there is a fair bit or mirroring going on here. Jack’s affection for his father as a kid was as strong as Danny's is for him. His father was an abusive alcoholic. While Jack is not (yet) the monster his father was, he is also an alcoholic with abusive tendencies.
I never had a father in the house. My mother raised my brother and I alone. I wasn’t using my own history, but I did tap into some of the anger you sometimes feel to the kids, where you say to yourself: I have really got to hold on to this because I’m the big person here, I’m the adult. One reason I wanted to use booze in the book is that booze has a tendency to fray that leash you have on your temper…For a lot of kids, Dad is the scary guy. It’s that whole thing where your mother says, ‘You just wait until your father comes home!” In The Shining, these people were snowbound in a hotel and Dad is always home! And Dad is fighting this thing with the bottle and he’s got a short temper anyway. I was kind of feeling my own way in that because I was a father of small children. And one of the things that shocked me about fatherhood was it was possible to get angry at your kids. (from the EW interview cited in Extra Stuff)
He’s right. I have had the pleasure and I know. Wendy gets some attention as well, as we learn a bit about her mother, and see Wendy’s fear that she has inherited elements of her mother’s awfulness.

Not everything shines here. There are times when five-year-old Danny seems much older than his tender years, even given his extraordinary circumstances. It struck me as surprising that there is no mention of anyone suggesting that maybe Jack might attend an AA meeting. But these are like single dead pixels on a large screen.

If you want to read horror tales that are straight up scare’ems, there are plenty in the world. But if you appreciate horror that offers underlying emotional content, and I know you do, my special gift tells me that The Shining is a brilliant example of how a master illuminates the darkness.

This review, with images intact, has also been posted on my blog

=============================EXTRA STUFF

Definitely check out the Wiki for this book – nifty info on the King Family’s stay at the Stanley, and yes, there was a Grady at the Stanley.

I also recommend checking out SK’s site if you want to learn more about him

An interview with King in Entertainment Weekly

BTW, here is a shot of the model snowmobile that Dick Halloran drives back to the Overlook


A few other SK's we have reviewed
Under the Dome
Duma Key
Lisey's Story
Doctor Sleep
Revival
Mr. Mercedes
Just After Sunset
Profile Image for megs_bookrack.
1,779 reviews12k followers
February 18, 2024
This was my 4th-time reading The Shining.



You read that correctly, the 4th-time. I'm aware rereading isn't for everyone, but I am a huge supporter and fan of rereading, especially tried and true favorites.

I know a lot of people feel it is a waste of time, but for me, when a story is special enough to you, each time with it is like a whole new experience. That's exactly how I feel every time I open the pages of this book.



Additionally, I feel like where I am at in my life plays a huge role in what I take out of a reading experience.

For example, the first time I read this, I was in high school. You better believe that 14-year old Meg walked away from this having picked up on different things than 44-year old Meg does, reading it now.



My experiences have shown me that rereading allows me to focus on different areas of any particular story. This time around, for me, I felt myself really drawn to the private thoughts and emotions of this cast of characters.

Jack's experience, in particular, as he struggles with the position he finds himself in, his loitering addiction and the love for his family, hit me hard this time. Instead of seeing his horrible aspects front and center, I thought more about what was going on with him internally.

There were moments of clarity for him, when he could see beyond the fog of the hotel's power, moments where he cherished his son and wife, but they would slip away like mist. It made my heart ache for the whole family.



This experience also reiterated for me how much I love Wendy and Hallorann. They got played dirty in the movie adaptation and we all know it. Not by the actors, the acting was fantastic, but yeah, they feel like completely different people in the book, IMO.

Again, I was beyond impressed with some of the scenes in this still having the ability to scare the shit out of me, even after all these years. The perfect example would be the first time Jack tries to trim the topiary.

That freaking scene gets my pulse racing every time!



I also felt like I paid more attention to the history of The Overlook this time through; like when Jack is looking into it. I really felt focused in those sections and loved being reminded of its intensely lurid history.

Finally, I would just give all the stars in the universe, yet again, to King's sense of place with this one. His ability to transform a hotel into an actual character in the story is just a masterpiece. It's basically the standard to which I compare atmosphere in all other stories.



I'm so glad I took the time to reread this. It was exactly what I needed to re-energize my reading. You better believe, this won't be the last time either!

Earlier

Here's the thing, July hasn't been the best reading month for me. I've had a lot of 2-to-3-star books. I'm frustrated. I'm getting disgruntled and burnt out on it honestly.

I have never been in a reading slump before, but I definitely feel myself drifting into that territory...



I feel like in an effort to keep that from happening, I am going to reread one of my top-3 favorite books of all-time. If anyone can shake me out of this funk, it's Jack Torrance.



I hear the fourth times a charm!!!

Original:

Hi. Hello!

It's me again, with another book you should consider picking up, if you haven't read it yet.



The Shining is my second favorite book of all time.

A true classic of Horror literature. I have read it a few times and it gets me EVERY. DAMN. TIME.



This is one of the most atmospheric books I have ever read, with The Overlook Hotel, ultimately becoming a character in its own right.

There are so many chilling moments from crazed topiary animals, to haunted elevators, and evil playground equipment.

Sounds intriguing, doesn't it?



Read it.
Read it now!

Meg's Advice:

The Shining is best read on a cold, windy night, when you are home alone and there is the slight possibility that you may lose electricity. Candles burning are a must for this one!

Profile Image for Kat.
268 reviews79.7k followers
November 20, 2019
i- i don't even know what to say that hasn't already been said about this but lemme give it a shot.

god DAMN this is king at his best. i know, i know, "kat that is so cliche. couldn't you have picked a less popular king book to stan?"

i guess not, but hear me out.

1. first of all, i love a good old fashioned haunted house story and that's exactly what this is. the slow progression of madness that overtook jack and the introduction of new ghosts (or hallucinations, whatever you decide) was INCREDIBLE. not to mention the thing that i think king writes best is the feeling of confinement, and what's more confining than being snowed into a haunted hotel that literally wants you dead?? oh right, nothing.

2. the characterization!!! ah! the way that king wrote these characters was just *chefs kiss* not only did i care about danny, wendy, and (sometimes) jack, but we also got to rip back the layers of their relationships with each other and dynamic as a family which i LOVE. even if you don't think this is a great horror story, don't deny it is a baller family drama.

3. the horror of it all. whether you want to look at it as a family being attacked by ghosts, or a father being overcome by an extreme case of cabin fever, or even if the whole murdering thing doesn't scare you but you can see the fear that comes with having a family member who battles with some kind of addiction, this book is fucking scary. it may not have made me physically jump or scream, but i can tell you that it's a story that is gonna stick in my brain and not let go for a long long time (just like any good horror should)

now for the obligatory comparison to the movie:

it's common knowledge that king himself hates the Kubrick movie, but i love it. so much. it's one of the first horror movies i ever saw and i've seen it many times since, so while it's a popular opinion to love the book and shit on the movie i just can't bring myself to do it. yes, they're very different in a lot of ways, but honestly i think that Kubrick did the best with what he had to work with.
a BIG part of the novel is rooted in internal conflict. we spend so much time inside of jack, danny, and wendy's heads that it would have been impossible (imo) to translate that to the screen without a near constant voiceover (like basically just the audiobook playing over all the scenes) sO, i can't fault the movie for what it lacks in depth of character and explanation...i just can't. however, if for some reason you're reading this and you have seen the movie but haven't read the book YOU BETTER READ THE FCKING BOOK ARE YOU JOKING?? READ IT.

anyway,
dear mr. stephen king,
i'm sorry i ever said that your popular books were overhyped. some of them are *cough* IT *cough* but this one isn't.
luv, kat

okay that's all read this book i don't have an outro okay byeeeee
Profile Image for Earline.
845 reviews
July 26, 2016
This scene from Friends pretty much sums up my feelings about this book:


"Rachel: Hmm. (she opens the freezer) Umm, why do you have a copy of The Shining in your freezer?

Joey: Oh, I was reading it last night, and I got scared, so.

Rachel: But ah, you’re safe from it if it’s in the freezer?

Joey: Well, safer. Y'know, I mean I never start reading The Shining, without making sure we’ve got plenty of room in the freezer, y'know.

Rachel: How often do you read it?

Joey: Haven’t you ever read the same book over and over again?

Rachel: Well, umm, I guess I read Little Women more than once. But I mean that’s a classic, what’s so great about The Shining?

Joey: The question should be Rach, what is not so great about The Shining. Okay? And the answer would be: nothing. All right? This is like the scariest book ever. I bet it’s way better than that classic of yours."
Profile Image for Chelsea Humphrey.
1,487 reviews81.7k followers
February 2, 2020
This was most excellent; I can 100% see why this is many readers favorite Stephen King novel. Heck, it's my favorite novel of his to date, although I have a good number of his books to catch up on. I've found myself overly critical of his work in the past, possibly due to the fact that he's so well known, but I feel it's more been a fault on my end. Previously I've picked up one of his doorstops at a time I wasn't prepared to fully invest in the time and energy it takes to immerse oneself into his world building and lengthy details. This time, I was ready. (Also, this was only like 600 pages which felt like a novella compared to IT.)

I'm finally able to understand why so many people hold the standard of traditional horror in comparison to this novel. Sure, it has all the creepy crawlies and spooky wookies to get your heart racing, but it's so grounded in reality that I had a hard time rationalizing with myself that "it's just a story." The 150 page set up is well worth the reader's time, as it lays the groundwork for much of the why behind the narrative, and it also gave me a chance to bond with precious Danny before the shit hit the fan.

I may be the last person on the planet to have read this book, but just in case I'm not, I wanted to share some of the things that really hit home with me. Just like IT is, at heart, a disturbing coming-of-age story, The Shining was an impeccable tale of extreme cabin fever with a hefty dose of "the destructive nature of alcoholism". When you break it down like that, the supernatural elements actually seem to take a backseat to the very real horror of what it's like living with someone struggling through addiction. I've heard all the stories of how this book helped SK realize his own struggle with alcohol, and I'm inclined to believe it's true as the writing here was heavy laden with emotion and depth.

I apologize for ever calling Mr. King over-hyped. I'm grateful my previous experiences with his wordier novels didn't deter me from finally choosing to read this, as it's a gem of a book and a classic in it's genre. I still despise Sleeping Beauties though and refuse to change my opinion on the matter. ;) Highly recommended to any other below-the-rock dwellers who may not have happened across this one. Now- to watch the movie or not?
Profile Image for Anne.
4,228 reviews69.9k followers
November 1, 2023
description

Is this horror?
I'm genuinely asking here because I'm not a horror aficionado, so I don't know what all constitutes that genre. To a layman like myself, IT was horror because it scared the piss out of me and I couldn't sleep without the lights on for a while. The Shining is more like a Spooky Family Drama. Yeah, yeah, there at the end things got a little hairy, but it was still mostly a human trotting around getting all stabby.

description

Now, I say mostly because good old Jack is getting some help from a couple of freaky paranormal spectres and...
THE HEDGES!

description

In an effort to be transparent, I feel like I should mention that I've never actually watched the movie that was based on this bestselling novel. My husband (who has long since stopped being surprised by me) gasped out loud when I told him that a few days ago. So, I'm guessing from his reaction that I'm probably in the minority. Now, normally, whether or not you've seen the movie doesn't matter at all, but this is a pretty iconic movie we're talking about, so even without having seen it, I kind of knew the plot a bit and (of course) knew who acted the starring roles. I know, I know. None of that matters at all when you're talking about a book. But I just thought it might be relevant because the movie is so incredibly well known that even peasants like myself who haven't seen it, immediately recognize certain images from the film.

description

I said that to say this: Jack Nicholson is definitely not the Jack Torrence I was seeing in my head, as described by Stephen King. King's Jack was a handsome young guy who was married to a beautiful woman. Now, Shelly Duval is a fine actor and so is Nicholson. But...
Anyway. I was just surprised to find out that the characters in the book were hotties.
I've heard the book and movie are very different in a lot of ways, but that both are good if taken separately. I'm planning to rent the movie soon and find out.

description

Alright. The gist is that there's this guy (Jack) who made a few mistakes because he was a bit boozy, and is now trying to go straight and get it together for his family.
He's a bit of a pompous ass, truth be told. One of those people who feel as though everyone around them just doesn't understand their tortured genius, you know? But he's not just that guy. Which is where King's brilliance as a writer comes in.
He doesn't make Jack the bad guy, he makes Jack a guy.
He's trying. He's trying so hard to stay on the wagon, he's trying so hard to be a better husband, and he's trying so hard to be the father Danny deserves.
And if he hadn't landed a job at a fucking Haunted Hotel, I truly believe he would have made it work.

description

Or maybe not.
Regardless, Jack is only one of the important characters in this Hallmark Family Movie Channel story. You also have Jack's sweet and beautiful (if a bit too mousy and faithful to the old fucker) wife, Wendy. And, of course, their little son, Danny.
Danny has + The Shine +. <--which, when I found this out, FINALLY explained the name of this fucking book to me! Do you know how many years this has been subconsciously niggling at my brain?
Well, neither do I.
But when fellow psychic, mind reader, and hotel employee, Dick Hallorann, tells Danny what rooms to avoid over the winter because he can feel Danny's super-bright Shine? It was like a puzzle I didn't even know I was trying to solve clicked into place! It was one of those moments you have where you suddenly realize that there's one less thing you don't know. For one brief second, I felt like the universe had given me a high-five I hadn't asked for and then didn't even pull away at the last second.

description

So, what happens when you toss a recovering alcoholic with a penchant towards abusive behavior, an overly-optimistic woman who tends to flutter instead of walk, and a 5 year old who can tell what they are both thinking, inside of a hotel that basically wants to eat them?
Well, I don't want to spoil anything for the 3 people who don't know how all this turns out, but...

description

Anyway. Good stuff. I'm glad my pals forced me (once again) outside my comfort zone.

Buddy Read with The Jeff & The Angry German 4/16
Because who doesn't like child abuse?

description
Profile Image for Jeffrey Keeten.
Author 6 books250k followers
July 26, 2018
“The thought rose from nowhere, naked and unadorned. The urge to tumble her out of bed, naked, bewildered, just beginning to wake up; to pounce on her, seize her neck like the green limb of a young aspen and to throttle her, thumbs on windpipe, fingers pressing against the top of her spine, jerking her head up and ramming it back down against the floorboards, again and again, whamming, whacking, smashing, crashing. Jitter and jive, baby. Shake, rattle, and roll. He would make her take her medicine. Every drop. Every last bitter drop.”

For a guy like myself who loves to read and write taking the job as a winter caretaker of The Overlook Hotel sounds like a dream job.

+ Photobucket +
The Stanley Hotel inspiration for The Overlook Hotel

The time requirements for the job are miniscule leaving me plenty of time every day to work on the next “great American novel”. Before leaving for this foray into isolationism I would calculate just how many books I would need to sustain me through the winter and then increase it by ⅓ or so. Jack Torrance makes the case that because he is an educated man he is better suited for the job.

“A stupid man is more prone to cabin fever just as he’s more prone to shoot someone over a card game or commit a spur-of-the-moment robbery. He gets bored. When the snow comes, there’s nothing to do but watch TV or play solitaire and cheat when he can’t get all the aces out. Nothing to do but bitch at his wife and nag at the kids and drink. It gets hard to sleep because there’s nothing to hear. So he drinks himself to sleep and wakes up with a hangover. He gets edgy. And maybe the telephone goes out and the TV aerial blows down and there’s nothing to do but think and cheat at solitaire and get edgier and edgier. Finally...boom, boom, boom.”

Now Jack may be an educated man but he is carrying around more baggage than any one bellhop could ever get delivered. He has a double helix of trouble an alcohol problem intertwined with a really nasty temper. He has lost jobs. He has beaten a young man senseless. He has broken his son Danny’s arm, little more than a toddler, because he messed up his papers.

Jack is always sorry.

+ Photobucket +
Jack playing Jack

When not drinking he wipes his lips so often he makes them bleed.

His father was a violent man and King does give us some background on Jack’s childhood which may have been intended to lend some sympathy for Jack. Just because we follow the threads back to why he is the way he is doesn’t mean that he is anymore likeable or for that matter less dangerous. He may be an educated man, and he may have made the case as to why he is more qualified to be a caretaker cut off from the world, but as it turns out he wasn’t suited for the job, not suited at all.

I was sitting in an American English class at the University of Arizona, what seems like an eon ago, when a woman, older than the rest of us by probably 15 years or so, raised her hand and asked the teacher why we weren’t reading Stephen King for this class. I remember distinctly peering at the syllabus and seeing Steinbeck, Faulkner, Hemingway and Fitzgerald among others. It was the canon of American Literature about to be explored by some of us in depth and by some of us only by way of Cliff Notes or Sparks Notes. Some in the class I could almost pick them out by their shiny perfect teeth, which I found abhorrently boring like trees planted in perfect rows, belonged to the Greek Houses and would be showing up to class only to turn in their papers carefully culled from the vast files of papers written by past Sorority Sisters or Fraternity Brothers who had received As in this class for their efforts. After all it isn’t about learning, but about passing. I’m there probably feeling slightly nauseous from the flashing brilliance of pearly whites from the orthodontically challenged when the teacher turns to me and says “Jeff why do you think we aren’t teaching King in this class?”

Here I am thinking about this woman wanting to wedge King between my literary hero F. Scott Fitzgerald and Ernest Hemingway. I don’t think I’d even read King at this point, but I’d been working in a bookstore for many years and knew how important he was to providing me with a paycheck. He developed cross genre appeal bringing horror forward from being a subspecies of science-fiction and away from residing in a spinner rack of books at the back of the bookstore for those social abnormals dressed all in black.

I didn’t really know how to answer the question except in the most bland way possible. I said he hasn’t stood the test of time. I could tell my answer was about as satisfying as a week old bagel to the woman, and I was hampered by the fact that I really didn’t want to insult the woman. The teacher also looked mildly disappointed. I could tell she was hoping to see blood in the water and I failed to be the shark she thought me to be.

The woman’s question does show the issue about Stephen King that is debated in most literary circles whether they are a book club down at the local library or the academic break room at a major university. He has legions of fans. He makes millions every time he puts out a new book which feels like four times a year. The problem is he is a genius. He isn’t a genius in the way that Pynchon, Gaddis, or Wallace are geniuses. He is a genius storyteller. So if so many people are reading him he really can’t be any good...can he?

Someone on GR made the really good point that Stephen King does not need him to buy and read his books. He has writer friends, below the radar, that need his support more. That is so true and one of the more annoying things about King followers is that a percentage of them don’t read anything else. They would come into the bookstore and hound us for the release date of the next Stephen King. I would sweep my hand grandly through the air and point out several other authors that may fill the time between King novels. They simply were not interested.

The thing of it is I used to love being one of those scruffy minded individuals that are always trying to find the next great writer before anyone else. There was no reason to read King because there were no points to be scored with my group of pseudo-intellectual friends by saying something so insipid as “is anyone else reading the new King?”

When I worked at Green Apple Books in San Francisco, which by the way that city is one of the best reading publics in the United States, we catered to University professors, want-to-be writers, actors, and a slew of other professionals such as doctors, lawyers, and bankers. It was a well educated lot to say the least. I thought my days of selling King were over....wrong. Customers with wire rimmed glasses and elbow patches on their tweed jackets would bring up these academic books so obscure that I had no idea we even had them in the store, and invariably in the pile somewhere would be a Stephen King novel. I was still too caught up in my self-image as a reader to really think about taking a walk with the “normals” and start reading King, but I was starting to think to myself... hmmm I wonder what’s going on in them thar books?

+ Redrum.
Murder.
Redrum.
Murder.
(The Red Death held sway over all!)
+


+ Photobucket +

Danny, Jack’s five year old son, has what one character referred to as “a shine”. If people are thinking about something intently, Danny can read their thoughts. He also has an invisible friend named Tony who can take him places, a bit more elaborate than my invisible friend Beauregard. What a dud he turned out to be.

Danny loves his father, actually more than his mother Wendy, which is such a painful realization for her. She has stood in the breach. She DIDN'T break his arm. She protects him from everything including his FATHER. As the malevolent force at the hotel begins to exert more and more influence on Jack and Danny she is relatively unaffected by hallucinatory thoughts. The interesting subtext of this novel is that Jack thinks the hotel is after him. As Danny explains:

“It’s tricking Daddy, it’s fooling him, trying to make him think it wants him the most. It wants me the most, but it will take all of us.”

A precocious five year old with a brain of such singular existence that the evil entity of The Overlook Hotel must have him. Another interesting aspect of the book is the fact that most people will not be affected by the ghostly influences of the hotel unless they have an imaginative brain to start with. They must have a mind open enough to hear the voices and realize the possibility that they may be real.

Did I mention that I’m not really interested in that job anymore?

I know this story. I haven’t watched the movie or read the book previously and yet I’m very familiar with the plot.

It didn’t matter.

While reading this book I was on the edge of my seat. My pulse rate elevated. My mind buzzing with lizard brain flight or fight responses. This guy King knows how to tell a story. There is this scene on the stairs between Jack and Wendy that is probably one of the most intense fight scenes I’ve ever read in literature. I was right there with the characters feeling the thud of the roque mallet and the grind of my broken ribs.

Stephen King is a cultural geek of the first order. He enjoys reading and promoting writers. He is a self-made man. A man blessed and haunted by a vivid imagination. He gets big points from me for mentioning Welcome to Hard Times and also McTeague two books that are members of my favorite obscure literature list. I like it when a writer tells us what his characters are reading. He mentions television shows such as The Avengers, which I loved discovering recently that Honor Blackman (Pussygalore) preceded Diana Rigg on that show, and King also mentions Secret Agent Man starring Peter McGoohan. For the last two years I’ve been sifting through old television shows, thank you NETFLIX, and finding shows that I really like. Besides the two shows King mentioned I’ve also enjoyed watching The Baron starring Steve Forrest and Sue Lloyd and the short episodes of Honey West starring the ocelot Bruce. I also have The Saint queued up starring Roger Moore. I have fond memories of watching that show as a child late at night in the summer time.

There has been a hue and cry from his fan base for Stephen King's work to be looked on as literary classics. They feel he is not given the respect he deserves for being a great writer. He is accessible to the average reader, and yet; somehow, puts the right hooks in his writing to please the elevated reader. We do him a disservice, I feel, to try to make him into something he is not. That said, probably the best of King will be read 100 years from now. He is the consummate storyteller still enamored with the unknown and the unknowable. He has a childlike wonder for the world and I for one will make a bigger effort to see the world more often through his eyes.

If you wish to see more of my most recent book and movie reviews, visit http://www.jeffreykeeten.com
I also have a Facebook blogger page at: https://www.facebook.com/JeffreyKeeten
This entire review has been hidden because of spoilers.
Profile Image for Lyn.
1,912 reviews16.9k followers
October 2, 2019
About as perfect a haunted house story as can be, King was at his best here.

It's as though he built a haunted house and then filled every nook and cranny with detail. King is also at his best in regard to characterization, all well rounded and complete, we know family relationships, group dynamics, all the old hidden buried fears.

King touches base with psychological elements, theological, metaphysical, spiritual, and cryptic aspects of a ghost story to wrap the reader in a blanket of horror.

** I watched the 1980 Stanley Kubrik film recently and this made me want to reread the book (which I need to anyway). Kubrik's film grasps the psychological elements of the book and delivers an extra large thin crust The Works pizza of haunted house horror. Jack Nicholson's portrayal of Jack Torrance is still the defining image of this tortured man. While some critics have derided the slow pace of the film (atypical for jump-out-and-yell-BOO! horror fliks of the time) I felt that Kubrik was building the tone and mood of the story to the grisly final moments. King himself has attributed mixed emotions to the film as an adaptation, but has consistently agreed that the imagery of an internal struggle with the dark side of Jack's psyche is a contribution to the horror film genre. King also disagreed with the casting of Nicholson who too closely identified with insanity (due largely to his exceptional work in One Flew Over the Cuckoo's Nest). Interestingly, King himself was battling alcoholism while writing the classic and viewing his work and Kubrik's vision from this perspective adds greater depth to an understanding and appreciation of both.

description
Profile Image for Nandakishore Mridula.
1,261 reviews2,395 followers
May 1, 2016
Quite simply put, The Shining is the best horror story I have ever read. It scared the hell out of me.

Over a period of time, I have noticed certain standard "motifs" in horror stories. One of these I call "The Lost Child". Such stories will typically involve a child, who can see what the silly grownups cannot see (or, even if they do see, don't acknowledge because it goes against reason and logic): and who fights, however high the odds stacked against him/ her are. Danny Torrance is such a boy.

Danny can read minds. He can see the frightening thoughts inside his Dad's and Mom's heads ("DIVORCE", "SUICIDE") but is powerless to do anything about it. Danny does not know that he has a gift; he takes it as a matter of course, until Dick Halloran of the Overlook Hotel tells him that he "shines on".

Jack Torrance, Danny's Dad, reformed alcoholic and struggling writer, is trying to put his life back together after a tragedy. He gets what he sees as the ideal chance when he lands the job of caretaker of the Overlook Hotel for the winter. In the snowed-in hotel with only his son and wife Wendy, Jack assumes that he will get enough quality time to be with his family, patch up old quarrels, and write that breakout novel.

But the Overlook has other plans. The hotel, which feeds on and grows in strength from the evils committed on its premises, wants Danny-permanently-to join its crew of ghostly inhabitants. And to do that, it needs to get to Jack...

The novel slowly grows in horror, starting with mild unease, moving up through sweaty palms and dry mouth, to pure, gut-wrenching terror. Jack's slow slide into madness is paralleled by the growth in power of the hotel's dark miasma, and Danny's extraordinary capabilities. We are on a roller-coaster ride into darkness.

The world of grownups is often frighteningly incomprehensible to young children: these fears seldom die as we grow up, but remain dormant in our psyche. There are very few of us who does not have a ghost in our childhood somewhere. It is when the writer invokes this ghost that story gets to us. King does a masterly job of awakening that child, and putting him/ her in the midst of childhood terrors through the alter ego of Danny Torrance, lost in the cavernous corridors of the Overlook.

There are a lot of passages which literally creeped me out in this novel (the topiary animals, the fire hose in the corridor, the woman in the bathroom to name a few). As King has said elsewhere, the monster behind the door is more frightening than the monster slavering at you: this book is full of such monsters. More importantly, you will keep on remembering your own boogeymen while you are reading; and long after you finish, you will feel the urge to look behind you.

Horror stories are a form of catharsis. As King says, the writer takes you to the body covered under the sheet: you feel it, and are frightened. At the same time, you are relieved that the body is not you.

A true masterpiece.


Profile Image for Nayra.Hassan.
1,259 reviews5,896 followers
September 19, 2022
هناك بريق يبهرك..و هناك بريق يعميك💥
عندما يتحدث كينج عن القدرات الخاصة..يجب ان ننصت مليا"..فاعتقد ان لديه شيئا منها
و عندما يخبرنا كينج عن الإدمان..يجب ان نستمع جيدا
..فقد عاني طويلا من هذا الداء الوبيلScreenshot_2018_09_14_13_49_32_1
و عندمايحكي لنا كينج عن الفنادق المسكونة..فلنصمت جميعا. .فملك الرعب يخبرنا حكاية جديدة

جاك مدرس لغة إنجليزية حياته تتهدم بسبب ادمانه على الشراب ..يفقد عمله..و على شفا خسرانه زوجته و ابنه
يأخذ نفسه بالشدة
..و يقرر ان يعمل ناطورا لفندق جبلي فخم..يتم غلقه طوال الشتاء..لأن العواصف الثلجية تعزله عن العالم و" الشراب "لاكثر من 6 أشهر كل عام
يصطحب أسرته ..و هناك..نكتشف ان للفندق القديم ' عادات شتاءية سيئة
الغرف تعيد تمثيل جرائم الماضي..أشجار الحديقة المنحوتة على شكل حيوانات. .تتجول و تهاجمك
المطعم..و ما أدراك بأحداث المطعم

الابن داني في سن الخامسة له قدرات تجعله يرى و يسمع كل شيء
و هنا يتحول من يحميك إلى مصدر رعبك
هواجس التوق للمشروب مختلطة مع هلاوس الفندق الخاوى..كانت من أصدق ما كتبه كينج..و قد كتبها في عز معاناته مع الادمان

هناك قراء كثيرون يختنقون من البناء الكثيف لشخصيات كينج..و لكن هذه الرواية تعتبر درسا في بناء الشخصية الروائية ..وهي من النوع الذي اما تحبه فورا او تتركها للابد ......لا ؤوجد 3نجوم هنا 🌟🌟🌟 الأبطال أربعة فقط...لا يظهر غيرهم مع الأشباح
اخيرا صارت مترجمة للعربية
و لكن من لم يشاهد الفيلم الغريب. .فهو لم ير بعد ابداع جاك نيكلسون الحقيقي رغم ان كينج لم يحب معالجة ستانلي كوبريك للرواية كثيرا
و هناك استطراد متأخر للرواية في د. سليييب
Screenshot_2018_09_14_13_53_17_1

مخطىء من يظن أن كينج مجرد كاتب روايات رعب
مسطحة ..بل هو طبيب نفسي اريب.. يجذب القراء بإطار من الرعب و الجريمة
لا اقول ان كل اعماله ممتازة. .بل غزارة إنتاجه توقعه في الفخ احيانا
و لكن البريق تستحق💫 و ان كانت ليست للكل
Profile Image for Maggie Stiefvater.
Author 61 books170k followers
May 6, 2022
Years ago, I stayed at a brand new Vegas hotel for a conference. Brand. New. This shining black tower of decadence had been decorated only a few months before I got there. It had all the ambiance of a freshly vacuumed rental car. In time it would wear Vegas, or vice versa, but for now: it was the new, gormless kid on the block.

So imagine my surprise when, on the last day of my stay, I was tormented all night long by something that turned on the jets in my hot tub, stomped heavily to and fro every time I turned the lights out, and, eventually, after I told the room audibly to "cut it out, I've got an early flight," slammed a shaking blow into the headboard directly beside me to remind me who had seniority in this place. In the morning, I confessed to the front desk I'd had a bit of an exciting night, and not in the usual Vegas way. With a glance at the room number, the clerk said he bet that I had.

Later, I found out the brand new hotel had only been a few weeks old when a man had jumped to his death from one of the rooms; the stylish glass balconies I'd enjoyed were an aftermarket part, designed to keep other tortured guests from following suit. Unclear if my room had been the unlucky suite. Unclear if my room was like that because the man had jumped, or if the man had jumped because my room was like that.

So: that's The Shining.

I'm sure I'm the last person in the world to have read the book (I haven't seen the film still, but now I will), but better late than never, right?

Sucks to shine in a hotel hungry for it, I guess.
Profile Image for Melissa ♥ Dog/Wolf Lover ♥ Martin.
3,603 reviews10.8k followers
October 1, 2020
Reread for my Horror Group Challenge & another Group Ghost Walk Challenge



Found me an old school copy with pics inside!!












*
4.5 Stars

I'm not sure why I only saw the movie and never read the book. I loved the movie so much it makes no sense, but back in the day, not many things make sense to me.

I will have to go back and watch the movie again to see all of the different little changes. Now I know why some things happened. You know those things, the little things that are only in the head, written in the book, but doesn't show up in the movie part. Wow! I know the book messed with my head but I didn't realize it would make me write that way! I hope anyone reading this can understand what I meant.



I really did enjoy the book, although I did feel a bit crazier than I am at times with all of the voices in everyone's head! :)

I didn't want one of the bad things that happened in the movie to NOT happen in the book. I didn't want to read that part and lo and behold, it didn't happen! Yay!

The ending in the book was a lot better than the movie. Once again, I really did enjoy this book and look forward to reading and re-reading more of the golden oldies!

Mel 🖤🐶🐺🐾

BLOG: https://melissa413readsalot.blogspot....
Profile Image for Johann (jobis89).
710 reviews4,350 followers
November 21, 2023
“Monsters are real. Ghosts are too. They live inside of us, and sometimes, they win.”

When I first read The Shining a number of years ago I thought it was fantastic and gave it 5 stars, but it just never ranked as a personal favourite. On this reread, however, my socks were well and truly blown off and I had an entirely different experience. This is why I will always be a huge advocate for rereading - it’s quite apparent that wherever your head is at, or whatever life circumstances you find yourself in, can really impact how you view a book. As if that isn’t obvious.

On my first read, I was impatient. I was just starting to read King, I wanted the SCARY BITS. This time around I was emotionally involved. I felt a deep connection to Danny and I could really tap into Wendy’s fears as a parent. A younger, more naive me would have thought “why don’t you just fucking leave if all this creepy shit is happening?” - well, until the snow storm at least - but now I can appreciate this as a last chance saloon for the Torrances. They needed the money, they really had nothing else to go back to.

The Shining is surely one of King’s scariest, if not THE scariest - a few scenes in Pet Sematary might rival this title. One scene in particular left me feeling claustrophobic and breathless, and I regretted reading it one night before bed when I was home alone. I love that there’s so much history to the Overlook and that the former guests continue to hang around...

Jack’s descent into madness is terrifying. He is a complex character and it is difficult to know whether we are to sympathise with him or not. He’s far from a perfect father, but we are all flawed in our ways - just maybe not to this extreme. I shed a little tear towards the end, because I think in spite of all he has done, he does love his son - he was just the perfect prey for the Overlook to get its claws into.

I thoroughly LOVED this reread, and also the extra prologue and epilogue this edition has. The prologue in particular is something you should seek out if you’re a fan of The Shining - it really added another layer of history. 5 stars.

Reread November 2023 on big King chronological reread. Still 5 stars.
Profile Image for Miranda Reads.
1,589 reviews161k followers
December 8, 2020
3.5 stars
+description

description

Just published Two Truths and a Lie - A Booktube Review featuring this book and two others!

Check it out to figure out which ones rock and which is the dud! With special guest - Tucker Almengor!
+ The Written Review +
+ “Sometimes human places, create inhuman monsters.” +
The Overlook Hotel - gorgeous and isolated - is in need of a winter caretaker.

Jack and his family are in need of an income and a place to stay.

Months alone, trapped by snow, with only the family by their sides.

What could go wrong?
+ “Wendy? Darling? Light, of my life. I'm not gonna hurt ya. I'm just going to bash your brains in.” +
So this one was pretty dang good but gosh-dang did I get lost at times.

I think it was cause I watched the movie first.

So while I was reading this book, I was constantly trying to piece together half-remembered fragments with what happened in the book.

That being said, this book felt well-crafted. It was compelling, fascinating and spooky.

Watching the darkness spread and death coming ever closer really cinched the book for me.

YouTube | Blog | Instagram | Twitter | Facebook | Snapchat @miranda_reads
Profile Image for ELLIAS (elliasreads).
502 reviews40.7k followers
February 5, 2021
This book was like a slow claustrophobic squeeze around my neck; I can definitely see why this book from KING is his most classic one yet.

I really enjoyed the way he tackled difficult subjects— abuse, alcoholism, a difficult marriage, and mixes them with horror elements; it was definitely a deep dive read. You can watch the liveshow for my overall thoughts but here are my short general thoughts on the book overall:

Danny was lovely. Too cute sometimes. This smol bb boy literally stomped his tiny foot and said to the mean nasty ol' Overlook: "I'm only five!!" Stop bOtHeRInG mEeeEEEE!!!. He didn't say that last part. Heavily implied though.

Jack Torrance. What a character. One moment you hate him. Like bitch. He needs therapy. Well, the whole family, honestly. The next, maybe you'll sympathize with him. Or not. Either way, King has a way of writing such characters with really complex layers that really gives them a definite look over.

Wendy. My girl suffered through H E L L with this shit. Homegirl barely got it through with all the misogyny, constantly sexualized, that rough toxic masculinity shit, all the ghosts and demons thrown at her. Me shouting out through the entire book: 'I was rooting for you the entire way!!!'

Hallorann. This man carried this whole fucking book on his back if you asked me. The only person of color in this book that really changed and saved the whole story for all of us. Imagine if there were more POC here. The Overlook wouldn't even stand a chance.

+ What I didn't like: +

The blatant and completely unnecessary uses of the n word and other racist dialogue. King is white. Took too much of a liberation with this and really made me uncomfortable and took me out of the story a few times. I understand it takes place in the 70s. The sexual depictions of pretty much every female character in this book. The male gaze was strong with this one. Eurgh.

Hedge animals: "r oAr". Me: ahahAhaHaHah— what? Edward Scissorhands could + N E V E R + let me tell you.

Overall a good solid read. Not too scary though.

3 STARS

Watch the The Late Night Book Club Liveshow here: https://www.youtube.com/watch?v=idGh9...
Twitter | Bookstagram | Youtube |
Profile Image for Matt.
965 reviews29.1k followers
October 31, 2020
"He sat down on one of the stools and propped his elbows on the bar’s leather-cushioned edge. At his left hand was a bowl for peanuts – now empty, of course. The first bar he’d been in for nineteen months and the damned thing was dry – just his luck. All the same, a bitterly powerful wave of nostalgia swept over him, and the physical craving for a drink seemed to work itself up from his belly to his throat to his mouth and nose, shriveling and wrinkling the tissues as it went, making them cry out for something wet and long and cold."
- Stephen King, The Shining

A lot of terrifying things occur in The Shining. None of them are as terrifying as the excruciating battle fought between the ears of an alcoholic. Stephen King’s novel is a classic ghost story; it is also a painful portrait of a man’s mental breakdown.

That man is Jack Torrance, a gifted writer who has squandered his talent with booze and a bad temper. He and his family – wife Wendy, young son Danny – are wintering at the Overlook, a hotel in the Colorado mountains with a long and checkered past. Jack has been given a job as the caretaker of the Overlook. It’s his last chance to make good after losing a teaching position at a prestigious prep school. All he has to do is keep the rooms heated, provide basic upkeep, and make minor repairs. He thinks the job will give him plenty of time to finish the play he has been laboring on. The only trick is the isolation. Once the snows move in, they will make the winding mountain roads impassable. The Overlook will be cut off. It’s the perfect spot to do some writing, go homicidally crazy, or both.

The genius of The Shining is the simplicity of its setting. Isolated location. Spirit infested living accommodations. Precocious child. All these story elements are exceedingly familiar. Layered onto this foundation is King’s exploration of Jack’s increasingly fragile psyche. King is at the height of his powers in his evocation of Jack. He makes visceral the taste of crushed aspirin, the piercing headaches, the desperate thirst for a drink. Jack is a complex character, at once a loving husband, a doting father, a grade-A prick, and a self-destructive wreck.

King is known for outsized epics with dozens of characters. Here, he pares things down to four main players. Besides Jack there are Wendy, Danny, and Dick Hallorann, the Overlook’s chef. King cleverly utilizes a third-person limited viewpoint, which allows him a tell the story through several eyes, giving him the ability to both widen and narrow the focus at his whim.

After Jack, Danny is the most important figure. He has “the shine”, a kind of ESP that includes mental telepathy, sensitivity to the paranormal, mind reading, and the gift of prophecy. (The ability to predict the future is not his best talent, though. If it was, the story would have turned out differently). Danny’s abilities allow him to perceive the danger of the Overlook Hotel – and its poisonous effect on his father – long before anyone else.

I think King’s major achievement is the way he grounds the weirdness in reality. He is methodical in building this limited world (the Overlook, the town of Sidewinder) and sketching its handful of characters. His plotting takes a bit of time, but there is a reason. Take, for instance, an early scene in which Jack and Wendy take Danny to a psychiatrist. The upshot is that the psychiatrist gives a mushy-mumbly diagnosis of Danny’s “special” abilities that momentarily soothes his parents. It’s a scene that could easily have been excised, since it’s clear the doctor is wrong, and it’s obvious that Danny’s abilities are beyond rational explanation. The value of keeping it, though, is that it more firmly roots the proceedings in the actual world. Eventually, King cuts loose and unleashes all manner of insanity. Some of it, frankly, is a bit goofy. However, all the work he has done setting up his endgame paid off. I believed so much that I didn't bat an eye once the hotel came – for lack of a better phrase – to life.

The Shining is a slow simmering tale that eventually explodes in the unrestrained violence and gore that has made King wealthy beyond imagining. (Of course, compared to some of his other titles, The Shining is practically subtle). The ending is something that is foreshadowed early on; unlike the producers of Friends, I will not spoil it for those who’ve managed to avoid learning it. I’m not sure I’m a huge fan of how King concludes things, but I liked the lead-up so much that I can let that pass. I appreciated the slow turning of the screws, the gradual accretion of detail, the building of tension before it all boils over.

I suppose a brief mention of Kubrick’s famous movie version is in order. I’ve heard that King hated it, and I can totally see why. Jack Nicholson plays Jack Torrance as already half-crazy by the time the title card is shown. It’s hard to take his portrayal seriously when his eyes are screaming I’m a psycho! from the very first scene. The film version of Jack Torrance is an exercise in Jack Nicholson seeing if he can out-Jack Nicholson himself. (He does). I like Kubrick’s The Shining, for its formal brilliance if nothing more. The novel, as is often the case, is far superior.

The book version of Jack Torrance is far different from his cinematic shadow. He begins as a deeply flawed man with an ugly past, a serious addiction, and a nasty streak a mile wide. But he is also a man who loves – or believes he loves – his wife and child. You see flashes of a good man, a man you don’t want to see destroyed. The erosion of Jack’s mind and soul is The Shining’s narrative backbone. King paints an indelible portrait. Jack chewing Excedrin after Excedrin. Jack wiping his lips till they bleed. Jack trying to distract himself from the thought of a drink. Jack trying to reconcile the man he wanted to be with the man he has demonstrated to the world. This is a fully realized and unforgettable character. It’s an accomplishment, and a testament to King’s skill. A skill, perhaps, that is sometimes overlooked.

I am slowly making my way through Stephen King’s extensive canon. So far, my favorite has been Pet Sematary, where King uses a ghoulish conceit (an Indian burial ground that can bring the dead back to life) to explore a very real human concern (loss and grief). He touched such powerful chords with that book that I hesitate to ever open it again. It’s becoming very clear to me that King is a genius. An artist of the first order. Not just a top-notch storyteller. Not just a guy with an incredible imagination. But a bona fide literary master. He writes things that you read and don’t forget, ever.

A lot of wacky and macabre things happen at the Overlook during the course of The Shining. The tension, the shocks, the slow revelation of the lurking terror, are all things that will keep you turning pages with increasing rapidity. It is also the reason that The Shining (along with King’s other works) is so obviously translatable to film. But the reason this is unforgettable is the framework that King builds upon. The horror of the supernatural is not nearly so deep and so dread as that which passes between flawed human beings.
Profile Image for Mario the lone bookwolf.
805 reviews4,729 followers
January 9, 2022
When MC Johnny is in the haunted mountain hotel house, twins can raise their axes and sway to the beat of the barkeepers´ whispering background vibe

Maybe just so popular because of the movie
I´ve read a ton of Kings´ novels, some already 2 times, and must say that this is a good, but by far not one of his best works. It has some freaking labyrinth, bathroom, parenting, and insanity axe murder moments, but besides that, there is much less terror, paranormal activity, and horror than one would expect and hope for. One could call it subtle and slowly accelerating in suspense and action, but subjectively it´s just not unleashing its full potential. Its close to only focus is on going insane in an isolated place and thereby facing ones´ demons, talking with ghosts, and self-doubt. I honestly even was a bit disappointed, because I know the better, harder, and far cooler King who switches perspectives, has big picture scenes, and much more badass characters than just stumbling fathers with alcohol problems.

Many autobiographical undertones in the horror hotel
There is so much personal King in this, his fear of wasps, not liking a kid, being a writer and substance abuser, probably even some relationship problems, especially in combination with the mentioned bad parenting and being high as heck tendencies. Not sure about that, he mentioned other inspirations in interviews, prefaces, and lectures, but because of his tendency to kind of use writing as a self reflection and therapy session, one can assume that there might have been the one or other epic Tabitha vs Stephen battle or King vs his kids, especially his son, that laid the groundwork.

Psi powers penetrate mental sanity
Going insane in the membrane on a wacky holiday trip has never been so much fun, especially because the issues and frustrations of the main protagonist are the foundation for escalation towards total bonkers status. A stable, happy person might have found a better way to deal with career and relationship problems, but that would have been a pretty boring attempt and not half as cool as good old letting the anger out before it hurts the hater, instead leaving everyone else as a victim or dead. That´s much better for the salvation of the ones that also caused the whole mess.

Alternative family therapy, anger management, bonding, and teambuilding methods
No matter what the friendlier, calmer approaches might tell, some in you face methods of innovative, new therapeutic schools recommend just unleashing ones´ anger, maybe accompanied by visualizing ones´ demons until they manifest as if they are real and give more, even greater tips and tricks to handle the situation.

How much could be real?
With all that quantum, parallel universe, time travel, extra dimension stuff, one really doesn´t know what will come out in centuries or millennia when 4567 scientists will use their instruments to find correlations between physics, death, haunted place, and possibly even souls, demons, and damned sex succubi. Maybe we just haven´t figured out how to construct the right equipment to see that we are surrounded by myriads of emanating reminiscences of billions of years of evolution and trillions of immortal, multi dimensional consciences that are created with each physical body.

Tropes show how literature is conceptualized and created and which mixture of elements makes works and genres unique
https://tvtropes.org/pmwiki/pmwiki.ph...
Profile Image for Henry Avila.
493 reviews3,275 followers
March 22, 2020
This is basically just another haunted house story...but my, such a great one, Stephen King brings all his considerable talents into view. Though his tendency to overwrite shows too, a little editing would have made it even better by cutting out superfluous pages, nothing wrong in being succinct . If you like ghouls, strange apparitions , an atmosphere thick with foreboding this ride will satisfy, not to mention the continuous party in the Colorado Lounge, where drinks are on the house, with Lloyd the perpetually agreeable gentleman presiding ...
A vague bartender who knows how to mix them, wild, crazy , raucous "people" inside, and noisy scenes happening frequently, sounds like fun...Now to begin, John "Jack" Torrance has a little drinking problem, a falling down drunk, to be honest, it wouldn't matter much to anyone, except he is married with a lovely wife Wendy and a good son Danny age five, he the kid, sees things though...which becomes a problem later on. The parents are in their late twenties, Jack has recently lost his job teaching at a prep school , an English instructor in New England, very appropriate. What is not, beating up a spoiled rich student damaging his old car, Jack has a bad temper obviously , and gives no mercy. Let go by the school he desperately needs another job quickly, this is where the ancient Overlook Hotel, in the high Rocky Mountains of Colorado, over 10,000 feet in elevation, becomes important. Jack's best friend Albert Shockley a wealthy man, obtains him the caretaker position there in the winter, he is part owner and fellow lush. A new start for the aspiring writer; five months in isolation with only his rattled family , the roads become impassable because of heavy snows, often blizzards strike the area, Mr. Torrance has the time now to finish his play, that will solve all the difficulties. Nevertheless the Overlook has other ideas not so nice, room 217 for instance, nor is it the only one , the sinister hotel elevator disturbs the occupants, a free spirit , which makes a quite chilling situation there. The three humans in the creepy building, months alone, can cause some to become unbalanced, even maniacal, as the temperature drops and the snowflakes fall, tense Wendy feels uneasy... Terrific novel and the little child, Daniel (Danny) his invisible, unearthly friend, the aloof Tony , dominates the preceding, they are rather a peculiar pair... good or bad is the question, the answer... read the book. However in reality and shall I write these words...the fiendish Overlook Hotel is the star.
Profile Image for Matthew.
1,221 reviews9,491 followers
March 4, 2019
Another Stephen King re-read complete!

I have had this book marked at 4 stars since I added it a few years ago. It has probably been 20 years since I last read the book and, in that time, I have watched the Kubrick movie a few times. Honestly, I am not a huge fan of the Kubrick movie (and I hear King wasn’t either). I think my thoughts on the movie combined with being a couple of decades removed from reading it skewed my rating a bit low.

This time, though, with the refresher – 5 stars all the way!

Definitely classic King, and maybe one of the most perfect monster/ghost stories ever written. One very important thing I think that people forget (including me) is

I listened to the book this time and the audio narration was great. I was enthralled the entire time and the narrator did a great job raising the stakes as the story progressed. If you are also considering a re-read, the audiobook is a great option.

If you are a King fan and haven’t read this, you should!

If you are looking for a place to start King, this is not a bad choice. It is a little more psychologically complex that a couple of the other titles I recommend as King starting points (The Dead Zone and Pet Sematary), but definitely would give anyone a good feel for King.

While there are some elements in the book similar to the movie, forget everything you have seen and the impressions Kubrick has given you and try the book. I think you will find it to be a vastly improved experience. Also, I hear the more recent mini-series is much more true to the book – I hope to hunt that one down, soon!
Profile Image for Elyse Walters.
4,010 reviews11.3k followers
February 24, 2018
Ok, Mr. Jack Torrence,.....
..... The man who was going to live by his wits....be a best selling author, acclaimed playwright and winner of the New York critics award, man of letters, winner of the Pulitzer Prize,
.....you killed my appetite
..... I’ll never be able to look at a Triscuit cracker again without thinking of “The Shining”, .... let alone eat one.
You, Sir, took the joy out of crunching those little squares.
Haha!
Great characters- storytelling- thriller by a master. Yep... I can see why readers get hooked on King.

Huge thanks to Zoey!!!!!! I’m so glad I read this!!! An adrenaline rush!!!!!
Off for a long Sat. morning hike - starting in 31 degrees. Geee... this is California!
Profile Image for Rebecca.
315 reviews369 followers
October 28, 2022
+ “You shine on, boy. Harder than anyone I ever met in my life. And I’m sixty years old this January.” “Huh?” “You got a knack,” Hallorann said, turning to him. “Me, I’ve always called it shining. That’s what my grandmother called it, too. She had it. We used to sit in the kitchen when I was a boy no older than you and have long talks without even openin our mouths.” +

The Shining is a story about the Torrance family. Jack, his wife Wendy and their five year old son, Danny. Jack is hired as the caretaker at the remote Overlook Hotel for the winter season. He is informed by the hotel manager that the previous caretaker, Delbert Grady, killed his entire family inside the hotel. Specifically, that Grady “murdered his two little girls with a hatchet, his wife with a shotgun, and then committed suicide.” As Jack later learns, the Overlook has a long and terrible history. Over the years, it has housed illicit affairs, horrible murders, and mob style executions.

Nonetheless, Jack is determined to be the caretaker. In the past, Jack, an aspiring writer and former school teacher has struggled with alcohol and anger issues. Once, he accidentally broke his son’s arm while trying to discipline him. More recently, Jack assaulted a student when he caught him letting the air out of his tires. The incident cost Jack his teaching job and almost his marriage.

Jack, now a recovering alcoholic and working on a play, hopes that the seclusion of the Overlook will help him finish the play and reconnect with his wife and son.

But the Overlook Hotel has other ideas. The longer the Torrance family stays, the more haunting and powerful it becomes…..

So, obviously this is Stephen King at his very best. Every chapter leaves you wanting more, and every sentence in this book is outstanding. Brilliantly written horror that is both magical and terrifying with fully developed characters that are equal parts innocent, vulnerable and pure evil!

The Overlook hotel, is a living nightmare, its bricks and mortar soaked through with past horrors. The creepy hedge animals, the old fashioned fire extinguisher: a coiled snake ready to strike, the sounds of a party echoing through the empty rooms and halls, the boiler, unstable and dangerous. The imagery playing through my mind was magnificent!

The Shining is an absolute masterpiece. A must read classic.

Highly recommend 🙌🏻
Profile Image for Ginger.
838 reviews436 followers
November 10, 2017
All the stars!
Loved, loved this book!



I'm not sure what to say in this review that hasn't been said by others. I was blown away by how great this book was. It was so much better then the movie!

The slow progression of insanity with Jack Torrance was one of the best things about this book. I loved the overall menacing presence of The Overlook. I loved how the hotel becomes more violent and threatening to Danny and his family the longer they stay there. It was so gripping and overwhelming as the story unfolded. You just couldn't quit reading!
I enjoyed Danny's struggle as a kid with understanding his 'gifts' and how to use them in a positive way.

Danny, don't you dare go into room 217!


This whole book was just awesome! This review doesn't give this book justice for how great it is. I recommend this book to Stephen King fans and horror lovers.

One of the best books out there! GO READ IT!
Profile Image for Fabian.
973 reviews1,909 followers
October 31, 2019
His best book is 'The Green Mile,' but since it doesn't quite fall under the Horror category, it is either 'Shining' or 'Carrie' which take top prize.

There is not one single detriment to this well-known tale of the disintegration of the American family within the realm of the undead. King here is as he has never been since: metaphoric and concise. He usually adds fact upon useless fact that converts a 400 page work into something more gargantuan, and, therefore, less enthralling.

King is not a fan of the Kubrick film, and it is easy to see why. His story is about the build up of tension, the "shining' a catalyst that promotes a bridge between the haunts & the humans. The boiler burns, blows everything up just as Jack Torrence forgets his humanity & becomes an ego/id complex. His selfishness & his alcoholism (a hereditary illness... another theme about family "curses," and weak threads) leads to savagery. The ghosts are the manifestations of a child's bruised home-life and the suffocation and claustrophobia have more to do with that tragic past than the hotel's eerie interior.

I place this masterpiece next to 'The Exorcist', a tale that is more than just a simple tale of demonic possession. To say the 'The Shining' is just a ghost story is something Kubrick ran with... completely ignoring the pathos of a family eating away at itself. The Torrences suffer because they had been broken prior to the stay at the Overlook... it seems that for this one all the stars aligned and all the ingredients for one of the most amazing horror stories of all time mixed exquisitely. This one is the one that made King king.
Profile Image for Nilufer Ozmekik.
2,513 reviews51.2k followers
February 7, 2022
Thank you the King of author who has written something so memorable that I cannot help myself to reread and see his extraordinary creative mind who finds millions of ways to scare me sh*tless!

Redrum
Fire extinguishers
Roque Mallet
Mind freaking maze
All work no play makes Jake dull boy!
Creepy Grady twins
Tricycle
Scary woman in bath
Room 237
Japanese lantern
Here comes Johnny ( okay this part belongs to the movie to tribute Johnny Carson)

Jack Torrance is totally satan, Overlook Hotel is last gate to the hell and little Danny speaks with the angels by communicating them using his finger ( that might be most biblical approach to the book but it makes more sense than conspiracy theories I’ve written)

Overall: I think the authors has brilliant minds shine like brightest stars in the sky! Mr. King already earned to have his own planet!

instagram
facebook
twitter
Profile Image for Kemper.
1,390 reviews7,257 followers
July 30, 2015
Even though the film version of this one from Stanley Kubrick is generally considered a horror classic, Stephen King has never been shy about making his dislike of it known. He hates it so much that he was heavily involved in making a more faithful adaptation of it as TV mini-series in 1997. (This inferior version invited comparisons of Stephen Weber from Wings to one of Jack Nicholson’s most iconic performances. So that worked well….)

Considering Uncle Stevie’s longstanding grudge about it, I was more than a little shocked when he recently made a public plea for fans of Under the Dome to accept the changes that the new TV show was making. I can’t quite wrap my head around why a genius director creating something new and brilliant based on his story is bad, but anything that a fairly shitty TV show does with the source material is A-OK with King?

Whatever….

On to the book. As most everyone knows, this is about a family spending the winter in a haunted hotel in the Rocky Mountains called the Overlook. Jack Torrance was a teacher and promising writer, but his alcoholism and short temper wrecked his career and very nearly ended his marriage. Jack has been sober over a year, and he and Wendy have started down the path of reconciliation. However, she can never entirely forgive him for breaking the arm of their son Danny in an incident that was equal parts rage and accident. Five year old Danny has psychic mojo that includes reading thoughts and precognition courtesy of visions shown to him by his imaginary friend, Tony.

Nearly broke, Jack takes on the job of being the winter caretaker for the Overlook. This means that the family will spend months alone in the hotel once the snow flies, and the last caretaker went axe-happy and killed his family. Unfortunately, the Overlook is like an emotional sponge that has soaked in every ugly act that ever took place within its rooms, and the presence of a high-powered psychic like Danny kicks the place into overdrive. As Jack is being driven into madness, Wendy and Danny become increasingly terrified of what he might do.

I once read something in which King talked about denial of his own substance abuse problems in which he noted that he somehow wrote The Shining without ever once realizing he was describing his own alcoholism. That element of the Jack Torrence character is what makes this one of his better books. The idea of being trapped in a hotel with a bunch of ghosts is scary in a horror story kind of way. The idea of being trapped in a hotel with an ill-tempered drunk with a history of violence as he is cracking up is downright terrifying.

Adding even more weight to that idea is that Jack Torrance isn’t a monster. He’s a troubled man who does love his wife and son, and he’s self-aware enough to realize that he’s on the brink. He’ll either turn his life around and earn his wife’s trust back, or he’ll give in to his own worst impulses. This would be hard enough under any circumstances, but under the influence of the evil spirits of the Overlook, Jack becomes a tragedy.

Another element jumped out at me while re-reading this time. King talked in his non-fiction Danse Macabre (Which I remember as being entertaining, but probably very dated by now. I would be very interested if Uncle Stevie wanted to take another look at what’s become of the horror genre since he wrote that one.) about the economic factor of The Amityville Horror and how a part of why the movie worked was that the family was essentially trapped by their finances.

He uses that idea to good effect here. Most people would run screaming from the Overloook in less than a week, but we’re frequently reminded that the Torrance family was swirling the drain financially. If the perception is that Jack botched this job, his last chance to get back to a more stable lifestyle is probably shot and that goes a long way towards allowing him to convince himself and Wendy that they’re overreacting to the weird occurrences during the early stages, and by the time they’ve become snowed in, the Overlook has its hooks deep into Jack.

It’s those more mundane things like a family struggling with money and that an evil entity turns one of them against the others by playing on his inherent weaknesses that make this one of my favorite King novels.
Profile Image for Justin.
291 reviews2,396 followers
October 30, 2021

Update 10/30/21:
Wow… I’ve read this book four times now?!
I don’t know what I wrote before, but it’s still a four-star read for me. It was interesting reading it in this weird post-Covidish time since it is heavy on themes of isolation and being quarantined off from the rest of the world. Happy Halloween everyone. Time to go take my medicine.
———————-

Update 8/28/18:
I completely agree with everything I said two years ago. Third time reading this one, and I think I enjoyed it the most this time around. Now it’s time to watch the movie and read Doctor Sleep. Kicking off a couple months of reading scary, autumny, Halloweeny books.

———————-

Old school Stephen King, man. That's where it's at. This is a high point in the King canon for me. In Salem's Lot before this, he developed fascinating characters inhabited a beautifully described small town. He took his time slowly unraveling the story, taking pages and pages to build the setting and deepen our relationship with the large cast of characters. In The Shining, there are basically three characters outside of a small cast of supporting actors. The setting is really just a giant old hotel in a snowy Colorado town. But SK takes even more pages, sometimes entire blasted chapters to develop his characters and set his scenes.

Like I said before, it's a slow burn, man.

The fact that King takes his time building the horror makes the scary scenes that much scarier. It's not a horror novel full of jump scares and monsters. It's effective by drawing us deep into the minds of the characters, overhearing their innermost thoughts, and freaking out right along with them. The scenes there for horror effect and the iconic stuff from the movie aren't even all that necessary. There is so much else going on in the isolation, addition, desperation, schizophrenia of it all that plays so much harder on your emotions than what's hiding behind a hotel room door.

It's long winded at times, sure, but it's mostly necessary. We get to know the Torrence family better than we wish we ever did by the end of this thing. From the awkwardness of the initial conversation with Jack and Ullman to the wild and crazy climax, the pages keep turning and your heart keeps pounding faster. King takes you on a long roller coaster ride that moves slowly up the long, high incline before bringing us crashing down screaming our faces off at the end. And then we grab another King book and hope the ride is just as thrilling as the one before.

I'm looking at you, Doctor Sleep.
Profile Image for Nataliya.
843 reviews14.1k followers
November 18, 2023
It’s interesting how at different times in life very different things stand out about this story. What’s scary changes with time, I suppose.
+ “This inhuman place makes human monsters.” +

When I was a kid way too young for reading King, the hotel was the scariest thing ever. On later rereads I was feeling the pain of Jack’s struggle with addiction, trying to overcome it but instead spiraling towards destruction and the relentless hounding of the Overlook. And now it’s Jack himself who freaks the living hell out of me — his anger and victim mentality, endless resentment and built-in drive to violence that uses addiction as a springboard. The hotel and its ghosts did not have to work too hard to reduce Jack to his entitled base impulses, did they?
+

“His temper was like a vicious animal on a frayed leash. ”

“How else could you explain the things that had happened to him? For he still felt that the whole range of unhappy Stovington experiences had to be looked at with Jack Torrance in the passive mode. He had not done things; things had been done to him.”
+

Jack Torrance goes through life angrily counting the wrongs done to him, minimizing - willingly or subconsciously - his own contribution to his misery, with Overlook just adding to the blind rage that eventually takes him over, a logical conclusion to that hair-trigger temper and abusive tendencies of his.
+ “And yet, through it all, he hadn’t felt like a son of a bitch. He hadn’t felt mean. He had always regarded himself as Jack Torrance, a really nice guy who was just going to have to learn how to cope with his temper someday before it got him in trouble. The same way he was going to have to learn how to cope with his drinking. But he had been an emotional alcoholic just as surely as he had been a physical one.” +

It’s a story of disintegration - of a person and a family under the pressure of anger and violence and excuses. And yet, even with me terrified of Jack ever since the first few pages of that simmering and initally pretty hidden rage I still cannot help but feel for him, for his doomed efforts to be better, for his love of his son, for his absolutely shitty luck of ending up in the worst place possible for him. King’s Jack Torrance is a wonderfully complex guy, far from the immediate crazy-eyed-insane of Jack Nicholson in Kubrick’s adaptation (and sadly, the image of Jack that most people have).
+ “This inhuman place makes human monsters.” +
+
+ +

—————
This book was when I first realized back at twelve with a few King books under my belt already that Uncle Stevie is way more disturbing when he hints at things rather than being overtly graphic. He’s the master of having you feel deeper and deeper unease at things just barely seen at the periphery of your vision, when his characters are not yet sure of what’s what but instead feel that pervasive unrelenting sense of utter wrongness. Jack’s rocque mallet is almost a relief after that chapter where he’s almost unsure whether the topiary is moving, and Danny finding out what’s in room 217 is less scary than that sense outside of the room that the fire hydrant hose is about to grab him. It’s the slow dreadful anticipation rather than jump scares that always did it for me.
+ “Dear God, do old scars ever stop hurting?” +

And this book yet again proves to me that even reread with older eyes its one more stone in King’s pedestal among great modern writers. Seriously, chuck some Hemingway out of literature courses and add The Shining instead, dear professors.

5 stars, always.

——————

Also posted on my blog.
Profile Image for Baba.
3,742 reviews1,141 followers
July 21, 2021
Constant Readers may well be surprised, but even after a second reading, this remains one of my least liked early Stephen King reads! This perception is also probably influenced by the far better and classic Stanley Kubrick/Jack Nicholson movie, which I feel is more grounded and a lot less supernatural based than the book. A personal admission I should add for context, is that I find most ghost stories unfathomable because of their reality 'rules' often being bent ad-hoc to meet the needs of the story being told... just like in this book. 5.5 out of 12!
Displaying 1 - 30 of 38,814 reviews

Can't find what you're looking for?

Get help and learn more about the design.
\ No newline at end of file diff --git a/test/ambry_scraping/goodreads/mocks/editions_the_shining.html b/test/ambry_scraping/goodreads/mocks/editions_the_shining.html new file mode 100644 index 00000000..2178b290 --- /dev/null +++ b/test/ambry_scraping/goodreads/mocks/editions_the_shining.html @@ -0,0 +1,12366 @@ + + Editions of The Shining by Stephen King + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ + + +
+ + + + +
+ +
+ +
+ + + + +
+ + + + + +

+ The Shining + > Editions +

+ +
+ + +

+ by Stephen King + + First published January 28th 1977 + +

+ + +
+
+ The Shining (The Shining, #1) +
+
+ +
+ Published July 1st 1980 + by New English Library (Hodder & Stoughton) +
+
+ 1st Paperback edition, Paperback, 497 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780450040184 + + (ISBN10: 0450040186) + +
+
+
+
+ ASIN: +
+
+ 0450040186 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.27 + + (1,367,192 ratings) + +
+
+
+ +
+
+ + + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining (The Shining, #1) +
+
+ +
+ Published June 24th 2008 + by Anchor +
+
+ Kindle Edition, 674 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ASIN: +
+
+ B001BANK32 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.46 + + (30,924 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor +
+
+ +
+ Published October 3rd 2001 + by Random House Mondadori +
+
+ 001, Paperback, 656 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788497593809 + + (ISBN10: 8497593804) + +
+
+
+
+ ASIN: +
+
+ 8497593804 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.27 + + (10,807 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining (The Shining, #1) +
+
+ +
+ Published June 26th 2012 + by Anchor +
+
+ Mass Market Paperback, 659 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.28 + + (8,782 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published August 2013 + by Anchor Books +
+
+ 1st Anchor Books trade paperback edition (US/CAN), Paperback, 688 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780345806789 + + (ISBN10: 0345806786) + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.32 + + (5,629 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published November 1st 2011 + by Hodder & Stoughton +
+
+ Paperback, 497 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.24 + + (4,927 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published September 2001 + by Pocket Books +
+
+ US / CAN Edition, Mass Market Paperback, 683 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780743424424 + + (ISBN10: 0743424425) + +
+
+
+
+ ASIN: +
+
+ 0743424425 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.18 + + (4,677 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published May 31st 2007 + by Hodder +
+
+ 01, Kindle Edition, 674 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.40 + + (3,989 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining (The Shining, #1) +
+
+ +
+ Published January 28th 1977 + by Doubleday & Company, Inc. +
+
+ First Edition, Hardcover, 447 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780385121675 + + (ISBN10: 0385121679) + +
+
+
+
+ ASIN: +
+
+ 0385121679 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.31 + + (3,360 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published June 26th 2012 + by Anchor +
+
+ Reissue, Mass Market Paperback, 659 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780307743657 + + (ISBN10: 0307743659) + +
+
+
+
+ ASIN: +
+
+ 0307743659 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.37 + + (2,800 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ O Iluminado (O Iluminado, #1) +
+
+ +
+ Published November 19th 2012 + by Suma de Letras +
+
+ ebook, 464 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788581051017 +
+
+
+
+ Edition language: +
+
+ Portuguese +
+
+
+
+ Average rating: +
+
+ 4.37 + + (2,478 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Lśnienie (Lśnienie, #1) +
+
+ +
+ Published January 2009 + by Prószyński i S-ka +
+
+ Paperback, 516 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788374696005 +
+
+
+
+ ASIN: +
+
+ 8374696001 +
+
+
+
+ Edition language: +
+
+ Polish +
+
+
+
+ Average rating: +
+
+ 4.01 + + (2,266 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published January 1978 + by Signet +
+
+ 68th Impression, Mass Market Paperback, 464 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780451160911 + + (ISBN10: 0451160916) + +
+
+
+
+ ASIN: +
+
+ 0451160916 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.17 + + (1,501 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published May 11th 2021 + by Hodder & Stoughton +
+
+ Paperback, 497 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9781444720723 + + (ISBN10: 1444720724) + +
+
+
+
+ ASIN: +
+
+ 1444720724 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.28 + + (1,468 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published 1978 + by Signet +
+
+ Paperback, 464 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780045113965 + + (ISBN10: 0045113963) + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.23 + + (1,946 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published June 2007 + by Hodder +
+
+ Mass Market Paperback, 497 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780340951392 + + (ISBN10: 0340951397) + +
+
+
+
+ ASIN: +
+
+ 0340951397 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.20 + + (1,630 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published October 1st 2002 + by Gallery Books +
+
+ Reprint, Paperback, 528 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780743437493 + + (ISBN10: 0743437497) + +
+
+
+
+ ASIN: +
+
+ 0743437497 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.12 + + (1,444 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor (El resplandor, #1) +
+
+ +
+ Published October 2013 + by Debolsillo +
+
+ Paperback, 682 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9786073118392 + + (ISBN10: 6073118392) + +
+
+
+
+ ASIN: +
+
+ 6073118392 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.35 + + (1,353 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining (The Shining, #1) +
+
+ +
+ Published April 28th 1985 + by Bastei Lübbe +
+
+ Paperback, 624 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9783404130085 + + (ISBN10: 3404130081) + +
+
+
+
+ ASIN: +
+
+ 3404130081 +
+
+
+
+ Edition language: +
+
+ German +
+
+
+
+ Average rating: +
+
+ 4.16 + + (1,098 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ البريق +
+
+ +
+ Published August 1st 2019 + by مركز المحروسة للنشر والخدمات الصحفية والمعلومات +
+
+ الطبعة الأولى, Paperback, 670 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789773137694 +
+
+
+
+ Edition language: +
+
+ Arabic +
+
+
+
+ Average rating: +
+
+ 4.03 + + (344 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published September 20th 2018 + by The Folio Society +
+
+ Halloween Edition, Paperback, 497 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9781473695498 + + (ISBN10: 147369549X) + +
+
+
+
+ ASIN: +
+
+ 147369549X +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.30 + + (1,196 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Medyum +
+
+ +
+ Published April 2017 + by Altın Kitaplar +
+
+ 10th, Paperback, 397 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789754055856 + + (ISBN10: 9754055858) + +
+
+
+
+ ASIN: +
+
+ 9754055858 +
+
+
+
+ Edition language: +
+
+ Turkish +
+
+
+
+ Average rating: +
+
+ 4.27 + + (946 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Сияние (The Shining, #1) +
+
+ +
+ Published April 2010 + by Плеяда +
+
+ Paperback, 472 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789544093013 +
+
+
+
+ Edition language: +
+
+ Bulgarian +
+
+
+
+ Average rating: +
+
+ 4.34 + + (1,029 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published 1980 + by Signet +
+
+ 1980 Movie Tie-In cover, Mass Market Paperback, 447 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780451092168 + + (ISBN10: 0451092163) + +
+
+
+
+ ASIN: +
+
+ 0451092163 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.26 + + (885 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Сяйво (The Shining, #1) +
+
+ +
+ Published January 2014 + by Книжковий Клуб «Клуб Сімейного Дозвілля» +
+
+ Hardcover, 640 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789661462792 + + (ISBN10: 9661462798) + +
+
+
+
+ Edition language: +
+
+ Ukrainian +
+
+
+
+ Average rating: +
+
+ 4.42 + + (916 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining +
+
+ +
+ Published January 1st 2001 + by Bompiani +
+
+ Tascabili bestseller, Paperback, 429 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788845246555 + + (ISBN10: 8845246558) + +
+
+
+
+ ASIN: +
+
+ 8845246558 +
+
+
+
+ Edition language: +
+
+ Italian +
+
+
+
+ Average rating: +
+
+ 4.17 + + (768 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ O Iluminado (O Iluminado, #1) +
+
+ +
+ Published August 22nd 2017 + by Suma de Letras +
+
+ Biblioteca Stephen King, Hardcover, 520 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788556510464 + + (ISBN10: 8556510469) + +
+
+
+
+ ASIN: +
+
+ 8556510469 +
+
+
+
+ Edition language: +
+
+ Portuguese +
+
+
+
+ Average rating: +
+
+ 4.31 + + (576 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor (El resplandor, #1) +
+
+ +
+ Published November 7th 2013 + by Debolsillo +
+
+ 005, Paperback, 682 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788490328729 + + (ISBN10: 8490328722) + +
+
+
+
+ ASIN: +
+
+ 8490328722 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.35 + + (750 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining +
+
+ +
+ Published September 2017 + by Bompiani +
+
+ Tascabili narrativa, Paperback, 592 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788845295300 + + (ISBN10: 8845295303) + +
+
+
+
+ ASIN: +
+
+ 8845295303 +
+
+
+
+ Edition language: +
+
+ Italian +
+
+
+
+ Average rating: +
+
+ 4.22 + + (682 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ O Iluminado +
+
+ +
+ Published 1999 + by Objetiva +
+
+ Paperback, 316 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788573022032 + + (ISBN10: 8573022035) + +
+
+
+
+ ASIN: +
+
+ 8573022035 +
+
+
+
+ Edition language: +
+
+ Portuguese +
+
+
+
+ Average rating: +
+
+ 4.34 + + (573 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ O Iluminado (O Iluminado, #1) +
+
+ +
+ Published November 19th 2012 + by Suma de Letras +
+
+ Paperback, 463 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ Portuguese +
+
+
+
+ Average rating: +
+
+ 4.37 + + (609 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shinning +
+
+ +
+ Published January 1st 1977 + by Signet +
+
+ Mass Market Paperback, 0 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ASIN: +
+
+ B0012270US +
+
+
+
+ Average rating: +
+
+ 4.34 + + (394 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published August 7th 2012 + by Books on Tape +
+
+ Audiobook, 16 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780385360135 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.17 + + (781 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published 1997 + by Signet +
+
+ 1997 Television Mini-series Tie-In cover, Paperback, 464 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780451193889 + + (ISBN10: 0451193881) + +
+
+
+
+ ASIN: +
+
+ 0451193881 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.16 + + (474 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Η λάμψη (Η λάμψη, #1) +
+
+ +
+ Published December 1992 + by Λιβάνης-Το κλειδί +
+
+ Paperback, 538 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789602370445 + + (ISBN10: 9602370440) + +
+
+
+
+ ASIN: +
+
+ 9602370440 +
+
+
+
+ Edition language: +
+
+ Greek, Modern (1453-) +
+
+
+
+ Average rating: +
+
+ 4.30 + + (565 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining +
+
+ +
+ Published January 1st 2014 + by Bompiani +
+
+ Classici contemporanei, Paperback, 588 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788845275746 + + (ISBN10: 8845275744) + +
+
+
+
+ ASIN: +
+
+ 8845275744 +
+
+
+
+ Edition language: +
+
+ Italian +
+
+
+
+ Average rating: +
+
+ 4.13 + + (459 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Hohto +
+
+ +
+ Published 1993 + by WSOY +
+
+ Hardcover, 513 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789510129043 + + (ISBN10: 9510129046) + +
+
+
+
+ Edition language: +
+
+ Finnish +
+
+
+
+ Average rating: +
+
+ 4.03 + + (443 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published June 24th 2008 + by Anchor Books / Doubleday +
+
+ ebook, 450 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.19 + + (524 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor (El resplandor, #1) +
+
+ +
+ Published February 2019 + by DeBolsillo +
+
+ BestSeller, Paperback, 656 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9786073176590 + + (ISBN10: 6073176597) + +
+
+
+
+ ASIN: +
+
+ 6073176597 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.37 + + (396 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining (The Shining, #1) +
+
+ +
+ Published November 1st 2019 + by Lübbe +
+
+ Paperback, 624 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9783404130894 + + (ISBN10: 3404130898) + +
+
+
+
+ ASIN: +
+
+ 3404130898 +
+
+
+
+ Edition language: +
+
+ German +
+
+
+
+ Average rating: +
+
+ 4.11 + + (401 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining (The Shining, #1) +
+
+ +
+ Published August 15th 2013 + by Hodder +
+
+ Paperback, 513 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9781444781359 + + (ISBN10: 1444781359) + +
+
+
+
+ ASIN: +
+
+ 1444781359 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.16 + + (378 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining (The Shining #1) +
+
+ +
+ Published 1978 + by Signet +
+
+ 1st U.S. Paperback Edition, Mass Market Paperback, 447 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780451078728 + + (ISBN10: 0451078721) + +
+
+
+
+ ASIN: +
+
+ 0451078721 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.15 + + (370 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ De Shining +
+
+ +
+ Published December 2012 + by Luitingh-Sijthoff +
+
+ 17th print, Paperback, 480 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789024559435 + + (ISBN10: 902455943X) + +
+
+
+
+ ASIN: +
+
+ 902455943X +
+
+
+
+ Edition language: +
+
+ Dutch +
+
+
+
+ Average rating: +
+
+ 4.07 + + (315 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining (The Shining, #1) +
+
+ +
+ Published May 1st 1990 + by Doubleday +
+
+ Alternate cover ed. for ISBN 1880418592, Hardcover, 447 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.27 + + (430 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining +
+
+ +
+ Published October 31st 2007 + by Le Livre de Poche +
+
+ Mass Market Paperback, 574 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ French +
+
+
+
+ Average rating: +
+
+ 4.14 + + (381 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Isijavanje +
+
+ +
+ Published October 27th 2011 + by Vulkan izdavaštvo +
+
+ Paperback, 390 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788677106669 + + (ISBN10: 8677106669) + +
+
+
+
+ Edition language: +
+
+ Serbian +
+
+
+
+ Average rating: +
+
+ 4.23 + + (349 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Osvícení +
+
+ +
+ Published 1993 + by Laser +
+
+ Hardcover, 404 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788085601589 + + (ISBN10: 8085601583) + +
+
+
+
+ Edition language: +
+
+ Czech +
+
+
+
+ Average rating: +
+
+ 4.29 + + (361 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Švytėjimas +
+
+ +
+ Published 1993 + by Žaltvykslė +
+
+ Paperback, 512 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ + (ISBN10: 9986060001) + +
+
+
+
+ Edition language: +
+
+ Lithuanian +
+
+
+
+ Average rating: +
+
+ 4.38 + + (265 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor (El resplandor, #1) +
+
+ +
+ Published May 10th 2012 + by DEBOLS!LLO +
+
+ Kindle Edition, 585 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ASIN: +
+
+ B007TID0R6 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.51 + + (295 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Сияние +
+
+ +
+ Published 2008 + by АСТ +
+
+ АСТ, Hardcover, 412 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ + (ISBN10: 9785170450) + +
+
+
+
+ Edition language: +
+
+ Russian +
+
+
+
+ Average rating: +
+
+ 4.39 + + (278 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published August 2nd 2005 + by Simon & Schuster Audio +
+
+ Unabridged, Audio CD, 16 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780743537001 + + (ISBN10: 0743537009) + +
+
+
+
+ ASIN: +
+
+ 0743537009 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.12 + + (368 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining +
+
+ +
+ Published 1981 + by Bompiani +
+
+ Tascabili Bompiani #226, Paperback, 432 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788845215599 + + (ISBN10: 8845215598) + +
+
+
+
+ ASIN: +
+
+ 8845215598 +
+
+
+
+ Edition language: +
+
+ Italian +
+
+
+
+ Average rating: +
+
+ 4.17 + + (227 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining +
+
+ +
+ Published October 31st 2007 + by Livre de Poche +
+
+ 0, Paperback, 571 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9782253151623 + + (ISBN10: 2253151629) + +
+
+
+
+ ASIN: +
+
+ 2253151629 +
+
+
+
+ Edition language: +
+
+ French +
+
+
+
+ Average rating: +
+
+ 4.18 + + (224 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published January 2017 + by 11x17 +
+
+ Mass Market Paperback, 619 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789722531696 + + (ISBN10: 9722531697) + +
+
+
+
+ ASIN: +
+
+ 9722531697 +
+
+
+
+ Edition language: +
+
+ Portuguese +
+
+
+
+ Average rating: +
+
+ 4.29 + + (269 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published April 6th 2021 + by Anchor +
+
+ Reprint, Paperback, 688 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780525565321 + + (ISBN10: 0525565329) + +
+
+
+
+ ASIN: +
+
+ 0525565329 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.40 + + (195 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining (The Shining #1) +
+
+ +
+ Published August 7th 2012 + by Random House Audio +
+
+ Unabridged, Audible Audio, 16 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ASIN: +
+
+ B008U2P6HC +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.26 + + (313 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining - A Casa do Horror +
+
+ +
+ Published 1988 + by Círculo de Leitores +
+
+ Hardcover, 457 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ Portuguese +
+
+
+
+ Average rating: +
+
+ 4.23 + + (126 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ A ragyogás +
+
+ +
+ Published + by Európa Könyvkiadó +
+
+ Hardcover, 512 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 630781867 +
+
+
+
+ Edition language: +
+
+ Hungarian +
+
+
+
+ Average rating: +
+
+ 4.32 + + (209 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published September 7th 2006 + by Hodder +
+
+ New Ed, Paperback, 497 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780340920930 + + (ISBN10: 0340920939) + +
+
+
+
+ ASIN: +
+
+ 0340920939 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.25 + + (244 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published October 1st 1978 + by Signet +
+
+ Revised, Mass Market Paperback, 447 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780451134264 + + (ISBN10: 0451134265) + +
+
+
+
+ ASIN: +
+
+ 0451134265 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.23 + + (259 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ A Luz +
+
+ +
+ Published April 16th 2009 + by Biblioteca Sábado +
+
+ Paperback, 438 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788461284955 + + (ISBN10: 846128495X) + +
+
+
+
+ ASIN: +
+
+ 846128495X +
+
+
+
+ Edition language: +
+
+ Portuguese +
+
+
+
+ Average rating: +
+
+ 3.95 + + (171 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining: l'enfant lumière +
+
+ +
+ Published 1981 + by J'ai Lu +
+
+ Mass Market Paperback, 576 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9782277211976 + + (ISBN10: 2277211974) + +
+
+
+
+ ASIN: +
+
+ 2277211974 +
+
+
+
+ Edition language: +
+
+ French +
+
+
+
+ Average rating: +
+
+ 4.11 + + (179 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published October 31st 1991 + by Plume +
+
+ Collector's Edition, Paperback, 416 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780452267220 + + (ISBN10: 0452267226) + +
+
+
+
+ ASIN: +
+
+ 0452267226 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.28 + + (195 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published 1977 + by Doubleday & Company, Inc. +
+
+ Book Club Edition, Hardcover, 447 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.41 + + (246 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor (El resplandor, #1) +
+
+ +
+ Published November 2012 + by Debolsillo +
+
+ Paperback, 656 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789875668478 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.34 + + (180 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining +
+
+ +
+ Published May 27th 2019 + by Armada +
+
+ Paperback, 541 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9786064305305 + + (ISBN10: 6064305304) + +
+
+
+
+ ASIN: +
+
+ 6064305304 +
+
+
+
+ Edition language: +
+
+ Romanian +
+
+
+
+ Average rating: +
+
+ 4.31 + + (183 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published July 2023 + by Hodder & Stoughton +
+
+ Kindle Edition, 466 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ASIN: +
+
+ B0037TPMOA +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.39 + + (175 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Varsel +
+
+ +
+ Published 1980 + by Askild & Kärnekull +
+
+ Hardcover, 458 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9170088187 +
+
+
+
+ Edition language: +
+
+ Swedish +
+
+
+
+ Average rating: +
+
+ 3.96 + + (160 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published January 1986 + by New English Library +
+
+ Paperback, 416 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.14 + + (183 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published January 1st 1977 + by Doubleday +
+
+ First Edition, Hardcover, 447 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ASIN: +
+
+ 0450032205 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.31 + + (141 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining +
+
+ +
+ Published August 1st 2003 + by Lübbe +
+
+ Paperback, 624 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ German +
+
+
+
+ Average rating: +
+
+ 4.07 + + (177 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Žiarenie (The Shining, #1) +
+
+ +
+ Published May 13th 2014 + by Ikar +
+
+ Hardcover, 672 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788055138343 + + (ISBN10: 8055138346) + +
+
+
+
+ ASIN: +
+
+ 8055138346 +
+
+
+
+ Edition language: +
+
+ Slovak +
+
+
+
+ Average rating: +
+
+ 4.30 + + (179 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining ; Varsel (The Shining, #1) +
+
+ +
+ Published January 2014 + by Bonnier Pocket +
+
+ Paperback, 539 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789174293920 + + (ISBN10: 9174293923) + +
+
+
+
+ ASIN: +
+
+ 9174293923 +
+
+
+
+ Edition language: +
+
+ Swedish +
+
+
+
+ Average rating: +
+
+ 3.99 + + (162 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Ondskabens hotel +
+
+ +
+ Published 1997 + by Borgen +
+
+ Mass Market Paperback, 437 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788741888200 + + (ISBN10: 8741888200) + +
+
+
+
+ ASIN: +
+
+ 8741888200 +
+
+
+
+ Edition language: +
+
+ Danish +
+
+
+
+ Average rating: +
+
+ 4.06 + + (127 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining +
+
+ +
+ Published January 1st 2004 + by Weltbild +
+
+ Hardcover, 464 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9783898970969 + + (ISBN10: 3898970965) + +
+
+
+
+ ASIN: +
+
+ 3898970965 +
+
+
+
+ Edition language: +
+
+ German +
+
+
+
+ Average rating: +
+
+ 3.97 + + (116 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Thị Kiến +
+
+ +
+ Published June 2022 + by Nhã Nam & NXB Hội Nhà Văn +
+
+ Paperback, 592 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ Vietnamese +
+
+
+
+ Average rating: +
+
+ 4.25 + + (71 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ O Iluminado (O Iluminado, #1) +
+
+ +
+ Published August 22nd 2017 + by Suma de Letras +
+
+ Biblioteca Stephen King, Kindle Edition, 689 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ + (ISBN10: 8543810558) + +
+
+
+
+ ASIN: +
+
+ B0743MBY15 +
+
+
+
+ Edition language: +
+
+ Portuguese +
+
+
+
+ Average rating: +
+
+ 4.46 + + (132 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published 1991 + by New English Library +
+
+ 19th Impression, Paperback, 416 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Average rating: +
+
+ 4.26 + + (163 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor (El resplandor, #1) +
+
+ +
+ Published June 2012 + by DEBOLS!LLO +
+
+ Paperback, 652 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9786073110020 + + (ISBN10: 6073110022) + +
+
+
+
+ ASIN: +
+
+ 6073110022 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.37 + + (129 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Lśnienie (Lśnienie, #1) +
+
+ +
+ Published 2011 + by Prószyński i S-ka +
+
+ Paperback, 519 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788376488097 + + (ISBN10: 8376488090) + +
+
+
+
+ ASIN: +
+
+ 8376488090 +
+
+
+
+ Edition language: +
+
+ Polish +
+
+
+
+ Average rating: +
+
+ 4.09 + + (117 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published 1986 + by New American Library +
+
+ Signet US/CAN Edition, Mass Market Paperback, 447 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780451150325 + + (ISBN10: 0451150325) + +
+
+
+
+ ASIN: +
+
+ 0451150325 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.20 + + (116 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ ნათება (The Shining, #1) +
+
+ +
+ Published 2015 + by პალიტრა L +
+
+ Paperback, 591 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789941240904 +
+
+
+
+ Edition language: +
+
+ Georgian +
+
+
+
+ Average rating: +
+
+ 4.22 + + (87 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ দ্য শাইনিং +
+
+ +
+ Published February 2011 + by বাতিঘর প্রকাশনী +
+
+ 1st, Hardcover, 288 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ Bengali +
+
+
+
+ Average rating: +
+
+ 4.06 + + (93 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor (El resplandor, #1) +
+
+ +
+ Published September 2018 + by Debolsillo +
+
+ Bestseller, Paperback, 656 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788466345675 + + (ISBN10: 8466345671) + +
+
+
+
+ ASIN: +
+
+ 8466345671 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.33 + + (104 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published 1992 + by Signet +
+
+ Mass Market Paperback, 447 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.19 + + (130 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor +
+
+ +
+ Published January 1st 1982 + by Plaza & Janes Editores +
+
+ Paperback, 504 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788401498824 + + (ISBN10: 8401498821) + +
+
+
+
+ ASIN: +
+
+ 8401498821 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.28 + + (107 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor +
+
+ +
+ Published October 7th 2021 + by DEBOLSILLO +
+
+ 001, Mass Market Paperback, 656 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788466357319 + + (ISBN10: 8466357319) + +
+
+
+
+ ASIN: +
+
+ 8466357319 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.28 + + (86 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published August 27th 2013 + by Knopf Doubleday Publishing Group +
+
+ Paperback, 688 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.46 + + (59 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published September 2018 + by Random House +
+
+ Books-A-Million Exclusive, Hardcover, 450 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780525615507 + + (ISBN10: 0525615504) + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.43 + + (101 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor +
+
+ +
+ Published January 1st 2002 + by Debolsillo +
+
+ Paperback, 652 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9788484504672 + + (ISBN10: 8484504670) + +
+
+
+
+ ASIN: +
+
+ 8484504670 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.34 + + (103 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El Resplandor +
+
+ +
+ Published August 25th 2020 + by Vintage Espanol +
+
+ Paperback, 688 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780593311233 + + (ISBN10: 059331123X) + +
+
+
+
+ ASIN: +
+
+ 059331123X +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.36 + + (72 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor +
+
+ +
+ Published 2008 + by Debols!llo +
+
+ 2nd edition, Paperback, 652 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ + (ISBN10: 9875668478) + +
+
+
+
+ ASIN: +
+
+ 9875668478 +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.44 + + (94 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining (The Shining, #1) +
+
+ +
+ Published May 2016 + by The Folio Society +
+
+ Hardcover, 536 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.56 + + (86 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ The Shining +
+
+ +
+ Published October 1st 1978 + by Signet +
+
+ 1st, First Edition, Mass Market Paperback, 447 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9780451139764 + + (ISBN10: 0451139763) + +
+
+
+
+ ASIN: +
+
+ 0451139763 +
+
+
+
+ Edition language: +
+
+ English +
+
+
+
+ Average rating: +
+
+ 4.10 + + (73 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining [L'enfant lumière] +
+
+ +
+ Published November 29th 2000 + by J'ai Lu +
+
+ Paperback, 574 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9782290308431 + + (ISBN10: 2290308439) + +
+
+
+
+ ASIN: +
+
+ 2290308439 +
+
+
+
+ Edition language: +
+
+ French +
+
+
+
+ Average rating: +
+
+ 4.19 + + (91 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ De Shining +
+
+ +
+ Published 1994 + by Poema Pocket +
+
+ Mass Market Paperback, 416 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789024512232 + + (ISBN10: 9024512239) + +
+
+
+
+ ASIN: +
+
+ 9024512239 +
+
+
+
+ Edition language: +
+
+ Dutch +
+
+
+
+ Average rating: +
+
+ 4.22 + + (81 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Mirdzums (Mirdzums, #1) +
+
+ +
+ Published 2013 + by Zvaigzne ABC +
+
+ Hardcover, 464 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789934035296 +
+
+
+
+ Edition language: +
+
+ Latvian +
+
+
+
+ Average rating: +
+
+ 4.24 + + (82 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ El resplandor +
+
+ +
+ Published February 2014 + by Penguin Random House Grupo Editorial +
+
+ Paperback, 652 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ 9789588789774 + + (ISBN10: 958878977X) + +
+
+
+
+ ASIN: +
+
+ B0054QPOQA +
+
+
+
+ Edition language: +
+
+ Spanish +
+
+
+
+ Average rating: +
+
+ 4.32 + + (95 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Сияние (Сияние, #1) +
+
+ +
+ Published October 1992 + by Народна култура +
+
+ Paperback, 411 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ + (ISBN10: 9540400600) + +
+
+
+
+ Edition language: +
+
+ Bulgarian +
+
+
+
+ Average rating: +
+
+ 4.40 + + (75 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ Shining +
+
+ +
+ Published October 25th 2013 + by Bastei Lübbe +
+
+ 1, Kindle Edition, 625 pages +
+
+
+
+ Author(s): +
+
+ + +
+
+
+
+ ISBN: +
+
+ + (ISBN10: 3838752031) + +
+
+
+
+ ASIN: +
+
+ B00FYPCNPQ +
+
+
+
+ Edition language: +
+
+ German +
+
+
+
+ Average rating: +
+
+ 4.16 + + (49 ratings) + +
+
+
+ +
+
+ + +
+
+
+ + + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+ +
+
« previous 1 3 4 5 6
+ +
+ +
+
+ per page + +
+
+ +
+
+
+
+ +
+
+
+
+
+ + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/ambry_scraping/goodreads/mocks/search_authors_stephen_king.html b/test/ambry_scraping/goodreads/mocks/search_authors_stephen_king.html new file mode 100644 index 00000000..648dd2bd --- /dev/null +++ b/test/ambry_scraping/goodreads/mocks/search_authors_stephen_king.html @@ -0,0 +1,1666 @@ + + Search results for "Stephen King" (showing 1-10 of 6788 books) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ + + +
+ + + + +
+
+ +
+ +
+ +
+ +
+ + + + +
+ + +
+

+ Search +

+ + + +
+
+ Books + Groups + Quotes + People + Listopia +
+
+ +
+ Genre: + Stephen King +
+ +

Page 1 of about 6788 results (0.08 seconds)

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + The Shining (The Shining, #1) +
+
+ by + + +
+
+ + 4.27 avg rating — 1,488,647 ratings + — + published + 1977 + — + 547 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + It +
+
+ by + + +
+
+ + 4.24 avg rating — 1,110,610 ratings + — + published + 1986 + — + 402 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + Misery +
+
+ by + + +
+
+ + 4.21 avg rating — 698,159 ratings + — + published + 1987 + — + 366 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + The Stand +
+
+ by + + +
+
+ + 4.35 avg rating — 760,505 ratings + — + published + 1990 + — + 383 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + Carrie +
+
+ by + + +
+
+ + 3.99 avg rating — 721,480 ratings + — + published + 1974 + — + 456 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + The Gunslinger (The Dark To... +
+
+ by + + +
+
+ + 3.92 avg rating — 610,749 ratings + — + published + 1982 + — + 359 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + 11/22/63 +
+
+ by + + +
+
+ + 4.33 avg rating — 540,589 ratings + — + published + 2011 + — + 234 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + The Outsider +
+
+ by + + +
+
+ + 4.01 avg rating — 308,448 ratings + — + published + 2018 + — + 137 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + ’Salem’s Lot +
+
+ by + + +
+
+ + 4.06 avg rating — 455,810 ratings + — + published + 1975 + — + 384 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + The Green Mile +
+
+ by + + +
+
+ + 4.48 avg rating — 320,216 ratings + — + published + 1996 + — + 344 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+ + +
+ +
+
« previous 1 3 4 5 6 7 8 9 99 100
+ +
+

+ + + +

+
+ +
+
+ + Import books +
+ +
+
+ +
+ +
+ fiction (25,782,506)
+ fantasy (23,107,168)
+ classics (8,822,233)
+ mystery (8,796,600)
+ audiobook (6,177,043)
+ adult (5,058,764)
+ horror (4,750,338)
+ thriller (4,174,421)
+ paranormal (4,154,804)
+ novels (3,146,355)
+ suspense (2,186,390)
+ mystery-thriller (1,967,706)
+ supernatural (1,404,076)
+ More shelves... +
+ + + + + + + + +
+ +
+
+
+
+
+ + +
+ + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/ambry_scraping/goodreads/mocks/search_books_the_shining.html b/test/ambry_scraping/goodreads/mocks/search_books_the_shining.html new file mode 100644 index 00000000..851c06bc --- /dev/null +++ b/test/ambry_scraping/goodreads/mocks/search_books_the_shining.html @@ -0,0 +1,1665 @@ + + Search results for "The Shining" (showing 1-10 of 3376 books) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ + + +
+ + + + +
+
+ +
+ +
+ +
+ +
+ + + + +
+ + +
+

+ Search +

+ + + +
+
+ Books + Groups + Quotes + People + Listopia +
+
+ + +

Page 1 of about 3376 results (0.06 seconds)

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + The Shining (The Shining, #1) +
+
+ by + + +
+
+ + 4.27 avg rating — 1,488,647 ratings + — + published + 1977 + — + 547 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + Doctor Sleep (The Shining, #2) +
+
+ by + + +
+
+ + 4.13 avg rating — 261,730 ratings + — + published + 2013 + — + 93 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + The Shining Girls +
+
+ by + + +
+
+ + 3.54 avg rating — 51,076 ratings + — + published + 2013 + — + 91 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + The Shining Ones (The Tamul... +
+
+ by + + +
+
+ + 3.98 avg rating — 23,940 ratings + — + published + 1993 + — + 54 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + Carrie / 'Salem's Lot / The... +
+
+ by + + +
+
+ + 4.57 avg rating — 19,629 ratings + — + published + 1983 + — + 11 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + The Radium Girls: The Dark ... +
+
+ by + + +
+
+ + 4.15 avg rating — 146,944 ratings + — + published + 2016 + — + 44 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + Ours Was the Shining Future... +
+
+ by + + +
+
+ + 4.32 avg rating — 574 ratings + — + published + 2023 + — + 1 edition + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + The World of the Shining Pr... +
+
+ by + + +
+
+ + 4.03 avg rating — 868 ratings + — + published + 1964 + — + 33 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + The Shining Mountains +
+
+ by + + +
+
+ + 4.18 avg rating — 28 ratings + — + published + 2023 + — + 6 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + The Shining City (Rhiannon'... +
+
+ by + + +
+
+ + 4.03 avg rating — 2,441 ratings + — + published + 2005 + — + 3 editions + +
+ + + + +
+
+
+
+ + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+ +
Rate this book
+
Clear rating
+ +
+ +
+ +
+
+
+
+ + +
+ +
+ + +
+ +
+
« previous 1 3 4 5 6 7 8 9 99 100
+ +
+

+ + + +

+
+ +
+
+ + Import books +
+ +
+
+ +
+ +
+ fiction (25,782,506)
+ fantasy (23,107,168)
+ classics (8,822,233)
+ mystery (8,796,600)
+ historical-fiction (7,877,191)
+ audiobook (6,177,043)
+ science-fiction (5,253,027)
+ adult (5,058,764)
+ horror (4,750,338)
+ thriller (4,174,421)
+ paranormal (4,154,804)
+ crime (2,764,616)
+ suspense (2,186,390)
+ mystery-thriller (1,967,536)
+ supernatural (1,404,081)
+ time-travel (492,897)
+ More shelves... +
+ + + + + + + + +
+ +
+
+
+
+
+ + +
+ + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/ambry_scraping/goodreads_test.exs b/test/ambry_scraping/goodreads_test.exs new file mode 100644 index 00000000..2629e14a --- /dev/null +++ b/test/ambry_scraping/goodreads_test.exs @@ -0,0 +1,171 @@ +defmodule AmbryScraping.GoodReadsTest do + use ExUnit.Case, async: false + use Patch + use Mneme + + alias AmbryScraping.GoodReads + alias AmbryScraping.GoodReads.AuthorDetails + alias AmbryScraping.GoodReads.Browser + alias AmbryScraping.GoodReads.Contributor + alias AmbryScraping.GoodReads.Edition + alias AmbryScraping.GoodReads.EditionDetails + alias AmbryScraping.GoodReads.Editions + alias AmbryScraping.GoodReads.PublishedDate + alias AmbryScraping.GoodReads.Series + alias AmbryScraping.GoodReads.Work + + describe "search_authors/1" do + test "searches for authors given a query" do + patch(Browser, :get_page_html, fn _path, _actions -> + {:ok, File.read!("test/ambry_scraping/goodreads/mocks/search_authors_stephen_king.html")} + end) + + assert {:ok, [author | _rest]} = GoodReads.search_authors("Stephen King") + + auto_assert %Contributor{ + id: "author:3389.Stephen_King", + name: "Stephen King", + type: "author" + } <- author + end + + test "returns an empty list if given an empty query" do + assert {:ok, []} = GoodReads.search_authors("") + end + end + + describe "author_details/1" do + test "fetches the details of an author by their ID" do + patch(Browser, :get_page_html, fn + "/author/show/3389.Stephen_King", _actions -> + {:ok, + File.read!("test/ambry_scraping/goodreads/mocks/author_details_stephen_king.html")} + + "/photo/author/3389.Stephen_King", _actions -> + {:ok, + File.read!( + "test/ambry_scraping/goodreads/mocks/author_details_photos_stephen_king.html" + )} + end) + + assert {:ok, author_details} = GoodReads.author_details("author:3389.Stephen_King") + + auto_assert %AuthorDetails{ + id: "author:3389.Stephen_King", + image: "https://images.gr-assets.com/authors/1362814142p8/3389.jpg", + name: "Stephen King" + } <- author_details + end + + test "returns an error when the given ID doesn't find an author" do + patch(Browser, :get_page_html, fn _path, _actions -> + {:ok, File.read!("test/ambry_scraping/goodreads/mocks/author_details_not_found.html")} + end) + + assert {:error, :not_found} = GoodReads.author_details("author:foo") + end + end + + describe "search_books/1" do + test "searches for books given a query" do + patch(Browser, :get_page_html, fn _path, _actions -> + {:ok, File.read!("test/ambry_scraping/goodreads/mocks/search_books_the_shining.html")} + end) + + assert {:ok, [book | _rest]} = GoodReads.search_books("The Shining") + + auto_assert %Work{ + contributors: [ + %Contributor{ + id: "author:3389.Stephen_King", + name: "Stephen King", + type: "author" + } + ], + id: "work:849585-the-shining", + thumbnail: + "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1353277730i/11588._SY75_.jpg", + title: "The Shining (The Shining, #1)" + } <- book + end + + test "returns an empty list if given an empty query" do + assert {:ok, []} = GoodReads.search_books("") + end + end + + describe "editions/1" do + test "returns list of editions for a given book" do + patch(Browser, :get_page_html, fn _path, _actions -> + {:ok, File.read!("test/ambry_scraping/goodreads/mocks/editions_the_shining.html")} + end) + + assert {:ok, editions} = GoodReads.editions("work:849585-the-shining") + + auto_assert %Editions{ + editions: _editions, + first_published: %PublishedDate{}, + id: "work:849585-the-shining", + primary_author: %Contributor{}, + title: "The Shining" + } <- editions + + %Editions{editions: [edition | _rest]} = editions + + auto_assert %Edition{ + contributors: [ + %Contributor{ + id: "author:3389.Stephen_King", + name: "Stephen King", + type: "author" + } + ], + format: "1st Paperback edition, Paperback, 497 pages", + id: "edition:11588.The_Shining", + language: "english", + published: %PublishedDate{date: ~D[1980-07-01], display_format: :full}, + publisher: "New English Library (Hodder & Stoughton)", + thumbnail: + "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1353277730l/11588._SY75_.jpg", + title: "The Shining (The Shining, #1)" + } <- edition + end + end + + describe "edition_details/1" do + test "returns the details for a given edition of a book" do + patch(Browser, :get_page_html, fn _path, _actions -> + {:ok, File.read!("test/ambry_scraping/goodreads/mocks/edition_details_the_shining.html")} + end) + + assert {:ok, edition} = GoodReads.edition_details("edition:11588.The_Shining") + + auto_assert %EditionDetails{ + authors: [ + %Contributor{ + id: "author:3389.Stephen_King", + name: "Stephen King", + type: "author" + } + ], + cover_image: + "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1353277730i/11588.jpg", + description: + "Jack Torrance's new job at the Overlook Hotel is the perfect chance for a fresh start. As the off-season caretaker at the atmospheric old hotel, he'll have plenty of time to spend reconnecting with his family and working on his writing. But as the harsh winter weather sets in, the idyllic location feels ever more remote...and more sinister. And the only one to notice the strange and terrible forces gathering around the Overlook is Danny Torrance, a uniquely gifted five-year-old.", + format: "497 pages, Paperback", + id: "edition:11588.The_Shining", + language: "English", + published: %PublishedDate{date: ~D[1980-07-01], display_format: :full}, + publisher: "New English Library (Hodder & Stoughton)", + series: [ + %Series{ + id: "series:117014-the-shining", + name: "The Shining", + number: "1" + } + ], + title: "The Shining" + } <- edition + end + end +end diff --git a/test/ambry_scraping_test.exs b/test/ambry_scraping_test.exs new file mode 100644 index 00000000..a7208d0f --- /dev/null +++ b/test/ambry_scraping_test.exs @@ -0,0 +1,9 @@ +defmodule AmbryScrapingTest do + use ExUnit.Case + + describe "web_scraping_available?" do + test "returns false because the web scraping service is not available in test mode" do + refute AmbryScraping.web_scraping_available?() + end + end +end diff --git a/test/test_helper.exs b/test/test_helper.exs index a6e416f6..c4f663c8 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -3,4 +3,5 @@ ExUnit.after_suite(fn _results -> end) ExUnit.start() +Mneme.start() Ecto.Adapters.SQL.Sandbox.mode(Ambry.Repo, :manual) From b559a257ab7f8dd221f04b85bf38158b220befea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Dos=C3=A9?= Date: Fri, 12 Apr 2024 11:51:29 -0700 Subject: [PATCH 05/13] Strictify AmbryApp boundary --- lib/ambry_app.ex | 5 ++++- mix.exs | 2 +- mix.lock | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/ambry_app.ex b/lib/ambry_app.ex index 14145ebd..4f05709b 100644 --- a/lib/ambry_app.ex +++ b/lib/ambry_app.ex @@ -3,5 +3,8 @@ defmodule AmbryApp do Ambry OTP application. """ - use Boundary, deps: [Ambry, AmbryWeb, AmbryScraping], exports: [Application] + use Boundary, + type: :strict, + deps: [Ecto.Migrator, Finch, Oban, Phoenix.PubSub, Ambry, AmbryWeb, AmbryScraping], + exports: [Application] end diff --git a/mix.exs b/mix.exs index c5056d7c..9b40fd93 100644 --- a/mix.exs +++ b/mix.exs @@ -54,7 +54,7 @@ defmodule Ambry.MixProject do {:absinthe, "~> 1.7"}, {:argon2_elixir, "~> 4.0"}, {:bandit, "~> 1.0"}, - {:boundary, "~> 0.10", runtime: false}, + {:boundary, github: "sasa1977/boundary", runtime: false}, {:credo, "~> 1.6", only: [:dev, :test], runtime: false}, {:dataloader, "~> 2.0"}, {:dialyxir, "~> 1.0", only: [:dev], runtime: false}, diff --git a/mix.lock b/mix.lock index e8ab0031..e83227e4 100644 --- a/mix.lock +++ b/mix.lock @@ -4,7 +4,7 @@ "absinthe_relay": {:hex, :absinthe_relay, "1.5.2", "cfb8aed70f4e4c7718d3f1c212332d2ea728f17c7fc0f68f1e461f0f5f0c4b9a", [:mix], [{:absinthe, "~> 1.5.0 or ~> 1.6.0 or ~> 1.7.0", [hex: :absinthe, repo: "hexpm", optional: false]}, {:ecto, "~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "0587ee913afa31512e1457a5064ee88427f8fe7bcfbeeecd41c71d9cff0b62b6"}, "argon2_elixir": {:hex, :argon2_elixir, "4.0.0", "7f6cd2e4a93a37f61d58a367d82f830ad9527082ff3c820b8197a8a736648941", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "f9da27cf060c9ea61b1bd47837a28d7e48a8f6fa13a745e252556c14f9132c7f"}, "bandit": {:hex, :bandit, "1.5.0", "3bc864a0da7f013ad3713a7f550c6a6ec0e19b8d8715ec678256a0dc197d5539", [:mix], [{:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "92d18d9a7228a597e0d4661ef69a874ea82d63ff49c7d801a5c68cb18ebbbd72"}, - "boundary": {:hex, :boundary, "0.10.3", "43c15d67a3a1ba863d0995de1c300e82aeb3cfec592d0a6a88a5aa2cf95d3c32", [:mix], [], "hexpm", "a037f12b28b2baf971f7e986e642967c94ff7bf74f25ad6a4d7c52e7e8739850"}, + "boundary": {:git, "https://github.com/sasa1977/boundary.git", "a706fda5e236ef8b36521a66c095bf524b080941", []}, "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "castore": {:hex, :castore, "1.0.7", "b651241514e5f6956028147fe6637f7ac13802537e895a724f90bf3e36ddd1dd", [:mix], [], "hexpm", "da7785a4b0d2a021cd1292a60875a784b6caef71e76bf4917bdee1f390455cf5"}, "comeonin": {:hex, :comeonin, "5.4.0", "246a56ca3f41d404380fc6465650ddaa532c7f98be4bda1b4656b3a37cc13abe", [:mix], [], "hexpm", "796393a9e50d01999d56b7b8420ab0481a7538d0caf80919da493b4a6e51faf1"}, From 695fb765d329d8e92b996b577145cf26a0f93612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Dos=C3=A9?= Date: Fri, 12 Apr 2024 11:59:18 -0700 Subject: [PATCH 06/13] Strictify AmbrySchema boundary --- lib/ambry_app.ex | 12 +++++++++++- lib/ambry_schema.ex | 17 ++++++++++++++++- .../{plug_helpers.ex => context_plug.ex} | 12 ++++++++++-- lib/ambry_web/router.ex | 3 +-- 4 files changed, 38 insertions(+), 6 deletions(-) rename lib/ambry_schema/{plug_helpers.ex => context_plug.ex} (67%) diff --git a/lib/ambry_app.ex b/lib/ambry_app.ex index 4f05709b..440ff2fb 100644 --- a/lib/ambry_app.ex +++ b/lib/ambry_app.ex @@ -5,6 +5,16 @@ defmodule AmbryApp do use Boundary, type: :strict, - deps: [Ecto.Migrator, Finch, Oban, Phoenix.PubSub, Ambry, AmbryWeb, AmbryScraping], + deps: [ + # External + Ecto.Migrator, + Finch, + Oban, + Phoenix.PubSub, + # Internal + Ambry, + AmbryScraping, + AmbryWeb + ], exports: [Application] end diff --git a/lib/ambry_schema.ex b/lib/ambry_schema.ex index 7cc3ae7a..32e3c10c 100644 --- a/lib/ambry_schema.ex +++ b/lib/ambry_schema.ex @@ -1,7 +1,22 @@ defmodule AmbrySchema do @moduledoc false - use Boundary, deps: [Ambry], exports: [PlugHelpers] + use Boundary, + type: :strict, + deps: [ + # External + Absinthe, + Absinthe.Plug, + Absinthe.Relay, + Dataloader, + Decimal, + Ecto, + Plug, + # Internal + Ambry + ], + exports: [ContextPlug] + use Absinthe.Schema use Absinthe.Relay.Schema, :modern diff --git a/lib/ambry_schema/plug_helpers.ex b/lib/ambry_schema/context_plug.ex similarity index 67% rename from lib/ambry_schema/plug_helpers.ex rename to lib/ambry_schema/context_plug.ex index 1b4555bf..4b65f64c 100644 --- a/lib/ambry_schema/plug_helpers.ex +++ b/lib/ambry_schema/context_plug.ex @@ -1,7 +1,15 @@ -defmodule AmbrySchema.PlugHelpers do +defmodule AmbrySchema.ContextPlug do @moduledoc false - def put_absinthe_context(conn, _opts) do + @behaviour Plug + + @impl Plug + def init(opts) do + opts + end + + @impl Plug + def call(conn, _opts) do context = build_context(conn) Absinthe.Plug.put_options(conn, context: context) end diff --git a/lib/ambry_web/router.ex b/lib/ambry_web/router.ex index ae2c0b9c..c2c4c51c 100644 --- a/lib/ambry_web/router.ex +++ b/lib/ambry_web/router.ex @@ -1,7 +1,6 @@ defmodule AmbryWeb.Router do use AmbryWeb, :router - import AmbrySchema.PlugHelpers import AmbryWeb.UserAuth import Phoenix.LiveDashboard.Router @@ -42,7 +41,7 @@ defmodule AmbryWeb.Router do pipeline :gql do plug :accepts, ["json", "graphql"] plug :fetch_api_user - plug :put_absinthe_context + plug AmbrySchema.ContextPlug end scope "/uploads" do From cf3dd5c82ddd55c9604f6ec8eefc71cdf253afa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Dos=C3=A9?= Date: Tue, 16 Apr 2024 12:36:52 -0700 Subject: [PATCH 07/13] Refactory Ambry boundary --- lib/ambry.ex | 49 +--- lib/ambry/accounts.ex | 8 + lib/ambry/accounts/user_flat.ex | 2 +- lib/ambry/authors.ex | 26 --- lib/ambry/books.ex | 183 ++++++++++++++- lib/ambry/books/book.ex | 8 +- lib/ambry/books/book_flat.ex | 10 +- lib/ambry/{series => books}/series.ex | 4 +- lib/ambry/{series => books}/series_book.ex | 4 +- lib/ambry/books/series_book_type.ex | 28 +++ lib/ambry/{series => books}/series_flat.ex | 8 +- lib/ambry/ecto/types/person_name.ex | 22 -- lib/ambry/ecto/types/reference.ex | 29 --- lib/ambry/ecto/types/series_book.ex | 22 -- lib/ambry/file_browser.ex | 2 + lib/ambry/file_utils.ex | 96 -------- lib/ambry/first_time_setup.ex | 19 -- lib/ambry/hashids.ex | 2 + lib/ambry/mailer.ex | 1 + lib/ambry/media.ex | 34 ++- lib/ambry/media/media.ex | 4 +- lib/ambry/media/media_flat.ex | 12 +- lib/ambry/media/media_narrator.ex | 2 +- lib/ambry/metadata.ex | 5 + lib/ambry/narrators.ex | 26 --- lib/ambry/paths.ex | 2 + lib/ambry/people.ex | 70 +++++- lib/ambry/{authors => people}/author.ex | 2 +- lib/ambry/{authors => people}/book_author.ex | 4 +- lib/ambry/{narrators => people}/narrator.ex | 2 +- lib/ambry/people/person.ex | 4 +- lib/ambry/people/person_flat.ex | 2 +- lib/ambry/people/person_name.ex | 23 ++ lib/ambry/pub_sub.ex | 2 + lib/ambry/reference.ex | 19 -- lib/ambry/repo.ex | 2 + lib/ambry/{ => repo}/flat_schema.ex | 2 +- lib/ambry/{ => repo}/supplemental_file.ex | 2 +- lib/ambry/search.ex | 19 +- lib/ambry/search/index.ex | 12 +- lib/ambry/search/record.ex | 6 +- lib/ambry/search/reference.ex | 49 ++++ lib/ambry/series.ex | 160 ------------- lib/ambry/series/series_book_type.ex | 5 - lib/ambry/utils.ex | 45 ++++ lib/ambry_schema/resolvers.ex | 8 +- lib/ambry_web/components/core_components.ex | 2 +- .../controllers/download_controller.ex | 2 +- lib/ambry_web/live/admin/audit_live/index.ex | 6 +- lib/ambry_web/live/admin/book_live/form.ex | 9 +- .../book_live/form/audible_import_form.ex | 5 +- .../book_live/form/goodreads_import_form.ex | 5 +- lib/ambry_web/live/admin/home_live/index.ex | 3 +- lib/ambry_web/live/admin/media_live/form.ex | 7 +- lib/ambry_web/live/admin/series_live/form.ex | 17 +- lib/ambry_web/live/admin/series_live/index.ex | 8 +- lib/ambry_web/live/author_or_narrator_live.ex | 7 +- .../live/first_time_setup/setup_live.ex | 13 +- lib/ambry_web/live/person_live.ex | 4 +- lib/ambry_web/live/search_live/components.ex | 2 +- lib/ambry_web/live/series_live.ex | 4 +- priv/repo/seeds.exs | 6 +- test/ambry/authors_test.exs | 19 -- test/ambry/books_test.exs | 217 ++++++++++++++++- test/ambry/first_time_setup_test.exs | 13 -- test/ambry/narrators_test.exs | 19 -- .../person_name/type_test.exs} | 15 +- test/ambry/people_test.exs | 28 +++ test/ambry/search/index_test.exs | 15 +- test/ambry/search_test.exs | 4 +- test/ambry/series_test.exs | 218 ------------------ test/ambry_schema/search_test.exs | 1 + test/ambry_web/live/search_live_test.exs | 1 + test/support/data_case.ex | 1 + test/support/factory.ex | 18 +- test/support/search/index_factory.ex | 12 + 76 files changed, 864 insertions(+), 863 deletions(-) delete mode 100644 lib/ambry/authors.ex rename lib/ambry/{series => books}/series.ex (91%) rename lib/ambry/{series => books}/series_book.ex (93%) create mode 100644 lib/ambry/books/series_book_type.ex rename lib/ambry/{series => books}/series_flat.ex (79%) delete mode 100644 lib/ambry/ecto/types/person_name.ex delete mode 100644 lib/ambry/ecto/types/reference.ex delete mode 100644 lib/ambry/ecto/types/series_book.ex delete mode 100644 lib/ambry/file_utils.ex delete mode 100644 lib/ambry/first_time_setup.ex create mode 100644 lib/ambry/metadata.ex delete mode 100644 lib/ambry/narrators.ex rename lib/ambry/{authors => people}/author.ex (95%) rename lib/ambry/{authors => people}/book_author.ex (86%) rename lib/ambry/{narrators => people}/narrator.ex (95%) delete mode 100644 lib/ambry/reference.ex rename lib/ambry/{ => repo}/flat_schema.ex (94%) rename lib/ambry/{ => repo}/supplemental_file.ex (96%) create mode 100644 lib/ambry/search/reference.ex delete mode 100644 lib/ambry/series.ex delete mode 100644 lib/ambry/series/series_book_type.ex delete mode 100644 test/ambry/authors_test.exs delete mode 100644 test/ambry/first_time_setup_test.exs delete mode 100644 test/ambry/narrators_test.exs rename test/ambry/{ecto/types/person_name_test.exs => people/person_name/type_test.exs} (58%) delete mode 100644 test/ambry/series_test.exs create mode 100644 test/support/search/index_factory.ex diff --git a/lib/ambry.ex b/lib/ambry.ex index 575612a1..07c7caa4 100644 --- a/lib/ambry.ex +++ b/lib/ambry.ex @@ -9,42 +9,17 @@ defmodule Ambry do use Boundary, deps: [AmbryScraping], exports: [ - Accounts, - Accounts.User, - Authors, - Authors.Author, - Books, - Books.Book, - DataCase, - Factory, - FileBrowser, - FileBrowser.File, - FileBrowser.FolderNode, - FileUtils, - FirstTimeSetup, - Hashids, - Media, - Media.Audit, - Media.Chapters, - Media.Media, - Media.PlayerState, - Media.Processor, - Media.ProcessorJob, - Metadata.Audible, - Metadata.GoodReads, - Narrators, - Narrators.Narrator, - Paths, - People, - People.Person, - PubSub, - PubSub.Message, - Repo, - Search, - Search.IndexManager, - Series, - Series.Series, - Series.SeriesBook, - SupplementalFile + {Accounts, []}, + {Books, []}, + {FileBrowser, []}, + {Hashids, []}, + {Media, []}, + {Metadata, []}, + {Paths, []}, + {People, []}, + {PubSub, []}, + {Repo, []}, + {Search, []}, + {Utils, []} ] end diff --git a/lib/ambry/accounts.ex b/lib/ambry/accounts.ex index 48af601f..7f7232aa 100644 --- a/lib/ambry/accounts.ex +++ b/lib/ambry/accounts.ex @@ -3,6 +3,14 @@ defmodule Ambry.Accounts do The Accounts context. """ + use Boundary, + deps: [ + Ambry.Mailer, + Ambry.Media, + Ambry.Repo + ], + exports: [User] + import Ecto.Query, warn: false alias Ambry.Accounts.User diff --git a/lib/ambry/accounts/user_flat.ex b/lib/ambry/accounts/user_flat.ex index 15b1978b..97175a0e 100644 --- a/lib/ambry/accounts/user_flat.ex +++ b/lib/ambry/accounts/user_flat.ex @@ -3,7 +3,7 @@ defmodule Ambry.Accounts.UserFlat do A flattened view of users. """ - use Ambry.FlatSchema + use Ambry.Repo.FlatSchema schema "users_flat" do field :email, :string diff --git a/lib/ambry/authors.ex b/lib/ambry/authors.ex deleted file mode 100644 index 0a96accf..00000000 --- a/lib/ambry/authors.ex +++ /dev/null @@ -1,26 +0,0 @@ -defmodule Ambry.Authors do - @moduledoc """ - Functions for dealing with Authors. - """ - - import Ecto.Query - - alias Ambry.Authors.Author - alias Ambry.Repo - - @doc """ - Gets a single author. - - Raises `Ecto.NoResultsError` if the Author does not exist. - """ - def get_author!(id), do: Author |> preload(:person) |> Repo.get!(id) - - @doc """ - Returns all authors for use in `Select` components. - """ - def for_select do - query = from a in Author, select: {a.name, a.id}, order_by: a.name - - Repo.all(query) - end -end diff --git a/lib/ambry/books.ex b/lib/ambry/books.ex index 97692956..00e2153c 100644 --- a/lib/ambry/books.ex +++ b/lib/ambry/books.ex @@ -3,19 +3,34 @@ defmodule Ambry.Books do Functions for dealing with Books. """ - import Ambry.FileUtils + use Boundary, + deps: [Ambry], + exports: [ + Book, + Series, + SeriesBook, + SeriesFlat, + SeriesBookType, + SeriesBookType.Type + ] + import Ambry.Utils import Ecto.Query alias Ambry.Books.Book alias Ambry.Books.BookFlat + alias Ambry.Books.Series + alias Ambry.Books.SeriesFlat alias Ambry.Media.Media + alias Ambry.Paths alias Ambry.PubSub alias Ambry.Repo + require Logger + @book_direct_assoc_preloads [:authors, book_authors: [:author], series_books: [:series]] - def standard_preloads, do: @book_direct_assoc_preloads + def book_standard_preloads, do: @book_direct_assoc_preloads @doc """ Returns a limited list of books and whether or not there are more. @@ -148,6 +163,21 @@ defmodule Ambry.Books do end end + defp maybe_delete_image(nil), do: :noop + + defp maybe_delete_image(web_path) do + book_count = Repo.aggregate(from(b in Book, where: b.image_path == ^web_path), :count) + + if book_count == 0 do + disk_path = Paths.web_to_disk(web_path) + + try_delete_file(disk_path) + else + Logger.warning(fn -> "Not deleting file because it's still in use: #{web_path}" end) + {:error, :still_in_use} + end + end + @doc """ Returns an `%Ecto.Changeset{}` for tracking book changes. @@ -193,7 +223,7 @@ defmodule Ambry.Books do @doc """ Returns all books for use in `Select` components. """ - def for_select do + def books_for_select do query = from b in Book, select: {b.title, b.id}, order_by: b.title Repo.all(query) @@ -229,4 +259,151 @@ defmodule Ambry.Books do {books_to_return, books != books_to_return} end + + @series_direct_assoc_preloads [series_books: [book: [:authors]]] + + def series_standard_preloads, do: @series_direct_assoc_preloads + + @doc """ + Returns a limited list of series and whether or not there are more. + + By default, it will limit to the first 10 results. Supply `offset` and `limit` + to change this. Also can optionally filter by the given `filter` string. + + ## Examples + + iex> list_series() + {[%SeriesFlat{}, ...], true} + """ + def list_series(offset \\ 0, limit \\ 10, filters \\ %{}, order \\ [asc: :name]) do + over_limit = limit + 1 + + series = + offset + |> SeriesFlat.paginate(over_limit) + |> SeriesFlat.filter(filters) + |> SeriesFlat.order(order) + |> Repo.all() + + series_to_return = Enum.slice(series, 0, limit) + + {series_to_return, series != series_to_return} + end + + @doc """ + Returns the number of series. + + ## Examples + + iex> count_series() + 1 + """ + @spec count_series :: integer() + def count_series do + Repo.aggregate(Series, :count) + end + + @doc """ + Gets a single series. + + Raises `Ecto.NoResultsError` if the Series does not exist. + + ## Examples + + iex> get_series!(123) + %Series{} + + iex> get_series!(456) + ** (Ecto.NoResultsError) + """ + def get_series!(id) do + Series + |> preload(^@series_direct_assoc_preloads) + |> Repo.get!(id) + end + + @doc """ + Creates a series. + + ## Examples + + iex> create_series(%{field: value}) + {:ok, %Series{}} + + iex> create_series(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + """ + def create_series(attrs) do + %Series{} + |> Series.changeset(attrs) + |> Repo.insert() + |> tap_ok(&PubSub.broadcast_create/1) + end + + @doc """ + Updates a series. + + ## Examples + + iex> update_series(series, %{field: new_value}) + {:ok, %Series{}} + + iex> update_series(series, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + """ + def update_series(%Series{} = series, attrs) do + series + |> Series.changeset(attrs) + |> Repo.update() + |> tap_ok(&PubSub.broadcast_create/1) + end + + @doc """ + Deletes a series. + + ## Examples + + iex> delete_series(series) + {:ok, %Series{}} + + iex> delete_series(series) + {:error, %Ecto.Changeset{}} + """ + def delete_series(%Series{} = series) do + series + |> Repo.delete() + |> tap_ok(&PubSub.broadcast_delete/1) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking series changes. + + ## Examples + + iex> change_series(series) + %Ecto.Changeset{data: %Series{}} + """ + def change_series(%Series{} = series, attrs \\ %{}) do + Series.changeset(series, attrs) + end + + @doc """ + Gets a series and all of its books. + + Books are listed in ascending order based on series book number. + """ + def get_series_with_books!(series_id) do + Series + |> preload(series_books: [book: [:authors, series_books: :series]]) + |> Repo.get!(series_id) + end + + @doc """ + Returns all series for use in `Select` components. + """ + def series_for_select do + query = from s in Series, select: {s.name, s.id}, order_by: s.name + + Repo.all(query) + end end diff --git a/lib/ambry/books/book.ex b/lib/ambry/books/book.ex index 1e0d2a9a..86121acc 100644 --- a/lib/ambry/books/book.ex +++ b/lib/ambry/books/book.ex @@ -7,11 +7,11 @@ defmodule Ambry.Books.Book do import Ecto.Changeset - alias Ambry.Authors.Author - alias Ambry.Authors.BookAuthor + alias Ambry.Books.Series + alias Ambry.Books.SeriesBook alias Ambry.Media.Media - alias Ambry.Series.Series - alias Ambry.Series.SeriesBook + alias Ambry.People.Author + alias Ambry.People.BookAuthor schema "books" do has_many :media, Media diff --git a/lib/ambry/books/book_flat.ex b/lib/ambry/books/book_flat.ex index e7c2bf5b..13f62a17 100644 --- a/lib/ambry/books/book_flat.ex +++ b/lib/ambry/books/book_flat.ex @@ -3,18 +3,18 @@ defmodule Ambry.Books.BookFlat do A flattened view of books. """ - use Ambry.FlatSchema + use Ambry.Repo.FlatSchema - alias Ambry.Ecto.Types.PersonName - alias Ambry.Ecto.Types.SeriesBook + alias Ambry.Books.SeriesBookType + alias Ambry.People.PersonName schema "books_flat" do field :title, :string field :published, :date field :published_format, Ecto.Enum, values: [:full, :year_month, :year] field :image_path, :string - field :authors, {:array, PersonName} - field :series, {:array, SeriesBook} + field :authors, {:array, PersonName.Type} + field :series, {:array, SeriesBookType.Type} field :universe, :string field :media, :integer field :has_description, :boolean diff --git a/lib/ambry/series/series.ex b/lib/ambry/books/series.ex similarity index 91% rename from lib/ambry/series/series.ex rename to lib/ambry/books/series.ex index 8fd82361..2ab90cf4 100644 --- a/lib/ambry/series/series.ex +++ b/lib/ambry/books/series.ex @@ -1,4 +1,4 @@ -defmodule Ambry.Series.Series do +defmodule Ambry.Books.Series do @moduledoc """ A series of books. """ @@ -8,7 +8,7 @@ defmodule Ambry.Series.Series do import Ecto.Changeset alias Ambry.Books.Book - alias Ambry.Series.SeriesBook + alias Ambry.Books.SeriesBook schema "series" do many_to_many :books, Book, join_through: "books_series" diff --git a/lib/ambry/series/series_book.ex b/lib/ambry/books/series_book.ex similarity index 93% rename from lib/ambry/series/series_book.ex rename to lib/ambry/books/series_book.ex index dd37fad3..f729c4d4 100644 --- a/lib/ambry/series/series_book.ex +++ b/lib/ambry/books/series_book.ex @@ -1,4 +1,4 @@ -defmodule Ambry.Series.SeriesBook do +defmodule Ambry.Books.SeriesBook do @moduledoc """ Join table between books and series. @@ -10,7 +10,7 @@ defmodule Ambry.Series.SeriesBook do import Ecto.Changeset alias Ambry.Books.Book - alias Ambry.Series.Series + alias Ambry.Books.Series schema "books_series" do belongs_to :book, Book diff --git a/lib/ambry/books/series_book_type.ex b/lib/ambry/books/series_book_type.ex new file mode 100644 index 00000000..bb34166e --- /dev/null +++ b/lib/ambry/books/series_book_type.ex @@ -0,0 +1,28 @@ +defmodule Ambry.Books.SeriesBookType do + @moduledoc false + + defstruct [:name, :number] + + defmodule Type do + @moduledoc false + + use Ecto.Type + + alias Ambry.Books.SeriesBookType + + def type, do: :series_book + + def cast(%SeriesBookType{} = series_book) do + {:ok, series_book} + end + + def cast(_series_book), do: :error + + def load({name, number}) do + {:ok, struct!(SeriesBookType, name: name, number: Decimal.new(number))} + end + + def dump(%SeriesBookType{name: name, number: number}), do: {:ok, {name, number}} + def dump(_series_book), do: :error + end +end diff --git a/lib/ambry/series/series_flat.ex b/lib/ambry/books/series_flat.ex similarity index 79% rename from lib/ambry/series/series_flat.ex rename to lib/ambry/books/series_flat.ex index 336aca1f..6eedf067 100644 --- a/lib/ambry/series/series_flat.ex +++ b/lib/ambry/books/series_flat.ex @@ -1,16 +1,16 @@ -defmodule Ambry.Series.SeriesFlat do +defmodule Ambry.Books.SeriesFlat do @moduledoc """ A flattened view of series. """ - use Ambry.FlatSchema + use Ambry.Repo.FlatSchema - alias Ambry.Ecto.Types.PersonName + alias Ambry.People.PersonName schema "series_flat" do field :name, :string field :books, :integer - field :authors, {:array, PersonName} + field :authors, {:array, PersonName.Type} timestamps() end diff --git a/lib/ambry/ecto/types/person_name.ex b/lib/ambry/ecto/types/person_name.ex deleted file mode 100644 index 19250db4..00000000 --- a/lib/ambry/ecto/types/person_name.ex +++ /dev/null @@ -1,22 +0,0 @@ -defmodule Ambry.Ecto.Types.PersonName do - @moduledoc false - - use Ecto.Type - - alias Ambry.People.PersonName - - def type, do: :person_name - - def cast(%PersonName{} = person_name) do - {:ok, person_name} - end - - def cast(_person_name), do: :error - - def load({name, person_name}) do - {:ok, struct!(PersonName, name: name, person_name: person_name)} - end - - def dump(%PersonName{name: name, person_name: person_name}), do: {:ok, {name, person_name}} - def dump(_person_name), do: :error -end diff --git a/lib/ambry/ecto/types/reference.ex b/lib/ambry/ecto/types/reference.ex deleted file mode 100644 index a46c10bf..00000000 --- a/lib/ambry/ecto/types/reference.ex +++ /dev/null @@ -1,29 +0,0 @@ -defmodule Ambry.Ecto.Types.Reference do - @moduledoc false - - use Ecto.Type - - alias Ambry.Reference - - def type, do: :reference - - def cast(%Reference{} = reference) do - {:ok, reference} - end - - def cast(_reference), do: :error - - def load({type, id}) do - {:ok, struct!(Reference, type: load_type(type), id: id)} - end - - def dump(%Reference{type: type, id: id}), do: {:ok, {to_string(type), id}} - def dump(_reference), do: :error - - defp load_type("author"), do: :author - defp load_type("book"), do: :book - defp load_type("media"), do: :media - defp load_type("narrator"), do: :narrator - defp load_type("person"), do: :person - defp load_type("series"), do: :series -end diff --git a/lib/ambry/ecto/types/series_book.ex b/lib/ambry/ecto/types/series_book.ex deleted file mode 100644 index 49c89ad5..00000000 --- a/lib/ambry/ecto/types/series_book.ex +++ /dev/null @@ -1,22 +0,0 @@ -defmodule Ambry.Ecto.Types.SeriesBook do - @moduledoc false - - use Ecto.Type - - alias Ambry.Series.SeriesBookType - - def type, do: :series_book - - def cast(%SeriesBookType{} = series_book) do - {:ok, series_book} - end - - def cast(_series_book), do: :error - - def load({name, number}) do - {:ok, struct!(SeriesBookType, name: name, number: Decimal.new(number))} - end - - def dump(%SeriesBookType{name: name, number: number}), do: {:ok, {name, number}} - def dump(_series_book), do: :error -end diff --git a/lib/ambry/file_browser.ex b/lib/ambry/file_browser.ex index b7615e31..d258cfef 100644 --- a/lib/ambry/file_browser.ex +++ b/lib/ambry/file_browser.ex @@ -3,6 +3,8 @@ defmodule Ambry.FileBrowser do Functions for browsing files and directories. """ + use Boundary, deps: [Ambry.Hashids], exports: [File, Folder, FolderNode] + import File, only: [ls!: 1, stat!: 1] alias Ambry.Hashids diff --git a/lib/ambry/file_utils.ex b/lib/ambry/file_utils.ex deleted file mode 100644 index 51381eee..00000000 --- a/lib/ambry/file_utils.ex +++ /dev/null @@ -1,96 +0,0 @@ -defmodule Ambry.FileUtils do - @moduledoc """ - Utility functions for managing files on disk. - """ - - import Ecto.Query - - alias Ambry.Books.Book - alias Ambry.Paths - alias Ambry.People.Person - alias Ambry.Repo - - require Logger - - @doc """ - Checks the given image web_path to see if it's used by any other books or - people, and if not, attempts to delete it from disk. - """ - def maybe_delete_image(nil), do: :noop - - def maybe_delete_image(web_path) do - book_count = Repo.aggregate(from(b in Book, where: b.image_path == ^web_path), :count) - person_count = Repo.aggregate(from(p in Person, where: p.image_path == ^web_path), :count) - - if book_count + person_count == 0 do - disk_path = Paths.web_to_disk(web_path) - - try_delete_file(disk_path) - else - Logger.warning(fn -> "Not deleting file because it's still in use: #{web_path}" end) - {:error, :still_in_use} - end - end - - @doc """ - Tries to delete all existing media files for a given media. - """ - def delete_media_files(media) do - %{ - source_path: source_disk_path, - mpd_path: mpd_path, - hls_path: hls_path, - mp4_path: mp4_path - } = media - - try_delete_folder(source_disk_path) - - mpd_path |> Paths.web_to_disk() |> try_delete_file() - hls_path |> Paths.web_to_disk() |> try_delete_file() - mp4_path |> Paths.web_to_disk() |> try_delete_file() - hls_path |> Paths.hls_playlist_path() |> Paths.web_to_disk() |> try_delete_file() - - :ok - end - - @doc """ - Tries to delete the given file. - - Logs output. - """ - def try_delete_file(nil), do: :noop - - def try_delete_file(disk_path) do - case File.rm(disk_path) do - :ok -> - Logger.info(fn -> "Deleted file: #{disk_path}" end) - :ok - - {:error, posix} -> - Logger.warning(fn -> "Couldn't delete file (#{posix}): #{disk_path}" end) - {:error, posix} - end - end - - @doc """ - Tries to delete the given folder. - - Logs output. - """ - def try_delete_folder(nil), do: :noop - - def try_delete_folder(disk_path) do - case File.rm_rf(disk_path) do - {:ok, paths} -> - for path <- paths, do: Logger.info(fn -> "Deleted file/folder: #{path}" end) - - :ok - - {:error, posix, path} -> - # coveralls-ignore-start - Logger.warning(fn -> "Couldn't delete file/folder (#{posix}): #{path}" end) - {:error, posix, path} - # coveralls-ignore-stop - end - end -end diff --git a/lib/ambry/first_time_setup.ex b/lib/ambry/first_time_setup.ex deleted file mode 100644 index ffd9cbb0..00000000 --- a/lib/ambry/first_time_setup.ex +++ /dev/null @@ -1,19 +0,0 @@ -defmodule Ambry.FirstTimeSetup do - @moduledoc """ - Context to handle first-time-setup related tasks. - """ - - alias Ambry.Paths - - @contents """ - This file is created once first-time-setup has been completed. - Please don't delete it. - """ - - @doc """ - Disables first-time-setup, so that the redirect no longer happens. - """ - def disable!(contents \\ @contents) do - File.write!(Paths.uploads_folder_disk_path("setup.lock"), contents) - end -end diff --git a/lib/ambry/hashids.ex b/lib/ambry/hashids.ex index 3f676e75..f001cdfc 100644 --- a/lib/ambry/hashids.ex +++ b/lib/ambry/hashids.ex @@ -3,6 +3,8 @@ defmodule Ambry.Hashids do Encode and decode simple hashids. """ + use Boundary + @coder Hashids.new([]) def encode(id) do diff --git a/lib/ambry/mailer.ex b/lib/ambry/mailer.ex index 696655b7..5ee40423 100644 --- a/lib/ambry/mailer.ex +++ b/lib/ambry/mailer.ex @@ -1,5 +1,6 @@ defmodule Ambry.Mailer do @moduledoc false + use Boundary use Swoosh.Mailer, otp_app: :ambry end diff --git a/lib/ambry/media.ex b/lib/ambry/media.ex index 7bad5197..262126d7 100644 --- a/lib/ambry/media.ex +++ b/lib/ambry/media.ex @@ -3,7 +3,20 @@ defmodule Ambry.Media do Functions for dealing with Media. """ - import Ambry.FileUtils + use Boundary, + deps: [Ambry], + exports: [ + Audit, + Bookmark, + Chapters, + Media, + Media.Chapter, + MediaNarrator, + PlayerState, + Processor, + ProcessorJob + ] + import Ambry.Utils import Ecto.Query @@ -14,6 +27,7 @@ defmodule Ambry.Media do alias Ambry.Media.Media alias Ambry.Media.MediaFlat alias Ambry.Media.PlayerState + alias Ambry.Paths alias Ambry.PubSub alias Ambry.Repo @@ -155,6 +169,24 @@ defmodule Ambry.Media do end end + defp delete_media_files(%Media{} = media) do + %Media{ + source_path: source_disk_path, + mpd_path: mpd_path, + hls_path: hls_path, + mp4_path: mp4_path + } = media + + try_delete_folder(source_disk_path) + + mpd_path |> Paths.web_to_disk() |> try_delete_file() + hls_path |> Paths.web_to_disk() |> try_delete_file() + mp4_path |> Paths.web_to_disk() |> try_delete_file() + hls_path |> Paths.hls_playlist_path() |> Paths.web_to_disk() |> try_delete_file() + + :ok + end + @doc """ Returns an `%Ecto.Changeset{}` for tracking media changes. diff --git a/lib/ambry/media/media.ex b/lib/ambry/media/media.ex index d92807a4..3341a721 100644 --- a/lib/ambry/media/media.ex +++ b/lib/ambry/media/media.ex @@ -13,8 +13,8 @@ defmodule Ambry.Media.Media do alias Ambry.Media.MediaNarrator alias Ambry.Media.PlayerState alias Ambry.Media.Processor - alias Ambry.Narrators.Narrator - alias Ambry.SupplementalFile + alias Ambry.People.Narrator + alias Ambry.Repo.SupplementalFile @statuses [:pending, :processing, :error, :ready] diff --git a/lib/ambry/media/media_flat.ex b/lib/ambry/media/media_flat.ex index 0bd3a5fe..4d0d1661 100644 --- a/lib/ambry/media/media_flat.ex +++ b/lib/ambry/media/media_flat.ex @@ -3,10 +3,10 @@ defmodule Ambry.Media.MediaFlat do A flattened view of media. """ - use Ambry.FlatSchema + use Ambry.Repo.FlatSchema - alias Ambry.Ecto.Types.PersonName - alias Ambry.Ecto.Types.SeriesBook + alias Ambry.Books.SeriesBookType + alias Ambry.People.PersonName schema "media_flat" do field :status, Ecto.Enum, values: [:pending, :processing, :error, :ready] @@ -16,10 +16,10 @@ defmodule Ambry.Media.MediaFlat do field :chapters, :integer field :book, :string field :image_path, :string - field :series, {:array, SeriesBook} + field :series, {:array, SeriesBookType.Type} field :universe, :string - field :authors, {:array, PersonName} - field :narrators, {:array, PersonName} + field :authors, {:array, PersonName.Type} + field :narrators, {:array, PersonName.Type} field :published, :date field :published_format, Ecto.Enum, values: [:full, :year_month, :year] diff --git a/lib/ambry/media/media_narrator.ex b/lib/ambry/media/media_narrator.ex index 87239760..15e1c641 100644 --- a/lib/ambry/media/media_narrator.ex +++ b/lib/ambry/media/media_narrator.ex @@ -8,7 +8,7 @@ defmodule Ambry.Media.MediaNarrator do import Ecto.Changeset alias Ambry.Media.Media - alias Ambry.Narrators.Narrator + alias Ambry.People.Narrator schema "media_narrators" do belongs_to :media, Media diff --git a/lib/ambry/metadata.ex b/lib/ambry/metadata.ex new file mode 100644 index 00000000..2a53c952 --- /dev/null +++ b/lib/ambry/metadata.ex @@ -0,0 +1,5 @@ +defmodule Ambry.Metadata do + @moduledoc false + + use Boundary, deps: [Ambry.Repo], exports: [Audible, GoodReads] +end diff --git a/lib/ambry/narrators.ex b/lib/ambry/narrators.ex deleted file mode 100644 index 9777249c..00000000 --- a/lib/ambry/narrators.ex +++ /dev/null @@ -1,26 +0,0 @@ -defmodule Ambry.Narrators do - @moduledoc """ - Functions for dealing with Narrators. - """ - - import Ecto.Query - - alias Ambry.Narrators.Narrator - alias Ambry.Repo - - @doc """ - Gets a single narrator. - - Raises `Ecto.NoResultsError` if the Narrator does not exist. - """ - def get_narrator!(id), do: Narrator |> preload(:person) |> Repo.get!(id) - - @doc """ - Returns all narrators for use in `Select` components. - """ - def for_select do - query = from n in Narrator, select: {n.name, n.id}, order_by: n.name - - Repo.all(query) - end -end diff --git a/lib/ambry/paths.ex b/lib/ambry/paths.ex index 0f7fcf83..1df62c1e 100644 --- a/lib/ambry/paths.ex +++ b/lib/ambry/paths.ex @@ -3,6 +3,8 @@ defmodule Ambry.Paths do Helpers for paths, like the uploads path. """ + use Boundary + @doc """ The path on disk that uploads are saved to. """ diff --git a/lib/ambry/people.ex b/lib/ambry/people.ex index 556ed116..2ea34eca 100644 --- a/lib/ambry/people.ex +++ b/lib/ambry/people.ex @@ -3,18 +3,33 @@ defmodule Ambry.People do Functions for dealing with People. """ - import Ambry.FileUtils + use Boundary, + deps: [Ambry], + exports: [ + Author, + BookAuthor, + Narrator, + Person, + PersonName, + PersonName.Type + ] + import Ambry.Utils import Ecto.Query + alias Ambry.Paths + alias Ambry.People.Author + alias Ambry.People.Narrator alias Ambry.People.Person alias Ambry.People.PersonFlat alias Ambry.PubSub alias Ambry.Repo + require Logger + @person_direct_assoc_preloads [:authors, :narrators] - def standard_preloads, do: @person_direct_assoc_preloads + def person_standard_preloads, do: @person_direct_assoc_preloads @doc """ Returns a limited list of people and whether or not there are more. @@ -165,6 +180,21 @@ defmodule Ambry.People do end end + defp maybe_delete_image(nil), do: :noop + + defp maybe_delete_image(web_path) do + person_count = Repo.aggregate(from(p in Person, where: p.image_path == ^web_path), :count) + + if person_count == 0 do + disk_path = Paths.web_to_disk(web_path) + + try_delete_file(disk_path) + else + Logger.warning(fn -> "Not deleting file because it's still in use: #{web_path}" end) + {:error, :still_in_use} + end + end + defp get_authored_books_list(person) do %{authors: authors} = Repo.preload(person, authors: [:books]) Enum.flat_map(authors, fn author -> Enum.map(author.books, & &1.title) end) @@ -187,4 +217,40 @@ defmodule Ambry.People do def change_person(%Person{} = person, attrs \\ %{}) do Person.changeset(person, attrs) end + + # Narrators + + @doc """ + Gets a single narrator. + + Raises `Ecto.NoResultsError` if the Narrator does not exist. + """ + def get_narrator!(id), do: Narrator |> preload(:person) |> Repo.get!(id) + + @doc """ + Returns all narrators for use in `Select` components. + """ + def narrators_for_select do + query = from n in Narrator, select: {n.name, n.id}, order_by: n.name + + Repo.all(query) + end + + # Authors + + @doc """ + Gets a single author. + + Raises `Ecto.NoResultsError` if the Author does not exist. + """ + def get_author!(id), do: Author |> preload(:person) |> Repo.get!(id) + + @doc """ + Returns all authors for use in `Select` components. + """ + def authors_for_select do + query = from a in Author, select: {a.name, a.id}, order_by: a.name + + Repo.all(query) + end end diff --git a/lib/ambry/authors/author.ex b/lib/ambry/people/author.ex similarity index 95% rename from lib/ambry/authors/author.ex rename to lib/ambry/people/author.ex index 28d30d1b..65686f64 100644 --- a/lib/ambry/authors/author.ex +++ b/lib/ambry/people/author.ex @@ -1,4 +1,4 @@ -defmodule Ambry.Authors.Author do +defmodule Ambry.People.Author do @moduledoc """ An author writes books. diff --git a/lib/ambry/authors/book_author.ex b/lib/ambry/people/book_author.ex similarity index 86% rename from lib/ambry/authors/book_author.ex rename to lib/ambry/people/book_author.ex index 517af9da..5f82f0a9 100644 --- a/lib/ambry/authors/book_author.ex +++ b/lib/ambry/people/book_author.ex @@ -1,4 +1,4 @@ -defmodule Ambry.Authors.BookAuthor do +defmodule Ambry.People.BookAuthor do @moduledoc """ Join table for authors to books. """ @@ -7,8 +7,8 @@ defmodule Ambry.Authors.BookAuthor do import Ecto.Changeset - alias Ambry.Authors.Author alias Ambry.Books.Book + alias Ambry.People.Author schema "authors_books" do belongs_to :author, Author diff --git a/lib/ambry/narrators/narrator.ex b/lib/ambry/people/narrator.ex similarity index 95% rename from lib/ambry/narrators/narrator.ex rename to lib/ambry/people/narrator.ex index 598a2275..434f1af5 100644 --- a/lib/ambry/narrators/narrator.ex +++ b/lib/ambry/people/narrator.ex @@ -1,4 +1,4 @@ -defmodule Ambry.Narrators.Narrator do +defmodule Ambry.People.Narrator do @moduledoc """ A narrator reads books. diff --git a/lib/ambry/people/person.ex b/lib/ambry/people/person.ex index a9277d18..e055e5c0 100644 --- a/lib/ambry/people/person.ex +++ b/lib/ambry/people/person.ex @@ -9,8 +9,8 @@ defmodule Ambry.People.Person do import Ecto.Changeset - alias Ambry.Authors.Author - alias Ambry.Narrators.Narrator + alias Ambry.People.Author + alias Ambry.People.Narrator schema "people" do has_many :authors, Author, on_replace: :delete diff --git a/lib/ambry/people/person_flat.ex b/lib/ambry/people/person_flat.ex index ba443589..6a47b2f7 100644 --- a/lib/ambry/people/person_flat.ex +++ b/lib/ambry/people/person_flat.ex @@ -3,7 +3,7 @@ defmodule Ambry.People.PersonFlat do A flattened view of people. """ - use Ambry.FlatSchema + use Ambry.Repo.FlatSchema schema "people_flat" do field :name, :string diff --git a/lib/ambry/people/person_name.ex b/lib/ambry/people/person_name.ex index 54812971..b53cabf9 100644 --- a/lib/ambry/people/person_name.ex +++ b/lib/ambry/people/person_name.ex @@ -2,4 +2,27 @@ defmodule Ambry.People.PersonName do @moduledoc false defstruct [:name, :person_name] + + defmodule Type do + @moduledoc false + + use Ecto.Type + + alias Ambry.People.PersonName + + def type, do: :person_name + + def cast(%PersonName{} = person_name) do + {:ok, person_name} + end + + def cast(_person_name), do: :error + + def load({name, person_name}) do + {:ok, struct!(PersonName, name: name, person_name: person_name)} + end + + def dump(%PersonName{name: name, person_name: person_name}), do: {:ok, {name, person_name}} + def dump(_person_name), do: :error + end end diff --git a/lib/ambry/pub_sub.ex b/lib/ambry/pub_sub.ex index 2db684bf..5de42c64 100644 --- a/lib/ambry/pub_sub.ex +++ b/lib/ambry/pub_sub.ex @@ -3,6 +3,8 @@ defmodule Ambry.PubSub do Helper functions for publishing and subscribing to Ambry events. """ + use Boundary, deps: [Ambry.Media], exports: [Message, Publishable] + alias Ambry.Media.Media alias Ambry.PubSub.Message alias Ambry.PubSub.Publishable diff --git a/lib/ambry/reference.ex b/lib/ambry/reference.ex deleted file mode 100644 index 62ae7def..00000000 --- a/lib/ambry/reference.ex +++ /dev/null @@ -1,19 +0,0 @@ -defmodule Ambry.Reference do - @moduledoc false - - alias Ambry.Authors.Author - alias Ambry.Books.Book - alias Ambry.Media.Media - alias Ambry.Narrators.Narrator - alias Ambry.People.Person - alias Ambry.Series.Series - - defstruct [:type, :id] - - def new(%Author{id: id}), do: %__MODULE__{type: :author, id: id} - def new(%Book{id: id}), do: %__MODULE__{type: :book, id: id} - def new(%Media{id: id}), do: %__MODULE__{type: :media, id: id} - def new(%Narrator{id: id}), do: %__MODULE__{type: :narrator, id: id} - def new(%Person{id: id}), do: %__MODULE__{type: :person, id: id} - def new(%Series{id: id}), do: %__MODULE__{type: :series, id: id} -end diff --git a/lib/ambry/repo.ex b/lib/ambry/repo.ex index 70fe2990..273c876c 100644 --- a/lib/ambry/repo.ex +++ b/lib/ambry/repo.ex @@ -5,6 +5,8 @@ defmodule Ambry.Repo do otp_app: :ambry, adapter: Ecto.Adapters.Postgres + use Boundary, deps: [], exports: [FlatSchema, SupplementalFile] + def fetch(queryable, id, opts \\ []) do case get(queryable, id, opts) do nil -> {:error, :not_found} diff --git a/lib/ambry/flat_schema.ex b/lib/ambry/repo/flat_schema.ex similarity index 94% rename from lib/ambry/flat_schema.ex rename to lib/ambry/repo/flat_schema.ex index e5cc362c..94c09e15 100644 --- a/lib/ambry/flat_schema.ex +++ b/lib/ambry/repo/flat_schema.ex @@ -1,4 +1,4 @@ -defmodule Ambry.FlatSchema do +defmodule Ambry.Repo.FlatSchema do @moduledoc false defmacro __using__(_opts) do diff --git a/lib/ambry/supplemental_file.ex b/lib/ambry/repo/supplemental_file.ex similarity index 96% rename from lib/ambry/supplemental_file.ex rename to lib/ambry/repo/supplemental_file.ex index 8ac63c52..eb7ece27 100644 --- a/lib/ambry/supplemental_file.ex +++ b/lib/ambry/repo/supplemental_file.ex @@ -1,4 +1,4 @@ -defmodule Ambry.SupplementalFile do +defmodule Ambry.Repo.SupplementalFile do @moduledoc """ An uploaded file """ diff --git a/lib/ambry/search.ex b/lib/ambry/search.ex index 7ba53b67..ad083759 100644 --- a/lib/ambry/search.ex +++ b/lib/ambry/search.ex @@ -3,17 +3,26 @@ defmodule Ambry.Search do A context for aggregate search across books, authors, narrators and series. """ + use Boundary, + deps: [ + Ambry.Books, + Ambry.Media, + Ambry.People, + Ambry.PubSub, + Ambry.Repo + ], + exports: [IndexManager] + import Ecto.Query alias Ambry.Books alias Ambry.Books.Book + alias Ambry.Books.Series, as: SeriesSchema alias Ambry.People alias Ambry.People.Person alias Ambry.Repo alias Ambry.Search.Index alias Ambry.Search.Record - alias Ambry.Series - alias Ambry.Series.Series, as: SeriesSchema @results_limit 36 @@ -24,9 +33,9 @@ defmodule Ambry.Search do |> query() |> limit(@results_limit) |> all( - books_preload: Books.standard_preloads(), - series_preload: Series.standard_preloads(), - people_preload: People.standard_preloads() + books_preload: Books.book_standard_preloads(), + series_preload: Books.series_standard_preloads(), + people_preload: People.person_standard_preloads() ) end diff --git a/lib/ambry/search/index.ex b/lib/ambry/search/index.ex index b0544962..fa21ed65 100644 --- a/lib/ambry/search/index.ex +++ b/lib/ambry/search/index.ex @@ -5,15 +5,15 @@ defmodule Ambry.Search.Index do import Ecto.Query - alias Ambry.Authors.Author alias Ambry.Books.Book + alias Ambry.Books.Series alias Ambry.Media.Media - alias Ambry.Narrators.Narrator + alias Ambry.People.Author + alias Ambry.People.Narrator alias Ambry.People.Person - alias Ambry.Reference alias Ambry.Repo alias Ambry.Search.Record - alias Ambry.Series.Series + alias Ambry.Search.Reference # Insert @@ -78,7 +78,7 @@ defmodule Ambry.Search.Index do {_count, nil} = Repo.delete_all( from record in Record, - where: record.reference == type(^reference, Ambry.Ecto.Types.Reference) + where: record.reference == type(^reference, Reference.Type) ) reindex_dependents!(type, id) @@ -266,7 +266,7 @@ defmodule Ambry.Search.Index do where: fragment( "? = ANY(?)", - type(^reference, Ambry.Ecto.Types.Reference), + type(^reference, Reference.Type), record.dependencies ) ) diff --git a/lib/ambry/search/record.ex b/lib/ambry/search/record.ex index a149219b..f395a422 100644 --- a/lib/ambry/search/record.ex +++ b/lib/ambry/search/record.ex @@ -4,12 +4,12 @@ defmodule Ambry.Search.Record do """ use Ecto.Schema - alias Ambry.Ecto.Types.Reference + alias Ambry.Search.Reference - @primary_key {:reference, Reference, []} + @primary_key {:reference, Reference.Type, []} schema "search_index" do - field :dependencies, {:array, Reference} + field :dependencies, {:array, Reference.Type} field :primary, :string field :secondary, :string field :tertiary, :string diff --git a/lib/ambry/search/reference.ex b/lib/ambry/search/reference.ex new file mode 100644 index 00000000..ccadb0d1 --- /dev/null +++ b/lib/ambry/search/reference.ex @@ -0,0 +1,49 @@ +defmodule Ambry.Search.Reference do + @moduledoc false + + alias Ambry.Books.Book + alias Ambry.Books.Series + alias Ambry.Media.Media + alias Ambry.People.Author + alias Ambry.People.Narrator + alias Ambry.People.Person + + defstruct [:type, :id] + + def new(%Author{id: id}), do: %__MODULE__{type: :author, id: id} + def new(%Book{id: id}), do: %__MODULE__{type: :book, id: id} + def new(%Media{id: id}), do: %__MODULE__{type: :media, id: id} + def new(%Narrator{id: id}), do: %__MODULE__{type: :narrator, id: id} + def new(%Person{id: id}), do: %__MODULE__{type: :person, id: id} + def new(%Series{id: id}), do: %__MODULE__{type: :series, id: id} + + defmodule Type do + @moduledoc false + + use Ecto.Type + + alias Ambry.Search.Reference + + def type, do: :reference + + def cast(%Reference{} = reference) do + {:ok, reference} + end + + def cast(_reference), do: :error + + def load({type, id}) do + {:ok, struct!(Reference, type: load_type(type), id: id)} + end + + def dump(%Reference{type: type, id: id}), do: {:ok, {to_string(type), id}} + def dump(_reference), do: :error + + defp load_type("author"), do: :author + defp load_type("book"), do: :book + defp load_type("media"), do: :media + defp load_type("narrator"), do: :narrator + defp load_type("person"), do: :person + defp load_type("series"), do: :series + end +end diff --git a/lib/ambry/series.ex b/lib/ambry/series.ex deleted file mode 100644 index a5f9bc02..00000000 --- a/lib/ambry/series.ex +++ /dev/null @@ -1,160 +0,0 @@ -defmodule Ambry.Series do - @moduledoc """ - Functions for dealing with Series. - """ - - import Ambry.Utils - import Ecto.Query - - alias Ambry.PubSub - alias Ambry.Repo - alias Ambry.Series.Series - alias Ambry.Series.SeriesFlat - - @series_direct_assoc_preloads [series_books: [book: [:authors]]] - - def standard_preloads, do: @series_direct_assoc_preloads - - @doc """ - Returns a limited list of series and whether or not there are more. - - By default, it will limit to the first 10 results. Supply `offset` and `limit` - to change this. Also can optionally filter by the given `filter` string. - - ## Examples - - iex> list_series() - {[%SeriesFlat{}, ...], true} - """ - def list_series(offset \\ 0, limit \\ 10, filters \\ %{}, order \\ [asc: :name]) do - over_limit = limit + 1 - - series = - offset - |> SeriesFlat.paginate(over_limit) - |> SeriesFlat.filter(filters) - |> SeriesFlat.order(order) - |> Repo.all() - - series_to_return = Enum.slice(series, 0, limit) - - {series_to_return, series != series_to_return} - end - - @doc """ - Returns the number of series. - - ## Examples - - iex> count_series() - 1 - """ - @spec count_series :: integer() - def count_series do - Repo.aggregate(Series, :count) - end - - @doc """ - Gets a single series. - - Raises `Ecto.NoResultsError` if the Series does not exist. - - ## Examples - - iex> get_series!(123) - %Series{} - - iex> get_series!(456) - ** (Ecto.NoResultsError) - """ - def get_series!(id) do - Series - |> preload(^@series_direct_assoc_preloads) - |> Repo.get!(id) - end - - @doc """ - Creates a series. - - ## Examples - - iex> create_series(%{field: value}) - {:ok, %Series{}} - - iex> create_series(%{field: bad_value}) - {:error, %Ecto.Changeset{}} - """ - def create_series(attrs) do - %Series{} - |> Series.changeset(attrs) - |> Repo.insert() - |> tap_ok(&PubSub.broadcast_create/1) - end - - @doc """ - Updates a series. - - ## Examples - - iex> update_series(series, %{field: new_value}) - {:ok, %Series{}} - - iex> update_series(series, %{field: bad_value}) - {:error, %Ecto.Changeset{}} - """ - def update_series(%Series{} = series, attrs) do - series - |> Series.changeset(attrs) - |> Repo.update() - |> tap_ok(&PubSub.broadcast_create/1) - end - - @doc """ - Deletes a series. - - ## Examples - - iex> delete_series(series) - {:ok, %Series{}} - - iex> delete_series(series) - {:error, %Ecto.Changeset{}} - """ - def delete_series(%Series{} = series) do - series - |> Repo.delete() - |> tap_ok(&PubSub.broadcast_delete/1) - end - - @doc """ - Returns an `%Ecto.Changeset{}` for tracking series changes. - - ## Examples - - iex> change_series(series) - %Ecto.Changeset{data: %Series{}} - """ - def change_series(%Series{} = series, attrs \\ %{}) do - Series.changeset(series, attrs) - end - - @doc """ - Gets a series and all of its books. - - Books are listed in ascending order based on series book number. - """ - def get_series_with_books!(series_id) do - Series - |> preload(series_books: [book: [:authors, series_books: :series]]) - |> Repo.get!(series_id) - end - - @doc """ - Returns all series for use in `Select` components. - """ - def for_select do - query = from s in Series, select: {s.name, s.id}, order_by: s.name - - Repo.all(query) - end -end diff --git a/lib/ambry/series/series_book_type.ex b/lib/ambry/series/series_book_type.ex deleted file mode 100644 index ce221398..00000000 --- a/lib/ambry/series/series_book_type.ex +++ /dev/null @@ -1,5 +0,0 @@ -defmodule Ambry.Series.SeriesBookType do - @moduledoc false - - defstruct [:name, :number] -end diff --git a/lib/ambry/utils.ex b/lib/ambry/utils.ex index 47e70ab0..97e21ebd 100644 --- a/lib/ambry/utils.ex +++ b/lib/ambry/utils.ex @@ -3,6 +3,10 @@ defmodule Ambry.Utils do Grab-bag of helpful utility functions """ + use Boundary + + require Logger + defmacro tap_ok(tuple, fun) do quote bind_quoted: [fun: fun, tuple: tuple] do case tuple do @@ -13,4 +17,45 @@ defmodule Ambry.Utils do tuple end end + + @doc """ + Tries to delete the given file. + + Logs output. + """ + def try_delete_file(nil), do: :noop + + def try_delete_file(disk_path) do + case File.rm(disk_path) do + :ok -> + Logger.info(fn -> "Deleted file: #{disk_path}" end) + :ok + + {:error, posix} -> + Logger.warning(fn -> "Couldn't delete file (#{posix}): #{disk_path}" end) + {:error, posix} + end + end + + @doc """ + Tries to delete the given folder. + + Logs output. + """ + def try_delete_folder(nil), do: :noop + + def try_delete_folder(disk_path) do + case File.rm_rf(disk_path) do + {:ok, paths} -> + for path <- paths, do: Logger.info(fn -> "Deleted file/folder: #{path}" end) + + :ok + + {:error, posix, path} -> + # coveralls-ignore-start + Logger.warning(fn -> "Couldn't delete file/folder (#{posix}): #{path}" end) + {:error, posix, path} + # coveralls-ignore-stop + end + end end diff --git a/lib/ambry_schema/resolvers.ex b/lib/ambry_schema/resolvers.ex index 4e48dfa6..3c4fa53e 100644 --- a/lib/ambry_schema/resolvers.ex +++ b/lib/ambry_schema/resolvers.ex @@ -8,17 +8,17 @@ defmodule AmbrySchema.Resolvers do alias Absinthe.Relay.Connection alias Ambry.Accounts alias Ambry.Accounts.User - alias Ambry.Authors.Author alias Ambry.Books.Book + alias Ambry.Books.Series + alias Ambry.Books.SeriesBook alias Ambry.Hashids alias Ambry.Media.Media alias Ambry.Media.PlayerState - alias Ambry.Narrators.Narrator + alias Ambry.People.Author + alias Ambry.People.Narrator alias Ambry.People.Person alias Ambry.Repo alias Ambry.Search - alias Ambry.Series.Series - alias Ambry.Series.SeriesBook def create_session(%{email: email, password: password}, _resolution) do if user = Accounts.get_user_by_email_and_password(email, password) do diff --git a/lib/ambry_web/components/core_components.ex b/lib/ambry_web/components/core_components.ex index f1c8d54e..0205b9d9 100644 --- a/lib/ambry_web/components/core_components.ex +++ b/lib/ambry_web/components/core_components.ex @@ -14,9 +14,9 @@ defmodule AmbryWeb.CoreComponents do import Phoenix.HTML, only: [raw: 1] alias Ambry.Books.Book + alias Ambry.Books.SeriesBook alias Ambry.Media.Media alias Ambry.Media.PlayerState - alias Ambry.Series.SeriesBook alias AmbryWeb.Admin.UploadHelpers alias AmbryWeb.Components.Autocomplete alias AmbryWeb.Player diff --git a/lib/ambry_web/controllers/download_controller.ex b/lib/ambry_web/controllers/download_controller.ex index 82a20501..51db0285 100644 --- a/lib/ambry_web/controllers/download_controller.ex +++ b/lib/ambry_web/controllers/download_controller.ex @@ -3,7 +3,7 @@ defmodule AmbryWeb.DownloadController do alias Ambry.Hashids alias Ambry.Media - alias Ambry.SupplementalFile + alias Ambry.Repo.SupplementalFile def download_media(conn, params) do with {:ok, [media_id]} <- Hashids.decode(params["media_id"]), diff --git a/lib/ambry_web/live/admin/audit_live/index.ex b/lib/ambry_web/live/admin/audit_live/index.ex index 01d2d94c..bfc8fe85 100644 --- a/lib/ambry_web/live/admin/audit_live/index.ex +++ b/lib/ambry_web/live/admin/audit_live/index.ex @@ -5,8 +5,8 @@ defmodule AmbryWeb.Admin.AuditLive.Index do use AmbryWeb, :admin_live_view - alias Ambry.FileUtils alias Ambry.Media + alias Ambry.Utils @impl Phoenix.LiveView def mount(_params, _session, socket) do @@ -48,7 +48,7 @@ defmodule AmbryWeb.Admin.AuditLive.Index do def handle_event("delete-file", %{"id" => file_id}, socket) do disk_path = Map.fetch!(socket.assigns.deletable_files, file_id) - case FileUtils.try_delete_file(disk_path) do + case Utils.try_delete_file(disk_path) do :ok -> {:noreply, socket @@ -63,7 +63,7 @@ defmodule AmbryWeb.Admin.AuditLive.Index do def handle_event("delete-folder", %{"id" => folder_id}, socket) do disk_path = Map.fetch!(socket.assigns.deletable_folders, folder_id) - case FileUtils.try_delete_folder(disk_path) do + case Utils.try_delete_folder(disk_path) do :ok -> {:noreply, socket diff --git a/lib/ambry_web/live/admin/book_live/form.ex b/lib/ambry_web/live/admin/book_live/form.ex index 53ca4026..47408982 100644 --- a/lib/ambry_web/live/admin/book_live/form.ex +++ b/lib/ambry_web/live/admin/book_live/form.ex @@ -6,6 +6,7 @@ defmodule AmbryWeb.Admin.BookLive.Form do alias Ambry.Books alias Ambry.Books.Book + alias Ambry.People alias AmbryWeb.Admin.BookLive.Form.AudibleImportForm alias AmbryWeb.Admin.BookLive.Form.GoodreadsImportForm alias Ecto.Changeset @@ -18,8 +19,8 @@ defmodule AmbryWeb.Admin.BookLive.Form do |> assign( import: nil, scraping_available: AmbryScraping.web_scraping_available?(), - authors: Ambry.Authors.for_select(), - series: Ambry.Series.for_select() + authors: People.authors_for_select(), + series: Books.series_for_select() )} end @@ -106,8 +107,8 @@ defmodule AmbryWeb.Admin.BookLive.Form do # authors and/or series could have been created, reload the data-lists socket = assign(socket, - authors: Ambry.Authors.for_select(), - series: Ambry.Series.for_select() + authors: People.authors_for_select(), + series: Books.series_for_select() ) new_params = Map.merge(socket.assigns.form.params, book_params) diff --git a/lib/ambry_web/live/admin/book_live/form/audible_import_form.ex b/lib/ambry_web/live/admin/book_live/form/audible_import_form.ex index 17180845..ca4d87f2 100644 --- a/lib/ambry_web/live/admin/book_live/form/audible_import_form.ex +++ b/lib/ambry_web/live/admin/book_live/form/audible_import_form.ex @@ -5,10 +5,11 @@ defmodule AmbryWeb.Admin.BookLive.Form.AudibleImportForm do import AmbryWeb.Admin.Components import AmbryWeb.Admin.Components.RichSelect, only: [rich_select: 1] + alias Ambry.Books + alias Ambry.Books.Series alias Ambry.Metadata.Audible alias Ambry.People.Person alias Ambry.Search - alias Ambry.Series.Series alias Phoenix.LiveView.AsyncResult @impl Phoenix.LiveComponent @@ -169,7 +170,7 @@ defmodule AmbryWeb.Admin.BookLive.Form.AudibleImportForm do |> Enum.zip() |> Enum.map(fn {imported, nil} -> - {:ok, series} = Ambry.Series.create_series(%{name: imported.title}) + {:ok, series} = Books.create_series(%{name: imported.title}) %{"book_number" => imported.sequence, "series_id" => series.id} {imported, existing} -> diff --git a/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.ex b/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.ex index 55ca248f..b633e140 100644 --- a/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.ex +++ b/lib/ambry_web/live/admin/book_live/form/goodreads_import_form.ex @@ -5,10 +5,11 @@ defmodule AmbryWeb.Admin.BookLive.Form.GoodreadsImportForm do import AmbryWeb.Admin.Components import AmbryWeb.Admin.Components.RichSelect, only: [rich_select: 1] + alias Ambry.Books + alias Ambry.Books.Series alias Ambry.Metadata.GoodReads alias Ambry.People.Person alias Ambry.Search - alias Ambry.Series.Series alias Phoenix.LiveView.AsyncResult @impl Phoenix.LiveComponent @@ -219,7 +220,7 @@ defmodule AmbryWeb.Admin.BookLive.Form.GoodreadsImportForm do |> Enum.zip() |> Enum.map(fn {imported, nil} -> - {:ok, series} = Ambry.Series.create_series(%{name: imported.name}) + {:ok, series} = Books.create_series(%{name: imported.name}) %{"book_number" => imported.number, "series_id" => series.id} {imported, existing} -> diff --git a/lib/ambry_web/live/admin/home_live/index.ex b/lib/ambry_web/live/admin/home_live/index.ex index dfca6a5b..d4ab496d 100644 --- a/lib/ambry_web/live/admin/home_live/index.ex +++ b/lib/ambry_web/live/admin/home_live/index.ex @@ -12,7 +12,6 @@ defmodule AmbryWeb.Admin.HomeLive.Index do alias Ambry.Media alias Ambry.People alias Ambry.PubSub - alias Ambry.Series @impl Phoenix.LiveView def mount(_params, _session, socket) do @@ -32,7 +31,7 @@ defmodule AmbryWeb.Admin.HomeLive.Index do defp count_things(socket) do people_count = People.count_people() books_count = Books.count_books() - series_count = Series.count_series() + series_count = Books.count_series() media_count = Media.count_media() files_count = Media.Audit.count_files() users_count = Accounts.count_users() diff --git a/lib/ambry_web/live/admin/media_live/form.ex b/lib/ambry_web/live/admin/media_live/form.ex index 86a08279..e1c594d4 100644 --- a/lib/ambry_web/live/admin/media_live/form.ex +++ b/lib/ambry_web/live/admin/media_live/form.ex @@ -9,6 +9,7 @@ defmodule AmbryWeb.Admin.MediaLive.Form do alias Ambry.Media alias Ambry.Media.Processor alias Ambry.Media.ProcessorJob + alias Ambry.People alias AmbryWeb.Admin.MediaLive.Form.AudibleImportForm alias AmbryWeb.Admin.MediaLive.Form.FileBrowser alias AmbryWeb.Admin.MediaLive.Form.GoodreadsImportForm @@ -26,8 +27,8 @@ defmodule AmbryWeb.Admin.MediaLive.Form do selected_files: MapSet.new(), scraping_available: AmbryScraping.web_scraping_available?(), source_files_expanded: false, - narrators: Ambry.Narrators.for_select(), - books: Ambry.Books.for_select() + narrators: People.narrators_for_select(), + books: Ambry.Books.books_for_select() )} end @@ -120,7 +121,7 @@ defmodule AmbryWeb.Admin.MediaLive.Form do # narrators could have been created, reload the data-lists socket = assign(socket, - narrators: Ambry.Narrators.for_select() + narrators: People.narrators_for_select() ) new_params = Map.merge(socket.assigns.form.params, media_params) diff --git a/lib/ambry_web/live/admin/series_live/form.ex b/lib/ambry_web/live/admin/series_live/form.ex index 4c2e41ce..f1b24412 100644 --- a/lib/ambry_web/live/admin/series_live/form.ex +++ b/lib/ambry_web/live/admin/series_live/form.ex @@ -3,12 +3,11 @@ defmodule AmbryWeb.Admin.SeriesLive.Form do use AmbryWeb, :admin_live_view alias Ambry.Books - alias Ambry.Series alias Ecto.Changeset @impl Phoenix.LiveView def mount(_params, _session, socket) do - {:ok, assign(socket, books: Books.for_select())} + {:ok, assign(socket, books: Books.books_for_select())} end @impl Phoenix.LiveView @@ -17,8 +16,8 @@ defmodule AmbryWeb.Admin.SeriesLive.Form do end defp apply_action(socket, :edit, %{"id" => id}) do - series = Series.get_series!(id) - changeset = Series.change_series(series) + series = Books.get_series!(id) + changeset = Books.change_series(series) socket |> assign_form(changeset) @@ -29,8 +28,8 @@ defmodule AmbryWeb.Admin.SeriesLive.Form do end defp apply_action(socket, :new, _params) do - series = %Series.Series{} - changeset = Series.change_series(series) + series = %Books.Series{} + changeset = Books.change_series(series) socket |> assign_form(changeset) @@ -44,7 +43,7 @@ defmodule AmbryWeb.Admin.SeriesLive.Form do def handle_event("validate", %{"series" => series_params}, socket) do changeset = socket.assigns.series - |> Series.change_series(series_params) + |> Books.change_series(series_params) |> Map.put(:action, :validate) {:noreply, assign_form(socket, changeset)} @@ -55,7 +54,7 @@ defmodule AmbryWeb.Admin.SeriesLive.Form do end defp save_series(socket, :edit, series_params) do - case Series.update_series(socket.assigns.series, series_params) do + case Books.update_series(socket.assigns.series, series_params) do {:ok, series} -> {:noreply, socket @@ -68,7 +67,7 @@ defmodule AmbryWeb.Admin.SeriesLive.Form do end defp save_series(socket, :new, series_params) do - case Series.create_series(series_params) do + case Books.create_series(series_params) do {:ok, series} -> {:noreply, socket diff --git a/lib/ambry_web/live/admin/series_live/index.ex b/lib/ambry_web/live/admin/series_live/index.ex index ccf47dd1..4511965f 100644 --- a/lib/ambry_web/live/admin/series_live/index.ex +++ b/lib/ambry_web/live/admin/series_live/index.ex @@ -7,8 +7,8 @@ defmodule AmbryWeb.Admin.SeriesLive.Index do import AmbryWeb.Admin.PaginationHelpers + alias Ambry.Books alias Ambry.PubSub - alias Ambry.Series @valid_sort_fields [ :name, @@ -78,8 +78,8 @@ defmodule AmbryWeb.Admin.SeriesLive.Index do @impl Phoenix.LiveView def handle_event("delete", %{"id" => id}, socket) do - series = Series.get_series!(id) - {:ok, _} = Series.delete_series(series) + series = Books.get_series!(id) + {:ok, _} = Books.delete_series(series) {:noreply, socket @@ -110,7 +110,7 @@ defmodule AmbryWeb.Admin.SeriesLive.Index do defp list_series(opts, default_sort) do filters = if opts.filter, do: %{search: opts.filter}, else: %{} - Series.list_series( + Books.list_series( page_to_offset(opts.page), limit(), filters, diff --git a/lib/ambry_web/live/author_or_narrator_live.ex b/lib/ambry_web/live/author_or_narrator_live.ex index 0f3f343c..67b51f26 100644 --- a/lib/ambry_web/live/author_or_narrator_live.ex +++ b/lib/ambry_web/live/author_or_narrator_live.ex @@ -6,9 +6,8 @@ defmodule AmbryWeb.AuthorOrNarratorLive do use AmbryWeb, :live_view - alias Ambry.Authors alias Ambry.Books - alias Ambry.Narrators + alias Ambry.People @per_page 36 @@ -47,8 +46,8 @@ defmodule AmbryWeb.AuthorOrNarratorLive do def mount(%{"id" => author_or_narrator_id}, _session, socket) do author_or_narrator = case socket.assigns.live_action do - :author -> Authors.get_author!(author_or_narrator_id) - :narrator -> Narrators.get_narrator!(author_or_narrator_id) + :author -> People.get_author!(author_or_narrator_id) + :narrator -> People.get_narrator!(author_or_narrator_id) end {:ok, diff --git a/lib/ambry_web/live/first_time_setup/setup_live.ex b/lib/ambry_web/live/first_time_setup/setup_live.ex index af972723..ea45f216 100644 --- a/lib/ambry_web/live/first_time_setup/setup_live.ex +++ b/lib/ambry_web/live/first_time_setup/setup_live.ex @@ -8,6 +8,7 @@ defmodule AmbryWeb.FirstTimeSetup.SetupLive do use AmbryWeb, :live_view alias Ambry.Accounts + alias Ambry.Paths @impl Phoenix.LiveView def render(%{state: :create_user} = assigns) do @@ -109,7 +110,7 @@ defmodule AmbryWeb.FirstTimeSetup.SetupLive do def handle_event("save", %{"user" => user_params}, socket) do with {:ok, user} <- Accounts.register_user(user_params), {:ok, _user} <- Accounts.promote_user_to_admin(user) do - Ambry.FirstTimeSetup.disable!() + disable_first_time_setup!() {:noreply, socket @@ -130,4 +131,14 @@ defmodule AmbryWeb.FirstTimeSetup.SetupLive do defp assign_form(socket, %Ecto.Changeset{} = changeset) do assign(socket, :form, to_form(changeset)) end + + @setup_lock_contents """ + This file is created once first-time-setup has been completed. + Please don't delete it. + """ + + # Disables first-time-setup, so that the redirect no longer happens. + defp disable_first_time_setup!(contents \\ @setup_lock_contents) do + File.write!(Paths.uploads_folder_disk_path("setup.lock"), contents) + end end diff --git a/lib/ambry_web/live/person_live.ex b/lib/ambry_web/live/person_live.ex index 2a823897..5eb93ab6 100644 --- a/lib/ambry_web/live/person_live.ex +++ b/lib/ambry_web/live/person_live.ex @@ -110,7 +110,7 @@ defmodule AmbryWeb.PersonLive do """ end - attr :author, Ambry.Authors.Author, required: true + attr :author, Ambry.People.Author, required: true attr :person, People.Person, required: true defp author_name(%{author: %{name: name}, person: %{name: name}} = assigns) do @@ -125,7 +125,7 @@ defmodule AmbryWeb.PersonLive do """ end - attr :narrator, Ambry.Narrators.Narrator, required: true + attr :narrator, Ambry.People.Narrator, required: true attr :person, People.Person, required: true defp narrator_name(%{narrator: %{name: name}, person: %{name: name}} = assigns) do diff --git a/lib/ambry_web/live/search_live/components.ex b/lib/ambry_web/live/search_live/components.ex index 5a49fb5a..69f891d6 100644 --- a/lib/ambry_web/live/search_live/components.ex +++ b/lib/ambry_web/live/search_live/components.ex @@ -6,8 +6,8 @@ defmodule AmbryWeb.SearchLive.Components do use AmbryWeb, :html alias Ambry.Books.Book + alias Ambry.Books.Series alias Ambry.People.Person - alias Ambry.Series.Series def result_tile(%{result: %Book{}} = assigns) do ~H""" diff --git a/lib/ambry_web/live/series_live.ex b/lib/ambry_web/live/series_live.ex index 9916f988..8ba6a911 100644 --- a/lib/ambry_web/live/series_live.ex +++ b/lib/ambry_web/live/series_live.ex @@ -5,7 +5,7 @@ defmodule AmbryWeb.SeriesLive do use AmbryWeb, :live_view - alias Ambry.Series + alias Ambry.Books @impl Phoenix.LiveView def render(assigns) do @@ -28,7 +28,7 @@ defmodule AmbryWeb.SeriesLive do @impl Phoenix.LiveView def mount(%{"id" => series_id}, _session, socket) do - series = Series.get_series_with_books!(series_id) + series = Books.get_series_with_books!(series_id) authors = series.series_books diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs index 52daec31..ebdd4052 100644 --- a/priv/repo/seeds.exs +++ b/priv/repo/seeds.exs @@ -3,12 +3,12 @@ # # mix ecto.seed -alias Ambry.Authors.Author -alias Ambry.Authors.BookAuthor alias Ambry.Books.Book alias Ambry.Media.Media alias Ambry.Media.MediaNarrator -alias Ambry.Narrators.Narrator +alias Ambry.People.Author +alias Ambry.People.BookAuthor +alias Ambry.People.Narrator alias Ambry.People.Person alias Ambry.Repo diff --git a/test/ambry/authors_test.exs b/test/ambry/authors_test.exs deleted file mode 100644 index 5ca46558..00000000 --- a/test/ambry/authors_test.exs +++ /dev/null @@ -1,19 +0,0 @@ -defmodule Ambry.AuthorsTest do - use Ambry.DataCase - - alias Ambry.Authors - - describe "for_select/0" do - test "returns all author names and ids only" do - insert_list(3, :author) - - list = Authors.for_select() - - assert [ - {_, _}, - {_, _}, - {_, _} - ] = list - end - end -end diff --git a/test/ambry/books_test.exs b/test/ambry/books_test.exs index d3ca9dbd..347b34c7 100644 --- a/test/ambry/books_test.exs +++ b/test/ambry/books_test.exs @@ -354,11 +354,11 @@ defmodule Ambry.BooksTest do end end - describe "for_select/0" do + describe "books_for_select/0" do test "returns all book titles and ids only" do insert_list(3, :book) - list = Books.for_select() + list = Books.books_for_select() assert [ {_, _}, @@ -379,4 +379,217 @@ defmodule Ambry.BooksTest do assert description =~ author_name end end + + describe "list_series/0" do + test "returns the first 10 series sorted by name" do + insert_list(11, :series) + + {returned_series, has_more?} = Books.list_series() + + assert has_more? + assert length(returned_series) == 10 + end + end + + describe "list_series/1" do + test "accepts an offset" do + insert_list(11, :series) + + {returned_series, has_more?} = Books.list_series(10) + + refute has_more? + assert length(returned_series) == 1 + end + end + + describe "list_series/2" do + test "accepts a limit" do + insert_list(6, :series) + + {returned_series, has_more?} = Books.list_series(0, 5) + + assert has_more? + assert length(returned_series) == 5 + end + end + + describe "list_series/3" do + test "accepts a 'search' filter that searches by series name" do + [_, _, %{id: id, name: name}, _, _] = insert_list(5, :series) + + {[matched], has_more?} = Books.list_series(0, 10, %{search: name}) + + refute has_more? + assert matched.id == id + end + end + + describe "list_series/4" do + test "allows sorting results by any field on the schema" do + %{id: series1_id} = insert(:series, name: "Apple") + %{id: series2_id} = insert(:series, name: "Banana") + %{id: series3_id} = insert(:series, name: "Carrot") + + {series, false} = Books.list_series(0, 10, %{}, :name) + + assert [ + %{id: ^series1_id}, + %{id: ^series2_id}, + %{id: ^series3_id} + ] = series + + {series, false} = Books.list_series(0, 10, %{}, {:desc, :name}) + + assert [ + %{id: ^series3_id}, + %{id: ^series2_id}, + %{id: ^series1_id} + ] = series + end + end + + describe "count_series/0" do + test "returns the number of series in the database" do + insert_list(3, :series) + + assert 3 = Books.count_series() + end + end + + describe "get_series!/1" do + test "raises if id is invalid" do + assert_raise Ecto.NoResultsError, fn -> + Books.get_series!(-1) + end + end + + test "returns the series with the given id" do + %{id: id} = insert(:series) + assert %Books.Series{id: ^id} = Books.get_series!(id) + end + end + + describe "create_series/1" do + test "requires name to be set" do + {:error, changeset} = Books.create_series(%{}) + + assert %{ + name: ["can't be blank"] + } = errors_on(changeset) + end + + test "validates name when given" do + {:error, changeset} = Books.create_series(%{name: ""}) + + assert %{ + name: ["can't be blank"] + } = errors_on(changeset) + end + + test "creates a series when given valid attributes" do + %{name: name} = params = params_for(:series) + + assert {:ok, series} = Books.create_series(params) + + assert %{name: ^name} = series + end + + test "can create a series with nested book associations" do + %{id: book_id} = insert(:book, series_books: []) + + %{name: name} = series_params = params_for(:series) + + %{book_number: book_number} = + series_book_params = params_for(:series_book, book_id: book_id) + + params = Map.put(series_params, :series_books, [series_book_params]) + + assert {:ok, series} = Books.create_series(params) + + book_number_decimal = Decimal.new(book_number) + + assert %{ + name: ^name, + series_books: [ + %{ + book_number: ^book_number_decimal, + book_id: ^book_id + } + ] + } = series + end + end + + describe "update_series/2" do + test "updates a series name" do + series = insert(:series) + %{name: new_name} = params_for(:series) + + {:ok, updated_series} = Books.update_series(series, %{name: new_name}) + + assert updated_series.name == new_name + end + end + + describe "delete_series/1" do + test "deletes a series" do + series = insert(:series) + + {:ok, _deleted_series} = Books.delete_series(series) + + assert_raise Ecto.NoResultsError, fn -> + Books.get_series!(series.id) + end + end + end + + describe "change_series/1" do + test "returns an unchanged changeset for a series" do + series = insert(:series) + + changeset = Books.change_series(series) + + assert %Ecto.Changeset{} = changeset + end + end + + describe "change_series/2" do + test "returns a changeset for a series" do + series = insert(:series) + %{name: new_name} = params_for(:series) + + changeset = Books.change_series(series, %{name: new_name}) + + assert %Ecto.Changeset{valid?: true} = changeset + assert new_name == Ecto.Changeset.get_change(changeset, :name) + end + end + + describe "get_series_with_books!/1" do + test "gets a series and all of its books" do + %{id: book_id, series_books: [%{series_id: series_id} | _other_series]} = insert(:book) + + series = Books.get_series_with_books!(series_id) + + assert %Books.Series{ + series_books: [ + %Books.SeriesBook{book: %Ambry.Books.Book{id: ^book_id}} + ] + } = series + end + end + + describe "series_for_select/0" do + test "returns all series names and ids only" do + insert_list(3, :series) + + list = Books.series_for_select() + + assert [ + {_, _}, + {_, _}, + {_, _} + ] = list + end + end end diff --git a/test/ambry/first_time_setup_test.exs b/test/ambry/first_time_setup_test.exs deleted file mode 100644 index 74941166..00000000 --- a/test/ambry/first_time_setup_test.exs +++ /dev/null @@ -1,13 +0,0 @@ -defmodule Ambry.FirstTimeSetupTest do - use Ambry.DataCase - - alias Ambry.FirstTimeSetup - - describe "disable!/0" do - test "creates a lock file in the uploads folder" do - assert :ok = FirstTimeSetup.disable!("test contents") - - assert File.read!(Ambry.Paths.uploads_folder_disk_path("setup.lock")) == "test contents" - end - end -end diff --git a/test/ambry/narrators_test.exs b/test/ambry/narrators_test.exs deleted file mode 100644 index 6b519081..00000000 --- a/test/ambry/narrators_test.exs +++ /dev/null @@ -1,19 +0,0 @@ -defmodule Ambry.NarratorsTest do - use Ambry.DataCase - - alias Ambry.Narrators - - describe "for_select/0" do - test "returns all narrator names and ids only" do - insert_list(3, :narrator) - - list = Narrators.for_select() - - assert [ - {_, _}, - {_, _}, - {_, _} - ] = list - end - end -end diff --git a/test/ambry/ecto/types/person_name_test.exs b/test/ambry/people/person_name/type_test.exs similarity index 58% rename from test/ambry/ecto/types/person_name_test.exs rename to test/ambry/people/person_name/type_test.exs index e52f1c4e..0d8ec934 100644 --- a/test/ambry/ecto/types/person_name_test.exs +++ b/test/ambry/people/person_name/type_test.exs @@ -1,40 +1,39 @@ -defmodule Ambry.Ecto.Types.PersonNameTest do +defmodule Ambry.People.PersonName.TypeTest do use Ambry.DataCase - alias Ambry.Ecto.Types.PersonName, as: PersonNameType alias Ambry.People.PersonName describe "type/0" do test "returns `:person_name`" do - assert :person_name = PersonNameType.type() + assert :person_name = PersonName.Type.type() end end describe "cast/1" do test "accepts a PersonName struct" do - assert {:ok, %PersonName{}} = PersonNameType.cast(%PersonName{}) + assert {:ok, %PersonName{}} = PersonName.Type.cast(%PersonName{}) end test "error for anything else" do - assert :error = PersonNameType.cast("foo") + assert :error = PersonName.Type.cast("foo") end end describe "load/1" do test "loads a tuple from the database into a PersonName struct" do assert {:ok, %PersonName{name: "Foo", person_name: "Bar"}} = - PersonNameType.load({"Foo", "Bar"}) + PersonName.Type.load({"Foo", "Bar"}) end end describe "dump/1" do test "dumps a PersonName struct to the database as a tuple" do assert {:ok, {"Foo", "Bar"}} = - PersonNameType.dump(%PersonName{name: "Foo", person_name: "Bar"}) + PersonName.Type.dump(%PersonName{name: "Foo", person_name: "Bar"}) end test "error for anything else" do - assert :error = PersonNameType.dump("foo") + assert :error = PersonName.Type.dump("foo") end end end diff --git a/test/ambry/people_test.exs b/test/ambry/people_test.exs index 3205779c..d105d718 100644 --- a/test/ambry/people_test.exs +++ b/test/ambry/people_test.exs @@ -341,4 +341,32 @@ defmodule Ambry.PeopleTest do assert %Ecto.Changeset{valid?: true} = changeset end end + + describe "authors_for_select/0" do + test "returns all author names and ids only" do + insert_list(3, :author) + + list = People.authors_for_select() + + assert [ + {_, _}, + {_, _}, + {_, _} + ] = list + end + end + + describe "narrators_for_select/0" do + test "returns all narrator names and ids only" do + insert_list(3, :narrator) + + list = People.narrators_for_select() + + assert [ + {_, _}, + {_, _}, + {_, _} + ] = list + end + end end diff --git a/test/ambry/search/index_test.exs b/test/ambry/search/index_test.exs index cb91a74a..a7fc6849 100644 --- a/test/ambry/search/index_test.exs +++ b/test/ambry/search/index_test.exs @@ -3,10 +3,13 @@ defmodule Ambry.Search.IndexTest do use Ambry.DataCase - alias Ambry.Reference + alias Ambry.Books + alias Ambry.Media + alias Ambry.People alias Ambry.Repo alias Ambry.Search.Index alias Ambry.Search.Record + alias Ambry.Search.Reference describe "insert(:book, id)" do test "indexes a new book" do @@ -107,7 +110,7 @@ defmodule Ambry.Search.IndexTest do } = fetch_record(book) new_book_title = "New Book Title" - {:ok, _book} = Ambry.Books.update_book(book, %{title: new_book_title}) + {:ok, _book} = Books.update_book(book, %{title: new_book_title}) assert :ok = Index.update!(:book, book.id) @@ -136,7 +139,7 @@ defmodule Ambry.Search.IndexTest do refute media_ref in book_two_record.dependencies refute narrator_ref in book_two_record.dependencies - {:ok, _book_two} = Ambry.Media.update_media(media, %{book_id: book_two.id}, for: :update) + {:ok, _book_two} = Media.update_media(media, %{book_id: book_two.id}, for: :update) assert :ok = Index.update!(:media, media.id) book_one_record = fetch_record(book_one) @@ -187,7 +190,7 @@ defmodule Ambry.Search.IndexTest do assert tertiary =~ person.name {:ok, _person} = - Ambry.People.update_person(person, %{ + People.update_person(person, %{ name: "PersonName", authors: [%{id: author.id, name: "AuthorName"}], narrators: [%{id: narrator.id, name: "NarratorName"}] @@ -238,7 +241,7 @@ defmodule Ambry.Search.IndexTest do assert %{primary: ^series_name} = fetch_record(series) {:ok, _updated_series} = - Ambry.Series.update_series(series, %{ + Books.update_series(series, %{ series_books_drop: [0, 1], series_books: %{ 0 => %{id: series_book_id1}, @@ -257,7 +260,7 @@ defmodule Ambry.Search.IndexTest do Repo.one( from record in Record, - where: record.reference == type(^reference, Ambry.Ecto.Types.Reference) + where: record.reference == type(^reference, Reference.Type) ) end end diff --git a/test/ambry/search_test.exs b/test/ambry/search_test.exs index 6f2c08af..0b888902 100644 --- a/test/ambry/search_test.exs +++ b/test/ambry/search_test.exs @@ -1,10 +1,12 @@ defmodule Ambry.SearchTest do use Ambry.DataCase + import Ambry.Search.IndexFactory + alias Ambry.Books.Book + alias Ambry.Books.Series alias Ambry.People.Person alias Ambry.Search - alias Ambry.Series.Series describe "search/1" do test "returns book by title" do diff --git a/test/ambry/series_test.exs b/test/ambry/series_test.exs deleted file mode 100644 index 6fffaefa..00000000 --- a/test/ambry/series_test.exs +++ /dev/null @@ -1,218 +0,0 @@ -defmodule Ambry.SeriesTest do - use Ambry.DataCase - - alias Ambry.Series - - describe "list_series/0" do - test "returns the first 10 series sorted by name" do - insert_list(11, :series) - - {returned_series, has_more?} = Series.list_series() - - assert has_more? - assert length(returned_series) == 10 - end - end - - describe "list_series/1" do - test "accepts an offset" do - insert_list(11, :series) - - {returned_series, has_more?} = Series.list_series(10) - - refute has_more? - assert length(returned_series) == 1 - end - end - - describe "list_series/2" do - test "accepts a limit" do - insert_list(6, :series) - - {returned_series, has_more?} = Series.list_series(0, 5) - - assert has_more? - assert length(returned_series) == 5 - end - end - - describe "list_series/3" do - test "accepts a 'search' filter that searches by series name" do - [_, _, %{id: id, name: name}, _, _] = insert_list(5, :series) - - {[matched], has_more?} = Series.list_series(0, 10, %{search: name}) - - refute has_more? - assert matched.id == id - end - end - - describe "list_series/4" do - test "allows sorting results by any field on the schema" do - %{id: series1_id} = insert(:series, name: "Apple") - %{id: series2_id} = insert(:series, name: "Banana") - %{id: series3_id} = insert(:series, name: "Carrot") - - {series, false} = Series.list_series(0, 10, %{}, :name) - - assert [ - %{id: ^series1_id}, - %{id: ^series2_id}, - %{id: ^series3_id} - ] = series - - {series, false} = Series.list_series(0, 10, %{}, {:desc, :name}) - - assert [ - %{id: ^series3_id}, - %{id: ^series2_id}, - %{id: ^series1_id} - ] = series - end - end - - describe "count_series/0" do - test "returns the number of series in the database" do - insert_list(3, :series) - - assert 3 = Series.count_series() - end - end - - describe "get_series!/1" do - test "raises if id is invalid" do - assert_raise Ecto.NoResultsError, fn -> - Series.get_series!(-1) - end - end - - test "returns the series with the given id" do - %{id: id} = insert(:series) - assert %Series.Series{id: ^id} = Series.get_series!(id) - end - end - - describe "create_series/1" do - test "requires name to be set" do - {:error, changeset} = Series.create_series(%{}) - - assert %{ - name: ["can't be blank"] - } = errors_on(changeset) - end - - test "validates name when given" do - {:error, changeset} = Series.create_series(%{name: ""}) - - assert %{ - name: ["can't be blank"] - } = errors_on(changeset) - end - - test "creates a series when given valid attributes" do - %{name: name} = params = params_for(:series) - - assert {:ok, series} = Series.create_series(params) - - assert %{name: ^name} = series - end - - test "can create a series with nested book associations" do - %{id: book_id} = insert(:book, series_books: []) - - %{name: name} = series_params = params_for(:series) - - %{book_number: book_number} = - series_book_params = params_for(:series_book, book_id: book_id) - - params = Map.put(series_params, :series_books, [series_book_params]) - - assert {:ok, series} = Series.create_series(params) - - book_number_decimal = Decimal.new(book_number) - - assert %{ - name: ^name, - series_books: [ - %{ - book_number: ^book_number_decimal, - book_id: ^book_id - } - ] - } = series - end - end - - describe "update_series/2" do - test "updates a series name" do - series = insert(:series) - %{name: new_name} = params_for(:series) - - {:ok, updated_series} = Series.update_series(series, %{name: new_name}) - - assert updated_series.name == new_name - end - end - - describe "delete_series/1" do - test "deletes a series" do - series = insert(:series) - - {:ok, _deleted_series} = Series.delete_series(series) - - assert_raise Ecto.NoResultsError, fn -> - Series.get_series!(series.id) - end - end - end - - describe "change_series/1" do - test "returns an unchanged changeset for a series" do - series = insert(:series) - - changeset = Series.change_series(series) - - assert %Ecto.Changeset{} = changeset - end - end - - describe "change_series/2" do - test "returns a changeset for a series" do - series = insert(:series) - %{name: new_name} = params_for(:series) - - changeset = Series.change_series(series, %{name: new_name}) - - assert %Ecto.Changeset{valid?: true} = changeset - assert new_name == Ecto.Changeset.get_change(changeset, :name) - end - end - - describe "get_series_with_books!/1" do - test "gets a series and all of its books" do - %{id: book_id, series_books: [%{series_id: series_id} | _other_series]} = insert(:book) - - series = Series.get_series_with_books!(series_id) - - assert %Series.Series{ - series_books: [ - %Series.SeriesBook{book: %Ambry.Books.Book{id: ^book_id}} - ] - } = series - end - end - - describe "for_select/0" do - test "returns all series names and ids only" do - insert_list(3, :series) - - list = Series.for_select() - - assert [ - {_, _}, - {_, _}, - {_, _} - ] = list - end - end -end diff --git a/test/ambry_schema/search_test.exs b/test/ambry_schema/search_test.exs index f3778232..74cd8b7e 100644 --- a/test/ambry_schema/search_test.exs +++ b/test/ambry_schema/search_test.exs @@ -3,6 +3,7 @@ defmodule AmbrySchema.SearchTest do import Absinthe.Relay.Node, only: [to_global_id: 2] import Ambry.GraphQLSigil + import Ambry.Search.IndexFactory setup :register_and_put_user_api_token diff --git a/test/ambry_web/live/search_live_test.exs b/test/ambry_web/live/search_live_test.exs index e86ea51c..97ce2534 100644 --- a/test/ambry_web/live/search_live_test.exs +++ b/test/ambry_web/live/search_live_test.exs @@ -1,6 +1,7 @@ defmodule AmbryWeb.SearchLiveTest do use AmbryWeb.ConnCase + import Ambry.Search.IndexFactory import Phoenix.LiveViewTest setup :register_and_log_in_user diff --git a/test/support/data_case.ex b/test/support/data_case.ex index b65a91b3..4e9a485f 100644 --- a/test/support/data_case.ex +++ b/test/support/data_case.ex @@ -14,6 +14,7 @@ defmodule Ambry.DataCase do this option is not recommended for other databases. """ + use Boundary, top_level?: true, check: [in: false, out: false] use ExUnit.CaseTemplate alias Ecto.Adapters.SQL.Sandbox diff --git a/test/support/factory.ex b/test/support/factory.ex index 1a984f98..490978b2 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -1,21 +1,21 @@ defmodule Ambry.Factory do @moduledoc false + use Boundary, top_level?: true, check: [in: false, out: false] use ExMachina.Ecto, repo: Ambry.Repo alias Ambry.Accounts.User - alias Ambry.Authors.Author - alias Ambry.Authors.BookAuthor alias Ambry.Books.Book + alias Ambry.Books.Series + alias Ambry.Books.SeriesBook alias Ambry.Media.Bookmark alias Ambry.Media.Media alias Ambry.Media.MediaNarrator alias Ambry.Media.PlayerState - alias Ambry.Narrators.Narrator + alias Ambry.People.Author + alias Ambry.People.BookAuthor + alias Ambry.People.Narrator alias Ambry.People.Person - alias Ambry.Search.Index - alias Ambry.Series.Series - alias Ambry.Series.SeriesBook # Users @@ -231,10 +231,4 @@ defmodule Ambry.Factory do false = File.exists?(disk_path) File.touch!(disk_path) end - - # Search indexing - - def insert_index!(%Book{id: id}), do: Index.insert!(:book, id) - def insert_index!(%Person{id: id}), do: Index.insert!(:person, id) - def insert_index!(%Series{id: id}), do: Index.insert!(:series, id) end diff --git a/test/support/search/index_factory.ex b/test/support/search/index_factory.ex new file mode 100644 index 00000000..2f65b675 --- /dev/null +++ b/test/support/search/index_factory.ex @@ -0,0 +1,12 @@ +defmodule Ambry.Search.IndexFactory do + @moduledoc false + + alias Ambry.Books.Book + alias Ambry.Books.Series + alias Ambry.People.Person + alias Ambry.Search.Index + + def insert_index!(%Book{id: id}), do: Index.insert!(:book, id) + def insert_index!(%Person{id: id}), do: Index.insert!(:person, id) + def insert_index!(%Series{id: id}), do: Index.insert!(:series, id) +end From 5c4e04fdb2f01d42b7c63901413e8e9f85e670b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Dos=C3=A9?= Date: Tue, 16 Apr 2024 12:37:05 -0700 Subject: [PATCH 08/13] Glass --- lib/ambry_web/components/core_components.ex | 9 ++++++--- lib/ambry_web/components/layouts.ex | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/ambry_web/components/core_components.ex b/lib/ambry_web/components/core_components.ex index 0205b9d9..899c7930 100644 --- a/lib/ambry_web/components/core_components.ex +++ b/lib/ambry_web/components/core_components.ex @@ -58,7 +58,7 @@ defmodule AmbryWeb.CoreComponents do >