From 4cac7ac76c78d294bca55e2fd382d654dd45db00 Mon Sep 17 00:00:00 2001 From: Brian Beck Date: Mon, 19 Dec 2016 21:21:07 -0800 Subject: [PATCH] Add support for cover art via the Cover Art Archive (#17) --- package.json | 1 + src/{api.js => api/client.js} | 115 +++------ src/api/cover-art-archive.js | 47 ++++ src/api/index.js | 10 + src/api/musicbrainz.js | 83 +++++++ src/index.js | 12 +- src/loaders.js | 56 +++-- src/types/cover-art-image.js | 72 ++++++ src/types/cover-art.js | 188 +++++++++++++++ src/types/enums.js | 23 ++ src/types/release-group.js | 9 + src/types/release.js | 21 +- test/api/client.js | 9 + test/api/cover-art-archive.js | 47 ++++ test/{api.js => api/musicbrainz.js} | 10 +- .../fixtures/01f85d1b5c1e1c7ee9768df1f7529a89 | 1 + .../01f85d1b5c1e1c7ee9768df1f7529a89.headers | 24 ++ .../fixtures/029740f01ae52e57fcaa1fbe44f3cc76 | 1 + .../029740f01ae52e57fcaa1fbe44f3cc76.headers | 27 +++ .../fixtures/0362ca3081fd5d16d8e29846798296a0 | 1 + .../0362ca3081fd5d16d8e29846798296a0.headers | 24 ++ .../fixtures/071ecc4967496ac9ff5c75bcb6faf549 | 0 .../071ecc4967496ac9ff5c75bcb6faf549.headers | 25 ++ .../fixtures/078ffa5f6640843175067e82b92da215 | Bin 0 -> 429 bytes .../078ffa5f6640843175067e82b92da215.headers | 29 +++ .../fixtures/07a9f4ce4cc4639f8ec3d5c06a91b670 | 0 .../07a9f4ce4cc4639f8ec3d5c06a91b670.headers | 25 ++ .../fixtures/17a054fb91109cd8b5a2d1a8c8ab3a4a | Bin 0 -> 387 bytes .../17a054fb91109cd8b5a2d1a8c8ab3a4a.headers | 29 +++ .../fixtures/1c31d4f3569dee83470ccf2948435447 | 0 .../1c31d4f3569dee83470ccf2948435447.headers | 24 ++ .../fixtures/1fd72722a40edf79ad5317b82116949d | 1 + .../1fd72722a40edf79ad5317b82116949d.headers | 24 ++ .../fixtures/217d797211c26dc393ef44fbf1a1a37e | 0 .../217d797211c26dc393ef44fbf1a1a37e.headers | 25 ++ .../fixtures/240fa01906160caef0ad74b8e2fe44f0 | Bin 0 -> 4552 bytes .../240fa01906160caef0ad74b8e2fe44f0.headers | 29 +++ .../fixtures/257742f1f5f07e90a7514808bc18977a | 4 + .../257742f1f5f07e90a7514808bc18977a.headers | 22 ++ .../fixtures/325850e36c752b826928e22ac481772a | Bin 0 -> 405 bytes .../325850e36c752b826928e22ac481772a.headers | 29 +++ .../fixtures/34ca10f44e5af073160c7b6adac60130 | 0 .../34ca10f44e5af073160c7b6adac60130.headers | 25 ++ .../fixtures/363970b23b4aa02d9be42a6492f76ada | Bin 0 -> 382 bytes .../363970b23b4aa02d9be42a6492f76ada.headers | 29 +++ .../fixtures/37dafe8b4260600bbb8b2571ec4ac86c | Bin 0 -> 390 bytes .../37dafe8b4260600bbb8b2571ec4ac86c.headers | 29 +++ .../fixtures/39192d7783e3cbd103a64e37435860c8 | 4 + .../39192d7783e3cbd103a64e37435860c8.headers | 22 ++ .../fixtures/3aaa80314ca3bb3404ab1a0b2be0da6a | 1 + .../3aaa80314ca3bb3404ab1a0b2be0da6a.headers | 24 ++ .../fixtures/3d1ea2a773f49cdf17cf4256f5cde4bf | 0 .../3d1ea2a773f49cdf17cf4256f5cde4bf.headers | 25 ++ .../fixtures/3d67fb108e6729c1e1e31c4889191cc4 | Bin 0 -> 436 bytes .../3d67fb108e6729c1e1e31c4889191cc4.headers | 29 +++ .../fixtures/3f24e4abb92f417cc6ee84b83d09c180 | 4 + .../3f24e4abb92f417cc6ee84b83d09c180.headers | 22 ++ .../fixtures/436bd8bd74ed540a37fcc9135ea97368 | Bin 0 -> 450 bytes .../436bd8bd74ed540a37fcc9135ea97368.headers | 29 +++ .../fixtures/4722e553ad2febf7e2c68d71f478a338 | 4 + .../4722e553ad2febf7e2c68d71f478a338.headers | 22 ++ .../fixtures/49b42184abf656b320a7124347074075 | 1 + .../49b42184abf656b320a7124347074075.headers | 24 ++ .../fixtures/4d3b01cc6d5ab75031ffa9465320de11 | Bin 0 -> 415 bytes .../4d3b01cc6d5ab75031ffa9465320de11.headers | 29 +++ .../fixtures/4fcb70e39045e968057c2ef8a75f9186 | Bin 0 -> 456 bytes .../4fcb70e39045e968057c2ef8a75f9186.headers | 29 +++ .../fixtures/55e718a13ff7c5178cbb0116a1bd2cd6 | Bin 0 -> 433 bytes .../55e718a13ff7c5178cbb0116a1bd2cd6.headers | 29 +++ .../fixtures/59293eea29033071de7f98943c3b5b1f | 1 + .../59293eea29033071de7f98943c3b5b1f.headers | 24 ++ .../fixtures/59c56dc30ab4179d0ee155e799ed637a | Bin 0 -> 377 bytes .../59c56dc30ab4179d0ee155e799ed637a.headers | 29 +++ .../fixtures/5d11ca0430a620cfab0f05264323a992 | 4 + .../5d11ca0430a620cfab0f05264323a992.headers | 22 ++ .../fixtures/600c519401f48c53791ce190cae3f561 | 1 + .../600c519401f48c53791ce190cae3f561.headers | 24 ++ .../fixtures/681f1edb476435e41fdb6ae48bd7e2f9 | 1 + .../681f1edb476435e41fdb6ae48bd7e2f9.headers | 27 +++ .../fixtures/71097d26676d70389a9b76ea2061db4d | 1 + .../71097d26676d70389a9b76ea2061db4d.headers | 24 ++ .../fixtures/725c9375e05c924c1e007b737cb42594 | 4 + .../725c9375e05c924c1e007b737cb42594.headers | 22 ++ .../fixtures/74e59908ce007e6c1904a9ea1772ebb6 | 0 .../74e59908ce007e6c1904a9ea1772ebb6.headers | 24 ++ .../fixtures/7625f6228e21bb0a707d6284d29f6238 | Bin 0 -> 431 bytes .../7625f6228e21bb0a707d6284d29f6238.headers | 29 +++ .../fixtures/7ac42ecd7ad91d876c3c3202ce69efa6 | Bin 0 -> 389 bytes .../7ac42ecd7ad91d876c3c3202ce69efa6.headers | 29 +++ .../fixtures/7c1ef1cb044aa69ddad7cd69db399a81 | 0 .../7c1ef1cb044aa69ddad7cd69db399a81.headers | 25 ++ .../fixtures/82f8e5c9c0995affcb90ff13a0359856 | 0 .../82f8e5c9c0995affcb90ff13a0359856.headers | 25 ++ .../fixtures/8417827908807fd6dda52450c6e094c6 | Bin 0 -> 427 bytes .../8417827908807fd6dda52450c6e094c6.headers | 29 +++ .../fixtures/851fadff7981d6862cc045eea0a822e3 | 1 + .../851fadff7981d6862cc045eea0a822e3.headers | 27 +++ .../fixtures/85b25c8d456ebee45124282fee2ce040 | Bin 0 -> 281 bytes .../85b25c8d456ebee45124282fee2ce040.headers | 29 +++ .../fixtures/85fe9ce7ea1df73ed9a47c34a9ab639a | 1 + .../85fe9ce7ea1df73ed9a47c34a9ab639a.headers | 27 +++ .../fixtures/88d25eac97d9ca9d35b89f082799a4c6 | 0 .../88d25eac97d9ca9d35b89f082799a4c6.headers | 25 ++ .../fixtures/899fe51e8e100f8345cd1cf922bbfe1e | 1 + .../899fe51e8e100f8345cd1cf922bbfe1e.headers | 24 ++ .../fixtures/8a175e08b48501b6e4cf37482521210d | Bin 0 -> 244 bytes .../8a175e08b48501b6e4cf37482521210d.headers | 29 +++ .../fixtures/8dbe81ff8f0caaa1ae9d4efa37dc1412 | 1 + .../8dbe81ff8f0caaa1ae9d4efa37dc1412.headers | 27 +++ .../fixtures/8e366fd1096b4f5c9a7992c9aac9f7b9 | Bin 0 -> 399 bytes .../8e366fd1096b4f5c9a7992c9aac9f7b9.headers | 29 +++ .../fixtures/8e41d1b7bbfb49f1d68725fe46b32b31 | 4 + .../8e41d1b7bbfb49f1d68725fe46b32b31.headers | 22 ++ .../fixtures/8f4adff433d805330aebe035bbb3d002 | Bin 0 -> 742 bytes .../8f4adff433d805330aebe035bbb3d002.headers | 29 +++ .../fixtures/90dd9e390b2eb9e86db99c06a5930c3c | 0 .../90dd9e390b2eb9e86db99c06a5930c3c.headers | 25 ++ .../fixtures/92c20b3043c804f81d89af97976dfa53 | 1 + .../92c20b3043c804f81d89af97976dfa53.headers | 24 ++ .../fixtures/9728c63ec56efc547f7cb0e94cb3fc43 | Bin 0 -> 431 bytes .../9728c63ec56efc547f7cb0e94cb3fc43.headers | 29 +++ .../fixtures/97ca6d7fad6a7b70ec940fa3bab6c47a | 0 .../97ca6d7fad6a7b70ec940fa3bab6c47a.headers | 25 ++ .../fixtures/99a9d97c03b0197b42c4fc8e06319a87 | 1 + .../99a9d97c03b0197b42c4fc8e06319a87.headers | 27 +++ .../fixtures/9e5831c56e1500e6c238583fc2a75fa7 | 1 + .../9e5831c56e1500e6c238583fc2a75fa7.headers | 27 +++ .../fixtures/a04597ae29bb987a5c36b1747baa25fa | 1 + .../a04597ae29bb987a5c36b1747baa25fa.headers | 24 ++ .../fixtures/a155d67a2d4b0ada2467e9cecd69577f | 0 .../a155d67a2d4b0ada2467e9cecd69577f.headers | 25 ++ .../fixtures/a1edb81b97ca0875be3c3fc1fb58f10b | 1 + .../a1edb81b97ca0875be3c3fc1fb58f10b.headers | 27 +++ .../fixtures/a2e9ac8cccc68070158e14f749720049 | 1 + .../a2e9ac8cccc68070158e14f749720049.headers | 24 ++ .../fixtures/a437ae1263f54894b27977b291026a21 | 4 + .../a437ae1263f54894b27977b291026a21.headers | 22 ++ .../fixtures/a4ee3084562f882fa11139d16733d21a | Bin 0 -> 432 bytes .../a4ee3084562f882fa11139d16733d21a.headers | 29 +++ .../fixtures/a7ebf644eeda889d47b3eeb3808e1612 | Bin 0 -> 440 bytes .../a7ebf644eeda889d47b3eeb3808e1612.headers | 29 +++ .../fixtures/ab47a9969477aef4978774f295da4fef | 4 + .../ab47a9969477aef4978774f295da4fef.headers | 22 ++ .../fixtures/abe14f4c4c73d24b0c1f73d484061520 | 0 .../abe14f4c4c73d24b0c1f73d484061520.headers | 25 ++ .../fixtures/ac7cdd14be6040b363313fe24fde27cc | Bin 0 -> 435 bytes .../ac7cdd14be6040b363313fe24fde27cc.headers | 29 +++ .../fixtures/acac35649a5fee09364a40ee95829e69 | 4 + .../acac35649a5fee09364a40ee95829e69.headers | 22 ++ .../fixtures/acf19bc8716eec134a0b6421390ef7f8 | Bin 0 -> 408 bytes .../acf19bc8716eec134a0b6421390ef7f8.headers | 29 +++ .../fixtures/aefcb623c80ff8bcf4ac278179801856 | 1 + .../aefcb623c80ff8bcf4ac278179801856.headers | 27 +++ .../fixtures/af9c8775c9c8864158f1c7b1b0fe5bda | 1 + .../af9c8775c9c8864158f1c7b1b0fe5bda.headers | 24 ++ .../fixtures/b126f5b19e3c828365bf2558f4c632d5 | 4 + .../b126f5b19e3c828365bf2558f4c632d5.headers | 22 ++ .../fixtures/b52874ed0f196446a4c665d43eb66a4e | 4 + .../b52874ed0f196446a4c665d43eb66a4e.headers | 22 ++ .../fixtures/b5ceda98812eb060f88237674aea6b39 | 0 .../b5ceda98812eb060f88237674aea6b39.headers | 24 ++ .../fixtures/bb2d63521b1bc4926702e93aca844990 | Bin 0 -> 426 bytes .../bb2d63521b1bc4926702e93aca844990.headers | 29 +++ .../fixtures/c1c06c12681af538c710619bc6b120f6 | 0 .../c1c06c12681af538c710619bc6b120f6.headers | 24 ++ .../fixtures/c20a5c482aa7d04b9dda7babfe743188 | Bin 0 -> 414 bytes .../c20a5c482aa7d04b9dda7babfe743188.headers | 29 +++ .../fixtures/caea1b69fe8f1d3a5e69b787336b9bc3 | 1 + .../caea1b69fe8f1d3a5e69b787336b9bc3.headers | 27 +++ .../fixtures/cc371fbba7f2002beeba8b30e43289ba | Bin 0 -> 204 bytes .../cc371fbba7f2002beeba8b30e43289ba.headers | 29 +++ .../fixtures/d00537c2d4ee5e022ede99f8107c8f31 | 1 + .../d00537c2d4ee5e022ede99f8107c8f31.headers | 24 ++ .../fixtures/d24e77d89cb5c321d30e6d57295865cb | 1 + .../d24e77d89cb5c321d30e6d57295865cb.headers | 24 ++ .../fixtures/d2c0839932094a26d5b332efdeb29411 | 0 .../d2c0839932094a26d5b332efdeb29411.headers | 24 ++ .../fixtures/d48ca164b5167c4b15adaa30b79c5e48 | 1 + .../d48ca164b5167c4b15adaa30b79c5e48.headers | 27 +++ .../fixtures/d79b4d5b3870a5c217bf065093f0c2bb | 0 .../d79b4d5b3870a5c217bf065093f0c2bb.headers | 25 ++ .../fixtures/dcd063023913100f2337a15baaf7cab8 | 0 .../dcd063023913100f2337a15baaf7cab8.headers | 25 ++ .../fixtures/df3294c221f51a91e332658994955033 | 1 + .../df3294c221f51a91e332658994955033.headers | 27 +++ .../fixtures/e1554c0273de859d87630ea52d37372a | Bin 0 -> 431 bytes .../e1554c0273de859d87630ea52d37372a.headers | 29 +++ .../fixtures/e7d064c841ee5e01c02ed599ecbd556a | 1 + .../e7d064c841ee5e01c02ed599ecbd556a.headers | 27 +++ .../fixtures/e7d66bffb0e7b3bb6f87aff19c514424 | 1 + .../e7d66bffb0e7b3bb6f87aff19c514424.headers | 27 +++ .../fixtures/eb333e098594fb7f53f15ca41f997176 | 1 + .../eb333e098594fb7f53f15ca41f997176.headers | 27 +++ .../fixtures/ef8a765d572046b07aa6947545f2655a | 0 .../ef8a765d572046b07aa6947545f2655a.headers | 24 ++ .../fixtures/ef97a1709cfc1a6cf2b23c0f0c7a34fa | 1 + .../ef97a1709cfc1a6cf2b23c0f0c7a34fa.headers | 27 +++ .../fixtures/f2f8141f92864c3860802d1e9d5b86c8 | Bin 0 -> 435 bytes .../f2f8141f92864c3860802d1e9d5b86c8.headers | 29 +++ .../fixtures/f3745cfb05ddfda57ec715ce6e752f4e | 1 + .../f3745cfb05ddfda57ec715ce6e752f4e.headers | 24 ++ .../fixtures/f3c7a5a4d0fbaf81b0a721a0fea245ea | 4 + .../f3c7a5a4d0fbaf81b0a721a0fea245ea.headers | 22 ++ .../fixtures/f64d96e2f100bde683ffde19d156218d | 0 .../f64d96e2f100bde683ffde19d156218d.headers | 25 ++ .../fixtures/faadb7f41cc3307e81ffc0775f85c8cd | Bin 0 -> 437 bytes .../faadb7f41cc3307e81ffc0775f85c8cd.headers | 29 +++ .../fixtures/fd48eb2a7c834a80a4cf3f589b1d9688 | 0 .../fd48eb2a7c834a80a4cf3f589b1d9688.headers | 25 ++ test/helpers/client.js | 11 - test/helpers/client/cover-art-archive.js | 11 + test/helpers/client/musicbrainz.js | 11 + test/helpers/context.js | 6 +- test/schema.js | 221 ++++++++++++++++++ test/types/scalars.js | 11 + 215 files changed, 3451 insertions(+), 123 deletions(-) rename src/{api.js => api/client.js} (60%) create mode 100644 src/api/cover-art-archive.js create mode 100644 src/api/index.js create mode 100644 src/api/musicbrainz.js create mode 100644 src/types/cover-art-image.js create mode 100644 src/types/cover-art.js create mode 100644 test/api/client.js create mode 100644 test/api/cover-art-archive.js rename test/{api.js => api/musicbrainz.js} (86%) create mode 100644 test/fixtures/01f85d1b5c1e1c7ee9768df1f7529a89 create mode 100644 test/fixtures/01f85d1b5c1e1c7ee9768df1f7529a89.headers create mode 100644 test/fixtures/029740f01ae52e57fcaa1fbe44f3cc76 create mode 100644 test/fixtures/029740f01ae52e57fcaa1fbe44f3cc76.headers create mode 100644 test/fixtures/0362ca3081fd5d16d8e29846798296a0 create mode 100644 test/fixtures/0362ca3081fd5d16d8e29846798296a0.headers create mode 100644 test/fixtures/071ecc4967496ac9ff5c75bcb6faf549 create mode 100644 test/fixtures/071ecc4967496ac9ff5c75bcb6faf549.headers create mode 100644 test/fixtures/078ffa5f6640843175067e82b92da215 create mode 100644 test/fixtures/078ffa5f6640843175067e82b92da215.headers create mode 100644 test/fixtures/07a9f4ce4cc4639f8ec3d5c06a91b670 create mode 100644 test/fixtures/07a9f4ce4cc4639f8ec3d5c06a91b670.headers create mode 100644 test/fixtures/17a054fb91109cd8b5a2d1a8c8ab3a4a create mode 100644 test/fixtures/17a054fb91109cd8b5a2d1a8c8ab3a4a.headers create mode 100644 test/fixtures/1c31d4f3569dee83470ccf2948435447 create mode 100644 test/fixtures/1c31d4f3569dee83470ccf2948435447.headers create mode 100644 test/fixtures/1fd72722a40edf79ad5317b82116949d create mode 100644 test/fixtures/1fd72722a40edf79ad5317b82116949d.headers create mode 100644 test/fixtures/217d797211c26dc393ef44fbf1a1a37e create mode 100644 test/fixtures/217d797211c26dc393ef44fbf1a1a37e.headers create mode 100644 test/fixtures/240fa01906160caef0ad74b8e2fe44f0 create mode 100644 test/fixtures/240fa01906160caef0ad74b8e2fe44f0.headers create mode 100644 test/fixtures/257742f1f5f07e90a7514808bc18977a create mode 100644 test/fixtures/257742f1f5f07e90a7514808bc18977a.headers create mode 100644 test/fixtures/325850e36c752b826928e22ac481772a create mode 100644 test/fixtures/325850e36c752b826928e22ac481772a.headers create mode 100644 test/fixtures/34ca10f44e5af073160c7b6adac60130 create mode 100644 test/fixtures/34ca10f44e5af073160c7b6adac60130.headers create mode 100644 test/fixtures/363970b23b4aa02d9be42a6492f76ada create mode 100644 test/fixtures/363970b23b4aa02d9be42a6492f76ada.headers create mode 100644 test/fixtures/37dafe8b4260600bbb8b2571ec4ac86c create mode 100644 test/fixtures/37dafe8b4260600bbb8b2571ec4ac86c.headers create mode 100644 test/fixtures/39192d7783e3cbd103a64e37435860c8 create mode 100644 test/fixtures/39192d7783e3cbd103a64e37435860c8.headers create mode 100644 test/fixtures/3aaa80314ca3bb3404ab1a0b2be0da6a create mode 100644 test/fixtures/3aaa80314ca3bb3404ab1a0b2be0da6a.headers create mode 100644 test/fixtures/3d1ea2a773f49cdf17cf4256f5cde4bf create mode 100644 test/fixtures/3d1ea2a773f49cdf17cf4256f5cde4bf.headers create mode 100644 test/fixtures/3d67fb108e6729c1e1e31c4889191cc4 create mode 100644 test/fixtures/3d67fb108e6729c1e1e31c4889191cc4.headers create mode 100644 test/fixtures/3f24e4abb92f417cc6ee84b83d09c180 create mode 100644 test/fixtures/3f24e4abb92f417cc6ee84b83d09c180.headers create mode 100644 test/fixtures/436bd8bd74ed540a37fcc9135ea97368 create mode 100644 test/fixtures/436bd8bd74ed540a37fcc9135ea97368.headers create mode 100644 test/fixtures/4722e553ad2febf7e2c68d71f478a338 create mode 100644 test/fixtures/4722e553ad2febf7e2c68d71f478a338.headers create mode 100644 test/fixtures/49b42184abf656b320a7124347074075 create mode 100644 test/fixtures/49b42184abf656b320a7124347074075.headers create mode 100644 test/fixtures/4d3b01cc6d5ab75031ffa9465320de11 create mode 100644 test/fixtures/4d3b01cc6d5ab75031ffa9465320de11.headers create mode 100644 test/fixtures/4fcb70e39045e968057c2ef8a75f9186 create mode 100644 test/fixtures/4fcb70e39045e968057c2ef8a75f9186.headers create mode 100644 test/fixtures/55e718a13ff7c5178cbb0116a1bd2cd6 create mode 100644 test/fixtures/55e718a13ff7c5178cbb0116a1bd2cd6.headers create mode 100644 test/fixtures/59293eea29033071de7f98943c3b5b1f create mode 100644 test/fixtures/59293eea29033071de7f98943c3b5b1f.headers create mode 100644 test/fixtures/59c56dc30ab4179d0ee155e799ed637a create mode 100644 test/fixtures/59c56dc30ab4179d0ee155e799ed637a.headers create mode 100644 test/fixtures/5d11ca0430a620cfab0f05264323a992 create mode 100644 test/fixtures/5d11ca0430a620cfab0f05264323a992.headers create mode 100644 test/fixtures/600c519401f48c53791ce190cae3f561 create mode 100644 test/fixtures/600c519401f48c53791ce190cae3f561.headers create mode 100644 test/fixtures/681f1edb476435e41fdb6ae48bd7e2f9 create mode 100644 test/fixtures/681f1edb476435e41fdb6ae48bd7e2f9.headers create mode 100644 test/fixtures/71097d26676d70389a9b76ea2061db4d create mode 100644 test/fixtures/71097d26676d70389a9b76ea2061db4d.headers create mode 100644 test/fixtures/725c9375e05c924c1e007b737cb42594 create mode 100644 test/fixtures/725c9375e05c924c1e007b737cb42594.headers create mode 100644 test/fixtures/74e59908ce007e6c1904a9ea1772ebb6 create mode 100644 test/fixtures/74e59908ce007e6c1904a9ea1772ebb6.headers create mode 100644 test/fixtures/7625f6228e21bb0a707d6284d29f6238 create mode 100644 test/fixtures/7625f6228e21bb0a707d6284d29f6238.headers create mode 100644 test/fixtures/7ac42ecd7ad91d876c3c3202ce69efa6 create mode 100644 test/fixtures/7ac42ecd7ad91d876c3c3202ce69efa6.headers create mode 100644 test/fixtures/7c1ef1cb044aa69ddad7cd69db399a81 create mode 100644 test/fixtures/7c1ef1cb044aa69ddad7cd69db399a81.headers create mode 100644 test/fixtures/82f8e5c9c0995affcb90ff13a0359856 create mode 100644 test/fixtures/82f8e5c9c0995affcb90ff13a0359856.headers create mode 100644 test/fixtures/8417827908807fd6dda52450c6e094c6 create mode 100644 test/fixtures/8417827908807fd6dda52450c6e094c6.headers create mode 100644 test/fixtures/851fadff7981d6862cc045eea0a822e3 create mode 100644 test/fixtures/851fadff7981d6862cc045eea0a822e3.headers create mode 100644 test/fixtures/85b25c8d456ebee45124282fee2ce040 create mode 100644 test/fixtures/85b25c8d456ebee45124282fee2ce040.headers create mode 100644 test/fixtures/85fe9ce7ea1df73ed9a47c34a9ab639a create mode 100644 test/fixtures/85fe9ce7ea1df73ed9a47c34a9ab639a.headers create mode 100644 test/fixtures/88d25eac97d9ca9d35b89f082799a4c6 create mode 100644 test/fixtures/88d25eac97d9ca9d35b89f082799a4c6.headers create mode 100644 test/fixtures/899fe51e8e100f8345cd1cf922bbfe1e create mode 100644 test/fixtures/899fe51e8e100f8345cd1cf922bbfe1e.headers create mode 100644 test/fixtures/8a175e08b48501b6e4cf37482521210d create mode 100644 test/fixtures/8a175e08b48501b6e4cf37482521210d.headers create mode 100644 test/fixtures/8dbe81ff8f0caaa1ae9d4efa37dc1412 create mode 100644 test/fixtures/8dbe81ff8f0caaa1ae9d4efa37dc1412.headers create mode 100644 test/fixtures/8e366fd1096b4f5c9a7992c9aac9f7b9 create mode 100644 test/fixtures/8e366fd1096b4f5c9a7992c9aac9f7b9.headers create mode 100644 test/fixtures/8e41d1b7bbfb49f1d68725fe46b32b31 create mode 100644 test/fixtures/8e41d1b7bbfb49f1d68725fe46b32b31.headers create mode 100644 test/fixtures/8f4adff433d805330aebe035bbb3d002 create mode 100644 test/fixtures/8f4adff433d805330aebe035bbb3d002.headers create mode 100644 test/fixtures/90dd9e390b2eb9e86db99c06a5930c3c create mode 100644 test/fixtures/90dd9e390b2eb9e86db99c06a5930c3c.headers create mode 100644 test/fixtures/92c20b3043c804f81d89af97976dfa53 create mode 100644 test/fixtures/92c20b3043c804f81d89af97976dfa53.headers create mode 100644 test/fixtures/9728c63ec56efc547f7cb0e94cb3fc43 create mode 100644 test/fixtures/9728c63ec56efc547f7cb0e94cb3fc43.headers create mode 100644 test/fixtures/97ca6d7fad6a7b70ec940fa3bab6c47a create mode 100644 test/fixtures/97ca6d7fad6a7b70ec940fa3bab6c47a.headers create mode 100644 test/fixtures/99a9d97c03b0197b42c4fc8e06319a87 create mode 100644 test/fixtures/99a9d97c03b0197b42c4fc8e06319a87.headers create mode 100644 test/fixtures/9e5831c56e1500e6c238583fc2a75fa7 create mode 100644 test/fixtures/9e5831c56e1500e6c238583fc2a75fa7.headers create mode 100644 test/fixtures/a04597ae29bb987a5c36b1747baa25fa create mode 100644 test/fixtures/a04597ae29bb987a5c36b1747baa25fa.headers create mode 100644 test/fixtures/a155d67a2d4b0ada2467e9cecd69577f create mode 100644 test/fixtures/a155d67a2d4b0ada2467e9cecd69577f.headers create mode 100644 test/fixtures/a1edb81b97ca0875be3c3fc1fb58f10b create mode 100644 test/fixtures/a1edb81b97ca0875be3c3fc1fb58f10b.headers create mode 100644 test/fixtures/a2e9ac8cccc68070158e14f749720049 create mode 100644 test/fixtures/a2e9ac8cccc68070158e14f749720049.headers create mode 100644 test/fixtures/a437ae1263f54894b27977b291026a21 create mode 100644 test/fixtures/a437ae1263f54894b27977b291026a21.headers create mode 100644 test/fixtures/a4ee3084562f882fa11139d16733d21a create mode 100644 test/fixtures/a4ee3084562f882fa11139d16733d21a.headers create mode 100644 test/fixtures/a7ebf644eeda889d47b3eeb3808e1612 create mode 100644 test/fixtures/a7ebf644eeda889d47b3eeb3808e1612.headers create mode 100644 test/fixtures/ab47a9969477aef4978774f295da4fef create mode 100644 test/fixtures/ab47a9969477aef4978774f295da4fef.headers create mode 100644 test/fixtures/abe14f4c4c73d24b0c1f73d484061520 create mode 100644 test/fixtures/abe14f4c4c73d24b0c1f73d484061520.headers create mode 100644 test/fixtures/ac7cdd14be6040b363313fe24fde27cc create mode 100644 test/fixtures/ac7cdd14be6040b363313fe24fde27cc.headers create mode 100644 test/fixtures/acac35649a5fee09364a40ee95829e69 create mode 100644 test/fixtures/acac35649a5fee09364a40ee95829e69.headers create mode 100644 test/fixtures/acf19bc8716eec134a0b6421390ef7f8 create mode 100644 test/fixtures/acf19bc8716eec134a0b6421390ef7f8.headers create mode 100644 test/fixtures/aefcb623c80ff8bcf4ac278179801856 create mode 100644 test/fixtures/aefcb623c80ff8bcf4ac278179801856.headers create mode 100644 test/fixtures/af9c8775c9c8864158f1c7b1b0fe5bda create mode 100644 test/fixtures/af9c8775c9c8864158f1c7b1b0fe5bda.headers create mode 100644 test/fixtures/b126f5b19e3c828365bf2558f4c632d5 create mode 100644 test/fixtures/b126f5b19e3c828365bf2558f4c632d5.headers create mode 100644 test/fixtures/b52874ed0f196446a4c665d43eb66a4e create mode 100644 test/fixtures/b52874ed0f196446a4c665d43eb66a4e.headers create mode 100644 test/fixtures/b5ceda98812eb060f88237674aea6b39 create mode 100644 test/fixtures/b5ceda98812eb060f88237674aea6b39.headers create mode 100644 test/fixtures/bb2d63521b1bc4926702e93aca844990 create mode 100644 test/fixtures/bb2d63521b1bc4926702e93aca844990.headers create mode 100644 test/fixtures/c1c06c12681af538c710619bc6b120f6 create mode 100644 test/fixtures/c1c06c12681af538c710619bc6b120f6.headers create mode 100644 test/fixtures/c20a5c482aa7d04b9dda7babfe743188 create mode 100644 test/fixtures/c20a5c482aa7d04b9dda7babfe743188.headers create mode 100644 test/fixtures/caea1b69fe8f1d3a5e69b787336b9bc3 create mode 100644 test/fixtures/caea1b69fe8f1d3a5e69b787336b9bc3.headers create mode 100644 test/fixtures/cc371fbba7f2002beeba8b30e43289ba create mode 100644 test/fixtures/cc371fbba7f2002beeba8b30e43289ba.headers create mode 100644 test/fixtures/d00537c2d4ee5e022ede99f8107c8f31 create mode 100644 test/fixtures/d00537c2d4ee5e022ede99f8107c8f31.headers create mode 100644 test/fixtures/d24e77d89cb5c321d30e6d57295865cb create mode 100644 test/fixtures/d24e77d89cb5c321d30e6d57295865cb.headers create mode 100644 test/fixtures/d2c0839932094a26d5b332efdeb29411 create mode 100644 test/fixtures/d2c0839932094a26d5b332efdeb29411.headers create mode 100644 test/fixtures/d48ca164b5167c4b15adaa30b79c5e48 create mode 100644 test/fixtures/d48ca164b5167c4b15adaa30b79c5e48.headers create mode 100644 test/fixtures/d79b4d5b3870a5c217bf065093f0c2bb create mode 100644 test/fixtures/d79b4d5b3870a5c217bf065093f0c2bb.headers create mode 100644 test/fixtures/dcd063023913100f2337a15baaf7cab8 create mode 100644 test/fixtures/dcd063023913100f2337a15baaf7cab8.headers create mode 100644 test/fixtures/df3294c221f51a91e332658994955033 create mode 100644 test/fixtures/df3294c221f51a91e332658994955033.headers create mode 100644 test/fixtures/e1554c0273de859d87630ea52d37372a create mode 100644 test/fixtures/e1554c0273de859d87630ea52d37372a.headers create mode 100644 test/fixtures/e7d064c841ee5e01c02ed599ecbd556a create mode 100644 test/fixtures/e7d064c841ee5e01c02ed599ecbd556a.headers create mode 100644 test/fixtures/e7d66bffb0e7b3bb6f87aff19c514424 create mode 100644 test/fixtures/e7d66bffb0e7b3bb6f87aff19c514424.headers create mode 100644 test/fixtures/eb333e098594fb7f53f15ca41f997176 create mode 100644 test/fixtures/eb333e098594fb7f53f15ca41f997176.headers create mode 100644 test/fixtures/ef8a765d572046b07aa6947545f2655a create mode 100644 test/fixtures/ef8a765d572046b07aa6947545f2655a.headers create mode 100644 test/fixtures/ef97a1709cfc1a6cf2b23c0f0c7a34fa create mode 100644 test/fixtures/ef97a1709cfc1a6cf2b23c0f0c7a34fa.headers create mode 100644 test/fixtures/f2f8141f92864c3860802d1e9d5b86c8 create mode 100644 test/fixtures/f2f8141f92864c3860802d1e9d5b86c8.headers create mode 100644 test/fixtures/f3745cfb05ddfda57ec715ce6e752f4e create mode 100644 test/fixtures/f3745cfb05ddfda57ec715ce6e752f4e.headers create mode 100644 test/fixtures/f3c7a5a4d0fbaf81b0a721a0fea245ea create mode 100644 test/fixtures/f3c7a5a4d0fbaf81b0a721a0fea245ea.headers create mode 100644 test/fixtures/f64d96e2f100bde683ffde19d156218d create mode 100644 test/fixtures/f64d96e2f100bde683ffde19d156218d.headers create mode 100644 test/fixtures/faadb7f41cc3307e81ffc0775f85c8cd create mode 100644 test/fixtures/faadb7f41cc3307e81ffc0775f85c8cd.headers create mode 100644 test/fixtures/fd48eb2a7c834a80a4cf3f589b1d9688 create mode 100644 test/fixtures/fd48eb2a7c834a80a4cf3f589b1d9688.headers delete mode 100644 test/helpers/client.js create mode 100644 test/helpers/client/cover-art-archive.js create mode 100644 test/helpers/client/musicbrainz.js diff --git a/package.json b/package.json index a98abcf..3165ba7 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "test:coverage": "cross-env NODE_ENV=test nyc npm run test:only", "test:only": "cross-env VCR_MODE=playback ava", "test:record": "cross-env VCR_MODE=record ava", + "test:record-new": "cross-env VCR_MODE=cache ava --serial", "test:watch": "npm run test:only -- --watch", "update-schema": "npm run -s print-schema:json > schema.json" }, diff --git a/src/api.js b/src/api/client.js similarity index 60% rename from src/api.js rename to src/api/client.js index 52d2bf3..a6280a1 100644 --- a/src/api.js +++ b/src/api/client.js @@ -1,11 +1,10 @@ import request from 'request' import retry from 'retry' -import qs from 'qs' import ExtendableError from 'es6-error' -import RateLimit from './rate-limit' -import pkg from '../package.json' +import RateLimit from '../rate-limit' +import pkg from '../../package.json' -const debug = require('debug')('graphbrainz:api') +const debug = require('debug')('graphbrainz:api/client') // If the `request` callback returns an error, it indicates a failure at a lower // level than the HTTP response itself. If it's any of the following error @@ -21,19 +20,20 @@ const RETRY_CODES = { EAI_AGAIN: true } -export class MusicBrainzError extends ExtendableError { +export class ClientError extends ExtendableError { constructor (message, statusCode) { super(message) this.statusCode = statusCode } } -export default class MusicBrainz { +export default class Client { constructor ({ baseURL = process.env.MUSICBRAINZ_BASE_URL || 'http://musicbrainz.org/ws/2/', userAgent = `${pkg.name}/${pkg.version} ` + `( ${pkg.homepage || pkg.author.url || pkg.author.email} )`, extraHeaders = {}, + errorClass = ClientError, timeout = 60000, // MusicBrainz API requests are limited to an *average* of 1 req/sec. // That means if, for example, we only need to make a few API requests to @@ -41,8 +41,8 @@ export default class MusicBrainz { // we then wait a few seconds before making more. In practice this can // seemingly be set to about 5 requests every 5 seconds before we're // considered to exceed the rate limit. - limit = 5, - period = 5500, + limit = 1, + period = 1000, concurrency = 10, retries = 10, // It's OK for `retryDelayMin` to be less than one second, even 0, because @@ -57,6 +57,7 @@ export default class MusicBrainz { this.baseURL = baseURL this.userAgent = userAgent this.extraHeaders = extraHeaders + this.errorClass = errorClass this.timeout = timeout this.limiter = new RateLimit({ limit, period, concurrency }) this.retryOptions = { @@ -73,36 +74,48 @@ export default class MusicBrainz { * `RETRY_CODES`. */ shouldRetry (err) { - if (err instanceof MusicBrainzError) { + if (err instanceof this.errorClass) { return err.statusCode >= 500 && err.statusCode < 600 } return RETRY_CODES[err.code] || false } + parseErrorMessage (response, body) { + return typeof body === 'string' && body ? body : `${response.statusCode}` + } + /** * Send a request without any retrying or rate limiting. * Use `get` instead. */ - _get (path, params, info = {}) { + _get (path, options = {}, info = {}) { return new Promise((resolve, reject) => { - const options = { + options = { baseUrl: this.baseURL, url: path, - qs: { ...params, fmt: 'json' }, - json: true, gzip: true, - headers: { 'User-Agent': this.userAgent, ...this.extraHeaders }, - timeout: this.timeout + timeout: this.timeout, + ...options, + headers: { + 'User-Agent': this.userAgent, + ...this.extraHeaders, + ...options.headers + } } - debug(`Sending request. url=${path} attempt=${info.currentAttempt}`) + debug(`Sending request. url=${this.baseURL}${path} attempt=${info.currentAttempt}`) request(options, (err, response, body) => { if (err) { + debug(`Error: “${err}” url=${this.baseURL}${path}`) reject(err) - } else if (response.statusCode !== 200) { - const message = (body && body.error) || '' - reject(new MusicBrainzError(message, response.statusCode)) + } else if (response.statusCode >= 400) { + const message = this.parseErrorMessage(response, body) + debug(`Error: “${message}” url=${this.baseURL}${path}`) + const ClientError = this.errorClass + reject(new ClientError(message, response.statusCode)) + } else if (options.method === 'HEAD') { + resolve(response.headers) } else { resolve(body) } @@ -113,7 +126,7 @@ export default class MusicBrainz { /** * Send a request with retrying and rate limiting. */ - get (path, params) { + get (path, options = {}) { return new Promise((resolve, reject) => { const fn = this._get.bind(this) const operation = retry.operation(this.retryOptions) @@ -121,7 +134,7 @@ export default class MusicBrainz { // This will increase the priority in our `RateLimit` queue for each // retry, so that newer requests don't delay this one further. const priority = currentAttempt - this.limiter.enqueue(fn, [path, params, { currentAttempt }], priority) + this.limiter.enqueue(fn, [path, options, { currentAttempt }], priority) .then(resolve) .catch(err => { if (!this.shouldRetry(err) || !operation.retry(err)) { @@ -131,64 +144,4 @@ export default class MusicBrainz { }) }) } - - stringifyParams (params) { - if (Array.isArray(params.inc)) { - params = { - ...params, - inc: params.inc.join('+') - } - } - if (Array.isArray(params.type)) { - params = { - ...params, - type: params.type.join('|') - } - } - if (Array.isArray(params.status)) { - params = { - ...params, - status: params.status.join('|') - } - } - return qs.stringify(params, { - skipNulls: true, - filter: (key, value) => value === '' ? undefined : value - }) - } - - getURL (path, params) { - const query = params ? this.stringifyParams(params) : '' - return query ? `${path}?${query}` : path - } - - getLookupURL (entity, id, params) { - if (id == null) { - return this.getBrowseURL(entity, params) - } - return this.getURL(`${entity}/${id}`, params) - } - - lookup (entity, id, params = {}) { - const url = this.getLookupURL(entity, id, params) - return this.get(url) - } - - getBrowseURL (entity, params) { - return this.getURL(entity, params) - } - - browse (entity, params = {}) { - const url = this.getBrowseURL(entity, params) - return this.get(url) - } - - getSearchURL (entity, query, params) { - return this.getURL(entity, { ...params, query }) - } - - search (entity, query, params = {}) { - const url = this.getSearchURL(entity, query, params) - return this.get(url) - } } diff --git a/src/api/cover-art-archive.js b/src/api/cover-art-archive.js new file mode 100644 index 0000000..3d03cfd --- /dev/null +++ b/src/api/cover-art-archive.js @@ -0,0 +1,47 @@ +import Client, { ClientError } from './client' + +export class CoverArtArchiveError extends ClientError {} + +export default class CoverArtArchive extends Client { + constructor ({ + baseURL = process.env.COVER_ART_ARCHIVE_BASE_URL || 'http://coverartarchive.org/', + errorClass = CoverArtArchiveError, + limit = 10, + period = 1000, + ...options + } = {}) { + super({ baseURL, errorClass, limit, period, ...options }) + } + + parseErrorMessage (response, body) { + if (typeof body === 'string' && body.startsWith('([^<]+)<\/h1>/i.exec(body) + const message = /

([^<]+)<\/p>/i.exec(body) + return `${heading ? heading[1] + ': ' : ''}${message ? message[1] : ''}` + } + return super.parseErrorMessage(response, body) + } + + getImagesURL (entity, mbid) { + return `${entity}/${mbid}` + } + + images (entity, mbid) { + const url = this.getImagesURL(entity, mbid) + return this.get(url, { json: true }) + } + + getImageURL (entity, mbid, typeOrID = 'front', size) { + let url = `${entity}/${mbid}/${typeOrID}` + if (size != null) { + url += `-${size}` + } + return url + } + + imageURL (entity, mbid, typeOrID = 'front', size) { + const url = this.getImageURL(entity, mbid, typeOrID, size) + return this.get(url, { method: 'HEAD', followRedirect: false }) + .then(headers => headers.location) + } +} diff --git a/src/api/index.js b/src/api/index.js new file mode 100644 index 0000000..fe1b7e9 --- /dev/null +++ b/src/api/index.js @@ -0,0 +1,10 @@ +import MusicBrainz, { MusicBrainzError } from './musicbrainz' +import CoverArtArchive, { CoverArtArchiveError } from './cover-art-archive' + +export { + MusicBrainz as default, + MusicBrainz, + MusicBrainzError, + CoverArtArchive, + CoverArtArchiveError +} diff --git a/src/api/musicbrainz.js b/src/api/musicbrainz.js new file mode 100644 index 0000000..ac1bc88 --- /dev/null +++ b/src/api/musicbrainz.js @@ -0,0 +1,83 @@ +import qs from 'qs' +import Client, { ClientError } from './client' + +export class MusicBrainzError extends ClientError {} + +export default class MusicBrainz extends Client { + constructor ({ + baseURL = process.env.MUSICBRAINZ_BASE_URL || 'http://musicbrainz.org/ws/2/', + errorClass = MusicBrainzError, + limit = 5, + period = 5500, + ...options + } = {}) { + super({ baseURL, errorClass, limit, period, ...options }) + } + + parseErrorMessage (response, body) { + if (body && body.error) { + return body.error + } + return super.parseErrorMessage(response, body) + } + + stringifyParams (params) { + if (Array.isArray(params.inc)) { + params = { + ...params, + inc: params.inc.join('+') + } + } + if (Array.isArray(params.type)) { + params = { + ...params, + type: params.type.join('|') + } + } + if (Array.isArray(params.status)) { + params = { + ...params, + status: params.status.join('|') + } + } + return qs.stringify(params, { + skipNulls: true, + filter: (key, value) => value === '' ? undefined : value + }) + } + + getURL (path, params) { + const query = params ? this.stringifyParams(params) : '' + return query ? `${path}?${query}` : path + } + + getLookupURL (entity, id, params) { + if (id == null) { + return this.getBrowseURL(entity, params) + } + return this.getURL(`${entity}/${id}`, params) + } + + lookup (entity, id, params = {}) { + const url = this.getLookupURL(entity, id, params) + return this.get(url, { json: true, qs: { fmt: 'json' } }) + } + + getBrowseURL (entity, params) { + return this.getURL(entity, params) + } + + browse (entity, params = {}) { + const url = this.getBrowseURL(entity, params) + return this.get(url, { json: true, qs: { fmt: 'json' } }) + } + + getSearchURL (entity, query, params) { + return this.getURL(entity, { ...params, query }) + } + + search (entity, query, params = {}) { + const url = this.getSearchURL(entity, query, params) + return this.get(url, { json: true, qs: { fmt: 'json' } }) + } +} diff --git a/src/index.js b/src/index.js index 10671c8..d3b2b2c 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,7 @@ import express from 'express' import graphqlHTTP from 'express-graphql' import compression from 'compression' -import MusicBrainz from './api' +import MusicBrainz, { CoverArtArchive } from './api' import schema from './schema' import createLoaders from './loaders' @@ -11,13 +11,17 @@ const formatError = (err) => ({ stack: err.stack }) -const middleware = ({ client = new MusicBrainz(), ...options } = {}) => { +const middleware = ({ + client = new MusicBrainz(), + coverArtClient = new CoverArtArchive(), + ...options +} = {}) => { const DEV = process.env.NODE_ENV !== 'production' const graphiql = DEV || process.env.GRAPHBRAINZ_GRAPHIQL === 'true' - const loaders = createLoaders(client) + const loaders = createLoaders(client, coverArtClient) return graphqlHTTP({ schema, - context: { client, loaders }, + context: { client, coverArtClient, loaders }, pretty: DEV, graphiql, formatError: DEV ? formatError : undefined, diff --git a/src/loaders.js b/src/loaders.js index c74c4ca..cce7657 100644 --- a/src/loaders.js +++ b/src/loaders.js @@ -5,7 +5,7 @@ import { toPlural } from './types/helpers' const debug = require('debug')('graphbrainz:loaders') const ONE_DAY = 24 * 60 * 60 * 1000 -export default function createLoaders (client) { +export default function createLoaders (client, coverArtClient) { // All loaders share a single LRU cache that will remember 8192 responses, // each cached for 1 day. const cache = LRUCache({ @@ -27,23 +27,6 @@ export default function createLoaders (client) { // Store the entity type so we can determine what type of object this // is elsewhere in the code. entity._type = entityType - entity._inc = params.inc - if (entityType === 'discid' && entity.releases) { - entity.releases.forEach(release => { - release._type = 'release' - release._inc = params.inc - }) - } else if (entityType === 'isrc' && entity.recordings) { - entity.recordings.forEach(recording => { - recording._type = 'recording' - recording._inc = params.inc - }) - } else if (entityType === 'iswc' && entity.works) { - entity.works.forEach(work => { - work._type = 'work' - work._inc = params.inc - }) - } } return entity }) @@ -61,7 +44,6 @@ export default function createLoaders (client) { // Store the entity type so we can determine what type of object this // is elsewhere in the code. entity._type = entityType - entity._inc = params.inc }) return list }) @@ -79,15 +61,45 @@ export default function createLoaders (client) { // Store the entity type so we can determine what type of object this // is elsewhere in the code. entity._type = entityType - entity._inc = params.inc }) return list }) })) }, { - cacheKeyFn: (key) => client.getSearchURL(...key), + cacheKeyFn: key => client.getSearchURL(...key), cacheMap: cache }) - return { lookup, browse, search } + const coverArt = new DataLoader(keys => { + return Promise.all(keys.map(key => { + const [ entityType, id ] = key + return coverArtClient.images(...key).catch(err => { + if (err.statusCode === 404) { + return { images: [] } + } + throw err + }).then(coverArt => { + coverArt._parentType = entityType + coverArt._parentID = id + if (entityType === 'release') { + coverArt._release = id + } else { + coverArt._release = coverArt.release && coverArt.release.split('/').pop() + } + return coverArt + }) + })) + }, { + cacheKeyFn: key => `cover-art/${coverArtClient.getImagesURL(...key)}`, + cacheMap: cache + }) + + const coverArtURL = new DataLoader(keys => { + return Promise.all(keys.map(key => coverArtClient.imageURL(...key))) + }, { + cacheKeyFn: key => `cover-art/url/${coverArtClient.getImageURL(...key)}`, + cacheMap: cache + }) + + return { lookup, browse, search, coverArt, coverArtURL } } diff --git a/src/types/cover-art-image.js b/src/types/cover-art-image.js new file mode 100644 index 0000000..b71f684 --- /dev/null +++ b/src/types/cover-art-image.js @@ -0,0 +1,72 @@ +import { + GraphQLObjectType, + GraphQLNonNull, + GraphQLList, + GraphQLBoolean, + GraphQLString, + GraphQLInt +} from 'graphql/type' +import { URLString } from './scalars' + +export const CoverArtImageThumbnails = new GraphQLObjectType({ + name: 'CoverArtImageThumbnails', + description: `URLs for thumbnails of different sizes for a particular piece of +cover art.`, + fields: () => ({ + small: { + type: URLString, + description: `The URL of a small version of the cover art, where the +maximum dimension is 250px.` + }, + large: { + type: URLString, + description: `The URL of a large version of the cover art, where the +maximum dimension is 500px.` + } + }) +}) + +export default new GraphQLObjectType({ + name: 'CoverArtImage', + description: 'An individual piece of album artwork from the [Cover Art Archive](https://musicbrainz.org/doc/Cover_Art_Archive).', + fields: () => ({ + fileID: { + type: new GraphQLNonNull(GraphQLString), + description: 'The Internet Archive’s internal file ID for the image.', + resolve: image => image.id + }, + image: { + type: new GraphQLNonNull(URLString), + description: 'The URL at which the image can be found.' + }, + thumbnails: { + type: CoverArtImageThumbnails, + description: 'A set of thumbnails for the image.' + }, + front: { + type: new GraphQLNonNull(GraphQLBoolean), + description: 'Whether this image depicts the “main front” of the release.' + }, + back: { + type: new GraphQLNonNull(GraphQLBoolean), + description: 'Whether this image depicts the “main back” of the release.' + }, + types: { + type: new GraphQLList(GraphQLString), + description: `A list of [image types](https://musicbrainz.org/doc/Cover_Art/Types) +describing what part(s) of the release the image includes.` + }, + edit: { + type: GraphQLInt, + description: 'The MusicBrainz edit ID.' + }, + approved: { + type: GraphQLBoolean, + description: 'Whether the image was approved by the MusicBrainz edit system.' + }, + comment: { + type: GraphQLString, + description: 'A free-text comment left for the image.' + } + }) +}) diff --git a/src/types/cover-art.js b/src/types/cover-art.js new file mode 100644 index 0000000..fae4f7a --- /dev/null +++ b/src/types/cover-art.js @@ -0,0 +1,188 @@ +import { + GraphQLObjectType, + GraphQLList, + GraphQLNonNull, + GraphQLBoolean, + GraphQLInt +} from 'graphql/type' +import CoverArtImage from './cover-art-image' +import { CoverArtImageSize } from './enums' +import Release from './release' +import { URLString } from './scalars' +import { resolveLookup } from '../resolvers' +import { getFields } from '../util' + +/** + * Return a resolver that will call `resolveFn` only if the requested field on + * the object is null or not present. + */ +function createFallbackResolver (resolveFn) { + return function resolve (coverArt, args, context, info) { + const value = coverArt[info.fieldName] + if (value == null) { + return resolveFn(coverArt, args, context, info) + } + return value + } +} + +function resolveImage (coverArt, { size }, { loaders }, info) { + if (size === 'FULL') { + size = null + } + const field = info.fieldName + if (coverArt.images) { + const matches = coverArt.images.filter(image => image[field]) + if (!matches.length) { + return null + } else if (matches.length === 1) { + const match = matches[0] + if (size === 250) { + return match.thumbnails.small + } else if (size === 500) { + return match.thumbnails.large + } else { + return match.image + } + } + } + if (coverArt[field] !== false) { + const { + _parentType: entityType = 'release', + _parentID: id = coverArt._release + } = coverArt + return loaders.coverArtURL.load([entityType, id, field, size]) + } +} + +const size = { + type: CoverArtImageSize, + description: `The size of the image to retrieve. By default, the returned +image will have its full original dimensions, but certain thumbnail sizes may be +retrieved as well.`, + defaultValue: null +} + +/** + * Get around both the circular dependency between the release and cover art + * types, and not have to define an identical `release` field twice on + * `ReleaseCoverArt` and `ReleaseGroupCoverArt`. + */ +function createReleaseField () { + return { + type: new GraphQLNonNull(Release), + description: 'The particular release shown in the returned cover art.', + resolve: (coverArt, args, context, info) => { + const id = coverArt._release + const fields = Object.keys(getFields(info)) + if (fields.length > 1 || fields[0] !== 'mbid') { + return resolveLookup(coverArt, { mbid: id }, context, info) + } + return { id } + } + } +} + +// This type combines two sets of data from different places. One is a *summary* +// of the images available at the Cover Art Archive, found in the `cover-art-archive` +// field on releases. The other is the actual list of images with their metadata, +// fetched from the Cover Art Archive itself rather than MusicBrainz. Depending +// on what fields are requested, we may only need to fetch one or the other, or +// both. Much of the summary data can be reconstructed if we already fetched the +// full image list, for example. +export const ReleaseCoverArt = new GraphQLObjectType({ + name: 'ReleaseCoverArt', + description: `An object containing a list of the cover art images for a +release obtained from the [Cover Art Archive](https://musicbrainz.org/doc/Cover_Art_Archive), +as well as a summary of what artwork is available.`, + fields: () => ({ + front: { + type: URLString, + description: `The URL of an image depicting the album cover or “main +front” of the release, i.e. the front of the packaging of the audio recording +(or in the case of a digital release, the image associated with it in a digital +media store). + +In the MusicBrainz schema, this field is a Boolean value indicating the presence +of a front image, whereas here the value is the URL for the image itself if one +exists. You can check for null if you just want to determine the presence of an +image.`, + args: { size }, + resolve: resolveImage + }, + back: { + type: URLString, + description: `The URL of an image depicting the “main back” of the +release, i.e. the back of the packaging of the audio recording. + +In the MusicBrainz schema, this field is a Boolean value indicating the presence +of a back image, whereas here the value is the URL for the image itself. You can +check for null if you just want to determine the presence of an image.`, + args: { size }, + resolve: resolveImage + }, + images: { + type: new GraphQLList(CoverArtImage), + description: `A list of images depicting the different sides and surfaces +of a release’s media and packaging.`, + resolve: createFallbackResolver((coverArt, args, { loaders }) => { + if (coverArt.count === 0) { + return [] + } + return loaders.coverArt.load(['release', coverArt._release]) + .then(coverArt => coverArt.images) + }) + }, + artwork: { + type: new GraphQLNonNull(GraphQLBoolean), + description: 'Whether there is artwork present for this release.', + resolve: createFallbackResolver(coverArt => coverArt.images.length > 0) + }, + darkened: { + type: new GraphQLNonNull(GraphQLBoolean), + description: `Whether the Cover Art Archive has received a take-down +request for this release’s artwork, disallowing new uploads.`, + resolve: createFallbackResolver((coverArt, args, { loaders }) => { + return loaders.lookup.load(['release', coverArt._release]) + .then(release => release['cover-art-archive'].darkened) + }) + }, + count: { + type: new GraphQLNonNull(GraphQLInt), + description: 'The number of artwork images present for this release.', + resolve: createFallbackResolver(coverArt => coverArt.images.length) + }, + release: createReleaseField() + }) +}) + +export const ReleaseGroupCoverArt = new GraphQLObjectType({ + name: 'ReleaseGroupCoverArt', + description: `An object containing the cover art for a release group obtained +from the [Cover Art Archive](https://musicbrainz.org/doc/Cover_Art_Archive). For +release groups, just the front cover of particular release will be selected.`, + fields: () => ({ + front: { + type: URLString, + description: `The URL of an image depicting the album cover or “main +front” of a release in the release group, i.e. the front of the packaging of the +audio recording (or in the case of a digital release, the image associated with +it in a digital media store).`, + args: { size }, + resolve: resolveImage + }, + images: { + type: new GraphQLList(CoverArtImage), + description: `A list of images returned by the [Cover Art +Archive](https://musicbrainz.org/doc/Cover_Art_Archive) for a release group. A +particular release’s front image will be included in the list, and likely no +others, even if other images are available.` + }, + artwork: { + type: new GraphQLNonNull(GraphQLBoolean), + description: 'Whether there is artwork present for this release group.', + resolve: createFallbackResolver(coverArt => coverArt.images.length > 0) + }, + release: createReleaseField() + }) +}) diff --git a/src/types/enums.js b/src/types/enums.js index d0e66e4..263b2f4 100644 --- a/src/types/enums.js +++ b/src/types/enums.js @@ -39,6 +39,29 @@ distinctive name.`, } }) +export const CoverArtImageSize = new GraphQLEnumType({ + name: 'CoverArtImageSize', + description: `The image sizes that may be requested at the [Cover Art +Archive](https://musicbrainz.org/doc/Cover_Art_Archive).`, + values: { + SMALL: { + name: 'Small', + description: 'A maximum dimension of 250px.', + value: 250 + }, + LARGE: { + name: 'Large', + description: 'A maximum dimension of 500px.', + value: 500 + }, + FULL: { + name: 'Full', + description: 'The image’s original dimensions, with no maximum.', + value: null + } + } +}) + export const ReleaseStatus = new GraphQLEnumType({ name: 'ReleaseStatus', description: `A type used to describe the status of releases, e.g. official, diff --git a/src/types/release-group.js b/src/types/release-group.js index 6161202..f7f68b8 100644 --- a/src/types/release-group.js +++ b/src/types/release-group.js @@ -1,6 +1,7 @@ import { GraphQLObjectType, GraphQLList } from 'graphql/type' import Node from './node' import Entity from './entity' +import { ReleaseGroupCoverArt } from './cover-art' import { DateType } from './scalars' import { ReleaseGroupType } from './enums' import { @@ -58,6 +59,14 @@ e.g. album, single, soundtrack, compilation, etc. A release group can have a description: `Additional [types](https://musicbrainz.org/doc/Release_Group/Type) that apply to this release group.` }), + coverArt: { + type: ReleaseGroupCoverArt, + description: `The cover art for a release group, obtained from the [Cover +Art Archive](https://musicbrainz.org/doc/Cover_Art_Archive).`, + resolve: (releaseGroup, args, { loaders }) => { + return loaders.coverArt.load(['release-group', releaseGroup.id]) + } + }, artists, releases, relationships, diff --git a/src/types/release.js b/src/types/release.js index 80f8abc..a8475c7 100644 --- a/src/types/release.js +++ b/src/types/release.js @@ -1,8 +1,14 @@ -import { GraphQLObjectType, GraphQLString, GraphQLList } from 'graphql/type' +import { + GraphQLObjectType, + GraphQLNonNull, + GraphQLString, + GraphQLList +} from 'graphql/type' import Node from './node' import Entity from './entity' import { ASIN, DateType } from './scalars' import Media from './media' +import { ReleaseCoverArt } from './cover-art' import { ReleaseStatus } from './enums' import ReleaseEvent from './release-event' import { @@ -68,6 +74,19 @@ release has one. The most common types found on releases are 12-digit [UPCs](https://en.wikipedia.org/wiki/Universal_Product_Code) and 13-digit [EANs](https://en.wikipedia.org/wiki/International_Article_Number).` }, + coverArt: { + type: new GraphQLNonNull(ReleaseCoverArt), + description: `A list and summary of the cover art images that are present +for this release from the [Cover Art Archive](https://musicbrainz.org/doc/Cover_Art_Archive).`, + resolve: (release, args, { loaders }) => { + const coverArt = release['cover-art-archive'] + if (coverArt) { + coverArt._release = release.id + return coverArt + } + return loaders.coverArt.load(['release', release.id]) + } + }, ...fieldWithID('status', { type: ReleaseStatus, description: 'The status describes how “official” a release is.' diff --git a/test/api/client.js b/test/api/client.js new file mode 100644 index 0000000..ecde9bf --- /dev/null +++ b/test/api/client.js @@ -0,0 +1,9 @@ +import test from 'ava' +import Client from '../../src/api/client' + +test('parseErrorMessage() returns the body or status code', t => { + const client = new Client() + t.is(client.parseErrorMessage({ statusCode: 500 }, 'something went wrong'), 'something went wrong') + t.is(client.parseErrorMessage({ statusCode: 500 }, ''), '500') + t.is(client.parseErrorMessage({ statusCode: 404 }, {}), '404') +}) diff --git a/test/api/cover-art-archive.js b/test/api/cover-art-archive.js new file mode 100644 index 0000000..02cf7ab --- /dev/null +++ b/test/api/cover-art-archive.js @@ -0,0 +1,47 @@ +import test from 'ava' +import { CoverArtArchiveError } from '../../src/api' +import client from '../helpers/client/cover-art-archive' + +test('can retrieve a front image URL', t => { + return client.imageURL('release', '76df3287-6cda-33eb-8e9a-044b5e15ffdd', 'front') + .then(url => { + t.is(url, 'http://archive.org/download/mbid-76df3287-6cda-33eb-8e9a-044b5e15ffdd/mbid-76df3287-6cda-33eb-8e9a-044b5e15ffdd-829521842.jpg') + }) +}) + +test('can retrieve a back image URL', t => { + return client.imageURL('release', '76df3287-6cda-33eb-8e9a-044b5e15ffdd', 'back') + .then(url => { + t.is(url, 'http://archive.org/download/mbid-76df3287-6cda-33eb-8e9a-044b5e15ffdd/mbid-76df3287-6cda-33eb-8e9a-044b5e15ffdd-5769317885.jpg') + }) +}) + +test('can retrieve a list of release images', t => { + return client.images('release', '76df3287-6cda-33eb-8e9a-044b5e15ffdd') + .then(data => { + t.is(data.release, 'http://musicbrainz.org/release/76df3287-6cda-33eb-8e9a-044b5e15ffdd') + t.true(data.images.length >= 3) + data.images.forEach(image => { + t.true(image.approved) + t.truthy(image.image) + t.truthy(image.id) + t.truthy(image.thumbnails.small) + t.truthy(image.thumbnails.large) + }) + t.true(data.images.some(image => image.front)) + t.true(data.images.some(image => image.back)) + t.true(data.images.some(image => image.types.indexOf('Front') !== -1)) + t.true(data.images.some(image => image.types.indexOf('Back') !== -1)) + t.true(data.images.some(image => image.types.indexOf('Medium') !== -1)) + }) +}) + +test('throws an error if given an invalid MBID', t => { + return t.throws(client.images('release', 'xyz'), CoverArtArchiveError) +}) + +test('uses the default error impementation if there is no HTML error', t => { + t.is(client.parseErrorMessage({ statusCode: 501 }, 'yikes'), 'yikes') + t.is(client.parseErrorMessage({ statusCode: 500 }, ''), '500') + t.is(client.parseErrorMessage({ statusCode: 404 }, null), '404') +}) diff --git a/test/api.js b/test/api/musicbrainz.js similarity index 86% rename from test/api.js rename to test/api/musicbrainz.js index e2405bd..62a4e5d 100644 --- a/test/api.js +++ b/test/api/musicbrainz.js @@ -1,6 +1,6 @@ import test from 'ava' -import MusicBrainz, { MusicBrainzError } from '../src/api' -import client from './helpers/client' +import MusicBrainz, { MusicBrainzError } from '../../src/api' +import client from '../helpers/client/musicbrainz' test('getLookupURL() generates a lookup URL', t => { t.is(client.getLookupURL('artist', 'c8da2e40-bd28-4d4e-813a-bd2f51958ba8', { @@ -62,3 +62,9 @@ test('rejects non-MusicBrainz errors', t => { const client = new MusicBrainz({ baseURL: '$!@#$' }) t.throws(client.get('artist/5b11f4ce-a62d-471e-81fc-a69a8278c7da'), Error) }) + +test('uses the default error impementation if there is no JSON error', t => { + t.is(client.parseErrorMessage({ statusCode: 501 }, 'yikes'), 'yikes') + t.is(client.parseErrorMessage({ statusCode: 500 }, {}), '500') + t.is(client.parseErrorMessage({ statusCode: 404 }, null), '404') +}) diff --git a/test/fixtures/01f85d1b5c1e1c7ee9768df1f7529a89 b/test/fixtures/01f85d1b5c1e1c7ee9768df1f7529a89 new file mode 100644 index 0000000..1d98000 --- /dev/null +++ b/test/fixtures/01f85d1b5c1e1c7ee9768df1f7529a89 @@ -0,0 +1 @@ +See: http://archive.org/download/mbid-76df3287-6cda-33eb-8e9a-044b5e15ffdd/index.json diff --git a/test/fixtures/01f85d1b5c1e1c7ee9768df1f7529a89.headers b/test/fixtures/01f85d1b5c1e1c7ee9768df1f7529a89.headers new file mode 100644 index 0000000..ece0e55 --- /dev/null +++ b/test/fixtures/01f85d1b5c1e1c7ee9768df1f7529a89.headers @@ -0,0 +1,24 @@ +{ + "statusCode": 307, + "headers": { + "date": "Tue, 20 Dec 2016 01:37:47 GMT", + "content-type": "text/plain; charset=utf-8", + "content-length": "86", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "location": "http://archive.org/download/mbid-76df3287-6cda-33eb-8e9a-044b5e15ffdd/index.json", + "access-control-allow-origin": "*", + "server": "4b4c084fb141" + }, + "url": "http://coverartarchive.org:80/release/76df3287-6cda-33eb-8e9a-044b5e15ffdd", + "time": 372, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/029740f01ae52e57fcaa1fbe44f3cc76 b/test/fixtures/029740f01ae52e57fcaa1fbe44f3cc76 new file mode 100644 index 0000000..5547437 --- /dev/null +++ b/test/fixtures/029740f01ae52e57fcaa1fbe44f3cc76 @@ -0,0 +1 @@ +{"images":[{"edit":41326273,"back":false,"approved":true,"comment":"","types":["Front"],"thumbnails":{"small":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955061405-250.jpg","large":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955061405-500.jpg"},"front":true,"id":"14955061405","image":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955061405.jpg"},{"approved":true,"back":true,"edit":41326275,"id":"14955062822","front":false,"image":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955062822.jpg","thumbnails":{"small":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955062822-250.jpg","large":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955062822-500.jpg"},"comment":"","types":["Back","Spine"]},{"id":"14955064370","front":false,"image":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955064370.jpg","thumbnails":{"large":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955064370-500.jpg","small":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955064370-250.jpg"},"types":["Tray"],"comment":"","approved":true,"back":false,"edit":41326278},{"edit":41326288,"approved":true,"back":false,"thumbnails":{"large":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955066041-500.jpg","small":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955066041-250.jpg"},"comment":"","types":["Booklet"],"image":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955066041.jpg","id":"14955066041","front":false},{"edit":41326294,"back":false,"approved":true,"comment":"","types":["Booklet"],"thumbnails":{"small":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955068047-250.jpg","large":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955068047-500.jpg"},"image":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955068047.jpg","front":false,"id":"14955068047"},{"front":false,"id":"14955069655","image":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955069655.jpg","types":["Booklet"],"comment":"","thumbnails":{"large":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955069655-500.jpg","small":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955069655-250.jpg"},"back":false,"approved":true,"edit":41326297},{"approved":true,"back":false,"edit":41326303,"image":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955071842.jpg","id":"14955071842","front":false,"thumbnails":{"small":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955071842-250.jpg","large":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955071842-500.jpg"},"comment":"","types":["Booklet"]},{"types":["Booklet"],"comment":"","thumbnails":{"small":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955073836-250.jpg","large":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955073836-500.jpg"},"front":false,"id":"14955073836","image":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955073836.jpg","edit":41326306,"back":false,"approved":true},{"edit":41326325,"back":false,"approved":true,"comment":"","types":["Booklet"],"thumbnails":{"large":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955075724-500.jpg","small":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955075724-250.jpg"},"front":false,"id":"14955075724","image":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/14955075724.jpg"},{"edit":41538992,"approved":true,"back":false,"thumbnails":{"small":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/15067760321-250.jpg","large":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/15067760321-500.jpg"},"comment":"Sticker","types":["Sticker"],"image":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/15067760321.jpg","id":"15067760321","front":false},{"id":"15067761190","front":false,"image":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/15067761190.jpg","thumbnails":{"large":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/15067761190-500.jpg","small":"http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52/15067761190-250.jpg"},"comment":"CD","types":["Medium"],"approved":true,"back":false,"edit":41538996}],"release":"https://musicbrainz.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52"} \ No newline at end of file diff --git a/test/fixtures/029740f01ae52e57fcaa1fbe44f3cc76.headers b/test/fixtures/029740f01ae52e57fcaa1fbe44f3cc76.headers new file mode 100644 index 0000000..040ff16 --- /dev/null +++ b/test/fixtures/029740f01ae52e57fcaa1fbe44f3cc76.headers @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:56 GMT", + "content-type": "application/json", + "content-length": "4829", + "last-modified": "Fri, 04 Nov 2016 08:01:44 GMT", + "connection": "keep-alive", + "etag": "\"581c4068-12dd\"", + "expires": "Tue, 20 Dec 2016 07:39:56 GMT", + "cache-control": "max-age=21600", + "accept-ranges": "bytes" + }, + "url": "http://ia601203.us.archive.org:80/29/items/mbid-d5cdb7fd-c7e9-460a-9549-8a369655cc52/index.json", + "time": 155, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://archive.org/download/mbid-d5cdb7fd-c7e9-460a-9549-8a369655cc52/index.json", + "host": "ia601203.us.archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/0362ca3081fd5d16d8e29846798296a0 b/test/fixtures/0362ca3081fd5d16d8e29846798296a0 new file mode 100644 index 0000000..fc146de --- /dev/null +++ b/test/fixtures/0362ca3081fd5d16d8e29846798296a0 @@ -0,0 +1 @@ +See: http://archive.org/download/mbid-dd15903e-0ee7-45ec-aba1-2fc7b3a44e19/index.json diff --git a/test/fixtures/0362ca3081fd5d16d8e29846798296a0.headers b/test/fixtures/0362ca3081fd5d16d8e29846798296a0.headers new file mode 100644 index 0000000..5784d9f --- /dev/null +++ b/test/fixtures/0362ca3081fd5d16d8e29846798296a0.headers @@ -0,0 +1,24 @@ +{ + "statusCode": 307, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:55 GMT", + "content-type": "text/plain; charset=utf-8", + "content-length": "86", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "location": "http://archive.org/download/mbid-dd15903e-0ee7-45ec-aba1-2fc7b3a44e19/index.json", + "access-control-allow-origin": "*", + "server": "d6446ea62189" + }, + "url": "http://coverartarchive.org:80/release/dd15903e-0ee7-45ec-aba1-2fc7b3a44e19", + "time": 414, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/071ecc4967496ac9ff5c75bcb6faf549 b/test/fixtures/071ecc4967496ac9ff5c75bcb6faf549 new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/071ecc4967496ac9ff5c75bcb6faf549.headers b/test/fixtures/071ecc4967496ac9ff5c75bcb6faf549.headers new file mode 100644 index 0000000..16039e4 --- /dev/null +++ b/test/fixtures/071ecc4967496ac9ff5c75bcb6faf549.headers @@ -0,0 +1,25 @@ +{ + "statusCode": 302, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:37:47 GMT", + "content-type": "text/html; charset=UTF-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "x-powered-by": "PHP/5.5.9-1ubuntu4.20", + "accept-ranges": "bytes", + "location": "http://ia802607.us.archive.org/32/items/mbid-76df3287-6cda-33eb-8e9a-044b5e15ffdd/index.json" + }, + "url": "http://archive.org:80/download/mbid-76df3287-6cda-33eb-8e9a-044b5e15ffdd/index.json", + "time": 139, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://coverartarchive.org/release/76df3287-6cda-33eb-8e9a-044b5e15ffdd", + "host": "archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/078ffa5f6640843175067e82b92da215 b/test/fixtures/078ffa5f6640843175067e82b92da215 new file mode 100644 index 0000000000000000000000000000000000000000..79842a246f1b1843b058e56f9068030fb66bb5ad GIT binary patch literal 429 zcmV;e0aE@SiwFP!0000018q{#irg>^{FUJ66~u88J9+GJ94&=Dwnw=K#Zk6qv+>q( z_F9(wdnLMUX{jM#jWn9cBsX)m#;CMRG-sEGP5mN_2!@k*7${vm`=11YfU(>3`{A?m~{8U zA3N;j9lg?AJm5-7c$r0%?wnS#G5I(OP`b*Q&giDD8g3+-i3vbgTJoy;&$oY=m8=Es2jdH+i9pqtSxrc=&2QvkY}Mj$F2B?OD^8#0t%^~q7)L^ z8pP3?l26q>JwGtEvY(9;QXi%%_<-|o?B}0UlPPNs6O3y|Fm>4hP8ET5uCYYE@smXU Xb;CJiNnwfU%v<&!t)_18lmY+%RS443 literal 0 HcmV?d00001 diff --git a/test/fixtures/078ffa5f6640843175067e82b92da215.headers b/test/fixtures/078ffa5f6640843175067e82b92da215.headers new file mode 100644 index 0000000..bde033d --- /dev/null +++ b/test/fixtures/078ffa5f6640843175067e82b92da215.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:40:11 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "577", + "x-ratelimit-reset": "1482198012", + "server": "Plack::Handler::Starlet", + "etag": "W/\"0c725784e392aef95ce4df262002a059\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/3e2c779e-16e8-459e-8791-2da47a92dce6?fmt=json", + "time": 415, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/07a9f4ce4cc4639f8ec3d5c06a91b670 b/test/fixtures/07a9f4ce4cc4639f8ec3d5c06a91b670 new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/07a9f4ce4cc4639f8ec3d5c06a91b670.headers b/test/fixtures/07a9f4ce4cc4639f8ec3d5c06a91b670.headers new file mode 100644 index 0000000..23b84e4 --- /dev/null +++ b/test/fixtures/07a9f4ce4cc4639f8ec3d5c06a91b670.headers @@ -0,0 +1,25 @@ +{ + "statusCode": 302, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:57 GMT", + "content-type": "text/html; charset=UTF-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "x-powered-by": "PHP/5.5.9-1ubuntu4.20", + "accept-ranges": "bytes", + "location": "http://ia600509.us.archive.org/33/items/mbid-fb98043c-7ac8-4505-ba87-28576836a8d5/index.json" + }, + "url": "http://archive.org:80/download/mbid-fb98043c-7ac8-4505-ba87-28576836a8d5/index.json", + "time": 178, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://coverartarchive.org/release/fb98043c-7ac8-4505-ba87-28576836a8d5", + "host": "archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/17a054fb91109cd8b5a2d1a8c8ab3a4a b/test/fixtures/17a054fb91109cd8b5a2d1a8c8ab3a4a new file mode 100644 index 0000000000000000000000000000000000000000..e96c7b9f273d745bd3743203a3138754eaaca043 GIT binary patch literal 387 zcmV-}0et=+iwFP!0000018q^uPQx$|{FQ3Yv6R$#wKtAPNE{1795(hQSh#kvotCQV zzq4*BLV|-2qn+8AS)X9Qpu8qnyV=?T5`88SXcs7wOPGvzus(rBH_bRP4aiMUKvco( z62k{f4$cKAzo#HDB!246>?z9zRPV4J(MBqOX9ph`r!X@dgLml$l%F%G3eXtd$&vn+ z@#e@e=Ezo$<7kvY%k~(J`-yCl&B5;6@qow0v!53mbZK#)nD{ZHHR;G>=fn1*z3vl+ zEubb@*0O4a>{~5lU9JRC^Rn=R4J>+JAK7Fyknv&f|_? z+yECK*jvUQbMu(VM_!8GIvbrhIO&f%j}_O~$}_*6#TH(Z%U=4ZT6c>Y4sY zuSa)%dQ=bZWgNzX=AcX7+vpq(yN5VDz33D2ezy;ap6*3U?x)u8FB`LiH*=#m_c#2s zlbV-<;UV_t{d?BF+^*+&AA8OC#BcWsjeF33uvfL;!vmV0VT)Vuz>JSyzI?odI_wVz zCr6hc@m_nMf+LVf0}4IigJlO&v+R@AOrW0(3Fr1~_QJ_w1>xB!=hVYM@C!1i=5>Dk zu`?MreHkqrs4S(CwGO z_%0%jus7I;{>fn=dYih$MeoZyVw@+=y#P~;CRz;%oQ?{ZVk{-4jhA_HN85uQU9^jx zv5})8#!qn0vBckp#CSM1p;RzcQrzC5lT-INUUXx#r_n6fIJbqfoHS+yBG7|Z4kM7m ziRX1j?ToQSsoSLZBeDZ&j_y}I=!sIk`XOAt40c7TxizZb6{KMPde%iI2l_+uWs9!)C9SX-3>>0MMH0tc8JGvm0fSq!dR)-~nA`I#A5DlSi?GpSyjW znMRk5xwt`s;~SG~AI8&LdwyaWOKGtW*JK9O;SZXo^{qO;S4&PS*pdt(i7^ zy*7Nd1_SD|f2Y7e;<}IvBW5bZQ7qQwS7KXjBoQFdE%&VL-C;g#_G10t%v6{;GzXGx z>?8TT-wX%wQxmYiOgufwLu_4aaqFV+c=qRS49;&(LKsWe+20o<()s_fz1g{p$(v)J zuAovX9P2cgj8Bn|iO$lv?3B%vM-<2`5dfs8L?IRhF-hmMG1-=IRa~ZLL{R9bivwds zZVwKRy1lap^Kpt=)D*RhZ*eKLs99>UJOnI=ke$#V37upsdSKk9h>2U}S|M*dCuVu} zvT+fakVzlsLCtv^)ywe9c^kkyD8p&)GpWh3mcoOtf+wN#HWDDBcGm;=X}MwedzOFC zy=I%7dbc@GqO21slZ#FhvVGLxMez_rM5c=hIr+(>ctxTzACs?o%?s=g^2ukisOk2b z(Lo;Pax+h9mHt2-mYNgT+e&8a^j*@ z`S1QL{J;NM#H2Uq`VbRz#){@|MCyOPL2S7^;ohb}oq^{Dq@{CpzTxw34P1hA^t3^o&lx8VXx+o#!tbt`61238Wq)|m`#NPW z1ecU70!B~DURVo37@B;HlAMrvaJ=<$MoNaiX+{_U%Qvaa^<-rNK-=l#D2uv}X<^?YxyA%xGx50gAb z$B1ZjAZ%D~0VP*pa-j$5xtFOGKlTPEy=J>RI=$Ok58+YC92jV66DTYkoc0b}P|iiC zY!Ue@pm7B<*2Pk{1D|ni#myql_Y!NagU`D+!1#ia!xRG-#sZ5KJW(1F3$E@}Wy*&{ zk}rz3wJ8s)*ZYZL%Q4LX?8nuG*vd$12N{{Ov_g{mQ`KJq5s<YM#;I;ej3u9l5!e!HfDhn0!@Z&DnSr8s6r7PxhmkCA~+$p$+o8Yf)2k6PiMP3Om2Pzb@aI zoHd0YEp$?u9@vNFUP%gbq@iMqAT>! zLj*5LEQ^#eC@&=CbCb)x!6Uljqe$7>f@@)*3@|wfDfr5~fnuK_ON&UHW3D?DTGx6v z4A}2=OI{)j%{OlsG%fJvY^~ImgW<{&cuOLMNI5|=#zd7=q-l0bY1F;$(`F?|PB{$( z7D)MOA|)3L2bMhrzEJ;d>G3^0Y~BorheyZF)>$FrRQcf9p^b+6ZJc#j23Qq!rWpjp ziS)>$qRiC93_2ytf@GfQ1sT?&MT#@{O$WSdO8BPEdYD4KrBGFg#Y}@kQksHAp-ASC zewI*pA$_1&ZWaIUWqQJ+W^0Ju{>BAf=Q5>l21L7rP)o9|ZkN*Br^@&Wye8sx=#-PP z2ou^Hr=(d3h;|JyjIpshxSyCdg9DX9(Z*6VCdmzo84AuJWSX0zIE*4DBU{usJjH&q znecE{>WtfH?$-{Tt6vEI?|;{RwPWke+18`;=GHo4r}w#YtE-t?!*0v;g^hQ%lG=7o zvwLzn>riT1YQ(qgiCVT`idtv1IYAV4nKUKJa+sGixkhR>;U54-DnHwdH+9y z>fU=z=T3G7U79O3xyT9+yilH`V)Uc|JOhtKSffJJro~g6KfGABl*7JFY;)FD+X9`D zRsTtCKsigPT(F8BFr!qOtRipTIzK%?vGba^*2Hxi#AR^pDuxTxHk#_D=IqEH}4ct(LKy5XimK1-R2>5D8}R)@MqWybX*67VXW{*T&7r z?E%*2C=ratnFLZRBJ{v0zmFzDri3;GAH8-hqT9)%;h;Neemu-W?4{W$w&3tpjCa;G zwYy$@KnS?t**P!v$Av)vGwJ@ z_xX4f&eu|}qP@lYwpZ46Q{U{!BHGG!+|-pmO@DIMa}WuYMK4m!=0@bVmUe4t_ZOCS zH~JdrqMY;rz5~jfaMF*(+;o`^X*sj|VS5E`t1^r((a<$uzKH)JB;8yMLR-?6;2l%s zRa>{xE6p?ntgE9=TjQibm-L#|)~vQ>wa$3?UW_ZGZu+gA$ypEltsUSwtFpXyq_f{j6B+43uw&($Wo_~CYcZtH=Ma* zf?QS#K0O`u${*~}t%+k1y%*Aev9)a4djp~VoiN3q=GJIgLcZOJ^T4aU#6C%e`i)pa z?p7%?a3m2xDINn_rmSv#oolO0H@0_jcvyD>{&4xHCmBaGlkfZx1%-Ob592Ny7bh&4 zj8h|EKh2J@Vz)aBbqhVP%(&S;_p~u7dh2B1B>w6=juiZYw*ivy(G{&z&Up!x{`&9P zUuE8gdvuvQe$h@%xPRv53DKO7{-5~I ze?mFwf9kX-EQlnvU;>IIp`#q}X|Tj&m{{S?3AEOJJ%z2AXw5|T$warGAydL90v7=U zujS#Teihx8`cpcgwUKUIcX$mxYI$Vyx9K|5zpoJD@8etKE-KEfr1W2qCa*iIASj(c zD$Qk1hD)X=2IrIR$!L33QU#GLJ~Xlmc)`Duoq27^z_%1|j2cOn=C zIjaoPmkgMd2d1OcCb%fZd%v#V=x2bG{CKtc2A{}jo%Qga$T7ZdP_WYJ>F@qC_C&vZ zFMeJj72A9LOGD|{_!@ID%nGX|)4G0fvR3>W0gfvP=%OVsMrTs19=={`_b@zJR4yJo z7lLwR5Ykg-$9$m74kKixLWw5IVq0a)uk#Vf*26BL;o0VkMFG)%WpZcRAJw!%1+NU0 zlqtY@dRmxBqw6e-5rr$%@^%5dhU(WrmGfHqJ^l*RO?I_U&iX!gwb#WX#;0GGY4P+4 z`)QS3?Qh?_+ujj!K`nsSXcYyfC`bhxAXoF71pla5W8%i)vd1|zx+SmS=MOKcK`rzlk{c) literal 0 HcmV?d00001 diff --git a/test/fixtures/240fa01906160caef0ad74b8e2fe44f0.headers b/test/fixtures/240fa01906160caef0ad74b8e2fe44f0.headers new file mode 100644 index 0000000..2f3375c --- /dev/null +++ b/test/fixtures/240fa01906160caef0ad74b8e2fe44f0.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:55 GMT", + "content-type": "application/json; charset=UTF-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "541", + "x-ratelimit-reset": "1482197996", + "last-modified": "Tue, 20 Dec 2016 01:16:03 GMT", + "server": "Jetty(9.3.10.v20160621)", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release?query=You%20Want%20It%20Darker&fmt=json", + "time": 415, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/257742f1f5f07e90a7514808bc18977a b/test/fixtures/257742f1f5f07e90a7514808bc18977a new file mode 100644 index 0000000..17ef318 --- /dev/null +++ b/test/fixtures/257742f1f5f07e90a7514808bc18977a @@ -0,0 +1,4 @@ + +400 Bad Request +

Bad Request

+

invalid MBID specified

diff --git a/test/fixtures/257742f1f5f07e90a7514808bc18977a.headers b/test/fixtures/257742f1f5f07e90a7514808bc18977a.headers new file mode 100644 index 0000000..5e8d68b --- /dev/null +++ b/test/fixtures/257742f1f5f07e90a7514808bc18977a.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 400, + "headers": { + "date": "Tue, 20 Dec 2016 01:37:47 GMT", + "content-type": "text/html", + "content-length": "138", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "d6446ea62189" + }, + "url": "http://coverartarchive.org:80/release/xyz", + "time": 366, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/325850e36c752b826928e22ac481772a b/test/fixtures/325850e36c752b826928e22ac481772a new file mode 100644 index 0000000000000000000000000000000000000000..9d0517f57bff8be54988596ede4351fc79a153fd GIT binary patch literal 405 zcmV;G0c!pqiwFP!0000019efsuG26O{FQ3YT`7*^#OV=HAtVr&Cjmn5uyHoUYHAn9 zDWIzV&bp%SfOyB<8PCp)uaJ0VS{V7lAuq7|b_GgIu)BgEVF$LSwll6q&ALNvl*Pen zhmEoWjix7S2(}RD#KPXMDV|y8C8mu3E=Rx6Y4C@YvX4O!+4&`+R&9$4T^zYMfG>M^ zz6qUjd0tma&x92UK$sOt7!vS_-o#!pMxQ3j53sc^0VW3omignvtqgzvTbuR!d zzTA9MsgFv(d)hy};wba4jET>Q7pdegaD|zI&<;hI<+wz2$)B@~A1DX-uU`@Kc`nPZ zaov2TkT>u1<}IZor=lS0>w@>58`f1LMWD9rh`OnIq^V}?tTi38Gj1vs-nrwbOkZin zin+tautOS1VLiES(9|@nO5m5K?iU_qT{t1h=SWT8{e?@kDa9Z`a#~qxO8I9@$HzDp zvw=lmqIu!cuX_RS)x%ET9$CcPr)l!e(<}yltTg*vekR0plGW`G6pCYIZ~_1TpC!q# literal 0 HcmV?d00001 diff --git a/test/fixtures/325850e36c752b826928e22ac481772a.headers b/test/fixtures/325850e36c752b826928e22ac481772a.headers new file mode 100644 index 0000000..490fe06 --- /dev/null +++ b/test/fixtures/325850e36c752b826928e22ac481772a.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:58 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "203", + "x-ratelimit-reset": "1482197998", + "server": "Plack::Handler::Starlet", + "etag": "W/\"08dc9c7327d0e7a8b9ede6ae8509c80b\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/dd15903e-0ee7-45ec-aba1-2fc7b3a44e19?fmt=json", + "time": 449, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/34ca10f44e5af073160c7b6adac60130 b/test/fixtures/34ca10f44e5af073160c7b6adac60130 new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/34ca10f44e5af073160c7b6adac60130.headers b/test/fixtures/34ca10f44e5af073160c7b6adac60130.headers new file mode 100644 index 0000000..b66cd46 --- /dev/null +++ b/test/fixtures/34ca10f44e5af073160c7b6adac60130.headers @@ -0,0 +1,25 @@ +{ + "statusCode": 302, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:56 GMT", + "content-type": "text/html; charset=UTF-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "x-powered-by": "PHP/5.5.9-1ubuntu4.20", + "accept-ranges": "bytes", + "location": "http://ia601203.us.archive.org/29/items/mbid-d5cdb7fd-c7e9-460a-9549-8a369655cc52/index.json" + }, + "url": "http://archive.org:80/download/mbid-d5cdb7fd-c7e9-460a-9549-8a369655cc52/index.json", + "time": 356, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://coverartarchive.org/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52", + "host": "archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/363970b23b4aa02d9be42a6492f76ada b/test/fixtures/363970b23b4aa02d9be42a6492f76ada new file mode 100644 index 0000000000000000000000000000000000000000..516486e94c33b2a695f97d654adaa30222a8e878 GIT binary patch literal 382 zcmV-^0fGJ>iwFP!0000018tB`O9L?w#lK3)xdWU1*WF%KL=ZfRNDs5gq=u$R&1S2m z?00ukY!Bigka@|Q`Mo&{jfuos$iA0iDUwYtmv`vg;wdd&KQJxc!nAlrpZNWNYKL3v zw_vqc`^mYb$TzVvrtbzUL3eEfbx#9y!=Rz8wCZ(Rm{KbCj|tN>Ud*DVs;Dd3Le;ez zs=DX_O-Zoox@JYB8fAzrDjX>S#>7W`*dybe1(#nT?!?-l8)+#_49s_}2By3f8sm;U z>6@U!l>Zj}&c1wMYd}$H0@BV?`BRRs6fR5x7d*9E0 z){2oZV_$M}x~4Q5K~}1UN@4{AQ3C}vYLKRp8Z~>g9dSR{?S#n&&py`d7}(IZAVCF9 zc~mCYFm~VtdEDorkHlI0iU0o*=6REs6SMak1xM?z_e9?bA{`=)9OQTISvd4evCW-` ccfi9`v*V|na~^-3E_ z-li=3-#f~ZG_>@fgNAwEd-E>BPhu~$QY1SxprxIln|B>pO$H2_&L}nC^`jK6DD+Yw z(J4`;P_XzI#Qq|(Oa4?C^94)bwH3p%;X*v2u!w6bCZF**dY;}ig11iS4!HQRK#dT# zb!~-nJRuxF)+QPjhKY#K!I2>E12;!ro&BE6JV)% zq&4!R_nYy^esQ8dIhd1vvEcE6*AuOTnSjoGb{6|@7v>YzaIf`s#yYZcgud4Xl-dno z%`m`V_1GJ&J7*1J0v>CI$KVT1%>x%mna4gyP_pkqLd{V5)%JTUa^xodqx!efzplJ8 z;CaK4+=qG6OdD5cl)!o&PX{+byJa9mfG>`UzCGvw-s*!C;IYh@5sau>`XZ kZ*3J{)@u6{x8^H`(tIurH1+o>){nUU2KCinvu6ST0R0og^8f$< literal 0 HcmV?d00001 diff --git a/test/fixtures/37dafe8b4260600bbb8b2571ec4ac86c.headers b/test/fixtures/37dafe8b4260600bbb8b2571ec4ac86c.headers new file mode 100644 index 0000000..bcf7a97 --- /dev/null +++ b/test/fixtures/37dafe8b4260600bbb8b2571ec4ac86c.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:40:05 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "422", + "x-ratelimit-reset": "1482198006", + "server": "Plack::Handler::Starlet", + "etag": "W/\"bc27197091616cb74bbc5128fb69a933\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/533e14a8-519d-4f04-95e8-8a84833f26b1?fmt=json", + "time": 410, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/39192d7783e3cbd103a64e37435860c8 b/test/fixtures/39192d7783e3cbd103a64e37435860c8 new file mode 100644 index 0000000..d4519ba --- /dev/null +++ b/test/fixtures/39192d7783e3cbd103a64e37435860c8 @@ -0,0 +1,4 @@ + +404 Not Found +

Not Found

+

No cover art found for release 29a43eb0-537d-4af1-8598-8b488c847f2e

diff --git a/test/fixtures/39192d7783e3cbd103a64e37435860c8.headers b/test/fixtures/39192d7783e3cbd103a64e37435860c8.headers new file mode 100644 index 0000000..b8b8ba4 --- /dev/null +++ b/test/fixtures/39192d7783e3cbd103a64e37435860c8.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:56 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "d6446ea62189" + }, + "url": "http://coverartarchive.org:80/release/29a43eb0-537d-4af1-8598-8b488c847f2e", + "time": 506, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/3aaa80314ca3bb3404ab1a0b2be0da6a b/test/fixtures/3aaa80314ca3bb3404ab1a0b2be0da6a new file mode 100644 index 0000000..edc4439 --- /dev/null +++ b/test/fixtures/3aaa80314ca3bb3404ab1a0b2be0da6a @@ -0,0 +1 @@ +See: http://archive.org/download/mbid-7aa99236-67d1-4996-b5ec-f6a517653fbe/index.json diff --git a/test/fixtures/3aaa80314ca3bb3404ab1a0b2be0da6a.headers b/test/fixtures/3aaa80314ca3bb3404ab1a0b2be0da6a.headers new file mode 100644 index 0000000..ad5136b --- /dev/null +++ b/test/fixtures/3aaa80314ca3bb3404ab1a0b2be0da6a.headers @@ -0,0 +1,24 @@ +{ + "statusCode": 307, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:57 GMT", + "content-type": "text/plain; charset=utf-8", + "content-length": "86", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "location": "http://archive.org/download/mbid-7aa99236-67d1-4996-b5ec-f6a517653fbe/index.json", + "access-control-allow-origin": "*", + "server": "4b4c084fb141" + }, + "url": "http://coverartarchive.org:80/release/7aa99236-67d1-4996-b5ec-f6a517653fbe", + "time": 391, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/3d1ea2a773f49cdf17cf4256f5cde4bf b/test/fixtures/3d1ea2a773f49cdf17cf4256f5cde4bf new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/3d1ea2a773f49cdf17cf4256f5cde4bf.headers b/test/fixtures/3d1ea2a773f49cdf17cf4256f5cde4bf.headers new file mode 100644 index 0000000..85c5e97 --- /dev/null +++ b/test/fixtures/3d1ea2a773f49cdf17cf4256f5cde4bf.headers @@ -0,0 +1,25 @@ +{ + "statusCode": 302, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:57 GMT", + "content-type": "text/html; charset=UTF-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "x-powered-by": "PHP/5.5.9-1ubuntu4.20", + "accept-ranges": "bytes", + "location": "http://ia601204.us.archive.org/4/items/mbid-3ee3723e-ed1e-4baa-a718-7f1d9ecb3bec/index.json" + }, + "url": "http://archive.org:80/download/mbid-3ee3723e-ed1e-4baa-a718-7f1d9ecb3bec/index.json", + "time": 158, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://coverartarchive.org/release/3ee3723e-ed1e-4baa-a718-7f1d9ecb3bec", + "host": "archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/3d67fb108e6729c1e1e31c4889191cc4 b/test/fixtures/3d67fb108e6729c1e1e31c4889191cc4 new file mode 100644 index 0000000000000000000000000000000000000000..ef26f0dc24e0fa3c3cad53f5266342c9f9485a1c GIT binary patch literal 436 zcmV;l0ZaZLiwFP!0000019eitirX*{{gt3|hRU&QS-JL53WXNJQcBswSQ@2b9VwOM zv?b)Uam1keC!eJ!_bw=+P zfSFM2xf=?e=5SoGh7@_uvxujLe2Afv+Z>pl3b%vfrkac;)6FoB!vuXVHJC|j&}Nv& zX&96>6Jtxt75>Ll67=0TLI*ZEYU;$pK|J1WkF2W%RuR`_*$SK1So5z&ap1jw4ZJ4Y zrVC|2{xoL$EnKKMd}a}QwG}hkC$X=2rRKl>Ncm6cb84V_;V?f@B)02uDRkS4?<+2$ zHYG9T({sXSCc|ThM|jS~>rQr-dXW93py!alct_yp*-5FC>jy8Igxoye<=zi>-&fR2 z#i>9)jShMx4WQo<=xG`>ksYijUa6rjZTm}FH=i-q&HK9DwBlWA?+rmeD`YxnDt!8v zaIT`*9M0@ee83tRwqWGwj*W}rQQTh6yW3%B)Zn3;1`En*2}T>Xu`_y>a+X$if1Br( ex0v0W`0?fwo+)n*3-MnkZodIuAmECb0ssJ1l-OJV literal 0 HcmV?d00001 diff --git a/test/fixtures/3d67fb108e6729c1e1e31c4889191cc4.headers b/test/fixtures/3d67fb108e6729c1e1e31c4889191cc4.headers new file mode 100644 index 0000000..0e0d31f --- /dev/null +++ b/test/fixtures/3d67fb108e6729c1e1e31c4889191cc4.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:40:11 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "579", + "x-ratelimit-reset": "1482198012", + "server": "Plack::Handler::Starlet", + "etag": "W/\"dc7e6d284fbbe310adcd3da8b6a4b24e\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/22a1945f-185c-4d70-979e-f297b00b0c71?fmt=json", + "time": 414, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/3f24e4abb92f417cc6ee84b83d09c180 b/test/fixtures/3f24e4abb92f417cc6ee84b83d09c180 new file mode 100644 index 0000000..77c0810 --- /dev/null +++ b/test/fixtures/3f24e4abb92f417cc6ee84b83d09c180 @@ -0,0 +1,4 @@ + +404 Not Found +

Not Found

+

No cover art found for release b2d35202-f793-487f-b796-ad0f1882a777

diff --git a/test/fixtures/3f24e4abb92f417cc6ee84b83d09c180.headers b/test/fixtures/3f24e4abb92f417cc6ee84b83d09c180.headers new file mode 100644 index 0000000..831402d --- /dev/null +++ b/test/fixtures/3f24e4abb92f417cc6ee84b83d09c180.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:57 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "d8b8a8eb2a2a" + }, + "url": "http://coverartarchive.org:80/release/b2d35202-f793-487f-b796-ad0f1882a777", + "time": 392, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/436bd8bd74ed540a37fcc9135ea97368 b/test/fixtures/436bd8bd74ed540a37fcc9135ea97368 new file mode 100644 index 0000000000000000000000000000000000000000..2f0130a9caaa8b304cacc790c9ffc63a8c1a2031 GIT binary patch literal 450 zcmV;z0X_a7iwFP!0000019eitYTPgo{S~8g2V~2(?7g);EG>l|LI|bwFqTGJv0iB_ z$(x3-|K3p&LJO&G554zh-po7-6Sq*(gV>4N8}UvgS_v}&T_}_+cHbX`#X|hu&XZ;W zCPJ}$6gj2>0Z;YoHuyrexhc%d%<(ybYR3^;Fws)AsqR1c$1=U2Wi?7ak<8ggU zenLx)56vCr((EanFg#S=KdB4-E|BP)DDzxiq&x(Z{JAjg3zopN6$2X|s*u7#Tv_PL zTH&|2HFp?F^Qkn@RJ4y3u;|x@t1oo}A#(NFANjK|3;%nSzNl!}lyaQ0vXhHRI26P>Po~A()nZY<>$%3hFhy{{Ox>mJA-__BX zc%cNyJ7&gDf1w)p=~l!}Rh>DCT}d0&izxRoy+W5_B|QU+=}3XNBZq6I>tE5h=4ZO6 swfV^RCSFcsmMEoN5YXBMdS^{-o0Ga_8LU>ys99Y901OOa@U{W~00bM?P5=M^ literal 0 HcmV?d00001 diff --git a/test/fixtures/436bd8bd74ed540a37fcc9135ea97368.headers b/test/fixtures/436bd8bd74ed540a37fcc9135ea97368.headers new file mode 100644 index 0000000..d072136 --- /dev/null +++ b/test/fixtures/436bd8bd74ed540a37fcc9135ea97368.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:40:11 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "573", + "x-ratelimit-reset": "1482198012", + "server": "Plack::Handler::Starlet", + "etag": "W/\"f31d3255a73df98fcc757f99355ca3d9\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/90a00dba-addb-4fdc-af2c-6fbb5d733c39?fmt=json", + "time": 419, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/4722e553ad2febf7e2c68d71f478a338 b/test/fixtures/4722e553ad2febf7e2c68d71f478a338 new file mode 100644 index 0000000..02ae5eb --- /dev/null +++ b/test/fixtures/4722e553ad2febf7e2c68d71f478a338 @@ -0,0 +1,4 @@ + +404 Not Found +

Not Found

+

No cover art found for release 15c88cc0-30f5-4568-bac8-e577e3358023

diff --git a/test/fixtures/4722e553ad2febf7e2c68d71f478a338.headers b/test/fixtures/4722e553ad2febf7e2c68d71f478a338.headers new file mode 100644 index 0000000..476e2d7 --- /dev/null +++ b/test/fixtures/4722e553ad2febf7e2c68d71f478a338.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:55 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "4b4c084fb141" + }, + "url": "http://coverartarchive.org:80/release/15c88cc0-30f5-4568-bac8-e577e3358023", + "time": 434, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/49b42184abf656b320a7124347074075 b/test/fixtures/49b42184abf656b320a7124347074075 new file mode 100644 index 0000000..25c7a61 --- /dev/null +++ b/test/fixtures/49b42184abf656b320a7124347074075 @@ -0,0 +1 @@ +See: http://archive.org/download/mbid-32a863b3-a356-4873-8b74-c2039156cb68/index.json diff --git a/test/fixtures/49b42184abf656b320a7124347074075.headers b/test/fixtures/49b42184abf656b320a7124347074075.headers new file mode 100644 index 0000000..c404dc0 --- /dev/null +++ b/test/fixtures/49b42184abf656b320a7124347074075.headers @@ -0,0 +1,24 @@ +{ + "statusCode": 307, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:56 GMT", + "content-type": "text/plain; charset=utf-8", + "content-length": "86", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "location": "http://archive.org/download/mbid-32a863b3-a356-4873-8b74-c2039156cb68/index.json", + "access-control-allow-origin": "*", + "server": "d6446ea62189" + }, + "url": "http://coverartarchive.org:80/release/32a863b3-a356-4873-8b74-c2039156cb68", + "time": 495, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/4d3b01cc6d5ab75031ffa9465320de11 b/test/fixtures/4d3b01cc6d5ab75031ffa9465320de11 new file mode 100644 index 0000000000000000000000000000000000000000..26c0eaa30e03db9cd92e53fd173d41a137b5ceba GIT binary patch literal 415 zcmV;Q0bu?giwFP!0000019ehOkJB&^{VS1AAax`=v6HmNJpdI*91ubX?O_s+gSDw$ z9H)S){&&WuU2#|rmNL$p_c7zM7%+{|lGq6&TUkq^Of8iW8fx;v%8!^TcCBT&VjNkoM1ic>Ih+?Ns5LN++z6Lq z`MTY6-_Mwyp6da}d%@fb8(A0D`skb=JT6u9FBo#Q&#(Faj}>R1e={P)bhy%3zu;l;9OiFSA?|YE*|yNsNZqIwn!dHrXt@P+ zH9^<+rXw27=t$ghrNaF7fy*P?$BA8BNy0kMtc1CE<2fsk9jN|a+#Ph)R9&ryt!}|t zYCvzv09qQsP~+O#DUGJ#=0r2$LO>_p6i?^dna4<2<{t1+v_1!)$yV=Kz{Z2P(f8OH zjT}kJx`PJmEex&gpdPd&l)6{EFvczsICu*R%3CP{CEVkGW)^w#FUwwD%6@sg`~mQ| JN~MPa004J>&fx$6 literal 0 HcmV?d00001 diff --git a/test/fixtures/4d3b01cc6d5ab75031ffa9465320de11.headers b/test/fixtures/4d3b01cc6d5ab75031ffa9465320de11.headers new file mode 100644 index 0000000..320a7a2 --- /dev/null +++ b/test/fixtures/4d3b01cc6d5ab75031ffa9465320de11.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:40:16 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "217", + "x-ratelimit-reset": "1482198016", + "server": "Plack::Handler::Starlet", + "etag": "W/\"463f2bbcb3f8dfb7e98aea81f2672f23\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/1724b946-fde3-49e5-adec-5e3f62f14a53?fmt=json", + "time": 417, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/4fcb70e39045e968057c2ef8a75f9186 b/test/fixtures/4fcb70e39045e968057c2ef8a75f9186 new file mode 100644 index 0000000000000000000000000000000000000000..17fbac3639f6ed24a31d1b2e43002c61d897ac9d GIT binary patch literal 456 zcmV;(0XP01iwFP!0000019ehOZ`&{o{VRsfAx7KsSB_nQqS$~97`CA+dY~mb73xTt ztfUKq{P$5^(CyG2EP&)A`QD>X%2HyrRuz^AH~_Y4rA#<*1d2&M^XLu&I4KFALwr)} ziROhfXz!C+<4TQW{-!O(C-!V#6H^Qs_Y$2~YA0aYIKKfW7&UbzmWFG}VmCBWi99nc41)7% zQS1BDo4P47WvQOFx%Sn&#J2b#Yi-y{{e^K)U8AXN0kP_!rfPt(wH;KWMkZNWiujdU zg4p-pK}&$TY+EQHGtP|E&6Ro(``kj?(QWpWT=3GX&gX}V+3_f`z}`R|d7i^_ad7@P zOFi+g1d(@<7ZH2`oz!BY+sQ4|M@n8`GkF=Y$rM?vJzo@JUsv392;6Z4y441Ts_$Vi z8at9gudBSor8&3WPQ_i=7vIUJ;x=U)7neC*A=Y=-Kfc}c*$!c`7oFZ@P#S*Cd)2W!Q;tq=o;mW;GU^F0)zOL*FVC zIu}|g)t?q##e#_qJ+^6La5ix&@yu(8w^)<7{c@EP@8>yA5f^SMv=FWYbYU#6eZI0& zgbnb%lt;I>$nHz29T?ODjD2vRM=J@X^@=@Y1J(?DqaGBrD>k6!%)?G3JT*z5QmhoZ zH@tVqr=~9Rss2~|`+@xP4!4It?0kMLBysuWPC08k9o)TD7T2<33*%BDpBGjrk zpz1+_9u^C=L?uiobX5?0;j|`D^krMfQwr~&*JsTPe z4f%pgI@%o%A?`7I!Bf0V=xi>D`w+KS=rLJ;F%iiTCIZ?sElWNfI5fh-{olYTaMT{R zMer6q8sz5R+NJ>s}XRV#I~Q33z}g&(rm literal 0 HcmV?d00001 diff --git a/test/fixtures/59c56dc30ab4179d0ee155e799ed637a.headers b/test/fixtures/59c56dc30ab4179d0ee155e799ed637a.headers new file mode 100644 index 0000000..fc33d75 --- /dev/null +++ b/test/fixtures/59c56dc30ab4179d0ee155e799ed637a.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:40:00 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "302", + "x-ratelimit-reset": "1482198000", + "server": "Plack::Handler::Starlet", + "etag": "W/\"d62c1c90ac668a9d6a2b70547d7879ce\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/15c88cc0-30f5-4568-bac8-e577e3358023?fmt=json", + "time": 409, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/5d11ca0430a620cfab0f05264323a992 b/test/fixtures/5d11ca0430a620cfab0f05264323a992 new file mode 100644 index 0000000..fd17adf --- /dev/null +++ b/test/fixtures/5d11ca0430a620cfab0f05264323a992 @@ -0,0 +1,4 @@ + +404 Not Found +

Not Found

+

No cover art found for release 83dc341f-1854-4319-b008-b6a26709dab8

diff --git a/test/fixtures/5d11ca0430a620cfab0f05264323a992.headers b/test/fixtures/5d11ca0430a620cfab0f05264323a992.headers new file mode 100644 index 0000000..33b9124 --- /dev/null +++ b/test/fixtures/5d11ca0430a620cfab0f05264323a992.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:56 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "4b4c084fb141" + }, + "url": "http://coverartarchive.org:80/release/83dc341f-1854-4319-b008-b6a26709dab8", + "time": 465, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/600c519401f48c53791ce190cae3f561 b/test/fixtures/600c519401f48c53791ce190cae3f561 new file mode 100644 index 0000000..8606524 --- /dev/null +++ b/test/fixtures/600c519401f48c53791ce190cae3f561 @@ -0,0 +1 @@ +See: http://archive.org/download/mbid-ee773571-6147-4bfd-8ea1-d666c4d4caef/index.json diff --git a/test/fixtures/600c519401f48c53791ce190cae3f561.headers b/test/fixtures/600c519401f48c53791ce190cae3f561.headers new file mode 100644 index 0000000..6448183 --- /dev/null +++ b/test/fixtures/600c519401f48c53791ce190cae3f561.headers @@ -0,0 +1,24 @@ +{ + "statusCode": 307, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:56 GMT", + "content-type": "text/plain; charset=utf-8", + "content-length": "86", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "location": "http://archive.org/download/mbid-ee773571-6147-4bfd-8ea1-d666c4d4caef/index.json", + "access-control-allow-origin": "*", + "server": "d6446ea62189" + }, + "url": "http://coverartarchive.org:80/release/ee773571-6147-4bfd-8ea1-d666c4d4caef", + "time": 476, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/681f1edb476435e41fdb6ae48bd7e2f9 b/test/fixtures/681f1edb476435e41fdb6ae48bd7e2f9 new file mode 100644 index 0000000..3c77997 --- /dev/null +++ b/test/fixtures/681f1edb476435e41fdb6ae48bd7e2f9 @@ -0,0 +1 @@ +{"images":[{"types":["Front","Booklet"],"front":true,"back":false,"edit":29753022,"image":"http://coverartarchive.org/release/90a00dba-addb-4fdc-af2c-6fbb5d733c39/8615474322.jpg","comment":"","approved":true,"id":"8615474322","thumbnails":{"large":"http://coverartarchive.org/release/90a00dba-addb-4fdc-af2c-6fbb5d733c39/8615474322-500.jpg","small":"http://coverartarchive.org/release/90a00dba-addb-4fdc-af2c-6fbb5d733c39/8615474322-250.jpg"}},{"types":["Medium"],"front":false,"back":false,"edit":29753069,"image":"http://coverartarchive.org/release/90a00dba-addb-4fdc-af2c-6fbb5d733c39/8615530709.jpg","comment":"","approved":true,"id":"8615530709","thumbnails":{"large":"http://coverartarchive.org/release/90a00dba-addb-4fdc-af2c-6fbb5d733c39/8615530709-500.jpg","small":"http://coverartarchive.org/release/90a00dba-addb-4fdc-af2c-6fbb5d733c39/8615530709-250.jpg"}},{"types":["Back","Spine"],"front":false,"back":true,"edit":29753023,"image":"http://coverartarchive.org/release/90a00dba-addb-4fdc-af2c-6fbb5d733c39/8615477106.jpg","comment":"","approved":true,"id":"8615477106","thumbnails":{"large":"http://coverartarchive.org/release/90a00dba-addb-4fdc-af2c-6fbb5d733c39/8615477106-500.jpg","small":"http://coverartarchive.org/release/90a00dba-addb-4fdc-af2c-6fbb5d733c39/8615477106-250.jpg"}}],"release":"http://musicbrainz.org/release/90a00dba-addb-4fdc-af2c-6fbb5d733c39"} \ No newline at end of file diff --git a/test/fixtures/681f1edb476435e41fdb6ae48bd7e2f9.headers b/test/fixtures/681f1edb476435e41fdb6ae48bd7e2f9.headers new file mode 100644 index 0000000..33d6543 --- /dev/null +++ b/test/fixtures/681f1edb476435e41fdb6ae48bd7e2f9.headers @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:57 GMT", + "content-type": "application/json", + "content-length": "1380", + "last-modified": "Sun, 26 Oct 2014 03:00:42 GMT", + "connection": "keep-alive", + "etag": "\"544c63da-564\"", + "expires": "Tue, 20 Dec 2016 07:39:57 GMT", + "cache-control": "max-age=21600", + "accept-ranges": "bytes" + }, + "url": "http://ia802605.us.archive.org:80/15/items/mbid-90a00dba-addb-4fdc-af2c-6fbb5d733c39/index.json", + "time": 93, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://archive.org/download/mbid-90a00dba-addb-4fdc-af2c-6fbb5d733c39/index.json", + "host": "ia802605.us.archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/71097d26676d70389a9b76ea2061db4d b/test/fixtures/71097d26676d70389a9b76ea2061db4d new file mode 100644 index 0000000..43c3a1c --- /dev/null +++ b/test/fixtures/71097d26676d70389a9b76ea2061db4d @@ -0,0 +1 @@ +See: http://archive.org/download/mbid-25fbfbb4-b1ee-4448-aadf-ae3bc2e2dd27/index.json diff --git a/test/fixtures/71097d26676d70389a9b76ea2061db4d.headers b/test/fixtures/71097d26676d70389a9b76ea2061db4d.headers new file mode 100644 index 0000000..b2e15a0 --- /dev/null +++ b/test/fixtures/71097d26676d70389a9b76ea2061db4d.headers @@ -0,0 +1,24 @@ +{ + "statusCode": 307, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:54 GMT", + "content-type": "text/plain; charset=utf-8", + "content-length": "86", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "location": "http://archive.org/download/mbid-25fbfbb4-b1ee-4448-aadf-ae3bc2e2dd27/index.json", + "access-control-allow-origin": "*", + "server": "4b4c084fb141" + }, + "url": "http://coverartarchive.org:80/release-group/f5093c06-23e3-404f-aeaa-40f72885ee3a", + "time": 383, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/725c9375e05c924c1e007b737cb42594 b/test/fixtures/725c9375e05c924c1e007b737cb42594 new file mode 100644 index 0000000..a73292e --- /dev/null +++ b/test/fixtures/725c9375e05c924c1e007b737cb42594 @@ -0,0 +1,4 @@ + +404 Not Found +

Not Found

+

No cover art found for release 1724b946-fde3-49e5-adec-5e3f62f14a53

diff --git a/test/fixtures/725c9375e05c924c1e007b737cb42594.headers b/test/fixtures/725c9375e05c924c1e007b737cb42594.headers new file mode 100644 index 0000000..d17fcdf --- /dev/null +++ b/test/fixtures/725c9375e05c924c1e007b737cb42594.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:57 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "d8b8a8eb2a2a" + }, + "url": "http://coverartarchive.org:80/release/1724b946-fde3-49e5-adec-5e3f62f14a53", + "time": 410, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/74e59908ce007e6c1904a9ea1772ebb6 b/test/fixtures/74e59908ce007e6c1904a9ea1772ebb6 new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/74e59908ce007e6c1904a9ea1772ebb6.headers b/test/fixtures/74e59908ce007e6c1904a9ea1772ebb6.headers new file mode 100644 index 0000000..250193f --- /dev/null +++ b/test/fixtures/74e59908ce007e6c1904a9ea1772ebb6.headers @@ -0,0 +1,24 @@ +{ + "statusCode": 307, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:49 GMT", + "content-type": "text/plain; charset=utf-8", + "content-length": "133", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "location": "http://archive.org/download/mbid-b84ee12a-09ef-421b-82de-0441a926375b/mbid-b84ee12a-09ef-421b-82de-0441a926375b-13536418798.jpg", + "access-control-allow-origin": "*", + "server": "4b4c084fb141" + }, + "url": "http://coverartarchive.org:80/release/b84ee12a-09ef-421b-82de-0441a926375b/back", + "time": 392, + "request": { + "method": "HEAD", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "content-length": 0 + } + } +} \ No newline at end of file diff --git a/test/fixtures/7625f6228e21bb0a707d6284d29f6238 b/test/fixtures/7625f6228e21bb0a707d6284d29f6238 new file mode 100644 index 0000000000000000000000000000000000000000..32ddc42524ef80c7d588d41993f90b5a4b4b98fe GIT binary patch literal 431 zcmV;g0Z{%QiwFP!0000018q^kj?^#={gqKJT*e}uq;1+Odsztyq|pi?#KBFS5=|!= z(sTih`tLZiFo%Up6x+|w&(BwJL3_fBdg0niR+bb9 z{!ysFi?#)A(B@XUl|p8x6H z8YBN39o@=AGhrs6Gli1H?(5}0!rD3Ius zDDxs$Cl`@z@+Xc+e8LhKn=!D@L)9eCWWBm+WaBJ50i0wHJ*fdS4J|m;lfyf*W>7VY z?87a%;>%oR9%A@VHecehdBRXOAIm+1-xr*HspdjVN1SUSY--8yXL;(Hp2LJrO9x%w j82~a z7Y6`;7M^jF?SN0J~q_PF#yu)1K7-vTIec0eS2Fku+7*)X*=oa^7 zseQ~Y`3g{48QFEhh*m4A%D5nG$ni#uG_G&=ca=d#s8SC5!jDQ=X}GhJ>^oujs6g_@ zw!NKxg+h;^$F;O_L=?%D)@e(~ zzjvM3r3b;Tcr&we6V8Z(P_@x@v$1lcc8zT6O(*-RQnGJh+wQB*K(9n8M$l&%To~l6 z3X}Jx_?*By`eBn0(*-MS1rg zikx;}xbI(FfgO8-S9nA3n|E&ZN95)ZOS8wo(1No$kX z#dM-Tk}{#s)WRrTk7G(v#;%uGzhe4hO)Qn|Zq=1cw6s<|2Co3qH>*TTqD(WbgQn^0|(yBoA>6y6}*K7OzY;sjwt3)4r1sAE7Yo6(b7tj87+32pn*a^i%4`% zlqnP}J_cB>kWKRE!ec&S3EZ|}IPQ2PMkpNN)_{o@N&-{iV_y7)D$T?_Fsp5V3qN9d zg~j2PsR4`Wl>*tnfJ?Eq{<*Da-gq~wp>ZH5oQu};e9hKU$5+yu)4QC<7xH0=pzQ;cAuk=Oc$M~ z11q5_d}|;_-aX){iag;NYfSg#d%F(3lCv;M_ClI|7VCggw5rp}&Euq{;of)D+xvZP zJpX@gGQZHy9^g5}Q@rDE;5``_JLMefiqTjSaH1YFZ(t t6K?e*__9^~FE4cXz>jtK>@6LlI}`>!#k&$_A0F}Fegj!dSR!Tu007ru#&G}u literal 0 HcmV?d00001 diff --git a/test/fixtures/8e366fd1096b4f5c9a7992c9aac9f7b9.headers b/test/fixtures/8e366fd1096b4f5c9a7992c9aac9f7b9.headers new file mode 100644 index 0000000..4f3f26a --- /dev/null +++ b/test/fixtures/8e366fd1096b4f5c9a7992c9aac9f7b9.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:40:23 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "632", + "x-ratelimit-reset": "1482198024", + "server": "Plack::Handler::Starlet", + "etag": "W/\"01992442d4c144ee1d736fcf341bc0b2\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/c0f74d5a-7534-414d-8b90-0ebe6c5da19e?fmt=json", + "time": 410, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/8e41d1b7bbfb49f1d68725fe46b32b31 b/test/fixtures/8e41d1b7bbfb49f1d68725fe46b32b31 new file mode 100644 index 0000000..ac17073 --- /dev/null +++ b/test/fixtures/8e41d1b7bbfb49f1d68725fe46b32b31 @@ -0,0 +1,4 @@ + +404 Not Found +

Not Found

+

No cover art found for release d632b12b-211e-4fbd-87fb-21382556388b

diff --git a/test/fixtures/8e41d1b7bbfb49f1d68725fe46b32b31.headers b/test/fixtures/8e41d1b7bbfb49f1d68725fe46b32b31.headers new file mode 100644 index 0000000..38598c2 --- /dev/null +++ b/test/fixtures/8e41d1b7bbfb49f1d68725fe46b32b31.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:57 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "d6446ea62189" + }, + "url": "http://coverartarchive.org:80/release/d632b12b-211e-4fbd-87fb-21382556388b", + "time": 395, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/8f4adff433d805330aebe035bbb3d002 b/test/fixtures/8f4adff433d805330aebe035bbb3d002 new file mode 100644 index 0000000000000000000000000000000000000000..bbb3d1ab5dd01daeb345520249a90359a2a6f749 GIT binary patch literal 742 zcmVFAu9JAhwW2S6}B=Qkm30%aO zb6>g%k7R~i_`VCV47{+LP`7ca4N|%*#I@d)stOz5J4ELJn1QpaGIVtAR1|oub!lrW zs3ru-p5(bo6%-U3K{|lGD*F`PqG57fWX^qkgoZXNd|h#aBZFfssaR2)-Z3kn>`$O? z;gAX~DWgWjgY7_7vRQ|LsnodQq)(=*X2wOtRyWf|UKYDi9Puy=Jnn~C$P?iuJc*_2 zNt!kFLuy>Y(4st5<-mDZ=xJubw5j-}4Jg!7(yK|AXYViHd~q&M-(7q<|Ml_5#fS4% z>&=^mPN9)=psftkkzLyyv*{OyX_Uow{TUcoKVYc;*`*#a+G`~luYFzKOlsOVSxXW;fk zRknWo>i<%hZlG{Y1?qE4^4nXyiN;#|7SuSH%?_3Z#rsB2M$2oPcSY=_BH+?Py0*g4 zIUoS7@=!)m7twqfOG<;Sn@@(f3d0wW6HwG_%r1EGa1lvIcgo^He8TKSDHineiZk&G z`B`kGNDN*R&!4Sz+Tp?|Ope)pU6xXuP`}{p{0z=8$_{l^Yigltm4tTG1fw+scA898 zNom^7vO=VVFcHw1w_)|~7hy2(w)HqRyG1127rcr}#X4g>LEm=@+O`^CRKozn*iF6a zI;ls+9FNCc;mNy9ra188l=#`D0Bzm(P=gMJb~o{K5I;&`T*BkzIPt9y!RQoXhBuYA zjVV7@TwMOcKYfVDYa6$QZt*3xm1Hw$Rd1k`)d*-Cf!2H2iY|Z;GmGZpE^BsT21wS#{2P^@`%w)fj{rR;E7^!SctF7pzQLp>wgIT ZT`s +404 Not Found +

Not Found

+

No cover art found for release 11b461f0-035f-4726-90e8-da897c9ffc58

diff --git a/test/fixtures/a437ae1263f54894b27977b291026a21.headers b/test/fixtures/a437ae1263f54894b27977b291026a21.headers new file mode 100644 index 0000000..85591e0 --- /dev/null +++ b/test/fixtures/a437ae1263f54894b27977b291026a21.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:55 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "d8b8a8eb2a2a" + }, + "url": "http://coverartarchive.org:80/release/11b461f0-035f-4726-90e8-da897c9ffc58", + "time": 416, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/a4ee3084562f882fa11139d16733d21a b/test/fixtures/a4ee3084562f882fa11139d16733d21a new file mode 100644 index 0000000000000000000000000000000000000000..b1b909d6e148a1000cefbffef29083d87331a5e7 GIT binary patch literal 432 zcmV;h0Z;xPiwFP!0000018q^!irX*{{1vm$S!$nb+4Ac>6$&kc<0z#MYk8FuQRGyX z)0U8b@2a_$7Vg0Y&+M#cX0KqE3n!$M<*_gR!Z2P1++v2Y*?|z>mvn?Nr;T?oQ#x|w z8AeB86~LvXOy1dv?D3VkiFEZ5#<+zbI=|9s@`sJGUjzjx)5$I~{~1Xfm{vx`gc6q3c>}26)>; zq>~tcr|2`!)jm^}?K@Z(>EliARyxQ9Z_LoZO*~|uLjfKsgz9~+o?j?epO>wACaFf2 ziE>-8^6L2?g_{V;Srv+b;7k$l@I`214@aY-i%0{uQoDv%_94c-$O z^Pn{9er~WeM&s16MW?B2dfh2Em2H`SWK4Wcyh^pN>94TbJUEw*C66B{vOCjM{6QSmNi%xeNSb4XEJtG4N( z9r_tsRgZvH66j&*G?D3yB~CHnLJ=@#{>+QJu-a8jXpUlQaYq_1ED}wa3tg>wslKio*%fA&@HDx@irEFv=N!8u%g#=AniNb8 z5h$ewK%6ZgwUdz~=UHmLn_XUt?2i|!zA#+1b2C-JR+$6e0!wbhnJd79^9R27mELHn zK4YSHi#Yn-T4x+CMUZ}Fh;)vW$mhRQSFxaH#zT3EScr2?bZ0JBJYn{NOMG2%ak(_Z zhj_YcVREIUPjy*xKgf?TkIs;hTGtJNLMfrumJ7CMpzoWWYCGz#M$U?~5HkZ^7>bF1 zUfE*8Lgw*QsP^7vnyVcnQz|B=0Nn8&8Ys?}oH8ZP|F%2@Zu5;)}Y63>W8jVW*mwOA7}9PeES2*_W$Rk0ssIZ8PAIV literal 0 HcmV?d00001 diff --git a/test/fixtures/a7ebf644eeda889d47b3eeb3808e1612.headers b/test/fixtures/a7ebf644eeda889d47b3eeb3808e1612.headers new file mode 100644 index 0000000..9d9b066 --- /dev/null +++ b/test/fixtures/a7ebf644eeda889d47b3eeb3808e1612.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:54 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "665", + "x-ratelimit-reset": "1482197996", + "server": "Plack::Handler::Starlet", + "etag": "W/\"e26f9afa519d55da80dff75fe8cfe5f7\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/25fbfbb4-b1ee-4448-aadf-ae3bc2e2dd27?fmt=json", + "time": 402, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/ab47a9969477aef4978774f295da4fef b/test/fixtures/ab47a9969477aef4978774f295da4fef new file mode 100644 index 0000000..dbc192a --- /dev/null +++ b/test/fixtures/ab47a9969477aef4978774f295da4fef @@ -0,0 +1,4 @@ + +404 Not Found +

Not Found

+

No cover art found for release 0832e770-e7e5-464c-9288-9c407a770842

diff --git a/test/fixtures/ab47a9969477aef4978774f295da4fef.headers b/test/fixtures/ab47a9969477aef4978774f295da4fef.headers new file mode 100644 index 0000000..559623d --- /dev/null +++ b/test/fixtures/ab47a9969477aef4978774f295da4fef.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:55 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "d8b8a8eb2a2a" + }, + "url": "http://coverartarchive.org:80/release/0832e770-e7e5-464c-9288-9c407a770842", + "time": 432, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/abe14f4c4c73d24b0c1f73d484061520 b/test/fixtures/abe14f4c4c73d24b0c1f73d484061520 new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/abe14f4c4c73d24b0c1f73d484061520.headers b/test/fixtures/abe14f4c4c73d24b0c1f73d484061520.headers new file mode 100644 index 0000000..12e783a --- /dev/null +++ b/test/fixtures/abe14f4c4c73d24b0c1f73d484061520.headers @@ -0,0 +1,25 @@ +{ + "statusCode": 302, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:58 GMT", + "content-type": "text/html; charset=UTF-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "x-powered-by": "PHP/5.5.9-1ubuntu4.20", + "accept-ranges": "bytes", + "location": "http://ia800503.us.archive.org/13/items/mbid-7aa99236-67d1-4996-b5ec-f6a517653fbe/index.json" + }, + "url": "http://archive.org:80/download/mbid-7aa99236-67d1-4996-b5ec-f6a517653fbe/index.json", + "time": 207, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://coverartarchive.org/release/7aa99236-67d1-4996-b5ec-f6a517653fbe", + "host": "archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/ac7cdd14be6040b363313fe24fde27cc b/test/fixtures/ac7cdd14be6040b363313fe24fde27cc new file mode 100644 index 0000000000000000000000000000000000000000..a69881be138cf742f71144d03c0c10a81e559651 GIT binary patch literal 435 zcmV;k0ZjfMiwFP!0000019efsZrd;n{gpuH5RheCl6%|^LxTd_VZcxfJiA| ziJ~sZE=|=#H&`oWZ}Z2?#tUIMxVV8F5KMU5-RzFl-BCz>+X?jnP%bx1D*K{ z%>RDjxCm>gVM)OHG&E4{)WmN-Zjnkk4006;Q(lr18 literal 0 HcmV?d00001 diff --git a/test/fixtures/ac7cdd14be6040b363313fe24fde27cc.headers b/test/fixtures/ac7cdd14be6040b363313fe24fde27cc.headers new file mode 100644 index 0000000..108b19d --- /dev/null +++ b/test/fixtures/ac7cdd14be6040b363313fe24fde27cc.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:40:11 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "576", + "x-ratelimit-reset": "1482198012", + "server": "Plack::Handler::Starlet", + "etag": "W/\"4256762186114fb28b6bea3459d842eb\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/fb98043c-7ac8-4505-ba87-28576836a8d5?fmt=json", + "time": 419, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/acac35649a5fee09364a40ee95829e69 b/test/fixtures/acac35649a5fee09364a40ee95829e69 new file mode 100644 index 0000000..73610b1 --- /dev/null +++ b/test/fixtures/acac35649a5fee09364a40ee95829e69 @@ -0,0 +1,4 @@ + +404 Not Found +

Not Found

+

No cover art found for release 0138608c-a850-4351-bb1e-4d551bb900b6

diff --git a/test/fixtures/acac35649a5fee09364a40ee95829e69.headers b/test/fixtures/acac35649a5fee09364a40ee95829e69.headers new file mode 100644 index 0000000..1a286dc --- /dev/null +++ b/test/fixtures/acac35649a5fee09364a40ee95829e69.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:55 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "d8b8a8eb2a2a" + }, + "url": "http://coverartarchive.org:80/release/0138608c-a850-4351-bb1e-4d551bb900b6", + "time": 428, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/acf19bc8716eec134a0b6421390ef7f8 b/test/fixtures/acf19bc8716eec134a0b6421390ef7f8 new file mode 100644 index 0000000000000000000000000000000000000000..e7cc4ca8722f92610151ab6e40e4f0ac344f5f17 GIT binary patch literal 408 zcmV;J0cZXniwFP!0000019ehOi`y^|{VQS45lFUW%RZJ~c3IfM5=tq17|G*Q#F0}; zPFq6$dq>HZ_OJ!%pf~eAq|pWZ2m?q}n^qbp&}b=|S}S3#BGHUmD{FfxZ3|mCp*!H- zhdm5oo#%f5QDpAe_Z4TKf3a#<;t^-&S&VKOiJ?vzRaLT9eP44SWz1{3k)felHnnO6 zM;S%k$X?)7k?4%k9g)*+BBr?IOi^IWyxli{X4MOWYsfIjV&x7nOgJan0(bpb;@|TW zm(uoj8ZjOy(D(*iw~&3FOUj37^JQ5#pE2akLuS)VKeLE*ij*jDX1|1DJ7d_dxG$9B zS}vMg^e1+JC(Hp@ar6m~)^pdL15kW(VN{ZD$g8Rt!{kf#gOt_d^T*w%f<>AM6A3!A zXM*AD<$Y=-EMWp3OKlf?rg8JaDJgOJ{ +404 Not Found +

Not Found

+

No cover art found for release 7ff98ba2-d865-49eb-8bbd-23dc9d60f21c

diff --git a/test/fixtures/b126f5b19e3c828365bf2558f4c632d5.headers b/test/fixtures/b126f5b19e3c828365bf2558f4c632d5.headers new file mode 100644 index 0000000..bade8bf --- /dev/null +++ b/test/fixtures/b126f5b19e3c828365bf2558f4c632d5.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:57 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "d8b8a8eb2a2a" + }, + "url": "http://coverartarchive.org:80/release/7ff98ba2-d865-49eb-8bbd-23dc9d60f21c", + "time": 390, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/b52874ed0f196446a4c665d43eb66a4e b/test/fixtures/b52874ed0f196446a4c665d43eb66a4e new file mode 100644 index 0000000..536bddf --- /dev/null +++ b/test/fixtures/b52874ed0f196446a4c665d43eb66a4e @@ -0,0 +1,4 @@ + +404 Not Found +

Not Found

+

No cover art found for release f12244a0-a0a6-4522-a78a-33b5c75c8b1f

diff --git a/test/fixtures/b52874ed0f196446a4c665d43eb66a4e.headers b/test/fixtures/b52874ed0f196446a4c665d43eb66a4e.headers new file mode 100644 index 0000000..79beb55 --- /dev/null +++ b/test/fixtures/b52874ed0f196446a4c665d43eb66a4e.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:55 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "4b4c084fb141" + }, + "url": "http://coverartarchive.org:80/release/f12244a0-a0a6-4522-a78a-33b5c75c8b1f", + "time": 434, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/b5ceda98812eb060f88237674aea6b39 b/test/fixtures/b5ceda98812eb060f88237674aea6b39 new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/b5ceda98812eb060f88237674aea6b39.headers b/test/fixtures/b5ceda98812eb060f88237674aea6b39.headers new file mode 100644 index 0000000..2721232 --- /dev/null +++ b/test/fixtures/b5ceda98812eb060f88237674aea6b39.headers @@ -0,0 +1,24 @@ +{ + "statusCode": 307, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:49 GMT", + "content-type": "text/plain; charset=utf-8", + "content-length": "132", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "location": "http://archive.org/download/mbid-b84ee12a-09ef-421b-82de-0441a926375b/mbid-b84ee12a-09ef-421b-82de-0441a926375b-1611507818.jpg", + "access-control-allow-origin": "*", + "server": "d6446ea62189" + }, + "url": "http://coverartarchive.org:80/release/b84ee12a-09ef-421b-82de-0441a926375b/front", + "time": 386, + "request": { + "method": "HEAD", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "content-length": 0 + } + } +} \ No newline at end of file diff --git a/test/fixtures/bb2d63521b1bc4926702e93aca844990 b/test/fixtures/bb2d63521b1bc4926702e93aca844990 new file mode 100644 index 0000000000000000000000000000000000000000..a581ca086b0b07301bd2d4dc147f22c6641e2a20 GIT binary patch literal 426 zcmV;b0agAViwFP!0000019g&5Z`&{o#lK3Ra|lSb*F6JwvTM9g?|!W4U4G*t#B|&^Z|vZhL^M>(rdBP~eLF$j$N|t+1YO_jj>u?ZiCa#L zin9yzt&2?6by6WTSXEGWwt>;2fwomGNjr2};wACZsp{qo-|OoZEY zBcCYXu?Rj9FD1Oavply%;N`TSp!`6^x{UJp3y)W%D?1^m+B7W08b%@wlC&9>)oQ|t UUH*x>ULUVN0Vkk*@st7p0KIF`<^TWy literal 0 HcmV?d00001 diff --git a/test/fixtures/bb2d63521b1bc4926702e93aca844990.headers b/test/fixtures/bb2d63521b1bc4926702e93aca844990.headers new file mode 100644 index 0000000..aac33cb --- /dev/null +++ b/test/fixtures/bb2d63521b1bc4926702e93aca844990.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:40:00 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "299", + "x-ratelimit-reset": "1482198000", + "server": "Plack::Handler::Starlet", + "etag": "W/\"249c8a9591359bb34c5d0f47bbb398f1\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/11b461f0-035f-4726-90e8-da897c9ffc58?fmt=json", + "time": 413, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/c1c06c12681af538c710619bc6b120f6 b/test/fixtures/c1c06c12681af538c710619bc6b120f6 new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/c1c06c12681af538c710619bc6b120f6.headers b/test/fixtures/c1c06c12681af538c710619bc6b120f6.headers new file mode 100644 index 0000000..30e370e --- /dev/null +++ b/test/fixtures/c1c06c12681af538c710619bc6b120f6.headers @@ -0,0 +1,24 @@ +{ + "statusCode": 307, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:53 GMT", + "content-type": "text/plain; charset=utf-8", + "content-length": "141", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "location": "http://archive.org/download/mbid-b84ee12a-09ef-421b-82de-0441a926375b/mbid-b84ee12a-09ef-421b-82de-0441a926375b-1611507818_thumb500.jpg", + "access-control-allow-origin": "*", + "server": "d8b8a8eb2a2a" + }, + "url": "http://coverartarchive.org:80/release/b84ee12a-09ef-421b-82de-0441a926375b/front-500", + "time": 379, + "request": { + "method": "HEAD", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "content-length": 0 + } + } +} \ No newline at end of file diff --git a/test/fixtures/c20a5c482aa7d04b9dda7babfe743188 b/test/fixtures/c20a5c482aa7d04b9dda7babfe743188 new file mode 100644 index 0000000000000000000000000000000000000000..3b0d7f89492655eacc6f8484ed253befd709ac01 GIT binary patch literal 414 zcmV;P0b%|hiwFP!0000018tH)i`y^|h5t&>IRla{TXt?`PYY%DSW4N$SQ@1wj+DxB z+7kTVJ4%)o${u|1o9CxDpL`P+v?n}uk|#I zlh}*9m&lm5GYWd84d}@`7zh=(zVEGe+9G-OE(OcFJmNLAQn#vycIX|nT8@CeAuz+x z86w+RPy9&H?!I6wyXV3Kho$O`snL=UR;KdE!mO8X>}s_XAy%&sF=dQ03MWCw`2#Q8hR_h&N*yjFp89aQa}J8{ zK($*8)9*3-*4ehNni^}VEt1u`-e_IvwVoW6eA*KV)Vk?%6d0iO!G>+c+HyHSVVMUEp zP1Ql8y8#*{4d7T4^jfz)k!#&ZEWyPGX1|lw!}I5_AMSd_vd=Ry_#D^G7YuoGpEvI@ z?J1Qa{mPK&m}sHE_xZ^Bvshg6$IPM!%zfAa4k9ZNnqU4k*O?nU8|vKWDiF7J@lrvoo-v@jAri5wwKGxznD^a ZdF*1#d8cAa?7}+Fmp}V?6uX%M002@T*~kC@ literal 0 HcmV?d00001 diff --git a/test/fixtures/e1554c0273de859d87630ea52d37372a.headers b/test/fixtures/e1554c0273de859d87630ea52d37372a.headers new file mode 100644 index 0000000..a62b2f4 --- /dev/null +++ b/test/fixtures/e1554c0273de859d87630ea52d37372a.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:58 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "202", + "x-ratelimit-reset": "1482197998", + "server": "Plack::Handler::Starlet", + "etag": "W/\"0a585501bcfd9432a42969f28fa96ad3\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/10ed5ae4-2bb8-48ac-89ac-a5ea58667f44?fmt=json", + "time": 408, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/e7d064c841ee5e01c02ed599ecbd556a b/test/fixtures/e7d064c841ee5e01c02ed599ecbd556a new file mode 100644 index 0000000..87899aa --- /dev/null +++ b/test/fixtures/e7d064c841ee5e01c02ed599ecbd556a @@ -0,0 +1 @@ +{"images":[{"types":["Front"],"front":true,"back":false,"edit":27985878,"image":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436435354.jpg","comment":"","approved":true,"id":"7436435354","thumbnails":{"large":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436435354-500.jpg","small":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436435354-250.jpg"}},{"types":["Back"],"front":false,"back":true,"edit":27985879,"image":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436436976.jpg","comment":"","approved":true,"id":"7436436976","thumbnails":{"large":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436436976-500.jpg","small":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436436976-250.jpg"}},{"types":["Medium"],"front":false,"back":false,"edit":27985881,"image":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436437572.jpg","comment":"","approved":true,"id":"7436437572","thumbnails":{"large":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436437572-500.jpg","small":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436437572-250.jpg"}},{"types":["Medium"],"front":false,"back":false,"edit":27985882,"image":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436438250.jpg","comment":"","approved":true,"id":"7436438250","thumbnails":{"large":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436438250-500.jpg","small":"http://coverartarchive.org/release/22a1945f-185c-4d70-979e-f297b00b0c71/7436438250-250.jpg"}}],"release":"http://musicbrainz.org/release/22a1945f-185c-4d70-979e-f297b00b0c71"} \ No newline at end of file diff --git a/test/fixtures/e7d064c841ee5e01c02ed599ecbd556a.headers b/test/fixtures/e7d064c841ee5e01c02ed599ecbd556a.headers new file mode 100644 index 0000000..e0b0911 --- /dev/null +++ b/test/fixtures/e7d064c841ee5e01c02ed599ecbd556a.headers @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:57 GMT", + "content-type": "application/json", + "content-length": "1787", + "last-modified": "Wed, 04 Jun 2014 14:48:40 GMT", + "connection": "keep-alive", + "etag": "\"538f31c8-6fb\"", + "expires": "Tue, 20 Dec 2016 07:39:57 GMT", + "cache-control": "max-age=21600", + "accept-ranges": "bytes" + }, + "url": "http://ia902502.us.archive.org:80/29/items/mbid-22a1945f-185c-4d70-979e-f297b00b0c71/index.json", + "time": 104, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://archive.org/download/mbid-22a1945f-185c-4d70-979e-f297b00b0c71/index.json", + "host": "ia902502.us.archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/e7d66bffb0e7b3bb6f87aff19c514424 b/test/fixtures/e7d66bffb0e7b3bb6f87aff19c514424 new file mode 100644 index 0000000..f8b45cf --- /dev/null +++ b/test/fixtures/e7d66bffb0e7b3bb6f87aff19c514424 @@ -0,0 +1 @@ +{"images":[{"thumbnails":{"large":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/1611507818-500.jpg","small":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/1611507818-250.jpg"},"approved":true,"comment":"","image":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/1611507818.jpg","edit":18544122,"front":true,"types":["Front"],"back":false,"id":"1611507818"},{"approved":true,"thumbnails":{"small":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536418798-250.jpg","large":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536418798-500.jpg"},"comment":"","front":false,"types":["Back"],"id":"13536418798","back":true,"edit":38677409,"image":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536418798.jpg"},{"approved":true,"thumbnails":{"small":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536419390-250.jpg","large":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536419390-500.jpg"},"comment":"","edit":38677410,"image":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536419390.jpg","types":["Liner"],"front":false,"back":false,"id":"13536419390"},{"approved":true,"thumbnails":{"small":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536420212-250.jpg","large":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536420212-500.jpg"},"comment":"","image":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536420212.jpg","edit":38677411,"types":["Liner"],"front":false,"back":false,"id":"13536420212"},{"approved":true,"thumbnails":{"large":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536420721-500.jpg","small":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536420721-250.jpg"},"comment":"","edit":38677412,"image":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536420721.jpg","types":["Poster"],"front":false,"back":false,"id":"13536420721"},{"approved":true,"thumbnails":{"large":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536421121-500.jpg","small":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536421121-250.jpg"},"comment":"","front":false,"types":["Poster"],"back":false,"id":"13536421121","edit":38677413,"image":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536421121.jpg"},{"comment":"","thumbnails":{"small":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536421897-250.jpg","large":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536421897-500.jpg"},"approved":true,"image":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536421897.jpg","edit":38677414,"id":"13536421897","back":false,"types":["Poster"],"front":false},{"image":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536422293.jpg","edit":38677415,"front":false,"types":["Poster"],"back":false,"id":"13536422293","approved":true,"thumbnails":{"small":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536422293-250.jpg","large":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536422293-500.jpg"},"comment":""},{"thumbnails":{"large":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536422691-500.jpg","small":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536422691-250.jpg"},"approved":true,"comment":"","edit":38677416,"image":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536422691.jpg","front":false,"types":["Medium"],"back":false,"id":"13536422691"},{"back":false,"id":"13536423081","front":false,"types":["Medium"],"image":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536423081.jpg","edit":38677417,"comment":"","thumbnails":{"large":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536423081-500.jpg","small":"http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536423081-250.jpg"},"approved":true}],"release":"https://musicbrainz.org/release/b84ee12a-09ef-421b-82de-0441a926375b"} \ No newline at end of file diff --git a/test/fixtures/e7d66bffb0e7b3bb6f87aff19c514424.headers b/test/fixtures/e7d66bffb0e7b3bb6f87aff19c514424.headers new file mode 100644 index 0000000..64cee04 --- /dev/null +++ b/test/fixtures/e7d66bffb0e7b3bb6f87aff19c514424.headers @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:53 GMT", + "content-type": "application/json", + "content-length": "4372", + "last-modified": "Tue, 10 May 2016 19:12:33 GMT", + "connection": "keep-alive", + "etag": "\"573232a1-1114\"", + "expires": "Tue, 20 Dec 2016 07:39:53 GMT", + "cache-control": "max-age=21600", + "accept-ranges": "bytes" + }, + "url": "http://ia600500.us.archive.org:80/31/items/mbid-b84ee12a-09ef-421b-82de-0441a926375b/index.json", + "time": 100, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://archive.org/download/mbid-b84ee12a-09ef-421b-82de-0441a926375b/index.json", + "host": "ia600500.us.archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/eb333e098594fb7f53f15ca41f997176 b/test/fixtures/eb333e098594fb7f53f15ca41f997176 new file mode 100644 index 0000000..258f73c --- /dev/null +++ b/test/fixtures/eb333e098594fb7f53f15ca41f997176 @@ -0,0 +1 @@ +{"images":[{"types":["Front"],"front":true,"back":false,"edit":30009929,"image":"http://coverartarchive.org/release/533e14a8-519d-4f04-95e8-8a84833f26b1/8804135645.jpg","comment":"","approved":true,"id":"8804135645","thumbnails":{"large":"http://coverartarchive.org/release/533e14a8-519d-4f04-95e8-8a84833f26b1/8804135645-500.jpg","small":"http://coverartarchive.org/release/533e14a8-519d-4f04-95e8-8a84833f26b1/8804135645-250.jpg"}}],"release":"http://musicbrainz.org/release/533e14a8-519d-4f04-95e8-8a84833f26b1"} \ No newline at end of file diff --git a/test/fixtures/eb333e098594fb7f53f15ca41f997176.headers b/test/fixtures/eb333e098594fb7f53f15ca41f997176.headers new file mode 100644 index 0000000..6dc4a42 --- /dev/null +++ b/test/fixtures/eb333e098594fb7f53f15ca41f997176.headers @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:57 GMT", + "content-type": "application/json", + "content-length": "515", + "last-modified": "Sun, 16 Nov 2014 22:03:42 GMT", + "connection": "keep-alive", + "etag": "\"54691f3e-203\"", + "expires": "Tue, 20 Dec 2016 07:39:57 GMT", + "cache-control": "max-age=21600", + "accept-ranges": "bytes" + }, + "url": "http://ia902608.us.archive.org:80/12/items/mbid-533e14a8-519d-4f04-95e8-8a84833f26b1/index.json", + "time": 180, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://archive.org/download/mbid-533e14a8-519d-4f04-95e8-8a84833f26b1/index.json", + "host": "ia902608.us.archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/ef8a765d572046b07aa6947545f2655a b/test/fixtures/ef8a765d572046b07aa6947545f2655a new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/ef8a765d572046b07aa6947545f2655a.headers b/test/fixtures/ef8a765d572046b07aa6947545f2655a.headers new file mode 100644 index 0000000..7fd6c7b --- /dev/null +++ b/test/fixtures/ef8a765d572046b07aa6947545f2655a.headers @@ -0,0 +1,24 @@ +{ + "statusCode": 307, + "headers": { + "date": "Tue, 20 Dec 2016 01:37:46 GMT", + "content-type": "text/plain; charset=utf-8", + "content-length": "131", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "location": "http://archive.org/download/mbid-76df3287-6cda-33eb-8e9a-044b5e15ffdd/mbid-76df3287-6cda-33eb-8e9a-044b5e15ffdd-829521842.jpg", + "access-control-allow-origin": "*", + "server": "4b4c084fb141" + }, + "url": "http://coverartarchive.org:80/release/76df3287-6cda-33eb-8e9a-044b5e15ffdd/front", + "time": 414, + "request": { + "method": "HEAD", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "content-length": 0 + } + } +} \ No newline at end of file diff --git a/test/fixtures/ef97a1709cfc1a6cf2b23c0f0c7a34fa b/test/fixtures/ef97a1709cfc1a6cf2b23c0f0c7a34fa new file mode 100644 index 0000000..3e53715 --- /dev/null +++ b/test/fixtures/ef97a1709cfc1a6cf2b23c0f0c7a34fa @@ -0,0 +1 @@ +{"release":"https://musicbrainz.org/release/10ed5ae4-2bb8-48ac-89ac-a5ea58667f44","images":[{"image":"http://coverartarchive.org/release/10ed5ae4-2bb8-48ac-89ac-a5ea58667f44/14894448550.jpg","front":true,"id":"14894448550","types":["Front"],"comment":"","thumbnails":{"small":"http://coverartarchive.org/release/10ed5ae4-2bb8-48ac-89ac-a5ea58667f44/14894448550-250.jpg","large":"http://coverartarchive.org/release/10ed5ae4-2bb8-48ac-89ac-a5ea58667f44/14894448550-500.jpg"},"back":false,"approved":true,"edit":41203744}]} \ No newline at end of file diff --git a/test/fixtures/ef97a1709cfc1a6cf2b23c0f0c7a34fa.headers b/test/fixtures/ef97a1709cfc1a6cf2b23c0f0c7a34fa.headers new file mode 100644 index 0000000..a111562 --- /dev/null +++ b/test/fixtures/ef97a1709cfc1a6cf2b23c0f0c7a34fa.headers @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:56 GMT", + "content-type": "application/json", + "content-length": "520", + "last-modified": "Fri, 21 Oct 2016 17:04:17 GMT", + "connection": "keep-alive", + "etag": "\"580a4a91-208\"", + "expires": "Tue, 20 Dec 2016 07:39:56 GMT", + "cache-control": "max-age=21600", + "accept-ranges": "bytes" + }, + "url": "http://ia801906.us.archive.org:80/20/items/mbid-10ed5ae4-2bb8-48ac-89ac-a5ea58667f44/index.json", + "time": 159, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://archive.org/download/mbid-10ed5ae4-2bb8-48ac-89ac-a5ea58667f44/index.json", + "host": "ia801906.us.archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/f2f8141f92864c3860802d1e9d5b86c8 b/test/fixtures/f2f8141f92864c3860802d1e9d5b86c8 new file mode 100644 index 0000000000000000000000000000000000000000..57905ed09a0b4713d93e6e91d02b1ab6a4b86c54 GIT binary patch literal 435 zcmV;k0ZjfMiwFP!0000019eeNkJB&^{VS2rjFiOjM|uMeD-aTg)e0fRVd6}R)zmJw z(*;%i?~J?4N=S=O^Wk~(-kXa!p*!H-hduaN>;$>qn6^V0udWq@fx2U>TU+GRAV zMe#Yx5p+olmq9M?hx^C5zp+i@-!Ec9&Oi za!dsR9xLgG;0w*oJ(H%)z5kSbj=(xJbl~Dlbw}0yojW(3c62m$6C0&0NZA@-GYptf zP1-6oxY3I1zfN8M4$B^`mXidOO2c4{1Us1lT;IyEQ`#{EQz-PSK%!Hk%qpMdTts%s zp9;f#!V>t~ih;%M>l$LGc8W%176e0T9o36KrqsUQAK zb;s@AVkfJBbf7>?d%-nR1$PIrD{13+NwI!=N*LlXrsp2B!0fC2@7ntMySJ4<@nx;N dzQ(Qjf}u1YN&`*J?qW^E^$%yDkg=iy0073r*;oJo literal 0 HcmV?d00001 diff --git a/test/fixtures/f2f8141f92864c3860802d1e9d5b86c8.headers b/test/fixtures/f2f8141f92864c3860802d1e9d5b86c8.headers new file mode 100644 index 0000000..19cb9b1 --- /dev/null +++ b/test/fixtures/f2f8141f92864c3860802d1e9d5b86c8.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:40:11 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "582", + "x-ratelimit-reset": "1482198012", + "server": "Plack::Handler::Starlet", + "etag": "W/\"b9cb2670f2ec23624af2b9452a5cd702\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/32a863b3-a356-4873-8b74-c2039156cb68?fmt=json", + "time": 413, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/f3745cfb05ddfda57ec715ce6e752f4e b/test/fixtures/f3745cfb05ddfda57ec715ce6e752f4e new file mode 100644 index 0000000..fdaefaa --- /dev/null +++ b/test/fixtures/f3745cfb05ddfda57ec715ce6e752f4e @@ -0,0 +1 @@ +See: http://archive.org/download/mbid-fb98043c-7ac8-4505-ba87-28576836a8d5/index.json diff --git a/test/fixtures/f3745cfb05ddfda57ec715ce6e752f4e.headers b/test/fixtures/f3745cfb05ddfda57ec715ce6e752f4e.headers new file mode 100644 index 0000000..9ebd8b3 --- /dev/null +++ b/test/fixtures/f3745cfb05ddfda57ec715ce6e752f4e.headers @@ -0,0 +1,24 @@ +{ + "statusCode": 307, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:56 GMT", + "content-type": "text/plain; charset=utf-8", + "content-length": "86", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "location": "http://archive.org/download/mbid-fb98043c-7ac8-4505-ba87-28576836a8d5/index.json", + "access-control-allow-origin": "*", + "server": "d8b8a8eb2a2a" + }, + "url": "http://coverartarchive.org:80/release/fb98043c-7ac8-4505-ba87-28576836a8d5", + "time": 506, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/f3c7a5a4d0fbaf81b0a721a0fea245ea b/test/fixtures/f3c7a5a4d0fbaf81b0a721a0fea245ea new file mode 100644 index 0000000..e0aacda --- /dev/null +++ b/test/fixtures/f3c7a5a4d0fbaf81b0a721a0fea245ea @@ -0,0 +1,4 @@ + +404 Not Found +

Not Found

+

No cover art found for release 060dc665-af64-4e75-8e51-d74eda2ec957

diff --git a/test/fixtures/f3c7a5a4d0fbaf81b0a721a0fea245ea.headers b/test/fixtures/f3c7a5a4d0fbaf81b0a721a0fea245ea.headers new file mode 100644 index 0000000..006cce1 --- /dev/null +++ b/test/fixtures/f3c7a5a4d0fbaf81b0a721a0fea245ea.headers @@ -0,0 +1,22 @@ +{ + "statusCode": 404, + "headers": { + "date": "Tue, 20 Dec 2016 01:39:55 GMT", + "content-type": "text/html", + "content-length": "179", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "server": "d6446ea62189" + }, + "url": "http://coverartarchive.org:80/release/060dc665-af64-4e75-8e51-d74eda2ec957", + "time": 433, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "coverartarchive.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/f64d96e2f100bde683ffde19d156218d b/test/fixtures/f64d96e2f100bde683ffde19d156218d new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/f64d96e2f100bde683ffde19d156218d.headers b/test/fixtures/f64d96e2f100bde683ffde19d156218d.headers new file mode 100644 index 0000000..2a9ad76 --- /dev/null +++ b/test/fixtures/f64d96e2f100bde683ffde19d156218d.headers @@ -0,0 +1,25 @@ +{ + "statusCode": 302, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:56 GMT", + "content-type": "text/html; charset=UTF-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "x-powered-by": "PHP/5.5.9-1ubuntu4.20", + "accept-ranges": "bytes", + "location": "http://ia801204.us.archive.org/9/items/mbid-3d354599-d9d4-44a8-9584-37e3b0238871/index.json" + }, + "url": "http://archive.org:80/download/mbid-3d354599-d9d4-44a8-9584-37e3b0238871/index.json", + "time": 222, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://coverartarchive.org/release/3d354599-d9d4-44a8-9584-37e3b0238871", + "host": "archive.org" + } + } +} \ No newline at end of file diff --git a/test/fixtures/faadb7f41cc3307e81ffc0775f85c8cd b/test/fixtures/faadb7f41cc3307e81ffc0775f85c8cd new file mode 100644 index 0000000000000000000000000000000000000000..9c646c7f3af4347020133113d92002d3fc16ad89 GIT binary patch literal 437 zcmV;m0ZRTKiwFP!0000018q^kirX*{{gt3o7b1`)%T{tMTiT_C9$HvR*~3^Gxgw5~ z%5vHz_}@EfvpJMK7(8!AZ{B-zVFP5F9I`#@cB+@ES4PVn+cFnsI1XW4poA2uPZ-Rh z{=F4Ke9&JX zrTj9wUR(K@R^Gp(RX-P)LaAj;`3Mt1bAhtVJP;jgQHfSH9apAvT(x4y!As=5F}g>z z+IplXC6uZ9{SxB1dGp{m-_o*qgjhBY<&OFpCxjU}o-vl0?Z010bEz++5FHnWOI@?b z2-WIqIYl_u`S(aF<1+zaPMnl=yx}$N%33WwQKu>=eOh`4yivBLK~Q`^)LfvpL*sSh zz*Vz}QvQ#7U7xnE>N`>BFp|fbUKqm(4(z(lbxID69Jp*6FYAphUL59EE_--Ul209_l9N->r<_sYdCB fJBgAU3s1MQbh>^pJLd+FZO7I>#P(vWp8@~?(38%< literal 0 HcmV?d00001 diff --git a/test/fixtures/faadb7f41cc3307e81ffc0775f85c8cd.headers b/test/fixtures/faadb7f41cc3307e81ffc0775f85c8cd.headers new file mode 100644 index 0000000..2486bb7 --- /dev/null +++ b/test/fixtures/faadb7f41cc3307e81ffc0775f85c8cd.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Tue, 20 Dec 2016 01:40:16 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "212", + "x-ratelimit-reset": "1482198016", + "server": "Plack::Handler::Starlet", + "etag": "W/\"cc124ae299c23d9df8cb9cc43a75d4b8\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/d632b12b-211e-4fbd-87fb-21382556388b?fmt=json", + "time": 421, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/fd48eb2a7c834a80a4cf3f589b1d9688 b/test/fixtures/fd48eb2a7c834a80a4cf3f589b1d9688 new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/fd48eb2a7c834a80a4cf3f589b1d9688.headers b/test/fixtures/fd48eb2a7c834a80a4cf3f589b1d9688.headers new file mode 100644 index 0000000..95b61c3 --- /dev/null +++ b/test/fixtures/fd48eb2a7c834a80a4cf3f589b1d9688.headers @@ -0,0 +1,25 @@ +{ + "statusCode": 302, + "headers": { + "server": "nginx/1.4.6 (Ubuntu)", + "date": "Tue, 20 Dec 2016 01:39:54 GMT", + "content-type": "text/html; charset=UTF-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "x-powered-by": "PHP/5.5.9-1ubuntu4.20", + "accept-ranges": "bytes", + "location": "http://ia800808.us.archive.org/32/items/mbid-25fbfbb4-b1ee-4448-aadf-ae3bc2e2dd27/index.json" + }, + "url": "http://archive.org:80/download/mbid-25fbfbb4-b1ee-4448-aadf-ae3bc2e2dd27/index.json", + "time": 141, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/4.5.0 ( https://github.com/exogen/graphbrainz )", + "accept-encoding": "gzip, deflate", + "accept": "application/json", + "referer": "http://coverartarchive.org/release-group/f5093c06-23e3-404f-aeaa-40f72885ee3a", + "host": "archive.org" + } + } +} \ No newline at end of file diff --git a/test/helpers/client.js b/test/helpers/client.js deleted file mode 100644 index 962017a..0000000 --- a/test/helpers/client.js +++ /dev/null @@ -1,11 +0,0 @@ -import path from 'path' -import sepia from 'sepia' -import MusicBrainz from '../../src/api' - -sepia.fixtureDir(path.join(__dirname, '..', 'fixtures')) - -const options = /^(playback|cache)$/.test(process.env.VCR_MODE) - ? { limit: Infinity, period: 0 } - : {} - -export default new MusicBrainz(options) diff --git a/test/helpers/client/cover-art-archive.js b/test/helpers/client/cover-art-archive.js new file mode 100644 index 0000000..0c509bd --- /dev/null +++ b/test/helpers/client/cover-art-archive.js @@ -0,0 +1,11 @@ +import path from 'path' +import sepia from 'sepia' +import { CoverArtArchive } from '../../../src/api' + +sepia.fixtureDir(path.join(__dirname, '..', '..', 'fixtures')) + +const options = process.env.VCR_MODE === 'playback' + ? { limit: Infinity, period: 0 } + : {} + +export default new CoverArtArchive(options) diff --git a/test/helpers/client/musicbrainz.js b/test/helpers/client/musicbrainz.js new file mode 100644 index 0000000..6ce707d --- /dev/null +++ b/test/helpers/client/musicbrainz.js @@ -0,0 +1,11 @@ +import path from 'path' +import sepia from 'sepia' +import MusicBrainz from '../../../src/api' + +sepia.fixtureDir(path.join(__dirname, '..', '..', 'fixtures')) + +const options = process.env.VCR_MODE === 'playback' + ? { limit: Infinity, period: 0 } + : {} + +export default new MusicBrainz(options) diff --git a/test/helpers/context.js b/test/helpers/context.js index c60cf17..e530fba 100644 --- a/test/helpers/context.js +++ b/test/helpers/context.js @@ -1,7 +1,9 @@ import createLoaders from '../../src/loaders' -import client from './client' +import client from './client/musicbrainz' +import coverArtClient from './client/cover-art-archive' export default { client, - loaders: createLoaders(client) + coverArtClient, + loaders: createLoaders(client, coverArtClient) } diff --git a/test/schema.js b/test/schema.js index 824087d..95d9f28 100644 --- a/test/schema.js +++ b/test/schema.js @@ -1071,3 +1071,224 @@ test('entities support tags', testData, ` t.true(artists[0].tags.edges.some(edge => edge.node.name === 'blues rock')) t.true(artists[0].tags.edges.some(edge => edge.node.count > 0)) }) + +test('releases have a cover art summary', testData, ` + { + lookup { + release(mbid: "b84ee12a-09ef-421b-82de-0441a926375b") { + coverArt { + artwork + darkened + count + } + } + } + } +`, (t, data) => { + const { coverArt } = data.lookup.release + t.true(coverArt.artwork) + t.false(coverArt.darkened) + t.true(coverArt.count >= 10) +}) + +test('releases have a set of cover art images', testData, ` + { + lookup { + release(mbid: "b84ee12a-09ef-421b-82de-0441a926375b") { + coverArt { + front + back + images { + front + back + types + approved + edit + comment + fileID + image + thumbnails { + small + large + } + } + } + } + } + } +`, (t, data) => { + const { coverArt } = data.lookup.release + t.is(coverArt.front, 'http://archive.org/download/mbid-b84ee12a-09ef-421b-82de-0441a926375b/mbid-b84ee12a-09ef-421b-82de-0441a926375b-1611507818.jpg') + t.is(coverArt.back, 'http://archive.org/download/mbid-b84ee12a-09ef-421b-82de-0441a926375b/mbid-b84ee12a-09ef-421b-82de-0441a926375b-13536418798.jpg') + t.true(coverArt.images.length >= 10) + t.true(coverArt.images.some(image => image.front === true)) + t.true(coverArt.images.some(image => image.back === true)) + t.true(coverArt.images.some(image => image.types.indexOf('Front') >= 0)) + t.true(coverArt.images.some(image => image.types.indexOf('Back') >= 0)) + t.true(coverArt.images.some(image => image.types.indexOf('Liner') >= 0)) + t.true(coverArt.images.some(image => image.types.indexOf('Poster') >= 0)) + t.true(coverArt.images.some(image => image.types.indexOf('Medium') >= 0)) + t.true(coverArt.images.some(image => image.edit === 18544122)) + t.true(coverArt.images.some(image => image.comment === '')) + t.true(coverArt.images.some(image => image.fileID === '1611507818')) + t.true(coverArt.images.some(image => image.image === 'http://coverartarchive.org/release/b84ee12a-09ef-421b-82de-0441a926375b/13536422691.jpg')) + t.true(coverArt.images.every(image => image.approved === true)) + t.true(coverArt.images.every(image => image.thumbnails.small)) + t.true(coverArt.images.every(image => image.thumbnails.large)) +}) + +test('can request a size for front and back cover art', testData, ` + { + lookup { + release(mbid: "b84ee12a-09ef-421b-82de-0441a926375b") { + coverArt { + front(size: LARGE) + back(size: SMALL) + fullFront: front(size: FULL) + } + } + } + } +`, (t, data) => { + const { coverArt } = data.lookup.release + t.is(coverArt.front, 'http://archive.org/download/mbid-b84ee12a-09ef-421b-82de-0441a926375b/mbid-b84ee12a-09ef-421b-82de-0441a926375b-1611507818_thumb500.jpg') + t.is(coverArt.back, 'http://archive.org/download/mbid-b84ee12a-09ef-421b-82de-0441a926375b/mbid-b84ee12a-09ef-421b-82de-0441a926375b-13536418798_thumb250.jpg') + t.is(coverArt.fullFront, 'http://archive.org/download/mbid-b84ee12a-09ef-421b-82de-0441a926375b/mbid-b84ee12a-09ef-421b-82de-0441a926375b-1611507818.jpg') +}) + +test('release groups have a front cover art image', testData, ` + { + lookup { + releaseGroup(mbid: "f5093c06-23e3-404f-aeaa-40f72885ee3a") { + coverArt { + artwork + front + images { + front + image + } + release { + mbid + title + } + } + } + } + } +`, (t, data) => { + const { coverArt } = data.lookup.releaseGroup + t.true(coverArt.artwork) + t.is(coverArt.front, 'http://coverartarchive.org/release/25fbfbb4-b1ee-4448-aadf-ae3bc2e2dd27/1675312275.jpg') + t.is(coverArt.release.mbid, '25fbfbb4-b1ee-4448-aadf-ae3bc2e2dd27') + t.is(coverArt.release.title, 'The Dark Side of the Moon') + t.is(coverArt.images.length, 1) + t.true(coverArt.images[0].front) +}) + +test('release groups have different cover art sizes available', testData, ` + { + lookup { + releaseGroup(mbid: "f5093c06-23e3-404f-aeaa-40f72885ee3a") { + coverArt { + small: front(size: SMALL) + large: front(size: LARGE) + } + } + } + } +`, (t, data) => { + const { coverArt } = data.lookup.releaseGroup + t.is(coverArt.small, 'http://coverartarchive.org/release/25fbfbb4-b1ee-4448-aadf-ae3bc2e2dd27/1675312275-250.jpg') + t.is(coverArt.large, 'http://coverartarchive.org/release/25fbfbb4-b1ee-4448-aadf-ae3bc2e2dd27/1675312275-500.jpg') +}) + +test('can retrieve cover art in searches', testData, ` + { + search { + releases(query: "You Want It Darker") { + edges { + node { + coverArt { + artwork + darkened + front + back + images { + image + } + } + } + } + } + } + } +`, (t, data) => { + const releases = data.search.releases.edges.map(edge => edge.node) + t.is(releases.length, 25) + t.true(releases.some(release => release.coverArt.artwork === true)) + t.true(releases.every(release => release.coverArt.darkened === false)) + t.true(releases.some(release => release.coverArt.images.length > 0)) + t.true(releases.some(release => release.coverArt.front === null)) + t.true(releases.some(release => release.coverArt.back === null)) +}) + +test('cover art release field does not make a request unless necessary', testData, ` + { + lookup { + release(mbid: "b84ee12a-09ef-421b-82de-0441a926375b") { + coverArt { + release { + mbid + } + } + } + } + } +`, (t, data) => { + // TODO: Add ability to check how many requests were made to fulfill a query. + const { coverArt } = data.lookup.release + t.is(coverArt.release.mbid, 'b84ee12a-09ef-421b-82de-0441a926375b') +}) + +test('cover art fields can be calculated instead of making another request', testData, ` + { + search { + releases(query: "reid:b84ee12a-09ef-421b-82de-0441a926375b", first: 1) { + edges { + node { + coverArt { + artwork + count + } + } + } + } + } + } +`, (t, data) => { + // TODO: Add ability to check how many requests were made to fulfill a query. + const releases = data.search.releases.edges.map(edge => edge.node) + t.is(releases.length, 1) + t.true(releases[0].coverArt.artwork) + t.is(releases[0].coverArt.count, 10) +}) + +test('cover art is not fetched if the count is 0', testData, ` + { + lookup { + release(mbid: "c0f74d5a-7534-414d-8b90-0ebe6c5da19e") { + coverArt { + count + images { + image + } + } + } + } + } +`, (t, data) => { + // TODO: Add ability to check how many requests were made to fulfill a query. + const { coverArt } = data.lookup.release + t.is(coverArt.count, 0) + t.deepEqual(coverArt.images, []) +}) diff --git a/test/types/scalars.js b/test/types/scalars.js index 51d92aa..a609341 100644 --- a/test/types/scalars.js +++ b/test/types/scalars.js @@ -45,6 +45,11 @@ test('Duration scalar must be a positive integer', t => { t.is(Duration.parseLiteral({ kind: Kind.STRING, value: '1000' }), null) t.throws(() => Duration.parseLiteral({ kind: Kind.INT, value: -1 }), TypeError) t.throws(() => Duration.parseLiteral({ kind: Kind.INT, value: -1000 }), TypeError) + t.is(Duration.parseValue(0), 0) + t.is(Duration.parseValue(1), 1) + t.is(Duration.parseValue(3000), 3000) + t.throws(() => Duration.parseValue(-1), TypeError) + t.throws(() => Duration.parseValue(-1000), TypeError) }) test('URLString scalar must be a valid URL', t => { @@ -62,6 +67,12 @@ test('ISWC scalar only accepts strings', t => { t.is(ISWC.parseLiteral({ kind: Kind.ENUM, value: 'xx' }), null) }) +test('ISWC scalar can be any string', t => { + t.is(ISWC.parseValue('foo'), 'foo') + t.is(ISWC.parseValue('123-456'), '123-456') + t.is(ISWC.parseValue('!@#$%^&*'), '!@#$%^&*') +}) + test('MBID scalar only accepts strings', t => { t.is(MBID.parseLiteral({ kind: Kind.INT, value: 12345 }), null) t.is(MBID.parseLiteral({ kind: Kind.ENUM, value: 'xx' }), null)