-
@Chimildic Возник такой вопрос, а нельзя ли фильтровать треки, так сказать, по их географическому положению? Допустим, решил я собрать популярные треки за 2020 год, но туда может попадать треки хоть откуда (Россия, Испания и тп). Вот интересно, можно ли как-то ненужные страны убрать. |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 2 replies
-
ПредупреждениеПост больше для справки, дабы закрыть вопрос. На практике много неточности, мало пользы. При тесте большой акцент на музыку СНГ. Возможно с другими странами отработает лучше. Фильтр по жанру с баном ОписаниеЕсть следующее неполноценное решение. У
Отсюда неполный охват, кто-то останется неизвестным. Сначала даем треки, вынимаем исполнителей и делим на два лагеря: есть или нет в базе До конца не понял документацию РеализацияВ результате сделал небольшой модуль
ПримерВзяли топ по России и исключили некоторые страны, включая ненайденных и неизвестных. Чтобы вернутся к трекам, используется function debug() {
let tracks = Source.getPlaylistTracks('', '7DyTIXA395t2S8mgusLiV9');
let musicbrainz = MusicBrainz.addEntities(tracks);
MusicBrainz.matchCountry(musicbrainz.found, {
exclude: ['RU', 'KZ', 'BY', 'UA'],
isRemoveUnknown: true,
});
Filter.removeArtists(tracks, musicbrainz.found, true);
Playlist.saveWithReplace({
name: 'Топ России',
tracks: tracks,
});
} На примере конкретного этого плейлиста, в момент теста, проскакивает исполнитель Можно улучшить поиск. Проходя по результатам и сравнивая имена на нашей стороне. Но учитывая нюансы лимитов и относительно маленькую базу с точки зрения разметки на страну, результат существенно не улучшится. Попробую, если будет спрос. КодКак обычно добавляется в один из файлов, например const MusicBrainz = (function () {
const API_BASE = 'https://musicbrainz.org/ws/2';
return {
addEntities: addEntities,
matchCountry: matchCountry,
}
function addEntities(items) {
let artists = items[0].hasOwnProperty('artists')
? items.map(t => t.artists).flat(1)
: items;
Filter.dedupArtists(artists);
let entities = artists.reduce((responses, artist) => {
let url = API_BASE + `/artist/?fmt=json&query=artist:${artist.name.formatName()}`;
let response = CustomUrlFetchApp.fetch(url);
if (response && response.artists && response.artists.length > 0) {
artist.musicbrainz = response.artists[0];
responses.found.push(artist);
} else {
responses.nofound.push(artist);
console.log('MusicBrainz. Не найден исполнитель:', artist.name);
}
Utilities.sleep(350);
return responses;
}, { found: [], nofound: [] });
appendCountry(entities.found);
return entities;
}
function appendCountry(artists) {
artists.forEach((artist, i) => {
let item = artist.musicbrainz;
if (!item) {
console.log('Нет данных от MusicBrainz');
return;
}
if (!item.hasOwnProperty('country') && (item['begin-area'] || item.area)) {
let areaName = item['begin-area'] ? item['begin-area'].name : item.area.name;
areaName.length <= 5 ? appendByCheerio(item.id, i) : appendByGeocode(areaName, i);
}
if (!artist.musicbrainz.hasOwnProperty('country')) {
console.log('MusicBrainz. Страна неизвестна', artist.name);
}
});
function appendByCheerio(id, i) {
let cheerio = createCherio(`https://musicbrainz.org/artist/${id}`);
artists[i].musicbrainz.country = cheerio('.flag', '.properties').first().attr('class').split('-')[1];
}
function appendByGeocode(areaName, i) {
let response = Maps.newGeocoder().geocode(areaName).results[0];
if (response) {
let country = response.address_components.find(c => c.types.includes('country'));
artists[i].musicbrainz.country = country.short_name;
}
}
function createCherio(url) {
let content = CustomUrlFetchApp.fetch(url).getContentText();
return Cheerio.load(content);
}
}
function matchCountry(artists, params) {
Combiner.replace(artists, artists.filter(artist => {
if (artist.musicbrainz.country) {
return RangeTracks.isBelongGenres([artist.musicbrainz.country], params.include)
&& !RangeTracks.isBelongBanGenres([artist.musicbrainz.country], params.exclude)
}
return !params.isRemoveUnknown;
}));
}
})(); |
Beta Was this translation helpful? Give feedback.
Предупреждение
Пост больше для справки, дабы закрыть вопрос. На практике много неточности, мало пользы. При тесте большой акцент на музыку СНГ. Возможно с другими странами отработает лучше.
Фильтр по жанру с баном
russian
будет эффективнее rangeTracks в сочетании с matchExceptRu. Поскольку многие исполнители остаются ненайденными, определены неправильно или неизвестны по стране.Описание
Есть следующее неполноценное решение. У
musicbrainz
база по музыке с доступом по API. Среди прочего, исполнители размечены по странам. Но много неприятностей: