38 Commits

Author SHA1 Message Date
d8a5d93342 new map-focused redesign
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-29 21:34:26 -04:00
2a72d1cecb correct Ripped Bodice URL [skip]
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-27 14:29:25 +00:00
537be9ed04 Return Three Lives to its original corner location.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-27 02:11:37 +00:00
f23f669f76 Idlewild Books appears to have transitioned entirely to language classes as opposed to bookselling
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-27 02:05:02 +00:00
e32bbee062 remove Boulevard Books; correct Alabaster Bookshop Instagram link
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-27 02:02:16 +00:00
9228769274 Add Topos Too, currently in a "soft opening"
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-26 23:43:01 +00:00
0b850b97e1 Relocate Adanne Bookshop to Ralph Ave
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-21 20:52:09 +00:00
72f517fdbb Add Village Works on St. Marks
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-21 18:14:13 +00:00
e2392081bf Merge pull request 'Update caddy Docker tag to v2.7.5' (#7) from renovate/caddy-2.x into master
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #7
2023-10-20 01:39:25 +00:00
52be65f6ba Update caddy Docker tag to v2.7.5
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-17 17:01:06 +00:00
3af97b1d4d [skip] set partial: false
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-11 21:54:14 -04:00
0297cca236 [skip] hide internal commits, only show four lines
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-11 21:51:22 -04:00
03e0a54399 upgrade build configuration [skip] 2023-10-11 21:46:46 -04:00
18d7a3e7b1 add this fancy recent changes module
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-11 21:37:28 -04:00
a33c4ca92b move Burnt Books into Hey Kids!, update archestratus to note there's no cafe anymore
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-09 02:37:41 +00:00
b2ad4697f0 add Lofty Pigeon Books
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-01 00:59:15 +00:00
084a613467 Move Yu and Me to Essex Market
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-09-20 03:48:15 +00:00
60b0023a9d update Archestratus location
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-09-07 02:14:08 +00:00
44e4ae5fa9 Merge pull request 'Update caddy Docker tag to v2.7.4' (#6) from renovate/caddy-2.x into master
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #6
2023-08-19 00:54:48 +00:00
63efd8c449 Update caddy Docker tag to v2.7.4
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-08-18 17:01:02 +00:00
bd390adcc1 Merge pull request 'Update caddy Docker tag to v2.7.3' (#5) from renovate/caddy-2.x into master
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Reviewed-on: #5
2023-08-14 20:31:21 +00:00
439b1fe95e Update caddy Docker tag to v2.7.3
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-08-14 18:00:50 +00:00
898e2b6136 Merge pull request 'Update caddy Docker tag to v2.7.2' (#4) from renovate/caddy-2.x into master
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #4
2023-08-05 01:13:45 +00:00
60b2df5e90 Add The Ripped Bodice
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is running
2023-08-05 01:10:13 +00:00
a595129d6d Update caddy Docker tag to v2.7.2
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-08-04 16:00:50 +00:00
7efe413ce4 catland moved down a storefront
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-07-14 13:24:42 +00:00
f07bda7dfa move astoria bookshop to its new location
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-07-14 13:21:54 +00:00
aad72fd649 remove Greenlight in Flatbush (closed in May)
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-06-18 01:57:34 +00:00
51b369dfbc update runner location
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-05-07 14:19:46 +00:00
c8600fc92d remove GA
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2023-05-07 14:18:27 +00:00
9268a94fb0 Add Taylor & Co. Books
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-23 23:21:38 +00:00
54ffbadf2e add description to Left Bank Books, since I was finally able to visit.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-22 21:46:37 +00:00
b9508dbc68 Add passageway books in Chelsea
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-22 21:43:39 +00:00
94d7b26ab9 Merge pull request 'Update node Docker tag to v20' (#3) from renovate/node-20.x into master
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #3
2023-04-21 02:22:42 +00:00
df8be56edc Update node Docker tag to v20
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-21 00:00:42 +00:00
3308da03e0 remove Avoid-The-Day, it closed
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
thanks to scott for the update
2023-04-17 21:36:22 +00:00
7a6c7f4df2 update hash-based routing tracking
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-16 16:46:36 +00:00
d9ef8e9655 add local "plausible" analytics
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-04-15 14:53:44 +00:00
6 changed files with 416 additions and 391 deletions

View File

@@ -1,4 +1,11 @@
pipeline:
clone:
git:
image: woodpeckerci/plugin-git
settings:
partial: false
depth: 15
steps:
build:
image: docker
commands:
@@ -6,8 +13,8 @@
- docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD registry.yetaga.in
- docker build -t registry.yetaga.in/bookstores:latest .
- docker push registry.yetaga.in/bookstores:latest
- 'curl http://172.17.0.1:4000/api/fetch -H "Authorization: Bearer $COMPOSE_TOKEN"'
- 'curl http://172.17.0.1:4000/api/update -H "Authorization: Bearer $COMPOSE_TOKEN"'
- 'curl http://100.113.98.36:4000/api/fetch -H "Authorization: Bearer $COMPOSE_TOKEN"'
- 'curl http://100.113.98.36:4000/api/update -H "Authorization: Bearer $COMPOSE_TOKEN"'
secrets: [docker_username, docker_password, compose_token]
when:
branch: "master"

View File

@@ -1,10 +1,10 @@
FROM node:19-slim AS builder
FROM node:20 AS builder
COPY . /src
WORKDIR /src
RUN npm install && node ./index.js
FROM caddy:2.6.4
FROM caddy:2.7.5
COPY img /usr/share/caddy/img
COPY css /usr/share/caddy/css

View File

@@ -1,38 +1,33 @@
/* Page Specific CSS */
body {
font-family: "Lato", sans-serif;
background: #fff;
color: #333;
font-size: 18px;
font-size: 16px;
margin: 0px;
padding: 20px 0px;
padding: 0px;
}
h1 {
font-size: 80px;
font-size: 40px;
font-family: "Acme", sans-serif;
font-weight: normal;
margin: 0px;
}
h2 {
font-size: 40px;
font-size: 30px;
font-family: "Acme", sans-serif;
font-weight: normal;
margin: 0px 0px;
}
h3 {
font-family: "Acme", sans-serif;
font-size: 30px;
font-size: 20px;
margin: 10px 0px;
}
h4 {
font-family: "Lato", sans-serif;
font-size: 24px;
font-size: 14px;
}
img {
width: 100%;
}
p a,
a {
color: #333;
@@ -43,10 +38,6 @@ a {
a:hover {
color: #47ccfc;
}
small {
padding: 10px 0px;
font-size: 10px;
}
p {
margin: 0px;
padding: 0px;
@@ -56,22 +47,14 @@ li {
line-height: 19px;
font-size: 15px;
}
ol {
line-height: 24px;
}
.clearfix {
clear: both;
}
.hidden {
display: none;
}
#map {
height: 500px;
width: 480px;
min-width: 300px;
height: 100vh;
width: 100%;
background: #ffffff;
float: left;
}
#map a {
border: none;
@@ -83,13 +66,19 @@ ol {
}
#wrapper {
margin: 0px auto;
padding: 40px;
max-width: 1000px;
max-width: 500px;
position: absolute;
top: 10px;
right: 10px;
bottom: 10px;
overflow: scroll;
}
.container {
margin: 24px 0px;
.bubble {
background-color: white;
margin: 10px 0px;
padding: 10px;
border-radius: 3px;
}
ul.nav {
@@ -105,7 +94,7 @@ ul.nav li {
}
ul.nav li:not(:first-child) {
border-left: 1px #333 solid;
padding-left: 10px;
padding-left: 5px;
}
ul.nav li h2 {
font-family: "Lato";
@@ -126,15 +115,9 @@ ul.nav li a:hover {
font-weight: 700;
}
#selected {
max-width: 500px;
width: 100%;
float: left;
padding: 5px 10px;
}
#selected .description {
padding-top: 7px;
font-size: 16px;
padding: 4px 0px;
line-height: 22px;
text-align: justify;
}
@@ -143,61 +126,55 @@ ul.nav li a:hover {
margin: 15px 0px;
padding: 0px;
}
#info {
max-width: 500px;
width: 100%;
float: left;
padding: 5px 10px;
}
.storeDetails {
font-size: 15px;
display: inline;
padding-right: 6px;
}
#info p {
font-size: 15px;
padding: 4px;
line-height: 22px;
text-align: justify;
}
#info details {
font-size: 15px;
line-height: 22px;
text-align: justify;
}
#info details summary {
text-decoration: underline;
cursor: pointer;
}
#Stores {
margin: 0 auto;
width: 80%;
}
#Stores tr {
cursor: pointer;
}
#Stores tr td {
padding: 4px 10px;
padding: 2px 0px;
}
#Stores tr:not(:last-child) td {
border-bottom: 1px #ddd solid;
}
@media only screen and (-webkit-min-device-pixel-ratio: 2) and (min-width: 320px) and (max-width: 1120px) {
h1 {
font-size: 60px;
}
body {
margin: 0px;
padding: 5px;
}
#wrapper {
max-width: 480px;
padding-top: 20px;
position: static;
padding: 10px;
}
.bubble {
margin: 0px;
padding: 0px;
border-radius: 0px;
}
#map {
height: 400px;
}
#Stores,
#map {
min-width: 224px;
width: 100%;
}
#map,
#info,
#selected {
width: 100%;
margin: 10px 0px;
padding: 0;
}
}

