Compare commits

...

2 commits

Author SHA1 Message Date
685038279e add playlist IDs from previous years 2023-11-13 00:01:48 +01:00
06d8885c33 feat: add playlist IDs of different types 2023-11-12 23:25:41 +01:00
32 changed files with 56520 additions and 12635 deletions

View file

@ -1,6 +1,7 @@
"""
Store the fetched genre info (everynoise_genres.json) in the metadata files.
"""
import asyncio
import argparse
import os
import sys
@ -10,17 +11,15 @@ import dataclasses
from pathlib import Path
from typing import Dict
import aiohttp
from aiostream import stream, pipe
from bs4 import BeautifulSoup
from dotenv import load_dotenv
import spotify
import yaml
import model
GENRE_DIR = Path(os.path.dirname(os.path.abspath(__file__)))
GENRE_FILE = GENRE_DIR / "everynoise_genres.json"
METADATA_DIR = GENRE_DIR / ".." / "metadata"
TRANSLATION_DIR = GENRE_DIR / ".." / "translations"
TRANSLATION_FILE = TRANSLATION_DIR / "_main.json"
TRANSLATION_FILE_EN = TRANSLATION_DIR / "en.json"
import util
def genre_letter(id: str) -> str:
@ -30,8 +29,9 @@ def genre_letter(id: str) -> str:
return "0"
def group_genres(genre_data: Dict[str, model.GenreMetadata]) -> Dict[
str, Dict[str, model.GenreMetadata]]:
def group_genres(
genre_data: Dict[str, model.GenreMetadata]
) -> Dict[str, Dict[str, model.GenreMetadata]]:
"""Group genres by their first letter"""
grouped_genres = dict()
for genre_id, genre in genre_data.items():
@ -43,7 +43,7 @@ def group_genres(genre_data: Dict[str, model.GenreMetadata]) -> Dict[
def genres_to_meta():
with open(GENRE_FILE) as f:
with open(util.GENRE_FILE) as f:
genre_dict = json.load(f)
genre_data = model.load_genre_dict(genre_dict)
@ -51,7 +51,7 @@ def genres_to_meta():
for lt, lt_genres in grouped_genres.items():
# Load stored metadata
md_path = METADATA_DIR / f"{lt}.yaml"
md_path = util.METADATA_DIR / f"{lt}.yaml"
stored_genres = dict()
if md_path.is_file():
with md_path.open() as f:
@ -78,29 +78,15 @@ def genres_to_meta():
model.store_genres_yaml(md_path, stored_genres)
def read_meta() -> Dict[str, model.GenreMetadata]:
metadata = dict()
for filename in os.listdir(METADATA_DIR):
md_path = METADATA_DIR / filename
with md_path.open("r") as f:
data = yaml.safe_load(f)
stored_genres = model.load_genre_dict(data)
metadata.update(stored_genres)
print(f"{len(metadata)} genres loaded", file=sys.stderr)
return metadata
def write_meta(metadata: Dict[str, model.GenreMetadata]):
grouped_metadata = group_genres(metadata)
for lt, genres in grouped_metadata.items():
md_path = METADATA_DIR / f"{lt}.yaml"
md_path = util.METADATA_DIR / f"{lt}.yaml"
model.store_genres_yaml(md_path, genres)
def migrate_meta():
metadata = read_meta()
metadata = util.read_meta()
mig_metadata = dict()
unknown_refs = set()
@ -132,7 +118,7 @@ def migrate_meta():
def remove_deprecated():
metadata = read_meta()
metadata = util.read_meta()
def flt(itm):
genre = itm[1]
@ -146,7 +132,7 @@ def remove_deprecated():
def validate():
metadata = read_meta()
metadata = util.read_meta()
n_err = 0
unknown_refs = set()
@ -159,7 +145,9 @@ def validate():
g = metadata.get(ref)
if g:
if g.alias:
print(f"ERR: '{own}' links to alias '{ref}', should be '{g.alias}'")
print(
f"ERR: '{own}' links to alias '{ref}', should be '{g.alias}'"
)
return False
return True
else:
@ -185,16 +173,23 @@ def validate():
def make_translations():
metadata = read_meta()
translations = {genre_id: genre.name for genre_id, genre in metadata.items() if not genre.alias}
with open(TRANSLATION_FILE, "w") as f:
json.dump(translations, f, ensure_ascii=False, sort_keys=True, indent=2)
metadata = util.read_meta()
translations = {
genre_id: genre.name
for genre_id, genre in metadata.items() if not genre.alias
}
with open(util.TRANSLATION_FILE, "w") as f:
json.dump(translations,
f,
ensure_ascii=False,
sort_keys=True,
indent=2)
f.write("\n")
for filename in os.listdir(TRANSLATION_DIR):
if filename == "_meta.yaml":
for filename in os.listdir(util.TRANSLATION_DIR):
if filename == "_main.json":
continue
tl_path = TRANSLATION_DIR / filename
tl_path = util.TRANSLATION_DIR / filename
with open(tl_path) as f:
tl = json.load(f)
modified = False
@ -209,9 +204,9 @@ def make_translations():
def list_genres(limit=None):
metadata = read_meta()
metadata = util.read_meta()
with open(TRANSLATION_FILE_EN) as f:#
with open(util.TRANSLATION_FILE_EN) as f: #
translation = json.load(f)
roots = []
@ -243,7 +238,7 @@ def list_genres(limit=None):
def find_missing_lang():
metadata = read_meta()
metadata = util.read_meta()
# English/multilingual countries
skip_countries = {
@ -268,7 +263,7 @@ def find_missing_lang():
def check_localized_name():
metadata = read_meta()
metadata = util.read_meta()
for genre_id, genre in metadata.items():
lang = genre.language
@ -286,37 +281,145 @@ def new_translation(new_file: Path, capitalize: bool):
Create a new translation file with the untranslatable items
already filled in
"""
metadata = read_meta()
with open(TRANSLATION_FILE_EN) as f:
with open(util.TRANSLATION_FILE_EN) as f:
en_tl: Dict[str, str] = json.load(f)
with open(util.TRANSLATION_DIR / "de.json") as f:
de_tl: Dict[str, str] = json.load(f)
new_tl = dict()
upper_pattern = re.compile(r"(?<=[ \-])[a-z](?=[a-z])")
for key, te in en_tl.items():
genre = metadata[key]
if not genre.localized_name and not "(" in te and not "traditional" in te.lower():
nval = te
if capitalize:
for m in upper_pattern.finditer(nval):
for key, english in en_tl.items():
german = de_tl[key]
english_upper = english
for m in upper_pattern.finditer(english_upper):
s = m.start(0)
nval = nval[:s] + nval[s].upper() + nval[s+1:]
new_tl[key] = nval
english_upper = english_upper[:s] + english_upper[s].upper(
) + english_upper[s + 1:]
if english_upper == german:
if capitalize:
new_tl[key] = english_upper
else:
new_tl[key] = english
with open(new_file, "w") as f:
json.dump(new_tl, f, ensure_ascii=False, sort_keys=True, indent=2)
f.write("\n")
async def scrape_playlists():
"""Scrape playlist IDs from everynoise.com"""
spid_pattern = re.compile("/([A-z0-9]{22})$")
for i in range(27):
metadata = util.read_meta_n(i)
async def scrape_playlist(g_id: str):
genre = metadata[g_id]
if genre.metagenre or genre.deprecated or genre.playlists:
return
urlid = re.sub(r"[^A-Za-z0-9]+", '', g_id)
async with aiohttp.ClientSession() as session:
async with session.get(
f"https://everynoise.com/engenremap-{urlid}.html"
) as response:
html_text = await response.text()
html = BeautifulSoup(html_text, features="lxml")
pl_links = {
"sound": f"listen to The Sound of {genre.name} on Spotify",
"intro": "listen to a shorter introduction to this genre",
"pulse": "listen to this genre's fans' current favorites",
"edge": "listen to this genre's fans' new discoveries",
"2023": "listen to this genre's fans' favorites of 2023",
}
for key, title in pl_links.items():
pl_link = html.find("a", {"title": title})
if pl_link is None:
if key == "sound":
print(html_text)
raise Exception(
f"could not find {key} link for {genre.name}")
else:
continue
pl_id = spid_pattern.search(pl_link["href"]).group(1)
if not genre.playlists:
metadata[g_id].playlists = dict()
metadata[g_id].playlists[key] = pl_id
# Remove legacy playlist id
if genre.playlist_id:
assert genre.playlist_id == genre.playlists["sound"]
metadata[g_id].playlist_id = None
print("scraped playlists for", g_id)
sx = stream.iterate(metadata.keys()) | pipe.map(scrape_playlist,
task_limit=5)
await sx
write_meta(metadata)
async def scrape_playlists_year(year: int):
"""Scrape yearly playlists of previous years from Spotify users"""
username = f"particledetector{year}"
prefix = f"{year} in "
offset = 0
metadata = util.read_meta()
name_map = {v.name: k for k, v in metadata.items()}
while True:
async with spotify.Client(os.getenv("SPOTIFY_CLIENT_ID"),
os.getenv("SPOTIFY_CLIENT_SECRET")) as client:
playlists = await client.http.get_playlists(username, limit=50, offset=offset)
items = playlists["items"]
for item in items:
name: str = item["name"]
if not name.startswith(prefix):
continue
genre_name = name.removeprefix(prefix)
if genre_name in name_map:
g_id = name_map[genre_name]
metadata[g_id].playlists[str(year)] = item["id"]
print("found ", genre_name)
if len(items) < 50:
break
offset += len(items)
write_meta(metadata)
if __name__ == "__main__":
load_dotenv()
parser = argparse.ArgumentParser()
parser.add_argument("op", type=str, help="Operation")
parser.add_argument("--limit", type=int, help="Limit", default=None, required=False)
parser.add_argument("--file", type=Path, help="Limit", default=None, required=False)
parser.add_argument("--limit",
type=int,
help="Limit",
default=None,
required=False)
parser.add_argument("--year",
type=int,
help="Year",
default=None,
required=False)
parser.add_argument("--file",
type=Path,
help="Limit",
default=None,
required=False)
args = parser.parse_args()
if args.op == "genres2meta":
@ -333,5 +436,9 @@ if __name__ == "__main__":
new_translation(args.file, True)
elif args.op == "checkln":
check_localized_name()
elif args.op == "scrapePlaylists":
asyncio.get_event_loop().run_until_complete(scrape_playlists())
elif args.op == "scrapePlaylistsYear":
asyncio.get_event_loop().run_until_complete(scrape_playlists_year(args.year))
else:
sys.exit(2)

View file

@ -16,18 +16,12 @@ import aiohttp
from aiostream import stream, pipe
import model
import util
EVERYNOISE_URL = "https://everynoise.com/everynoise1d.cgi?vector=popularity&scope=all"
GENRE_FILE = "everynoise_genres.json"
def remove_prefix(s, prefix):
if s.startswith(prefix):
return s[len(prefix):]
else:
raise Exception(f"{s} does not start with {prefix}")
async def get_genres():
async with aiohttp.ClientSession() as session:
async with session.get(EVERYNOISE_URL) as response:
@ -49,7 +43,7 @@ async def get_genres():
popularity = int(row.find("td").string)
pl_link = row.find("a", {"target": "spotify"})
pl_id = remove_prefix(pl_link["href"],
pl_id = util.remove_prefix(pl_link["href"],
"https://embed.spotify.com/?uri=spotify:playlist:")
genre_link = row.find("a",
{
@ -63,7 +57,7 @@ async def get_genres():
# Fetch genre name from Spotify
pl_data = await client.http.get_playlist(pl_id, fields=["name"])
genre_name = remove_prefix(pl_data["name"], "The Sound of ")
genre_name = util.remove_prefix(pl_data["name"], "The Sound of ")
genre_data[genre_id] = model.GenreMetadata(genre_name,
playlist_id=pl_id,

View file

@ -32,8 +32,9 @@ class GenreMetadata:
localized_name: Optional[bool] = None
wikipedia_url: Optional[str] = None
wikidata_id: Optional[int] = None
popularity: Optional[int] = None
rank: Optional[int] = None
playlist_id: Optional[str] = None
playlists: Optional[Dict[str, str]] = None
alias: Optional[str] = None
deprecated: Optional[bool] = None
metagenre: Optional[bool] = None

47
genres/util.py Normal file
View file

@ -0,0 +1,47 @@
import os
import sys
import yaml
from pathlib import Path
from typing import Dict
import model
GENRE_DIR = Path(os.path.dirname(os.path.abspath(__file__)))
GENRE_FILE = GENRE_DIR / "everynoise_genres.json"
METADATA_DIR = GENRE_DIR / ".." / "metadata"
TRANSLATION_DIR = GENRE_DIR / ".." / "translations"
TRANSLATION_FILE = TRANSLATION_DIR / "_main.json"
TRANSLATION_FILE_EN = TRANSLATION_DIR / "en.json"
def remove_prefix(s: str, prefix: str) -> str:
if s.startswith(prefix):
return s[len(prefix):]
else:
raise Exception(f"{s} does not start with {prefix}")
def read_meta() -> Dict[str, model.GenreMetadata]:
metadata = dict()
for filename in os.listdir(METADATA_DIR):
md_path = METADATA_DIR / filename
with md_path.open("r") as f:
data = yaml.safe_load(f)
stored_genres = model.load_genre_dict(data)
metadata.update(stored_genres)
print(f"{len(metadata)} genres loaded", file=sys.stderr)
return metadata
def read_meta_n(n: int) -> Dict[str, model.GenreMetadata]:
"""Read metadata from a specific file (numbers 0-26)"""
if n == 0:
md_path = METADATA_DIR / "0.yaml"
else:
md_path = METADATA_DIR / f"{chr(96 + n)}.yaml"
with md_path.open("r") as f:
data = yaml.safe_load(f)
return model.load_genre_dict(data)

View file

@ -8,8 +8,13 @@
parent: uk garage
wikipedia_url: https://en.wikipedia.org/wiki/2-step_garage
wikidata_id: 1751409
popularity: 3715
playlist_id: 3YOSwaEFJsA3fbYH8lArkR
rank: 3715
playlists:
"2023": 4O242UZweUZ7S9wmDvxiEp
edge: 7xqAm3evGeotzSNWqgpgbU
intro: 7hqqWzw23Hmbw67hp8BPKN
pulse: 3JSwdgeMJJoD0Y0z3AwczS
sound: 3YOSwaEFJsA3fbYH8lArkR
21st century classical:
name: 21st Century Classical
description:
@ -21,8 +26,17 @@
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/21st-century_classical_music
wikidata_id: 4631020
popularity: 2437
playlist_id: 2HUpNZLoYHe0Sa9dglqQOg
rank: 2437
playlists:
"2019": 70FdGcqZAMGnQ8cIE4OQZq
"2020": 6vWyCmjP0OY2nBSK7kSTXo
"2021": 4rEFotvPMureiXTfgQJajM
"2022": 0ZA8FJ3NZGtsQu4zZ6MFUC
"2023": 2hSUx0szcSZHdeIqmHCgNK
edge: 6vXmXiiR3ATnrC3P0opPx5
intro: 7wdDcoVCJoZYoUGZ8yBJ4w
pulse: 7cVjeKbwzoQOnbn0Zd3t8B
sound: 2HUpNZLoYHe0Sa9dglqQOg
432hz:
name: 432Hz
description:
@ -34,8 +48,16 @@
parent: meditation
wikipedia_url: https://en.wikipedia.org/wiki/Scientific_pitch
wikidata_id: 17087764
popularity: 3209
playlist_id: 5qQLE1iuD3CKOEXIb0fi7Z
rank: 3209
playlists:
"2020": 0AqosdJ3M7pMv52okCF0Rh
"2021": 3B60gl1JExbz2Uu7aIxwPJ
"2022": 6JvAila6APnRtJnCAyS6CO
"2023": 4DcFGzPanZDbICFl5bV2ps
edge: 4JPWXlNL2douhtdT9KSdtL
intro: 5f4DZVPGQBMiCVNuIuaBmu
pulse: 03JB7KqVuC3sFTIrSCI21V
sound: 5qQLE1iuD3CKOEXIb0fi7Z
48g:
name: 48G
description:
@ -47,8 +69,16 @@
parent: j-pop girl group
wikipedia_url: https://en.wikipedia.org/wiki/AKB48_Group
wikidata_id: 42742220
popularity: 3128
playlist_id: 4GhzIuuhKmoxP4WMDukGhR
rank: 3128
playlists:
"2020": 0LukbPqHCglGwvAkMp5CmA
"2021": 5eHaQCbu6wHNVrQE9h9XEw
"2022": 6IWUwj1fUTp8d2kXIhC9cC
"2023": 4IYTur8JekCowXPoSpfxOo
edge: 1UR3oO9MjQqfehLXnPNn1j
intro: 0hBM02jeH0mVo9pTTNr8zl
pulse: 2QgbGoFxHmIxBktq59GzP2
sound: 4GhzIuuhKmoxP4WMDukGhR
528hz:
name: 528Hz
description:
@ -57,8 +87,12 @@
promote feelings of love, peace, and harmony. This genre of music is often used in
meditation, yoga, and other spiritual practices.
parent: meditation
popularity: 2778
playlist_id: 3qHTGXTTyexCin7nO1Wbv1
rank: 2778
playlists:
"2023": 1NgpILwgAgDBfAMktnaRM3
intro: 3DocbbFaCFUjba3GL6hKPm
pulse: 55RKxcLS4yqFwTIfgXPcBA
sound: 3qHTGXTTyexCin7nO1Wbv1
5th wave emo:
name: 5th Wave Emo
description:
@ -69,12 +103,22 @@
lyrics. Bands like The Hotelier, Modern Baseball, and Sorority Noise are considered
pioneers of the genre.
parent: emo
popularity: 1914
playlist_id: 5jJRdxN4pD29Uhj0ZIRFPf
rank: 1914
playlists:
"2021": 0KJUxaUMw2UPNq5spdhrOs
"2022": 40kVQJTPp0LFnacQYSEI3H
"2023": 5yMdRzeiDRm2txwRFE4BFJ
edge: 4ylDR9xvKqps8q2JmE2uAr
intro: 5ZsM9HKe1QLdqvmPxRu5Ol
pulse: 3kZS5scnM4wZJRQelCiGNO
sound: 5jJRdxN4pD29Uhj0ZIRFPf
8-bit:
name: 8-Bit
popularity: 4225
playlist_id: 0ORjwYMeNv9v441v6aHPa1
rank: 4225
playlists:
intro: 0uGCjwYca99ZTenVlJIGhl
pulse: 0d3bkro50wPqNTkybpysz8
sound: 0ORjwYMeNv9v441v6aHPa1
alias: chiptune
8d:
name: 8D
@ -83,5 +127,12 @@
experience for the listener. It uses binaural recording techniques to create the
illusion of sound coming from different directions and distances, giving the
parent: meditation
popularity: 1922
playlist_id: 2vLez030U00PBsuE2ug926
rank: 1922
playlists:
"2020": 0dpxcFSfWTAvPppDWqOEKR
"2021": 7yGrSTjXbmqhEiaJBOEeXV
"2022": 4tyL0n6UZwag6d8BNb1dzu
"2023": 701PL0EJO5snKtSWhflfbc
intro: 16ye0dzYr7sQJp7Iiqe6Og
pulse: 29g0yeNuHIFagRnWhZ0D2L
sound: 2vLez030U00PBsuE2ug926

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -10,8 +10,13 @@ qanun:
region: ME
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Qanun_(instrument)
popularity: 5288
playlist_id: 2F5lFpyiAqk9JmhCnA5DHr
rank: 5288
playlists:
"2022": 68xdEmw2n8qdBwYnljGy4o
"2023": 387E6HvYjYjGg4cLkSuHx1
intro: 4hPPdbxJxPufdJEpkPO4lH
pulse: 2wkPdJW6atmvsLJGDkh8Kx
sound: 2F5lFpyiAqk9JmhCnA5DHr
qawwali:
name: Qawwali
description:
@ -23,8 +28,16 @@ qawwali:
region: DS
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Qawwali
popularity: 1271
playlist_id: 6DEKx1zncvF5WovQK13IIk
rank: 1271
playlists:
"2020": 0ZDJm0Meen25AMeHXlsmXV
"2021": 5II5dwobTza9tULQmDxZoJ
"2022": 5gCsdUZADbiopbtDcs2uxk
"2023": 2hCSA7T50O4usB1fCCprCq
edge: 0zMONOrY99EodipvUSq6kA
intro: 38WcQvLjSaJ0VcfQDgxR7q
pulse: 3nJSGOaSfFExlCwhRRWcQd
sound: 6DEKx1zncvF5WovQK13IIk
quartetto d'archi:
name: Quartetto d'archi
description:
@ -38,8 +51,9 @@ quartetto d'archi:
language: ita
country: IT
localized_name: true
popularity: 6277
playlist_id: 1kps7K1T21QuwQUHaotbmj
rank: 6277
playlists:
sound: 1kps7K1T21QuwQUHaotbmj
quatuor a cordes:
name: Quatuor à cordes
description:
@ -50,8 +64,11 @@ quatuor a cordes:
parent: string quartet
language: fra
localized_name: true
popularity: 6257
playlist_id: 2LxiSYEJRCTiv0TE0K3ljN
rank: 6257
playlists:
"2022": 2nlWOJcP7DWdOvOJyqatsW
"2023": 3ANWOLevdvupZlIyRfzHK5
sound: 2LxiSYEJRCTiv0TE0K3ljN
quebec death metal:
name: Québec Death Metal
description:
@ -62,8 +79,15 @@ quebec death metal:
parent: canadian death metal
language: fra
localized_name: true
popularity: 3762
playlist_id: 3ozgCnrW1PNZxpkVkazhtT
rank: 3762
playlists:
"2020": 4w8SWyhZ31Nfhy9ndELRRY
"2021": 1SN6lnPKhqLsryJhus6z0D
"2022": 08B92glfzvVSt5MfZPpTgi
"2023": 4UOn7RFYiNDfsSLTo9krQX
intro: 1JlrADIcVfm8pRceGrDIG0
pulse: 1f3PVdDADO6CK6ta8Ifj1U
sound: 3ozgCnrW1PNZxpkVkazhtT
quebec hardcore:
name: Québec Hardcore
description:
@ -74,8 +98,13 @@ quebec hardcore:
parent: canadian hardcore
language: fra
localized_name: true
popularity: 5303
playlist_id: 5QfnA78JvJkwlV0IHJSYrA
rank: 5303
playlists:
"2023": 4CvAZw19vgcKHYWE9jATsH
edge: 0IzeF4ujxyeyucI29RY3SA
intro: 2wj1Lvm7LkK3XCkRy72kHk
pulse: 7LPX29QMyibTotpAmfvUtj
sound: 5QfnA78JvJkwlV0IHJSYrA
quebec indie:
name: Québec Indie
description:
@ -87,8 +116,17 @@ quebec indie:
parent: canadian indie
language: fra
localized_name: true
popularity: 1464
playlist_id: 4uRfUMUWYXOtFiSD4pFfbn
rank: 1464
playlists:
"2019": 2FguZNfTdLECN6pCZehZTy
"2020": 6WsmFe1oDR0rUjDA7S15lL
"2021": 78A7pZZ7Dc3pcIF8xjYbb2
"2022": 1oPrxSWZmN3OSzAIMDDVVn
"2023": 5ovosGU5UaLlpGVwBiV9Pi
edge: 4I7eRwKpSGGU4q6kI5rJup
intro: 6kEpbXb3r2nNDPYpbRHpPC
pulse: 5bJ1r3BzsvlAGOUAJ0q0ho
sound: 4uRfUMUWYXOtFiSD4pFfbn
quebec metal:
name: Québec Metal
description:
@ -99,8 +137,13 @@ quebec metal:
parent: canadian metal
language: fra
localized_name: true
popularity: 5697
playlist_id: 2t7PKO3CCmlch3IaqxUiKz
rank: 5697
playlists:
"2023": 2efIzroABFpxRfxP2BlyYF
edge: 0NpI7tSPo3jbpVEYQxA1WM
intro: 18dYExuUvGmeTP76lD7FRy
pulse: 6rGo3BObNlgMAMHXW1NnY4
sound: 2t7PKO3CCmlch3IaqxUiKz
quebec punk:
name: Québec Punk
description:
@ -112,8 +155,16 @@ quebec punk:
parent: canadian punk
language: fra
localized_name: true
popularity: 3613
playlist_id: 5vd5RRHykVvzcnZDXnRt2H
rank: 3613
playlists:
"2020": 2W6KJ5wkaAhoNu2aI1BdUc
"2021": 3T2N1KoMPnhMzN4jf3gENw
"2022": 6gDhU92V25ckHMUp8iazAl
"2023": 1XrAXOT5bldwjOyEmSHggC
edge: 1gZHyn1F5ISyjKen0FXq7O
intro: 2xBmMaPYjwzxhEBrIXf7sx
pulse: 34EEKsS3GsglwCxkYBTMR9
sound: 5vd5RRHykVvzcnZDXnRt2H
queens hip hop:
name: Queens Hip Hop
description:
@ -124,8 +175,17 @@ queens hip hop:
today.
parent: hip hop
country: US
popularity: 212
playlist_id: 0AxeQveEqk8X42sovBCls8
rank: 212
playlists:
"2019": 0Q8edy5uKGQp7LPN6ojo6V
"2020": 7a6XHTbjXOSPkwbwG6n6P3
"2021": 2uXQlvgIzLHZMI2eCbJb3e
"2022": 6jPXH68YGMLeUtGpzTLSfT
"2023": 2zrFr5IM5IE3EGyDWsHlHo
edge: 7qMDUuIEJACoFd1TMGIXjf
intro: 78WED6iWCoildza89ZSEOT
pulse: 6fyjVFmRVdAWJZ9AgoN5e3
sound: 0AxeQveEqk8X42sovBCls8
queer country:
name: Queer Country
description:
@ -134,8 +194,16 @@ queer country:
gender roles in the genre. This genre has gained popularity in recent years as more
queer artists have emerged in the country music scene.
parent: country
popularity: 2771
playlist_id: 5lAp13nSaA7eHafwqV5ilp
rank: 2771
playlists:
"2020": 54h9847CRl8q7wIsrICIZV
"2021": 3EgcL43P4KUrkGB0CwniXT
"2022": 35ONLV5ctIkyKMqHhIwwQE
"2023": 6ycklRfayyDECyAPymNY54
edge: 0wC0jygftE6hjdcASMaoJT
intro: 1zpT4LLOpEEIr16bRKcdwU
pulse: 7egFXiz7QCP1MaVd5YXYxF
sound: 5lAp13nSaA7eHafwqV5ilp
queercore:
name: Queercore
description:
@ -147,8 +215,16 @@ queercore:
include Pansy Division, Team Dresch, and The Butchies.
parent: punk
wikipedia_url: https://en.wikipedia.org/wiki/Queercore
popularity: 2625
playlist_id: 7msivIljALwqTDOrrdJk9K
rank: 2625
playlists:
"2020": 07AF4ny6jhZBRFvGizW48F
"2021": 5O2MnqaDsZId2yZKrtaK1C
"2022": 2pc6ORKiI7AfFbmnKn2vIR
"2023": 6K9CNhPoNIjtyXgLQeEw7X
edge: 223XD0hgKVDumSG4UT74wM
intro: 6WGF9AkrKIgEgRXIdWW8tq
pulse: 6A2ENrWv6lVVQ5YspbppXs
sound: 7msivIljALwqTDOrrdJk9K
quiet storm:
name: Quiet Storm
description:
@ -158,8 +234,18 @@ quiet storm:
music to help listeners relax and unwind.
parent: r&b
wikipedia_url: https://en.wikipedia.org/wiki/Quiet_storm
popularity: 220
playlist_id: 66k6nBXFo6of5ckPWCuCSi
rank: 220
playlists:
"2018": 4AevCxg42j7bZE3hwbsEZU
"2019": 2fr3a7e33WmrXEcdroyTWo
"2020": 1mQw7taFxQl5H4zv6Rwgcs
"2021": 2zf4AOdSN92IoJadjQW9uc
"2022": 1jOWn7Nm6FoiCfpQ6L7ip7
"2023": 6rKYbaTMR6dzbMjR4S1uKc
edge: 7jUlnzUBP5jzSpu6YFDWwU
intro: 2OGzevPKBSbHVMlO0XZqaX
pulse: 1aFspLgNzl6hP62RCtVafi
sound: 66k6nBXFo6of5ckPWCuCSi
quran:
name: Quran
description:
@ -170,5 +256,13 @@ quran:
emotional experience for listeners.
parent: islamic recitation
localized_name: true
popularity: 1509
playlist_id: 2fGISxSz9tC1fkRX2qZdDW
rank: 1509
playlists:
"2020": 7Jru7itsnVdPU0VLb8ejjp
"2021": 4hEemc87qRur2ZucMKAjH2
"2022": 1kIiIL6k5wvWNCOYgGybxI
"2023": 0VYE7BwHM1ixFWVwNIOEJJ
edge: 0q0N5NqtpVF8aWsyHdckQN
intro: 42DWet00h5oV0O0xZtpFbV
pulse: 5YILSNwgCQXpZq7v0okuiP
sound: 2fGISxSz9tC1fkRX2qZdDW

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -9,8 +9,13 @@ xenharmonic:
it.
parent: experimental
wikipedia_url: https://en.wikipedia.org/wiki/Xenharmonic_music
popularity: 5492
playlist_id: 31vMSXGJYkMnYVfP4MVUMB
rank: 5492
playlists:
"2022": 7tRARyR2ZLAeihpONatBoN
"2023": 2ldiXZjjllFXQeKjrHMdyG
intro: 5wCvsZiNjsOWEQkZG8wsNq
pulse: 60AQpTHEvzYVUgcY7hFbUl
sound: 31vMSXGJYkMnYVfP4MVUMB
xhosa:
name: Xhosa
description:
@ -21,8 +26,15 @@ xhosa:
parent: folk
language: xho
country: SA
popularity: 4115
playlist_id: 1SPR7yk4kwmz09NovuUzKN
rank: 4115
playlists:
"2020": 6NVL0NXx4cXdt900sh1Wwj
"2021": 37r8CZM1HtGiijJwmfmQbR
"2022": 0SxhZYAzpgCQoldqdobLQb
"2023": 2QH1f5W59QI76MFABvrjKL
intro: 09cnl6NIPxut0M9HFootj3
pulse: 0eRxUT4PEy4XbGZ2OINWfx
sound: 1SPR7yk4kwmz09NovuUzKN
xhosa hip hop:
name: Xhosa Hip Hop
description:
@ -34,8 +46,14 @@ xhosa hip hop:
parent: hip hop
language: xho
country: SA
popularity: 4833
playlist_id: 03gnvuMqmf0w2E5qv4bHsy
rank: 4833
playlists:
"2022": 7D6AsEkwQbn31Tb9Y0bEQZ
"2023": 1zqKja0PnwEeyT1QjdXTOX
edge: 5tLwS19hN5EFzIPcsToPcI
intro: 4yVSCJtn4RJJjjE2dcWNDA
pulse: 1YSzamhHpNsXrOxZb3X64w
sound: 03gnvuMqmf0w2E5qv4bHsy
xinyao:
name: Xinyao
description:
@ -47,8 +65,14 @@ xinyao:
parent: folk-pop
language: zho
country: SG
popularity: 4575
playlist_id: 3OdedP3CjT68YpId2B1BFk
rank: 4575
playlists:
"2021": 5p1iS2JVwZJAjB5gReHuzD
"2022": 16YAihQQxgwCNHqJYHjx7v
"2023": 4zNtkXC6mgLSP2d6Qbqlrs
intro: 6z4B3se4fJq99PeDIpkqbu
pulse: 0CcD4wWiXWOdY4l9QdRDf0
sound: 3OdedP3CjT68YpId2B1BFk
xitsonga pop:
name: Xitsonga Pop
description:
@ -59,8 +83,15 @@ xitsonga pop:
parent: pop
language: tso
country: SA
popularity: 3844
playlist_id: 23MUSPH44uYB10onXR9mRe
rank: 3844
playlists:
"2021": 2agrFCVcNupsWWZqTlWI8h
"2022": 5mQf0OWNjaj3OYCP3m2LEb
"2023": 5IpbN9zmjnNZCHIAMh091g
edge: 77XVX9oGQINOocRelyY6lF
intro: 2oYo8r7glZ2vAPxmI9iCsR
pulse: 3uaWclhjwq3SnkdLmcGx4I
sound: 23MUSPH44uYB10onXR9mRe
xtra raw:
name: Xtra Raw
description:
@ -69,5 +100,13 @@ xtra raw:
use of bass and percussion. The music is often played at high speeds and can be
quite intense, making it popular among fans of hardcore and gabber music.
parent: hardcore techno
popularity: 1828
playlist_id: 7oe7qiYLUxsfhZXlT6AIiS
rank: 1828
playlists:
"2020": 74eYgpbsLjnlLUUjqIAEm2
"2021": 4gbYwBQMnW8J2B48hPnK3n
"2022": 1XMRwF812En9UAiRUXzww8
"2023": 4NIRWVtaM5wXzU4teD6jlu
edge: 4U1Ipy0nizjpKMQm8xOHVY
intro: 5idjHsS2J3gzXPDS2WgTFJ
pulse: 3QcW4u0QrCwKQAn2dj6jIT
sound: 7oe7qiYLUxsfhZXlT6AIiS

View file

@ -8,8 +8,17 @@ yacht rock:
who grew up during this era.
parent: soft rock
wikipedia_url: https://en.wikipedia.org/wiki/Yacht_rock
popularity: 156
playlist_id: 1imbMwZYgwB2NCAVPkq5sZ
rank: 156
playlists:
"2019": 0efuIF55Ao2ZdlEgPr0FRa
"2020": 4F1Ag8T12ouQ9eeiAR5y8v
"2021": 6LqsY3t1cj3nCGh1bgkuht
"2022": 2MTvk8S6wcRcoFv6CGX1DW
"2023": 6qFEC1WBQRPxS9r2m2Q7f4
edge: 0ksniO425Yn64qiNI1iXPS
intro: 5ldcVmWjkKoyLy6nRsABr3
pulse: 5zgLnWhHxDqGFf267udixC
sound: 1imbMwZYgwB2NCAVPkq5sZ
yakut pop:
name: Yakut Pop
description:
@ -20,8 +29,14 @@ yakut pop:
language: sah
country: RU
localized_name: true
popularity: 5270
playlist_id: 3H2aC6nJR4L39KCCI0Pcg8
rank: 5270
playlists:
"2021": 7bMDIhX1izesJkgCOwBmC6
"2022": 1krcxmhPQgTUge79FUU3PY
"2023": 0kaVz5eAf2HNkiMLh3iCfr
intro: 1Zxfy3fthRe0VzETGODPNT
pulse: 5TxAWVyWEOzjEXwzZtbulY
sound: 3H2aC6nJR4L39KCCI0Pcg8
yaoi:
name: Yaoi
description:
@ -30,8 +45,15 @@ yaoi:
emotional connection between two male characters. Yaoi music is popular among fans
of the genre and is often performed by male vocalists with high-pitched voices.
parent: anime
popularity: 2946
playlist_id: 1eWtvA0Byu9Wu7LENK35Dp
rank: 2946
playlists:
"2021": 3Vq3hn458ZXhXwOwiOw1eH
"2022": 6CIGAFoAUMuuDetfSHA8Ru
"2023": 3Sp6axFKvNCoFm0BgA1LNn
edge: 3GYVFufk4G4my872lAlH9a
intro: 4b6r1gI7ITYe5BWzIZVIUm
pulse: 2JlBKPG5mWiwtt1ZyF8WkP
sound: 1eWtvA0Byu9Wu7LENK35Dp
ye ye:
name: Ye Ye
description:
@ -42,8 +64,18 @@ ye ye:
Dutronc, and had a significant impact on French and European pop music.
parent: french rock-and-roll
wikipedia_url: https://en.wikipedia.org/wiki/Y%C3%A9-y%C3%A9
popularity: 1091
playlist_id: 0HjnliL7S56u2t2sFW8gG7
rank: 1091
playlists:
"2018": 2V1xg1glwzwjcspf00oN83
"2019": 3bTKme8Ajp48144eN4PMkZ
"2020": 4dlM2wC9xobcIU4cs6gxKB
"2021": 0HoTrw8HJPsHUpe8ODrV72
"2022": 1ti4vV7IkUtnJMazPQg2Qd
"2023": 5GEEmH9dLo9KJ950mW16N6
edge: 2jchAUDj0rYaWHVIpwGDx0
intro: 6BBjHLbX9A5BHI2LBVwHx3
pulse: 0Sjq8W3hK7h9Ooh9wtNPcS
sound: 0HjnliL7S56u2t2sFW8gG7
yemeni pop:
name: Yemeni Pop
description:
@ -55,8 +87,16 @@ yemeni pop:
language: ara
country: YE
localized_name: true
popularity: 4561
playlist_id: 5YFUtJgAy2Xfly9whFZrz2
rank: 4561
playlists:
"2020": 0WEwWphiLMQZWYQSU0ZTEo
"2021": 5JzFPMPqLYlKw87Sty0lHV
"2022": 6dAud5OfUVWcCnVpXR934V
"2023": 0ps8aiyDzRVQWyKLJDsFeS
edge: 1x6aj99GxYzjFBsDSfFHfI
intro: 4ztKSleHkDZHPswqTmTa48
pulse: 5kydFGIAX9ym3UoTki3Glm
sound: 5YFUtJgAy2Xfly9whFZrz2
yemeni traditional:
name: Yemeni Traditional
description:
@ -70,8 +110,9 @@ yemeni traditional:
country: YE
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Music_of_Yemen
popularity: 6262
playlist_id: 1DWET41vcTWLJFAnYJHUp0
rank: 6262
playlists:
sound: 1DWET41vcTWLJFAnYJHUp0
yiddish folk:
name: Yiddish Folk
description:
@ -82,8 +123,11 @@ yiddish folk:
parent: folk
language: yid
localized_name: true
popularity: 6085
playlist_id: 5vKOWKIkiwTjrRpRrM96qw
rank: 6085
playlists:
intro: 30X3mIra3t9D66TIrz4Cpt
pulse: 6BXsh0EdOGzPUchnAk6MzH
sound: 5vKOWKIkiwTjrRpRrM96qw
yodeling:
name: Yodeling
description:
@ -95,8 +139,15 @@ yodeling:
parent: vocal
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Yodeling
popularity: 2563
playlist_id: 2SMDVBkKqnZL9AoUWaZ2qs
rank: 2563
playlists:
"2020": 3rBQ13NN8DeLKbGwp99HsC
"2021": 3eIR1nLuFSnDXJwX7x4rKe
"2022": 2yjK86RaxVrsOVRhJ4Xk20
"2023": 4OWAGffPUg98Ft87iJDhkw
intro: 1Fja6pWav4eg3LPQBd7s9i
pulse: 1Jbqb1kKq9WXSzlAtmcijt
sound: 2SMDVBkKqnZL9AoUWaZ2qs
yoga:
name: Yoga
description:
@ -106,8 +157,17 @@ yoga:
connect with their breath and body. It is often used in yoga classes, meditation
practices, and other wellness activities.
parent: meditation
popularity: 4268
playlist_id: 5cZJI7DrZ3NIWWcbPIZeWt
rank: 4268
playlists:
"2019": 1Xdl0mLKCifBLiTByLIdzH
"2020": 3ZSKcOUAcgZOoAlBGwFMPI
"2021": 2DX8wGFe1gfQsJ2ZOX50q6
"2022": 7jdGJBAkeCHAb90zwCgh26
"2023": 0ssFWJ8Bp3uCrxmMll11rA
edge: 2OtZ82HLJ7gJxeLlSD7ksE
intro: 5AkypVsBycocK6YxbKBw0q
pulse: 4jPPbSI3FzdcNTVYRvhnqV
sound: 5cZJI7DrZ3NIWWcbPIZeWt
yogyakarta indie:
name: Yogyakarta Indie
description:
@ -117,8 +177,15 @@ yogyakarta indie:
Yogyakarta indie artists often explore themes of social and cultural issues, making
it a unique and thought-provoking listening experience.
parent: indonesian indie rock
popularity: 2132
playlist_id: 4rIqIjgskuOmJnaX2Z8Fzx
rank: 2132
playlists:
"2021": 1P4fokXxzJfhQJCcAaiuy7
"2022": 0NjGZQkv2khLISYTQ1FewS
"2023": 1B1yDtja9NLNS6nXJV7hDo
edge: 2ZG0ajyzhlsQQN8ZZ2q8x9
intro: 4WqMImNGvoTn74kclXp3lg
pulse: 4plq6vvDZALe3GR2tGGNrB
sound: 4rIqIjgskuOmJnaX2Z8Fzx
yoik:
name: Yoik
description:
@ -130,8 +197,18 @@ yoik:
parent: folk
region: ND
wikipedia_url: https://en.wikipedia.org/wiki/Joik
popularity: 5268
playlist_id: 53pmQn6lXF6m5WViERilQF
rank: 5268
playlists:
"2018": 1OISQsSZIOkrA7mwMbSpL4
"2019": 72qasWzfdXtxpU8ofNh2RP
"2020": 2PDnq0D3ZMmScsnWr3QS77
"2021": 5rlucO1gj2aAVKD0wev48t
"2022": 7wscgaVPCfYvSnN44RKqcw
"2023": 4CVKEndDl1RYnycW9WeiBj
edge: 4lfbSHAzy8Mf4ntfCDTmG4
intro: 1eAEv4wZONXg1wSS3pzHRd
pulse: 3BUJ3Cki67B0Ie3npVpiMV
sound: 53pmQn6lXF6m5WViERilQF
york indie:
name: York Indie
description:
@ -142,8 +219,12 @@ york indie:
alternative rock into their music. York indie is a vibrant and exciting genre that
continues to evolve and push boundaries.
parent: english indie rock
popularity: 3625
playlist_id: 02NPFyGAScohVgMt3JN00H
rank: 3625
playlists:
"2020": 1j4WYbLpVvuygopfS4WRjl
"2021": 4JsW3XZdZ20FkEWNIhm02v
"2022": 5xk2QwXOPpj9jT0BRsyiYS
sound: 02NPFyGAScohVgMt3JN00H
yorkshire folk:
name: Yorkshire Folk
description:
@ -153,8 +234,14 @@ yorkshire folk:
local history and folklore, and the music has a strong sense of community and
identity.
parent: traditional english folk
popularity: 5030
playlist_id: 2mVv3SQVPJ38r4zEHm68Jy
rank: 5030
playlists:
"2021": 3mPv7sebt9B9YRGBvKTRhA
"2022": 3cdB89QJFeJCh4fH9zZTpA
"2023": 00y9GIDRW83fRtr1mi8GYo
intro: 1GOb8AWMBLXqXui1xgo8Je
pulse: 3USKfe9w0mgoof0ez7F74r
sound: 2mVv3SQVPJ38r4zEHm68Jy
yoruba worship:
name: Yoruba Worship
description:
@ -167,8 +254,15 @@ yoruba worship:
language: yor
region: WF
localized_name: true
popularity: 4278
playlist_id: 4QTwi9BhTVG9Nbjo65HwZh
rank: 4278
playlists:
"2021": 45WU82RpOszs3HL3hxrjkc
"2022": 6NkVDDuuyFd5i4FYEi8QB6
"2023": 0PCwv4PlIZBuw7jIZEsJDd
edge: 4IxaYJRlNbHAQODNL0Amxz
intro: 1TN27Ng0BjrFpPn3lddyS4
pulse: 2CcqXzI6A3vqrmXLtJKPvE
sound: 4QTwi9BhTVG9Nbjo65HwZh
youth orchestra:
name: Youth Orchestra
description:
@ -181,8 +275,9 @@ youth orchestra:
parent: orchestra
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Youth_orchestra
popularity: 6280
playlist_id: 4SNnzqfxrI1Uh1HpOctFTT
rank: 6280
playlists:
sound: 4SNnzqfxrI1Uh1HpOctFTT
yu-mex:
name: Yu-Mex
description:
@ -193,8 +288,15 @@ yu-mex:
parent: world
region: EE
wikipedia_url: https://en.wikipedia.org/wiki/Yu-Mex
popularity: 5071
playlist_id: 1Frk27X8mA30Oc4wxwHDT8
rank: 5071
playlists:
"2021": 1yuajYGruI16S21IntbFGr
"2022": 7zvoKSEcFJ6gYkwPUrlliH
"2023": 6MRTPEiewUzM028RuFLzVy
edge: 6Q7mvDfiXdnu1HDOrqe40w
intro: 2OlnkQAj8Z4HpFP9XDlefj
pulse: 1aihsJ0vRzCjv3Zsyy93W0
sound: 1Frk27X8mA30Oc4wxwHDT8
yugoslav new wave:
name: Yugoslav New Wave
description:
@ -207,8 +309,16 @@ yugoslav new wave:
region: EE
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/New_wave_music_in_Yugoslavia
popularity: 3779
playlist_id: 5jaGOpLsE7tSbE060h8U6C
rank: 3779
playlists:
"2020": 4ve4Sr2ny8GzHvygGJh4Yh
"2021": 6zbT6y6I8IfhR3I0W6xHA4
"2022": 45d8i80uoJNWYTssHAmPUC
"2023": 1Wcon4NYuxNfpjzxHfyQD8
edge: 7pyb8K0sdn25WKaGyPE6TZ
intro: 1vrPlYzda0XzG1sLb5fmm3
pulse: 2waa2QtXWkQZhJ4Erp11Bu
sound: 5jaGOpLsE7tSbE060h8U6C
yugoslav rock:
name: Yugoslav Rock
description:
@ -221,8 +331,18 @@ yugoslav rock:
parent: rock
region: EE
localized_name: true
popularity: 1577
playlist_id: 7KuZSebZlQto9drDc7l5tE
rank: 1577
playlists:
"2018": 675BY81TbwNuBJmzvpgasg
"2019": 1MZ6t7G7eXh9H6Un8Atcce
"2020": 0ALQksDJxjR3ygje3qeEHj
"2021": 743Ip6JePWjBAWjed4z7k2
"2022": 1iVHqVOeOFNSSGWG44UdHR
"2023": 0h054lbY8skxKoE0Sbxmiu
edge: 7xrGpxzSEzIiOkIiITOQKL
intro: 5pNs35CSG9fy3QxU59UThq
pulse: 3NRqXFKe4rY1fEEbX01kKt
sound: 7KuZSebZlQto9drDc7l5tE
yunnan traditional:
name: Yunnan Traditional
description:
@ -232,8 +352,9 @@ yunnan traditional:
intricate rhythms, and haunting melodies. It is often performed during festivals and
celebrations.
parent: chinese folk
popularity: 6279
playlist_id: 19q2gA3eWnQO5eTOD6aTYv
rank: 6279
playlists:
sound: 19q2gA3eWnQO5eTOD6aTYv
yuri:
name: Yuri
description:
@ -245,5 +366,11 @@ yuri:
remains a defining feature.
parent: anime
wikipedia_url: https://en.wikipedia.org/wiki/Yuri_(genre)
popularity: 5504
playlist_id: 0BYoEJVB9xZjjsKMNnujN7
rank: 5504
playlists:
"2021": 7ApX5Nw7sfu8tyLKYFKNvJ
"2022": 58VXvl5nQAdEUZtfSmAPDQ
"2023": 7zRAhWdlTR4bqtt4JEK9DY
intro: 0FSiq4Pxv91W6UB8mJsbA9
pulse: 6ZaiceZSPmbze1bctCSw7o
sound: 0BYoEJVB9xZjjsKMNnujN7

View file

@ -6,8 +6,15 @@ zamba:
the use of traditional instruments such as the guitar, bombo, and violin.
parent: folklore argentino
wikipedia_url: https://en.wikipedia.org/wiki/Zamba_(artform)
popularity: 2883
playlist_id: 4BLHWGRsNFy6C64njAPdJ2
rank: 2883
playlists:
"2021": 2Rvk3LDQ4Bm2jwMcfIOkGS
"2022": 20TSjVAlQhFilRQpRRnxWG
"2023": 6zDYNreYkYI2LsugEkbhAz
edge: 35w7paShlAZX6uZ28lmDnZ
intro: 47qoB5onjeSlbpOnCepwa4
pulse: 7ofLDrEqsoxDH6VY8LBvJ6
sound: 4BLHWGRsNFy6C64njAPdJ2
zambian gospel:
name: Zambian Gospel
description:
@ -19,8 +26,14 @@ zambian gospel:
country: ZM
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Music_of_Zambia#Christian_Music
popularity: 4737
playlist_id: 2KMOd9KmWLeUbbRySGHN5j
rank: 4737
playlists:
"2022": 3iOu7CmaWRRB2PKS5QUad6
"2023": 5zus1RC2ujSYR2XDiSeWgt
edge: 2ruCJy3NHDwxJgjzOPWAhY
intro: 3HLqajXuWDaej9Cp5IU6OJ
pulse: 6nP1xvV1NHMsXurvHEAJAV
sound: 2KMOd9KmWLeUbbRySGHN5j
zambian hip hop:
name: Zambian Hip Hop
description:
@ -31,8 +44,16 @@ zambian hip hop:
parent: hip hop
country: ZM
localized_name: true
popularity: 3540
playlist_id: 5ZDuKkHD8vQMIINeFsTTyu
rank: 3540
playlists:
"2020": 3UbX3fwKLn0G91ZnlNQk7m
"2021": 3XuSRcKS2EKbtojMakcb3F
"2022": 6Croqt7C4Kgz5dnhM49XON
"2023": 7qzsnzj0AVs3ogGXTsf56t
edge: 4hKJh9c7N1iNsefNLcdY7K
intro: 7z0I0DxyxXfIJ89LlLHBst
pulse: 4FnkK0e2PC1pG3E55q7OkZ
sound: 5ZDuKkHD8vQMIINeFsTTyu
zambian pop:
name: Zambian Pop
description:
@ -44,8 +65,17 @@ zambian pop:
country: ZM
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Music_of_Zambia#Popular_Music
popularity: 3620
playlist_id: 3AxsN9foojNcuPI9OXnVIB
rank: 3620
playlists:
"2019": 57YoQJKYuPTfPBrpVOE6Rr
"2020": 4LLlhzDIE9ckZN47IVmB3m
"2021": 5cNUrryxZTU51A6ZEhRtck
"2022": 5vf3yYGKOGnIL95xGBYZju
"2023": 4fIzut5yyxRDUxmv41EROZ
edge: 0wVnk3rDL9nS6IxZFJbFKx
intro: 2kgYmOI5UGocqb4shcALcV
pulse: 0exQFJ6ItSWw5EigRWRdzF
sound: 3AxsN9foojNcuPI9OXnVIB
zampogna:
name: Zampogna
description:
@ -58,8 +88,9 @@ zampogna:
parent: italian folk
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Zampogna
popularity: 6260
playlist_id: 6egS6vpB5c6raIlw1v0Nx2
rank: 6260
playlists:
sound: 6egS6vpB5c6raIlw1v0Nx2
zarzuela:
name: Zarzuela
description:
@ -73,8 +104,12 @@ zarzuela:
country: ES
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Zarzuela
popularity: 5535
playlist_id: 0pMsLV9uQUZtDGyPYVIeAt
rank: 5535
playlists:
"2023": 0VnwJ1lHtFODSxNS8i7383
intro: 487GPsF0rNw71bVB15TCAB
pulse: 6sMjpZKNFTVjngUXbbquxO
sound: 0pMsLV9uQUZtDGyPYVIeAt
zcc:
name: ZCC
description:
@ -87,8 +122,15 @@ zcc:
parent: south african gospel
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Zion_Christian_Church
popularity: 3593
playlist_id: 4rohSjUJ1bDLU1JLCi6n7y
rank: 3593
playlists:
"2021": 3X8rYAUlO77om0sxjzdlJc
"2022": 2yX45Ke8T96o89LVmgG4Dv
"2023": 4vkX5frnqZHYRD6FpHPYYP
edge: 0eBwbIifUAAu40WBjSRvxi
intro: 4WH8z60xovUbfdFMmmGAPD
pulse: 3UaUMUEzfShRFPOn5Dxk92
sound: 4rohSjUJ1bDLU1JLCi6n7y
zen:
name: Zen
description:
@ -96,8 +138,17 @@ zen:
Japanese music, ambient sounds, and natural sounds like waterfalls and birds. Zen
music is perfect for relaxation, yoga, and meditation.
parent: meditation
popularity: 2995
playlist_id: 7y2Av5WgZgD7jSuQZu6M7n
rank: 2995
playlists:
"2019": 2l0VoqIvjuZuVkLCeBoPEP
"2020": 0wUnoAJw3KRc7HHFkantle
"2021": 3x8QnQlcH5qJORKkF4xDNB
"2022": 50WbGfr58fBW6mxXFshMPv
"2023": 2nsvWEwvoYl2WZbjVZPWth
edge: 3vuv8UPBFdo3EggX2C0okq
intro: 11tUZm4YxxppZ7EAvrZo1n
pulse: 5dvRDWB92mMAq54KDPLsRS
sound: 7y2Av5WgZgD7jSuQZu6M7n
zenonesque:
name: Zenonesque
description:
@ -105,8 +156,15 @@ zenonesque:
calming and meditative qualities of Zen music. Zenonesque music is characterized by
its slow and hypnotic beats, intricate melodies, and atmospheric soundscapes.
parent: psychedelic trance
popularity: 4698
playlist_id: 1RbpXfjqUTf9iKExXjr2jp
rank: 4698
playlists:
"2021": 720pwhb3p5EeaY3o1WRnWS
"2022": 1qHUpBueHrlwwwqC7f9Fh2
"2023": 2k6BPE0D0ZUPg6cfkwTSV6
edge: 1KaH8nzzfXjj2yUVEZxhFH
intro: 2ajoGJJHd5zySHK8aXdCCn
pulse: 1b2042iJe3pIuYv5ueHIow
sound: 1RbpXfjqUTf9iKExXjr2jp
zespol dzieciecy:
name: Zespol Dziecięcy
description:
@ -119,8 +177,15 @@ zespol dzieciecy:
language: pol
country: PL
localized_name: true
popularity: 2634
playlist_id: 66IvXQyzUNEalJnbyvSb6d
rank: 2634
playlists:
"2020": 5cBNyYf78FFoWf2dIFlDpU
"2021": 1wYhvFsDVbJoIrMo4s3s98
"2023": 4iUjVjqCFboU8LCjcFdpAj
edge: 75JfKyqPVO2pUJvMzywKfh
intro: 5GAFL1KNAcy82IOpzPCTgV
pulse: 6k4bTEUvma1MqH1tR0AuWL
sound: 66IvXQyzUNEalJnbyvSb6d
zeuhl:
name: Zeuhl
description:
@ -132,8 +197,12 @@ zeuhl:
language: fra
country: FR
wikipedia_url: https://en.wikipedia.org/wiki/Zeuhl
popularity: 5627
playlist_id: 2PvNMMgIu3xbKLuMBU8RlE
rank: 5627
playlists:
"2023": 6XBWUpUMUH6VxFfHGigFXt
intro: 2NyVgNk2UuJlOPNTSaqRUb
pulse: 5sc0zJyYQn5ZS5U57uSnrF
sound: 2PvNMMgIu3xbKLuMBU8RlE
zhenskiy rep:
name: Zhenskiy Rep
description:
@ -144,8 +213,14 @@ zhenskiy rep:
music and uses a mix of Russian and English lyrics.
parent: russian hip hop
localized_name: true
popularity: 1453
playlist_id: 4lCP4GdpJDW6u6vgUu3aGd
rank: 1453
playlists:
"2022": 5xGOpH3IE89pQH3NHEL66z
"2023": 2D9xYURZIZmCiULfDKPHVF
edge: 6i8m8Edo5TbVFFusCOc0hQ
intro: 2xYJNvLLLtK7pvh68pwo46
pulse: 2gokIQZ5rA1w2aELLO0fxT
sound: 4lCP4GdpJDW6u6vgUu3aGd
zhongguo feng:
name: Zhongguo Feng
description:
@ -156,8 +231,16 @@ zhongguo feng:
genre has become increasingly popular in recent years and has produced many
successful artists in China.
parent: c-pop
popularity: 1048
playlist_id: 7f7A3WaMDLcAHyTwxT5hK8
rank: 1048
playlists:
"2020": 7ufqtvKQahEObK1hyoCywQ
"2021": 6KZvo6aNkvJM57QeV1dEdl
"2022": 6nky7fwmdkGLvus1Z1GG9H
"2023": 3rZ5vAiPOcnV6xgTXmMrs5
edge: 35CpSgxpTZYA8tT0cLr2iF
intro: 63c1MUz8cwOvwqcH7jLy4z
pulse: 4zwGynt6z1yQaPst1EbmD8
sound: 7f7A3WaMDLcAHyTwxT5hK8
zikir:
name: Zikir
description:
@ -167,8 +250,16 @@ zikir:
participants.
parent: islamic
wikipedia_url: https://en.wikipedia.org/wiki/Dhikr
popularity: 2648
playlist_id: 2QusAPixVAakbqYcK087KN
rank: 2648
playlists:
"2020": 6JMKDG7musLNXNUaweF0mB
"2021": 3tU92vD3DMFHfJ90hdPn2R
"2022": 7d2ou7lr9Wt1k39KAI8tEU
"2023": 4WJZaqnBx5sBoe9TrTBQjJ
edge: 66ut1Xwgj2keW72rzMOHhM
intro: 4hlv1e1lv0rIVaP0OPUYGr
pulse: 1IHi9ftWEV1oEKlq62oYvW
sound: 2QusAPixVAakbqYcK087KN
zilizopendwa:
name: Zilizopendwa
description:
@ -178,8 +269,14 @@ zilizopendwa:
melodies, relatable lyrics, and danceable beats that still resonate with audiences
today.
parent: afropop
popularity: 3270
playlist_id: 6ZjTAVi7EIot1EPgaxoyO5
rank: 3270
playlists:
"2022": 7a2R9u6R8NfvDlbmAcai2v
"2023": 4xpPnkC3Xku1JAucNTeYn9
edge: 57sUXlvp2wKvTIe1du6Mpq
intro: 7nnQpO1z3Z800P0Kt9u1LR
pulse: 67kgGxLGxHS0VsEd6VtgGK
sound: 6ZjTAVi7EIot1EPgaxoyO5
zillertal:
name: Zillertal
description:
@ -192,8 +289,18 @@ zillertal:
language: deu
country: AT
wikipedia_url: https://en.wikipedia.org/wiki/Zillertal#Culture
popularity: 3075
playlist_id: 1fzcR3U9cUpJm92J14ThFS
rank: 3075
playlists:
"2018": 3Zz6BY5tE5rdDTknAXnkp5
"2019": 5ItywednyP3E78pIOaa62C
"2020": 6ivJQtHAyX9kF1IFZTNtjY
"2021": 3C6jQHUmooxToZ7tKuxaag
"2022": 6cZTfkGzHV0JhNbSNzKvQ3
"2023": 3CcjO11Bc5lXM9h6Jam7AE
edge: 042ILS5629PdI1mZV9UChV
intro: 08FFaeJdASSvPBHQjmKEmd
pulse: 4Eu3wk3VL09qRr1izf7ZHI
sound: 1fzcR3U9cUpJm92J14ThFS
zim gospel:
name: Zim Gospel
description:
@ -206,8 +313,16 @@ zim gospel:
country: ZW
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Music_of_Zimbabwe#Gospel
popularity: 4538
playlist_id: 1EfJDym7urLaa1hpi6TFwr
rank: 4538
playlists:
"2020": 3hYQsZwU4BI5z8Sy8vdTki
"2021": 4bIhaI6Sm1zShiIkdtp9J5
"2022": 6k0RtBHM3Owu1CrXrBrZTY
"2023": 2aNwIz6RVLVhxqO6p9cqV8
edge: 1XVpDNtEFAfCB6GTHybvqk
intro: 56zpApJqmeWrfgShohTAey
pulse: 7fu5FIXkVy5rCtm2IUOuHN
sound: 1EfJDym7urLaa1hpi6TFwr
zim hip hop:
name: Zim Hip Hop
description:
@ -220,8 +335,16 @@ zim hip hop:
country: ZW
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Zimbabwean_hip_hop
popularity: 3834
playlist_id: 25zL0DjNC6mr6qB3F5iSWK
rank: 3834
playlists:
"2020": 24b8mg5vsBHQ2eGXZOcOUn
"2021": 6VHbP8KZjpa2GWRwbo1zsV
"2022": 1pdA6Dy27QccMkkgQ1yhbZ
"2023": 71UaS6t1PQmRe5YSNbdvVU
edge: 69hDKr8sCkhrXYDZG1ZWC3
intro: 02547sBomc5SVzoJFH2aa2
pulse: 6z82ryN1gkKz2x2VGBzSvq
sound: 25zL0DjNC6mr6qB3F5iSWK
zim urban groove:
name: Zim Urban Groove
description:
@ -233,8 +356,16 @@ zim urban groove:
country: ZW
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Music_of_Zimbabwe#Urban_Grooves
popularity: 3710
playlist_id: 54WupWz7dqaSAZvIv91ksb
rank: 3710
playlists:
"2020": 64922zKn4Jscvry7SJiQ06
"2021": 69uVwpL5GeOSvsCdE2Hmu2
"2022": 5u4HQQ316JsDq8PJQuxNcZ
"2023": 4Jps0bn9KewVijyCOQk3LS
edge: 2LF8S6bOaYsuIQQZWftFjX
intro: 1S7IzlN0LuZEAJwspC8eWA
pulse: 1mqSJ5mkbkvixlEqEuEqoh
sound: 54WupWz7dqaSAZvIv91ksb
zimdancehall:
name: Zimdancehall
description:
@ -245,8 +376,18 @@ zimdancehall:
parent: dancehall
country: ZW
wikipedia_url: https://en.wikipedia.org/wiki/Zimdancehall
popularity: 3162
playlist_id: 2K3BDsbnwwsJClbZqOQztK
rank: 3162
playlists:
"2018": 0rK39a5IGanOK9c8lJINoq
"2019": 6p3Hrbjiv4tFE8iY8LpXyr
"2020": 31yG4G1Upt1cuKkeO6lEn1
"2021": 6PwXgUYpnQ6RWdi9z5X6NO
"2022": 2vJqmoZfR26RneS32ImuZe
"2023": 4N5dmpdxW7Mucz5OYhykFN
edge: 4MhGYYmqYhLYzyxq9Sdnki
intro: 3TpEglsUsYM5IsM27aNEJJ
pulse: 5CagSlELd59f52LTLwMMz0
sound: 2K3BDsbnwwsJClbZqOQztK
zither:
name: Zither
description:
@ -258,8 +399,12 @@ zither:
parent: instrument
localized_name: true
wikipedia_url: https://en.wikipedia.org/wiki/Zither
popularity: 5754
playlist_id: 6bpwGHlRRLkVqfmOpqfmvx
rank: 5754
playlists:
"2022": 6xy9uDTfq44ivFRhQcrJH3
intro: 4V0ZPlaG9nxM3JiKGbkl6n
pulse: 2OU1OJADxPsF5iiBuJVx7n
sound: 6bpwGHlRRLkVqfmOpqfmvx
zohioliin duu:
name: Zohioliin Duu
description:
@ -269,14 +414,28 @@ zohioliin duu:
(two-stringed lute). The lyrics of zohioliin duu songs are typically focused on
themes of love, nature, and the beauty of the Mongolian landscape.
parent: mongolian folk
popularity: 5946
playlist_id: 7HNLEMjbJjqPCGK6AXxAqa
rank: 5946
playlists:
"2022": 1dpgPyHehxIWlIjdBcqy6m
"2023": 58Kuv7GpNKCN1E1gE9CHtF
intro: 1SGagj87XH8ExbnlJM0SYW
pulse: 6QvVhD2WBnuX2td2VAP3ZV
sound: 7HNLEMjbJjqPCGK6AXxAqa
zolo:
name: Zolo
description: ""
parent: experimental
popularity: 811
playlist_id: 1HDK9LHAXjMQEbEhh9Lbfa
rank: 811
playlists:
"2019": 3PDHEexZuRc6fq5XvGedRV
"2020": 686Whkq0YH2IRPecz75V5L
"2021": 4GIJE0z1QE4pchaTEnTlsx
"2022": 6JFnEO06HdsJa4t2veYwrx
"2023": 5c9C1OBA8xjWsixxrlKJQb
edge: 3UzMRlqF46hXh7XAapxmOD
intro: 5ePODnANEVIrPu0NNLu8sF
pulse: 17eVQDI3bYXdCxcX697iPB
sound: 1HDK9LHAXjMQEbEhh9Lbfa
zomi pop:
name: Zomi Pop
description:
@ -286,8 +445,13 @@ zomi pop:
throughout Southeast Asia.
parent: pop
country: MM
popularity: 6003
playlist_id: 6OIvf4qxX3DEeobwlpRBHq
rank: 6003
playlists:
"2023": 6EXSWHGXwLM2Y18USSYX39
edge: 5PMaKavtXKwpM1MsnAhfso
intro: 60raCdyp8P4kq5hkglgzj7
pulse: 6UIBQPVBz1gbDbJt0SfoE7
sound: 6OIvf4qxX3DEeobwlpRBHq
zouglou:
name: Zouglou
description:
@ -299,8 +463,18 @@ zouglou:
language: fra
country: CI
wikipedia_url: https://en.wikipedia.org/wiki/Zouglou
popularity: 2500
playlist_id: 7kGA6YnBYlU3HplyYp9buA
rank: 2500
playlists:
"2018": 5FsUOhIk6QVRg0CBtEXPq2
"2019": 70oLdRAIIn0pZkYmwPC6rQ
"2020": 6CNEU3ejJsduYZgTNSShIa
"2021": 5pfE821otW9ICjpx2ghEcu
"2022": 11aB5VVtLFBIrlm3MVnLoC
"2023": 4ELJec1VjGG2eWIn7CXorL
edge: 54MJVo9n1D7I5IeY5R0R95
intro: 68LPqL3IGQ4yauemWERGWK
pulse: 1CYBaeISwXShTdVDWcFGcy
sound: 7kGA6YnBYlU3HplyYp9buA
zouk:
name: Zouk
description:
@ -310,8 +484,18 @@ zouk:
elements of other genres like reggae and salsa.
parent: musique guadeloupe
wikipedia_url: https://en.wikipedia.org/wiki/Zouk
popularity: 1958
playlist_id: 7mNGeqFpLOFebS0QrGXU2N
rank: 1958
playlists:
"2018": 5DU4EXai3fpwYHihwh0y0P
"2019": 53RjCxMQo1hWWaKfNtHPD6
"2020": 2esOhj56bgf2dMA3l8Va8N
"2021": 0SnEWSuCsRCFlqrca3YCfg
"2022": 7jhFPhSLwMUV4ZXmu3TgD2
"2023": 0Sp7KYyTUrsYcIFnIVQmBr
edge: 5WaiDRbwkjd02KCZy0H2wR
intro: 0uvJdpoV7slyBgaOvXh5d4
pulse: 2vLRmflO4amJkZB4lRVMSv
sound: 7mNGeqFpLOFebS0QrGXU2N
zouk riddim:
name: Zouk Riddim
description:
@ -321,8 +505,18 @@ zouk riddim:
dancing.
parent: zouk
country: JM
popularity: 1980
playlist_id: 6vkcfCa0G2qHz5CogrViSl
rank: 1980
playlists:
"2018": 2SoAWd2BYOOkRp9g7wwVLM
"2019": 7MeYNDMYrUPm5Hy3ITczLu
"2020": 3yrC9d9pnijjZ0bLSG4W4q
"2021": 6CH7izBLCWI9n3KVywf1HV
"2022": 1dvnLAn964SgQu8bA8Cr5G
"2023": 4a2vTmwipDZDsmGMZe0Axh
edge: 30S8Kvds1Te0JkjPRRrJKR
intro: 1CNCH5VugAdNhPOMvVlJGm
pulse: 76gyWS1NrryGTvpwruvo1I
sound: 6vkcfCa0G2qHz5CogrViSl
zurich indie:
name: Zürich Indie
description:
@ -334,8 +528,9 @@ zurich indie:
recognition.
parent: swiss indie
localized_name: true
popularity: 4285
playlist_id: 0jNHdwA4dCJkYmPBHlt4r2
rank: 4285
playlists:
sound: 0jNHdwA4dCJkYmPBHlt4r2
zxc:
name: ZXC
description:
@ -344,8 +539,15 @@ zxc:
forceful drum beats. The genre is frequently linked to video game soundtracks and
has been featured in numerous popular video games.
parent: electropop
popularity: 2039
playlist_id: 3mOVijfpf6hU4gDCabCU5G
rank: 2039
playlists:
"2021": 3xOmLd3J8BSwVfYbSmDeyD
"2022": 5YAkW4WPyeOPU9fItmRfJp
"2023": 1OcUB3XMJufkkv9P9k0zMz
edge: 2iVdQGDx9mO3nYGTtGBQhg
intro: 1DXgXe8y7Nn5K83pD15Wjj
pulse: 4q3n9ocSYCUoOsz6fu5xZM
sound: 3mOVijfpf6hU4gDCabCU5G
zydeco:
name: Zydeco
description:
@ -359,5 +561,15 @@ zydeco:
language: lou
country: US
wikipedia_url: https://en.wikipedia.org/wiki/Zydeco
popularity: 4215
playlist_id: 1BsskTfK2Sfg5mJI1o4MGr
rank: 4215
playlists:
"2018": 7m6MCXApdlaQAXpe83k5rR
"2019": 0HDIO7iTO3TbyFkVxCa8L3
"2020": 7CphmAIzRkBS3TwZWZm5Pb
"2021": 6nnU5IihvSaCUkeNMvfxKM
"2022": 4ih0fWzVDugG5rpa1qN5dp
"2023": 3Ac1ZDn50hwrdH8kFWzm5r
edge: 2sF6CWRdg9nWSryFtGgn8B
intro: 7wd1Omc54DAQOZ4e0yminR
pulse: 4Bwa4ju96NQmXOQMw3gPVN
sound: 1BsskTfK2Sfg5mJI1o4MGr

View file

@ -79,15 +79,34 @@
"description": "Wikidata entity ID of the genre",
"type": "integer"
},
"popularity": {
"rank": {
"description": "Position in the popularity ranking (1: most popular)",
"type": "number",
"minimum": 1
},
"playlist_id": {
"description": "Spotify genre playlist ID",
"playlists": {
"description": "Spotify playlist IDs",
"propertyNames": {
"description": "Playlist kind",
"type": "string",
"enum": [
"sound",
"intro",
"pulse",
"edge",
"2018",
"2019",
"2020",
"2021",
"2022",
"2023"
]
},
"additionalProperties": {
"description": "Spotify playlist ID",
"type": "string",
"pattern": "^[A-z0-9]{22}$"
}
},
"alias": {
"description": "Genre ID this genre is an alias of",