diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 59369115c..ef79faeeb 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -898,9 +898,9 @@ "musicBrainzQueries": "enable MusicBrainz integration", "musicBrainzQueries_description": "the integration will query MusicBrainz for missing artist releases and other miscellaneous data", "musicbrainzExcludeReleaseTypes": "exclude MusicBrainz release types", - "musicbrainzExcludeReleaseTypes_description": "release types to exclude when loading MusicBrainz artist releases (e.g. album, single, ep)", + "musicbrainzExcludeReleaseTypes_description": "release types to exclude when loading MusicBrainz artist releases", "musicbrainzPrioritizeCountries": "prioritize MusicBrainz countries", - "musicbrainzPrioritizeCountries_description": "country codes to prioritize when ordering MusicBrainz releases, comma separated and non case-sensitive (e.g. us, gb, de)", + "musicbrainzPrioritizeCountries_description": "countries to prioritize when ordering MusicBrainz releases (first in list has highest priority)", "youtube": "enable youtube integration", "youtube_description": "external songs will attempt to use YouTube to resolve stream URLs for playback (desktop only)", "neteaseTranslation_description": "When enabled, fetches and displays translated lyrics from NetEase if available", diff --git a/src/renderer/features/musicbrainz/utils.ts b/src/renderer/features/musicbrainz/utils.ts index 64bdb4721..5aa601525 100644 --- a/src/renderer/features/musicbrainz/utils.ts +++ b/src/renderer/features/musicbrainz/utils.ts @@ -40,287 +40,6 @@ export function getMbzReleaseIdFromAlbumId(albumId: string): null | string { return albumId.slice(MUSICBRAINZ_ID_PREFIX.length); } -// const MBZ_COUNTRY_CODES = { -// AD: 'Andorra', -// AE: 'United Arab Emirates', -// AF: 'Afghanistan', -// AG: 'Antigua and Barbuda', -// AI: 'Anguilla', -// AL: 'Albania', -// AM: 'Armenia', -// AN: 'Netherlands Antilles', -// AO: 'Angola', -// AQ: 'Antarctica', -// AR: 'Argentina', -// AS: 'American Samoa', -// AT: 'Austria', -// AU: 'Australia', -// AW: 'Aruba', -// AX: 'Åland Islands', -// AZ: 'Azerbaijan', -// BA: 'Bosnia and Herzegovina', -// BB: 'Barbados', -// BD: 'Bangladesh', -// BE: 'Belgium', -// BF: 'Burkina Faso', -// BG: 'Bulgaria', -// BH: 'Bahrain', -// BI: 'Burundi', -// BJ: 'Benin', -// BL: 'Saint Barthélemy', -// BM: 'Bermuda', -// BN: 'Brunei', -// BO: 'Bolivia', -// BQ: 'Bonaire, Sint Eustatius and Saba', -// BR: 'Brazil', -// BS: 'Bahamas', -// BT: 'Bhutan', -// BV: 'Bouvet Island', -// BW: 'Botswana', -// BY: 'Belarus', -// BZ: 'Belize', -// CA: 'Canada', -// CC: 'Cocos (Keeling) Islands', -// CD: 'Democratic Republic of the Congo', -// CF: 'Central African Republic', -// CG: 'Congo', -// CH: 'Switzerland', -// CI: "Côte d'Ivoire", -// CK: 'Cook Islands', -// CL: 'Chile', -// CM: 'Cameroon', -// CN: 'China', -// CO: 'Colombia', -// CR: 'Costa Rica', -// CS: 'Serbia and Montenegro', -// CU: 'Cuba', -// CV: 'Cape Verde', -// CW: 'Curaçao', -// CX: 'Christmas Island', -// CY: 'Cyprus', -// CZ: 'Czechia', -// DE: 'Germany', -// DJ: 'Djibouti', -// DK: 'Denmark', -// DM: 'Dominica', -// DO: 'Dominican Republic', -// DZ: 'Algeria', -// EC: 'Ecuador', -// EE: 'Estonia', -// EG: 'Egypt', -// EH: 'Western Sahara', -// ER: 'Eritrea', -// ES: 'Spain', -// ET: 'Ethiopia', -// FI: 'Finland', -// FJ: 'Fiji', -// FK: 'Falkland Islands', -// FM: 'Federated States of Micronesia', -// FO: 'Faroe Islands', -// FR: 'France', -// GA: 'Gabon', -// GB: 'United Kingdom', -// GD: 'Grenada', -// GE: 'Georgia', -// GF: 'French Guiana', -// GG: 'Guernsey', -// GH: 'Ghana', -// GI: 'Gibraltar', -// GL: 'Greenland', -// GM: 'Gambia', -// GN: 'Guinea', -// GP: 'Guadeloupe', -// GQ: 'Equatorial Guinea', -// GR: 'Greece', -// GS: 'South Georgia and the South Sandwich Islands', -// GT: 'Guatemala', -// GU: 'Guam', -// GW: 'Guinea-Bissau', -// GY: 'Guyana', -// HK: 'Hong Kong', -// HM: 'Heard Island and McDonald Islands', -// HN: 'Honduras', -// HR: 'Croatia', -// HT: 'Haiti', -// HU: 'Hungary', -// ID: 'Indonesia', -// IE: 'Ireland', -// IL: 'Israel', -// IM: 'Isle of Man', -// IN: 'India', -// IO: 'British Indian Ocean Territory', -// IQ: 'Iraq', -// IR: 'Iran', -// IS: 'Iceland', -// IT: 'Italy', -// JE: 'Jersey', -// JM: 'Jamaica', -// JO: 'Jordan', -// JP: 'Japan', -// KE: 'Kenya', -// KG: 'Kyrgyzstan', -// KH: 'Cambodia', -// KI: 'Kiribati', -// KM: 'Comoros', -// KN: 'Saint Kitts and Nevis', -// KP: 'North Korea', -// KR: 'South Korea', -// KW: 'Kuwait', -// KY: 'Cayman Islands', -// KZ: 'Kazakhstan', -// LA: 'Laos', -// LB: 'Lebanon', -// LC: 'Saint Lucia', -// LI: 'Liechtenstein', -// LK: 'Sri Lanka', -// LR: 'Liberia', -// LS: 'Lesotho', -// LT: 'Lithuania', -// LU: 'Luxembourg', -// LV: 'Latvia', -// LY: 'Libya', -// MA: 'Morocco', -// MC: 'Monaco', -// MD: 'Moldova', -// ME: 'Montenegro', -// MF: 'Saint Martin (French part)', -// MG: 'Madagascar', -// MH: 'Marshall Islands', -// MK: 'North Macedonia', -// ML: 'Mali', -// MM: 'Myanmar', -// MN: 'Mongolia', -// MO: 'Macao', -// MP: 'Northern Mariana Islands', -// MQ: 'Martinique', -// MR: 'Mauritania', -// MS: 'Montserrat', -// MT: 'Malta', -// MU: 'Mauritius', -// MV: 'Maldives', -// MW: 'Malawi', -// MX: 'Mexico', -// MY: 'Malaysia', -// MZ: 'Mozambique', -// NA: 'Namibia', -// NC: 'New Caledonia', -// NE: 'Niger', -// NF: 'Norfolk Island', -// NG: 'Nigeria', -// NI: 'Nicaragua', -// NL: 'Netherlands', -// NO: 'Norway', -// NP: 'Nepal', -// NR: 'Nauru', -// NU: 'Niue', -// NZ: 'New Zealand', -// OM: 'Oman', -// PA: 'Panama', -// PE: 'Peru', -// PF: 'French Polynesia', -// PG: 'Papua New Guinea', -// PH: 'Philippines', -// PK: 'Pakistan', -// PL: 'Poland', -// PM: 'Saint Pierre and Miquelon', -// PN: 'Pitcairn', -// PR: 'Puerto Rico', -// PS: 'Palestine', -// PT: 'Portugal', -// PW: 'Palau', -// PY: 'Paraguay', -// QA: 'Qatar', -// RE: 'Réunion', -// RO: 'Romania', -// RS: 'Serbia', -// RU: 'Russia', -// RW: 'Rwanda', -// SA: 'Saudi Arabia', -// SB: 'Solomon Islands', -// SC: 'Seychelles', -// SD: 'Sudan', -// SE: 'Sweden', -// SG: 'Singapore', -// SH: 'Saint Helena, Ascension and Tristan da Cunha', -// SI: 'Slovenia', -// SJ: 'Svalbard and Jan Mayen', -// SK: 'Slovakia', -// SL: 'Sierra Leone', -// SM: 'San Marino', -// SN: 'Senegal', -// SO: 'Somalia', -// SR: 'Suriname', -// SS: 'South Sudan', -// ST: 'Sao Tome and Principe', -// SU: 'Soviet Union', -// SV: 'El Salvador', -// SX: 'Sint Maarten (Dutch part)', -// SY: 'Syria', -// SZ: 'Eswatini', -// TC: 'Turks and Caicos Islands', -// TD: 'Chad', -// TF: 'French Southern Territories', -// TG: 'Togo', -// TH: 'Thailand', -// TJ: 'Tajikistan', -// TK: 'Tokelau', -// TL: 'Timor-Leste', -// TM: 'Turkmenistan', -// TN: 'Tunisia', -// TO: 'Tonga', -// TR: 'Turkey', -// TT: 'Trinidad and Tobago', -// TV: 'Tuvalu', -// TW: 'Taiwan', -// TZ: 'Tanzania', -// UA: 'Ukraine', -// UG: 'Uganda', -// UM: 'United States Minor Outlying Islands', -// US: 'United States', -// UY: 'Uruguay', -// UZ: 'Uzbekistan', -// VA: 'Vatican City', -// VC: 'Saint Vincent and The Grenadines', -// VE: 'Venezuela', -// VG: 'British Virgin Islands', -// VI: 'U.S. Virgin Islands', -// VN: 'Vietnam', -// VU: 'Vanuatu', -// WF: 'Wallis and Futuna', -// WS: 'Samoa', -// XC: 'Czechoslovakia', -// XE: 'Europe', -// XG: 'East Germany', -// XK: 'Kosovo', -// XW: '[Worldwide]', -// YE: 'Yemen', -// YT: 'Mayotte', -// YU: 'Yugoslavia', -// ZA: 'South Africa', -// ZM: 'Zambia', -// ZW: 'Zimbabwe', -// }; - -// const MBZ_RELEASE_TYPES = { -// album: 'album', -// audiobook: 'audiobook', -// 'audio drama': 'audio drama', -// broadcast: 'broadcast', -// compilation: 'compilation', -// demo: 'demo', -// 'dj-mix': 'dj-mix', -// ep: 'ep', -// 'field recording': 'field recording', -// interview: 'interview', -// live: 'live', -// 'mixtape/street': 'mixtape/street', -// other: 'other', -// remix: 'remix', -// single: 'single', -// soundtrack: 'soundtrack', -// spokenword: 'spokenword', -// }; - export function isMbzAlbumId(albumId: string): boolean { return albumId.startsWith(MUSICBRAINZ_ID_PREFIX); } diff --git a/src/renderer/features/settings/components/integrations/integrations-tab.tsx b/src/renderer/features/settings/components/integrations/integrations-tab.tsx index ad4fffed3..925c0112b 100644 --- a/src/renderer/features/settings/components/integrations/integrations-tab.tsx +++ b/src/renderer/features/settings/components/integrations/integrations-tab.tsx @@ -14,7 +14,6 @@ import { import { MultiSelect } from '/@/shared/components/multi-select/multi-select'; import { Stack } from '/@/shared/components/stack/stack'; import { Switch } from '/@/shared/components/switch/switch'; -import { TextInput } from '/@/shared/components/text-input/text-input'; const MUSICBRAINZ_RELEASE_TYPES = [ 'album', @@ -37,6 +36,271 @@ const MUSICBRAINZ_RELEASE_TYPES = [ 'spokenword', ]; +const MUSICBRAINZ_COUNTRY_CODES: Record = { + AD: 'Andorra', + AE: 'United Arab Emirates', + AF: 'Afghanistan', + AG: 'Antigua and Barbuda', + AI: 'Anguilla', + AL: 'Albania', + AM: 'Armenia', + AN: 'Netherlands Antilles', + AO: 'Angola', + AQ: 'Antarctica', + AR: 'Argentina', + AS: 'American Samoa', + AT: 'Austria', + AU: 'Australia', + AW: 'Aruba', + AX: 'Åland Islands', + AZ: 'Azerbaijan', + BA: 'Bosnia and Herzegovina', + BB: 'Barbados', + BD: 'Bangladesh', + BE: 'Belgium', + BF: 'Burkina Faso', + BG: 'Bulgaria', + BH: 'Bahrain', + BI: 'Burundi', + BJ: 'Benin', + BL: 'Saint Barthélemy', + BM: 'Bermuda', + BN: 'Brunei', + BO: 'Bolivia', + BQ: 'Bonaire, Sint Eustatius and Saba', + BR: 'Brazil', + BS: 'Bahamas', + BT: 'Bhutan', + BV: 'Bouvet Island', + BW: 'Botswana', + BY: 'Belarus', + BZ: 'Belize', + CA: 'Canada', + CC: 'Cocos (Keeling) Islands', + CD: 'Democratic Republic of the Congo', + CF: 'Central African Republic', + CG: 'Congo', + CH: 'Switzerland', + CI: "Côte d'Ivoire", + CK: 'Cook Islands', + CL: 'Chile', + CM: 'Cameroon', + CN: 'China', + CO: 'Colombia', + CR: 'Costa Rica', + CS: 'Serbia and Montenegro', + CU: 'Cuba', + CV: 'Cape Verde', + CW: 'Curaçao', + CX: 'Christmas Island', + CY: 'Cyprus', + CZ: 'Czechia', + DE: 'Germany', + DJ: 'Djibouti', + DK: 'Denmark', + DM: 'Dominica', + DO: 'Dominican Republic', + DZ: 'Algeria', + EC: 'Ecuador', + EE: 'Estonia', + EG: 'Egypt', + EH: 'Western Sahara', + ER: 'Eritrea', + ES: 'Spain', + ET: 'Ethiopia', + FI: 'Finland', + FJ: 'Fiji', + FK: 'Falkland Islands', + FM: 'Federated States of Micronesia', + FO: 'Faroe Islands', + FR: 'France', + GA: 'Gabon', + GB: 'United Kingdom', + GD: 'Grenada', + GE: 'Georgia', + GF: 'French Guiana', + GG: 'Guernsey', + GH: 'Ghana', + GI: 'Gibraltar', + GL: 'Greenland', + GM: 'Gambia', + GN: 'Guinea', + GP: 'Guadeloupe', + GQ: 'Equatorial Guinea', + GR: 'Greece', + GS: 'South Georgia and the South Sandwich Islands', + GT: 'Guatemala', + GU: 'Guam', + GW: 'Guinea-Bissau', + GY: 'Guyana', + HK: 'Hong Kong', + HM: 'Heard Island and McDonald Islands', + HN: 'Honduras', + HR: 'Croatia', + HT: 'Haiti', + HU: 'Hungary', + ID: 'Indonesia', + IE: 'Ireland', + IL: 'Israel', + IM: 'Isle of Man', + IN: 'India', + IO: 'British Indian Ocean Territory', + IQ: 'Iraq', + IR: 'Iran', + IS: 'Iceland', + IT: 'Italy', + JE: 'Jersey', + JM: 'Jamaica', + JO: 'Jordan', + JP: 'Japan', + KE: 'Kenya', + KG: 'Kyrgyzstan', + KH: 'Cambodia', + KI: 'Kiribati', + KM: 'Comoros', + KN: 'Saint Kitts and Nevis', + KP: 'North Korea', + KR: 'South Korea', + KW: 'Kuwait', + KY: 'Cayman Islands', + KZ: 'Kazakhstan', + LA: 'Laos', + LB: 'Lebanon', + LC: 'Saint Lucia', + LI: 'Liechtenstein', + LK: 'Sri Lanka', + LR: 'Liberia', + LS: 'Lesotho', + LT: 'Lithuania', + LU: 'Luxembourg', + LV: 'Latvia', + LY: 'Libya', + MA: 'Morocco', + MC: 'Monaco', + MD: 'Moldova', + ME: 'Montenegro', + MF: 'Saint Martin (French part)', + MG: 'Madagascar', + MH: 'Marshall Islands', + MK: 'North Macedonia', + ML: 'Mali', + MM: 'Myanmar', + MN: 'Mongolia', + MO: 'Macao', + MP: 'Northern Mariana Islands', + MQ: 'Martinique', + MR: 'Mauritania', + MS: 'Montserrat', + MT: 'Malta', + MU: 'Mauritius', + MV: 'Maldives', + MW: 'Malawi', + MX: 'Mexico', + MY: 'Malaysia', + MZ: 'Mozambique', + NA: 'Namibia', + NC: 'New Caledonia', + NE: 'Niger', + NF: 'Norfolk Island', + NG: 'Nigeria', + NI: 'Nicaragua', + NL: 'Netherlands', + NO: 'Norway', + NP: 'Nepal', + NR: 'Nauru', + NU: 'Niue', + NZ: 'New Zealand', + OM: 'Oman', + PA: 'Panama', + PE: 'Peru', + PF: 'French Polynesia', + PG: 'Papua New Guinea', + PH: 'Philippines', + PK: 'Pakistan', + PL: 'Poland', + PM: 'Saint Pierre and Miquelon', + PN: 'Pitcairn', + PR: 'Puerto Rico', + PS: 'Palestine', + PT: 'Portugal', + PW: 'Palau', + PY: 'Paraguay', + QA: 'Qatar', + RE: 'Réunion', + RO: 'Romania', + RS: 'Serbia', + RU: 'Russia', + RW: 'Rwanda', + SA: 'Saudi Arabia', + SB: 'Solomon Islands', + SC: 'Seychelles', + SD: 'Sudan', + SE: 'Sweden', + SG: 'Singapore', + SH: 'Saint Helena, Ascension and Tristan da Cunha', + SI: 'Slovenia', + SJ: 'Svalbard and Jan Mayen', + SK: 'Slovakia', + SL: 'Sierra Leone', + SM: 'San Marino', + SN: 'Senegal', + SO: 'Somalia', + SR: 'Suriname', + SS: 'South Sudan', + ST: 'Sao Tome and Principe', + SU: 'Soviet Union', + SV: 'El Salvador', + SX: 'Sint Maarten (Dutch part)', + SY: 'Syria', + SZ: 'Eswatini', + TC: 'Turks and Caicos Islands', + TD: 'Chad', + TF: 'French Southern Territories', + TG: 'Togo', + TH: 'Thailand', + TJ: 'Tajikistan', + TK: 'Tokelau', + TL: 'Timor-Leste', + TM: 'Turkmenistan', + TN: 'Tunisia', + TO: 'Tonga', + TR: 'Turkey', + TT: 'Trinidad and Tobago', + TV: 'Tuvalu', + TW: 'Taiwan', + TZ: 'Tanzania', + UA: 'Ukraine', + UG: 'Uganda', + UM: 'United States Minor Outlying Islands', + US: 'United States', + UY: 'Uruguay', + UZ: 'Uzbekistan', + VA: 'Vatican City', + VC: 'Saint Vincent and The Grenadines', + VE: 'Venezuela', + VG: 'British Virgin Islands', + VI: 'U.S. Virgin Islands', + VN: 'Vietnam', + VU: 'Vanuatu', + WF: 'Wallis and Futuna', + WS: 'Samoa', + XC: 'Czechoslovakia', + XE: 'Europe', + XG: 'East Germany', + XK: 'Kosovo', + XW: '[Worldwide]', + YE: 'Yemen', + YT: 'Mayotte', + YU: 'Yugoslavia', + ZA: 'South Africa', + ZM: 'Zambia', + ZW: 'Zimbabwe', +}; + +const MUSICBRAINZ_COUNTRY_OPTIONS = Object.entries(MUSICBRAINZ_COUNTRY_CODES) + .map(([code, name]) => ({ label: `${code} - ${name}`, value: code })) + .sort((a, b) => a.label.localeCompare(b.label)); + export const IntegrationsTab = memo(() => { const { t } = useTranslation(); const { musicBrainz } = useGeneralSettings(); @@ -91,17 +355,19 @@ export const IntegrationsTab = memo(() => { }, { control: ( - { - const value = e.currentTarget.value - .split(/[,;\s]+/) - .map((s) => s.trim().toUpperCase()) - .filter(Boolean); - updateIntegrations({ musicBrainzPrioritizeCountries: value }); - }} - placeholder="e.g. US, GB, DE" + c.toUpperCase()) + .filter((code) => code in MUSICBRAINZ_COUNTRY_CODES)} + onChange={(value) => + updateIntegrations({ musicBrainzPrioritizeCountries: value }) + } + searchable width={300} /> ),