View File

@@ -1,20 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script
async=""
src="https://www.googletagmanager.com/gtag/js?id=G-BNVKSB6DVW"
defer=""
data-domain="nycbookstores.org"
src="https://stats.yetaga.in/js/script.hash.outbound-links.js"
></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
gtag("config", "G-BNVKSB6DVW");
</script>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<title>
@@ -40,7 +31,7 @@
media="screen"
rel="stylesheet"
type="text/css"
href="/css/site.css?1678239113605"
href="/css/site.css?1698627633277"
/>
<meta
property="title"
@@ -75,15 +66,11 @@
/>
</head>
<body>
<div id="map"></div>
<div id="wrapper">
<h1>NYC Bookstores</h1>
<div>
<header class="bubble">
<h1>NYC Bookstores</h1>
<ul class="nav">
<li>
<h2 id="subhed">
The Many Independent Bookstores of New York City
</h2>
</li>
<li>
<a id="viewInfo" href="#info" onclick="event.preventDefault()"
>intro</a
@@ -102,73 +89,87 @@
>
</li>
</ul>
</div>
<div class="container">
<div id="map"></div>
<div id="info">
<p>
New York City loves its independent bookstores. It
<a
href="https://www.nytimes.com/2006/10/15/nyregion/thecity/15book.html"
target="_blank"
>eulogizes those that have faded</a
>
and celebrates when new ventures are launched. And while the
historic
<a
href="https://untappedcities.com/2015/08/26/4th-avenue-the-history-of-nycs-book-row/"
target="_blank"
>Book Row may have passed away in the 80s</a
>, there are still many indie bookstores dotting the map, across all
five boroughs. Here, I have attempted to collect all of the
currently-open general-interest independent booksellers in NYC. Any
store with regular-ish hours (excluding religious booksellers and
appointment-only rare book sellers) is included.
</p>
<p>
While Manhattan and Brooklyn still lead the pack, Queens has a
respectable number of stores, and all five boroughs are represented,
with the Bronx and Staten Island both hosting lone independent
stores. Lower Manhattan has the highest density of booksellers.
</p>
<p>
The listings here are kept up-to-date to the best of my ability;
however, I make no promises about either the accuracy or reliability
of the information. If you spot an error, or I've missed a shop,
please let me know by
<a href="mailto:delta.mu.alpha@gmail.com" target="_blank">email</a>,
<a href="https://icosahedron.website/@lazyreader" target="_blank"
>mastodon</a
>, or
<a href="https://www.twitter.com/alazyreader" target="_blank"
>twitter</a
>. Originally based on the "<a
href="https://github.com/jlord/hack-spots"
target="_blank"
>Hack Spots</a
>" website by
<a href="https://www.twitter.com/jllord" target="_blank">@jllord</a>
(although I don't believe any of the actual underlying code still
survives at this point).
</p>
<p>
There are currently <span id="storeCount">111</span> stores indexed
on this page. Last updated
<span id="updatedOn">March 7, 2023</span>.
</p>
</div>
<div id="selected"></div>
</header>
<div id="info" class="bubble">
<p>
New York City loves its independent bookstores. It
<a
href="https://www.nytimes.com/2006/10/15/nyregion/thecity/15book.html"
target="_blank"
>eulogizes those that have faded</a
>
and celebrates when new ventures are launched. And while the historic
<a
href="https://untappedcities.com/2015/08/26/4th-avenue-the-history-of-nycs-book-row/"
target="_blank"
>Book Row may have passed away in the 80s</a
>, there are still many indie bookstores dotting the map, across all
five boroughs. Here, I have attempted to collect all of the
currently-open general-interest independent booksellers in NYC. Any
store with regular-ish hours (excluding religious booksellers and
appointment-only rare book sellers) is included.
</p>
<p>
While Manhattan and Brooklyn still lead the pack, Queens has a
respectable number of stores, and all five boroughs are represented,
with the Bronx and Staten Island both hosting lone independent stores.
Lower Manhattan has the highest density of booksellers.
</p>
<p>
The listings here are kept up-to-date to the best of my ability;
however, I make no promises about either the accuracy or reliability
of the information. If you spot an error, or I've missed a shop,
please let me know by
<a href="mailto:delta.mu.alpha@gmail.com" target="_blank">email</a>,
<a href="https://icosahedron.website/@lazyreader" target="_blank"
>mastodon</a
>, or
<a href="https://www.twitter.com/alazyreader" target="_blank"
>twitter</a
>. Originally based on the "<a
href="https://github.com/jlord/hack-spots"
target="_blank"
>Hack Spots</a
>" website by
<a href="https://www.twitter.com/jllord" target="_blank">@jllord</a>
(although I don't believe any of the actual underlying code still
survives at this point).
</p>
<p>
There are currently <span id="storeCount">114</span> stores indexed on
this page. Last updated <span id="updatedOn">October 29, 2023</span>.
</p>
<details>
<summary>Recent Changes</summary>
<ul id="changesList">
<li>
October 26, 2023 - Return Three Lives to its original corner
location.
</li>
<li>
October 26, 2023 - Idlewild Books appears to have transitioned
entirely to language classes as opposed to bookselling
</li>
<li>
October 26, 2023 - remove Boulevard Books; correct Alabaster
Bookshop Instagram link
</li>
<li>
October 26, 2023 - Add Topos Too, currently in a "soft opening"
</li>
</ul>
</details>
</div>
<div class="clearfix"></div>
<div id="selected" class="bubble hidden"></div>
<div class="container">
<div class="bubble">
<div id="Stores">
<table>
<tbody>
<tr id="0" class="spotRow">
<td class="name">1804 Books</td>
<td>320 W 37th Street, New York</td>
<td>320 W 37th St, New York</td>
</tr>
<tr id="1" class="spotRow">
<td class="name">192 Books</td>
@@ -176,7 +177,7 @@
</tr>
<tr id="2" class="spotRow">
<td class="name">Adanne</td>
<td>234 Water Street, Brooklyn</td>
<td>115 Ralph Ave, Brooklyn</td>
</tr>
<tr id="3" class="spotRow">
<td class="name">Aeon Bookstore</td>
@@ -192,7 +193,7 @@
</tr>
<tr id="6" class="spotRow">
<td class="name">Archestratus</td>
<td>160 Huron St, Brooklyn</td>
<td>164 Huron St, Brooklyn</td>
</tr>
<tr id="7" class="spotRow">
<td class="name">Argosy Books</td>
@@ -200,24 +201,24 @@
</tr>
<tr id="8" class="spotRow">
<td class="name">Astoria Bookshop</td>
<td>31-29 31st St, Astoria</td>
<td>36-19 30th St, Astoria</td>
</tr>
<tr id="9" class="spotRow">
<td class="name">Avoid The Day Bookstore &amp; Cafe</td>
<td>99-04 A Rockaway Beach Blvd, Rockaway Park</td>
</tr>
<tr id="10" class="spotRow">
<td class="name">Berl's Brooklyn Poetry Shop</td>
<td>126A Front St, Brooklyn</td>
</tr>
<tr id="11" class="spotRow">
<tr id="10" class="spotRow">
<td class="name">Better Read Than Dead</td>
<td>867 Broadway, Brooklyn</td>
</tr>
<tr id="12" class="spotRow">
<tr id="11" class="spotRow">
<td class="name">Better Read Than Dead &amp; Burly Coffee</td>
<td>90 Kosciuszko St, Brooklyn</td>
</tr>
<tr id="12" class="spotRow">
<td class="name">Black Spring Books</td>
<td>672 Driggs Ave, Brooklyn</td>
</tr>
<tr id="13" class="spotRow">
<td class="name">Bluestockings Cooperative</td>
<td>116 Suffolk Street, New York</td>
@@ -275,261 +276,259 @@
<td>42 West 17th St, New York</td>
</tr>
<tr id="27" class="spotRow">
<td class="name">Boulevard Books</td>
<td>7518 13th Ave, Brooklyn</td>
</tr>
<tr id="28" class="spotRow">
<td class="name">Bravo's Book Nook</td>
<td>115 MacDougal St, New York</td>
</tr>
<tr id="29" class="spotRow">
<tr id="28" class="spotRow">
<td class="name">Burnt Books</td>
<td>1014 Manhattan Ave, Brooklyn</td>
<td>157 Huron St, Brooklyn</td>
</tr>
<tr id="30" class="spotRow">
<tr id="29" class="spotRow">
<td class="name">Cafe con Libros</td>
<td>724 Prospect Place, Brooklyn</td>
</tr>
<tr id="31" class="spotRow">
<tr id="30" class="spotRow">
<td class="name">Catland</td>
<td>987 Flushing Ave, Brooklyn</td>
<td>985 Flushing Ave, Brooklyn</td>
</tr>
<tr id="32" class="spotRow">
<tr id="31" class="spotRow">
<td class="name">Chartwell Booksellers</td>
<td>55 E 52nd St, New York</td>
</tr>
<tr id="33" class="spotRow">
<tr id="32" class="spotRow">
<td class="name">Codex Books</td>
<td>1 Bleecker St, New York</td>
</tr>
<tr id="34" class="spotRow">
<tr id="33" class="spotRow">
<td class="name">Community Bookstore</td>
<td>143 7th Ave, Brooklyn</td>
</tr>
<tr id="35" class="spotRow">
<tr id="34" class="spotRow">
<td class="name">Cups and Books</td>
<td>2024 Bedford Ave, Brooklyn</td>
</tr>
<tr id="36" class="spotRow">
<tr id="35" class="spotRow">
<td class="name">Dashwood Books</td>
<td>33 Bond St, New York</td>
</tr>
<tr id="37" class="spotRow">
<tr id="36" class="spotRow">
<td class="name">Dear Friend Books</td>
<td>343A Tompkins Avenue, Brooklyn</td>
<td>343A Tompkins Ave, Brooklyn</td>
</tr>
<tr id="38" class="spotRow">
<tr id="37" class="spotRow">
<td class="name">Desert Island Comics</td>
<td>540 Metropolitan Ave, Brooklyn</td>
</tr>
<tr id="39" class="spotRow">
<tr id="38" class="spotRow">
<td class="name">East Village Books</td>
<td>99 St. Mark's Place, New York</td>
</tr>
<tr id="40" class="spotRow">
<tr id="39" class="spotRow">
<td class="name">ETG Book Cafe</td>
<td>208 Bay St, Staten Island</td>
</tr>
<tr id="41" class="spotRow">
<tr id="40" class="spotRow">
<td class="name">Freebird Books</td>
<td>123 Columbia St, Brooklyn</td>
</tr>
<tr id="42" class="spotRow">
<tr id="41" class="spotRow">
<td class="name">Greenlight Bookstore</td>
<td>686 Fulton St, Brooklyn</td>
</tr>
<tr id="43" class="spotRow">
<td class="name">
Greenlight Bookstore (Prospect Lefferts Gardens)
</td>
<td>632 Flatbush Ave, Brooklyn</td>
</tr>
<tr id="44" class="spotRow">
<tr id="42" class="spotRow">
<td class="name">Here's A Book Store</td>
<td>1964 Coney Island Ave, Brooklyn</td>
</tr>
<tr id="45" class="spotRow">
<tr id="43" class="spotRow">
<td class="name">Hey Kids! Comics</td>
<td>157 Huron St, Brooklyn</td>
</tr>
<tr id="46" class="spotRow">
<tr id="44" class="spotRow">
<td class="name">Housing Works Bookstore Café</td>
<td>126 Crosby St, New York</td>
</tr>
<tr id="47" class="spotRow">
<tr id="45" class="spotRow">
<td class="name">Human Relations Books</td>
<td>1067 Flushing Ave, Brooklyn</td>
</tr>
<tr id="48" class="spotRow">
<td class="name">Idlewild Books</td>
<td>170 7th Avenue S, New York</td>
</tr>
<tr id="49" class="spotRow">
<tr id="46" class="spotRow">
<td class="name">James Cummins Bookseller</td>
<td>699 Madison Ave, 7th Floor, New York</td>
</tr>
<tr id="50" class="spotRow">
<tr id="47" class="spotRow">
<td class="name">Joanne Hendricks Cookbooks</td>
<td>488 Greenwich St, New York</td>
</tr>
<tr id="51" class="spotRow">
<tr id="48" class="spotRow">
<td class="name">Karma Bookstore</td>
<td>136 East Third St, New York</td>
</tr>
<tr id="52" class="spotRow">
<tr id="49" class="spotRow">
<td class="name">Kew &amp; Willow Books</td>
<td>81-63 Lefferts Boulevard, New York</td>
</tr>
<tr id="53" class="spotRow">
<tr id="50" class="spotRow">
<td class="name">Kinokunya</td>
<td>1073 Avenue of the Americas, New York</td>
</tr>
<tr id="54" class="spotRow">
<tr id="51" class="spotRow">
<td class="name">Kitchen Arts &amp; Letters</td>
<td>1435 Lexington Ave, New York</td>
</tr>
<tr id="55" class="spotRow">
<tr id="52" class="spotRow">
<td class="name">Leaves Bookstore</td>
<td>140 Nassau Ave, Brooklyn</td>
</tr>
<tr id="56" class="spotRow">
<tr id="53" class="spotRow">
<td class="name">Left Bank Books</td>
<td>41 Perry Street, New York</td>
<td>41 Perry St, New York</td>
</tr>
<tr id="57" class="spotRow">
<tr id="54" class="spotRow">
<td class="name">Lofty Pigeon Books</td>
<td>743 Church Ave, Brooklyn</td>
</tr>
<tr id="55" class="spotRow">
<td class="name">Logos Bookstore</td>
<td>1575 York Ave, New York</td>
</tr>
<tr id="58" class="spotRow">
<tr id="56" class="spotRow">
<td class="name">Mast Books</td>
<td>72 Avenue A, New York</td>
</tr>
<tr id="59" class="spotRow">
<tr id="57" class="spotRow">
<td class="name">McNally Jackson Books</td>
<td>52 Prince St, New York</td>
<td>134 Prince St, New York</td>
</tr>
<tr id="60" class="spotRow">
<tr id="58" class="spotRow">
<td class="name">McNally Jackson Books City Point</td>
<td>445 Albee Square W, Unit G112, Brooklyn</td>
</tr>
<tr id="61" class="spotRow">
<tr id="59" class="spotRow">
<td class="name">McNally Jackson Books Seaport</td>
<td>4 Fulton St, New York</td>
</tr>
<tr id="62" class="spotRow">
<tr id="60" class="spotRow">
<td class="name">McNally Jackson Books Williamsburg</td>
<td>76 North 4th St, Brooklyn</td>
</tr>
<tr id="63" class="spotRow">
<tr id="61" class="spotRow">
<td class="name">McNally Jackson Rockefeller Center</td>
<td>1 Rockefeller Plaza, New York</td>
</tr>
<tr id="64" class="spotRow">
<tr id="62" class="spotRow">
<td class="name">Melville House Publishers</td>
<td>46 John St, Brooklyn</td>
</tr>
<tr id="65" class="spotRow">
<tr id="63" class="spotRow">
<td class="name">Mercer Street Books &amp; Records</td>
<td>206 Mercer St, New York</td>
</tr>
<tr id="66" class="spotRow">
<tr id="64" class="spotRow">
<td class="name">Mil Mundos Books</td>
<td>323 Linden St, Brooklyn</td>
</tr>
<tr id="67" class="spotRow">
<tr id="65" class="spotRow">
<td class="name">Molasses Books</td>
<td>770 Hart St, Brooklyn</td>
</tr>
<tr id="68" class="spotRow">
<tr id="66" class="spotRow">
<td class="name">Namaste Bookshop</td>
<td>2 W 14th St, New York</td>
</tr>
<tr id="69" class="spotRow">
<tr id="67" class="spotRow">
<td class="name">P&amp;T Knitwear</td>
<td>180 Orchard Street, New York</td>
<td>180 Orchard St, New York</td>
</tr>
<tr id="70" class="spotRow">
<tr id="68" class="spotRow">
<td class="name">Passageway Books</td>
<td>150 9th Ave, New York</td>
</tr>
<tr id="69" class="spotRow">
<td class="name">Pillow-Cat Books</td>
<td>328 East 9th St, New York</td>
</tr>
<tr id="71" class="spotRow">
<tr id="70" class="spotRow">
<td class="name">Posman Books Chelsea Market</td>
<td>75 9th Avenue, New York</td>
</tr>
<tr id="72" class="spotRow">
<tr id="71" class="spotRow">
<td class="name">POWERHOUSE @ IC</td>
<td>220 36th Street, Building #2, Brooklyn</td>
<td>220 36th St, Building #2, Brooklyn</td>
</tr>
<tr id="73" class="spotRow">
<tr id="72" class="spotRow">
<td class="name">POWERHOUSE Arena</td>
<td>28 Adams St, Brooklyn</td>
</tr>
<tr id="74" class="spotRow">
<tr id="73" class="spotRow">
<td class="name">POWERHOUSE on 8th</td>
<td>1111 8th Ave, Brooklyn</td>
</tr>
<tr id="75" class="spotRow">
<tr id="74" class="spotRow">
<td class="name">Printed Matter</td>
<td>231 11th Ave, New York</td>
</tr>
<tr id="76" class="spotRow">
<tr id="75" class="spotRow">
<td class="name">Printed Matter St. Marks</td>
<td>38 St. Marks Pl, New York</td>
</tr>
<tr id="77" class="spotRow">
<tr id="76" class="spotRow">
<td class="name">Quest Bookshop</td>
<td>240 E 53rd St, New York</td>
</tr>
<tr id="78" class="spotRow">
<tr id="77" class="spotRow">
<td class="name">Quimby's Bookstore</td>
<td>536 Metropolitan Avenue, Brooklyn</td>
<td>536 Metropolitan Ave, Brooklyn</td>
</tr>
<tr id="79" class="spotRow">
<tr id="78" class="spotRow">
<td class="name">Recirculation</td>
<td>876 Riverside Dr, New York</td>
</tr>
<tr id="80" class="spotRow">
<tr id="79" class="spotRow">
<td class="name">Respect For Life Books-N-Things</td>
<td>537 Nostrand Ave, Brooklyn</td>
</tr>
<tr id="81" class="spotRow">
<tr id="80" class="spotRow">
<td class="name">Revolution Books</td>
<td>437 Malcolm X Blvd, New York</td>
</tr>
<tr id="82" class="spotRow">
<tr id="81" class="spotRow">
<td class="name">Rizzoli Bookstore</td>
<td>1133 Broadway, New York</td>
</tr>
<tr id="83" class="spotRow">
<tr id="82" class="spotRow">
<td class="name">Shakespeare &amp; Company</td>
<td>939 Lexington Ave, New York</td>
</tr>
<tr id="84" class="spotRow">
<tr id="83" class="spotRow">
<td class="name">
Shakespeare &amp; Company (Upper West Side)
</td>
<td>2020 Broadway, New York</td>
</tr>
<tr id="85" class="spotRow">
<tr id="84" class="spotRow">
<td class="name">Sister's Uptown Bookstore</td>
<td>1942 Amsterdam Ave, New York</td>
</tr>
<tr id="86" class="spotRow">
<tr id="85" class="spotRow">
<td class="name">Spoonbill &amp; Sugartown, Booksellers</td>
<td>218 Bedford Ave, Brooklyn</td>
</tr>
<tr id="87" class="spotRow">
<tr id="86" class="spotRow">
<td class="name">Standards Manual</td>
<td>212 Franklin Street, Brooklyn</td>
</tr>
<tr id="88" class="spotRow">
<tr id="87" class="spotRow">
<td class="name">Strand Bookstore</td>
<td>828 Broadway, New York</td>
</tr>
<tr id="89" class="spotRow">
<tr id="88" class="spotRow">
<td class="name">Sweet Pickle Books</td>
<td>47 Orchard St, New York</td>
</tr>
<tr id="89" class="spotRow">
<td class="name">Taylor &amp; Co. Books</td>
<td>1021 Cortelyou Rd, Brooklyn</td>
</tr>
<tr id="90" class="spotRow">
<td class="name">Terrace Books</td>
<td>242 Prospect Park West, Brooklyn</td>
@@ -563,56 +562,68 @@
<td>58 Warren St, New York</td>
</tr>
<tr id="98" class="spotRow">
<td class="name">The Strand At Columbus Ave</td>
<td>450 Columbus Avenue, New York</td>
<td class="name">The Ripped Bodice</td>
<td>218 5th Ave, Brooklyn</td>
</tr>
<tr id="99" class="spotRow">
<td class="name">The Word Is Change</td>
<td>368 Tompkins Avenue, Brooklyn</td>
<td class="name">The Strand At Columbus Ave</td>
<td>450 Columbus Ave, New York</td>
</tr>
<tr id="100" class="spotRow">
<td class="name">Three Lives &amp; Company</td>
<td>238 West 10th St, New York</td>
<td class="name">The Word Is Change</td>
<td>368 Tompkins Ave, Brooklyn</td>
</tr>
<tr id="101" class="spotRow">
<td class="name">Three Lives &amp; Company</td>
<td>154 W 10th St, New York</td>
</tr>
<tr id="102" class="spotRow">
<td class="name">Topos Bookstore Cafe</td>
<td>788 Woodward Ave, Brooklyn</td>
</tr>
<tr id="102" class="spotRow">
<tr id="103" class="spotRow">
<td class="name">Topos Too</td>
<td>59-22 Myrtle Ave, Queens</td>
</tr>
<tr id="104" class="spotRow">
<td class="name">Troubled Sleep Books</td>
<td>129 6th Ave, Brooklyn</td>
</tr>
<tr id="103" class="spotRow">
<tr id="105" class="spotRow">
<td class="name">Turn The Page... Again</td>
<td>39-15a Bell Blvd, Flushing</td>
</tr>
<tr id="104" class="spotRow">
<tr id="106" class="spotRow">
<td class="name">Unnameable Books</td>
<td>600 Vanderbilt Ave, Brooklyn</td>
</tr>
<tr id="105" class="spotRow">
<tr id="107" class="spotRow">
<td class="name">Ursus Books</td>
<td>50 East 78th St, Suite 1C, New York</td>
</tr>
<tr id="106" class="spotRow">
<tr id="108" class="spotRow">
<td class="name">Village Works</td>
<td>12 St. Marks Pl, New York</td>
</tr>
<tr id="109" class="spotRow">
<td class="name">Westsider Rare &amp; Used Books</td>
<td>2246 Broadway, New York</td>
</tr>
<tr id="107" class="spotRow">
<tr id="110" class="spotRow">
<td class="name">Westsider Records</td>
<td>233 West 72nd St, New York</td>
</tr>
<tr id="108" class="spotRow">
<tr id="111" class="spotRow">
<td class="name">Word Bookstore</td>
<td>126 Franklin St, Brooklyn</td>
</tr>
<tr id="109" class="spotRow">
<tr id="112" class="spotRow">
<td class="name">Word Up Books</td>
<td>2113 Amsterdam Ave, New York</td>
</tr>
<tr id="110" class="spotRow">
<tr id="113" class="spotRow">
<td class="name">Yu and Me Books</td>
<td>44 Mulberry St, New York</td>
<td>115 Delancey St Stall #11, New York</td>
</tr>
</tbody>
</table>
@@ -672,7 +683,6 @@
${city}, NY ${postcode}
</p>
<p>
View in:
<a
href="https://maps.google.com/maps?q=${encodeURIComponent(
name
@@ -693,17 +703,13 @@
: ""
}
</p>
<ul>
${
website
? `<li><a href="${website}" target="_blank">${cleanWebsite(
website
)}</a></li>`
: ""
}
<li class="storeDetails">Events: ${events}</li>
<li class="storeDetails">Caf&eacute;: ${cafe}</li>
</ul>
${
website
? `<p><a href="${website}" target="_blank">${cleanWebsite(
website
)}</a></p>`
: ""
}
${description ? `<p class="description">${description}</p>` : ""}`;
}
@@ -807,6 +813,10 @@
}
}
function isStacked() {
return screen.width < 1120;
}
function boundingBox(point) {
// add some buffer to a point to give the user some leeway
return [
@@ -816,7 +826,11 @@
}
function updateSelectedStore(store, pushState = false) {
map.flyTo({ center: [store.long, store.lat], zoom: 12 });
map.flyTo({
center: [store.long, store.lat],
offset: [isStacked() ? 0 : -250, 0],
zoom: 13,
});
popup.setLngLat([store.long, store.lat]).setHTML(store.name).addTo(map);
@@ -838,8 +852,6 @@
}
function loadMap(data) {
var geolocate = new mapboxgl.GeolocateControl();
var points = [];
data.forEach((value, key) => {
points.push({
@@ -870,7 +882,6 @@
},
});
map.addControl(new mapboxgl.NavigationControl(), "top-left");
map.addControl(geolocate, "top-right");
updateViewBySlug(window.location.hash.split("#")[1]);
});
@@ -903,20 +914,12 @@
map.getCanvas().style.cursor = features.length ? "pointer" : "";
});
geolocate.on("geolocate", function (e) {
map.setZoom(14);
popup
.setLngLat([e.coords.longitude, e.coords.latitude])
.setHTML("Current Location")
.addTo(map);
});
setContent("Stores", TableViewTemplate(data));
document.querySelectorAll("#Stores tbody tr").forEach((element) => {
element.addEventListener("click", () => {
updateSelectedStore(data[element.id], true);
document
.getElementById("subhed")
.getElementById(isStacked() ? "map" : "selected")
.scrollIntoView({ behavior: "smooth" });
});
});
@@ -924,29 +927,5 @@
document.getElementById("viewInfo").addEventListener("click", showInfo);
}
</script>
<script>
(function (i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function () {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(
window,
document,
"script",
"https://www.google-analytics.com/analytics.js",
"ga"
);
ga("create", "UA-100418882-1", "auto");
ga("send", "pageview");
</script>
</body>
</html>

View File

@@ -1,7 +1,39 @@
import { load } from "cheerio";
import { readFile, writeFile } from "fs";
import process from "child_process";
import stores from "./stores.json" assert { type: "json" };
function GetRecentChanges() {
const res = process
.execSync('git log -15 --pretty=format:"%ct %s"')
.toString();
return res.split("\n");
}
function ChangeLog(logs) {
let res = "\n";
let i = 0;
logs.forEach((l) => {
if (
i > 3 ||
l.includes("[skip]") ||
l.includes("caddy") ||
l.includes("renovate")
) {
return;
}
i++;
const s = l.split(" ");
const date = new Date(s[0] * 1000).toLocaleDateString("en-US", {
year: "numeric",
month: "long",
day: "numeric",
});
res = res + `<li>${date} - ${s.slice(1).join(" ")}</li>\n`;
});
return res;
}
function TableViewTemplate(rows) {
let table = "<table>";
rows.forEach((row, key) => {
@@ -20,6 +52,7 @@ function TableRowTemplate({ rowNumber, name, address, city }) {
}
readFile("./index.html", function (err, data) {
const changeList = GetRecentChanges();
if (err) {
throw err;
}
@@ -40,6 +73,7 @@ readFile("./index.html", function (err, data) {
day: "numeric",
})
);
$("#changesList").html(ChangeLog(changeList));
const cssurl = $("link[type='text/css']").attr("href").split("?")[0];
$("link[type='text/css']").attr("href", cssurl + "?" + new Date().getTime());
writeFile("./index.html", $.html(), (err) => {

View File

@@ -43,13 +43,13 @@
},
{
"name": "Astoria Bookshop",
"address": "31-29 31st St",
"address": "36-19 30th St",
"city": "Astoria",
"state": "NY",
"postcode": "11106",
"description": "The Astoria Bookshop is a general-interest bookstore with a decently-sized children's department. It also hosts book clubs and signings.",
"lat": "40.763494",
"long": "-73.923838",
"lat": "40.7563539364933",
"long": "-73.93073227116471",
"country": "USA",
"website": "https://www.astoriabookshop.com/",
"events": "Yes",
@@ -149,7 +149,7 @@
"lat": "40.733032",
"long": "-73.98996",
"country": "USA",
"website": "https://www.instagram.com/alabasterbooks/",
"website": "https://www.instagram.com/alabasterbookshop/",
"events": "No",
"cafe": "No"
},
@@ -195,20 +195,6 @@
"events": "Yes",
"cafe": "No"
},
{
"name": "Greenlight Bookstore (Prospect Lefferts Gardens)",
"address": "632 Flatbush Ave",
"city": "Brooklyn",
"state": "NY",
"postcode": "11225",
"description": "",
"lat": "40.657927",
"long": "-73.960535",
"country": "USA",
"website": "https://www.greenlightbookstore.com/",
"events": "Yes",
"cafe": "No"
},
{
"name": "Dashwood Books",
"address": "33 Bond St",
@@ -309,13 +295,13 @@
},
{
"name": "Three Lives & Company",
"address": "238 West 10th St",
"address": "154 W 10th St",
"city": "New York",
"state": "NY",
"postcode": "10014",
"description": "Unselfconsciously old-fashioned, Three Lives (the name comes from the trio of women founders as well as the Gertrude Stein novel) occupies a former deli. A gorgeous space with dark wood everywhere, they sell mainly literary fiction, with a selection of literary magazines and travel guides as well. The staff are enthusiastic and deeply knowledgable. Temporarily moved from 154 West 10th St.",
"lat": "40.733749",
"long": "-74.005438",
"description": "Unselfconsciously old-fashioned, Three Lives (the name comes from the trio of women founders as well as the Gertrude Stein novel) occupies a former deli. A gorgeous space with dark wood everywhere, they sell mainly literary fiction, with a selection of literary magazines and travel guides as well. The staff are enthusiastic and deeply knowledgable.",
"lat": "40.734402117180856",
"long": "-74.00149889306957",
"country": "USA",
"website": "http://www.threelives.com/",
"events": "Yes",
@@ -433,20 +419,6 @@
"events": "Yes",
"cafe": "No"
},
{
"name": "Idlewild Books",
"address": "170 7th Avenue S",
"city": "New York",
"state": "NY",
"postcode": "10014",
"description": "Idlewild Books started off as a store for travel guides and books for armchair travelers; over time, the selection has started to cater more to those interested in learning another language, but the Manhattan location has maintained a large selection of books from and about far-flung corners of the globe. Langauge classes are also available here and at the other two locations in the city.",
"lat": "40.7355778",
"long": "-74.0017457",
"country": "USA",
"website": "https://www.idlewildbooks.com/",
"events": "Yes",
"cafe": "No"
},
{
"name": "Posman Books Chelsea Market",
"address": "75 9th Avenue",
@@ -685,20 +657,6 @@
"events": "Yes",
"cafe": "No"
},
{
"name": "Boulevard Books",
"address": "7518 13th Ave",
"city": "Brooklyn",
"state": "NY",
"postcode": "11228",
"description": "",
"lat": "40.61998",
"long": "-74.0080949",
"country": "USA",
"website": "https://facebook.com/boulevardbookstore/",
"events": "Yes",
"cafe": "Yes"
},
{
"name": "Better Read Than Dead",
"address": "867 Broadway",
@@ -813,13 +771,13 @@
},
{
"name": "Catland",
"address": "987 Flushing Ave",
"address": "985 Flushing Ave",
"city": "Brooklyn",
"state": "NY",
"postcode": "11206",
"description": "New York City has an occult bookstore again, thanks to Catland. This store caters to those interested in the various schools of modern magical thought, and we're not talking about stage magic. New titles are available from various occult publishers, including imports from Europe and other hard-to-find titles, and there are also used and out-of-print resources. The store also sells candles, minerals, and other paraphenalia for the serious occultist, and has an adjacent event space for... other purposes.",
"lat": "40.70313",
"long": "-73.933208",
"lat": "40.70308451154855",
"long": "-73.9332990716122",
"country": "USA",
"website": "https://www.catlandbooks.com/",
"events": "Yes",
@@ -869,17 +827,17 @@
},
{
"name": "Archestratus",
"address": "160 Huron St",
"address": "164 Huron St",
"city": "Brooklyn",
"state": "NY",
"postcode": "11222",
"description": "Archestratus is a combination cookbook bookstore, café, and restaurant on Thursday evenings serving Sicilian-inspired food. A gorgeous, bright space with a wide selection of cookbooks, both new and used, as well as fiction and non-fiction on and relating to gustatory pleasure. Includes stationary, a small selection of pantry items, and a children's section.",
"lat": "40.732808",
"long": "-73.955144",
"description": "Archestratus is a combination cookbook-bookstore and grocery. A gorgeous, bright space with a wide selection of cookbooks, both new and used, as well as fiction and non-fiction on and relating to gustatory pleasure. Includes stationary, a small selection of pantry items, and a children's section.",
"lat": "40.73291914466089",
"long": "-73.955081286067",
"country": "USA",
"website": "https://www.archestrat.us/",
"events": "Yes",
"cafe": "Yes"
"cafe": "Sandwiches and Groceries"
},
{
"name": "Quest Bookshop",
@@ -1203,20 +1161,6 @@
"events": "Yes",
"cafe": "No"
},
{
"name": "Avoid The Day Bookstore & Cafe",
"address": "99-04 A Rockaway Beach Blvd",
"city": "Rockaway Park",
"state": "NY",
"postcode": "11694",
"description": "",
"lat": "40.584264",
"long": "-73.820613",
"country": "USA",
"website": "https://www.avoidtheday.org/",
"events": "Yes",
"cafe": "Yes"
},
{
"name": "Bravo's Book Nook",
"address": "115 MacDougal St",
@@ -1303,17 +1247,17 @@
},
{
"name": "Yu and Me Books",
"address": "44 Mulberry St",
"address": "115 Delancey St Stall #11",
"city": "New York",
"state": "NY",
"postcode": "10013",
"description": "",
"lat": "40.7150026491681",
"long": "-73.99949344452915",
"postcode": "10002",
"description": "Temporarily located in Essex Market after a fire ruined their original Chinatown location.",
"lat": "40.71799108242515",
"long": "-73.98821173877292",
"country": "USA",
"website": "https://www.yuandmebooks.com/",
"events": "Yes",
"cafe": "Yes?"
"cafe": "No"
},
{
"name": "Bookoff Brooklyn",
@@ -1359,17 +1303,17 @@
},
{
"name": "Burnt Books",
"address": "1014 Manhattan Ave",
"address": "157 Huron St",
"city": "Brooklyn",
"state": "NY",
"postcode": "11222",
"description": "Inside the bodega at this address.",
"lat": "40.733568440405016",
"long": "-73.95461455767136",
"description": "Inside Hey Kids! Comics.",
"lat": "40.73311524313807",
"long": "-73.95524501396707",
"country": "USA",
"website": "https://www.instagram.com/burnt_books_/",
"events": "No",
"cafe": "Yes?"
"cafe": "No"
},
{
"name": "Hey Kids! Comics",
@@ -1471,13 +1415,13 @@
},
{
"name": "Adanne",
"address": "234 Water St",
"address": "115 Ralph Ave",
"city": "Brooklyn",
"state": "NY",
"postcode": "11201",
"postcode": "11221",
"description": "",
"lat": "40.70288951770088",
"long": "-73.98444221660601",
"lat": "40.686078937932145",
"long": "-73.92321820991805",
"country": "USA",
"website": "https://adanne.co/",
"events": "Yes",
@@ -1531,7 +1475,7 @@
"city": "New York",
"state": "NY",
"postcode": "10014",
"description": "",
"description": "A revival of an older shop by the same name in the same neighborhood, Left Bank Books is a used-book seller specializing in fiction, art and photo books, as well as 'first or interesting editions of books in good condition'. The storefront is small and tidy, with a varied, interesting selection.",
"lat": "40.73571487088914",
"long": "-74.00279887704167",
"country": "USA",
@@ -1566,5 +1510,89 @@
"website": "https://www.blackspringbookstore.com/",
"events": "Yes",
"cafe": "No"
},
{
"name": "Passageway Books",
"address": "150 9th Ave",
"city": "New York",
"state": "NY",
"postcode": "10011",
"description": "",
"lat": "40.74412894095414",
"long": "-74.00282753618434",
"country": "USA",
"website": "https://www.instagram.com/passageway_books/",
"events": "Yes",
"cafe": "No"
},
{
"name": "Taylor & Co. Books",
"address": "1021 Cortelyou Rd",
"city": "Brooklyn",
"state": "NY",
"postcode": "11218",
"description": "",
"lat": "40.63931763103944",
"long": "-73.96838123421915",
"country": "USA",
"website": "https://www.taylorcobooks.com/",
"events": "Yes",
"cafe": "No"
},
{
"name": "The Ripped Bodice",
"address": "218 5th Ave",
"city": "Brooklyn",
"state": "NY",
"postcode": "11215",
"description": "",
"lat": "40.67614895922998",
"long": "-73.98099066262628",
"country": "USA",
"website": "https://www.therippedbodicela.com/ripped-bodice-brooklyn",
"events": "Yes",
"cafe": "No"
},
{
"name": "Lofty Pigeon Books",
"address": "743 Church Ave",
"city": "Brooklyn",
"state": "NY",
"postcode": "11218",
"description": "",
"lat": "40.646037403744415",
"long": "-73.97189664018556",
"country": "USA",
"website": "https://www.loftypigeonbooks.com/",
"events": "Yes",
"cafe": "No"
},
{
"name": "Village Works",
"address": "12 St. Marks Pl",
"city": "New York",
"state": "NY",
"postcode": "10003",
"description": "",
"lat": "40.72914082270099",
"long": "-73.98920772389302",
"country": "USA",
"website": "https://www.villageworksnyc.com/",
"events": "Yes",
"cafe": "Soon?"
},
{
"name": "Topos Too",
"address": "59-22 Myrtle Ave",
"city": "Queens",
"state": "NY",
"postcode": "11385",
"description": "",
"lat": "40.70042656211568",
"long": "-73.89895900901953",
"country": "USA",
"website": "https://www.toposbookstore.com/",
"events": "?",
"cafe": "No"
}
]