Replies: 6 comments 24 replies
-
Появилась ошибка после того как я зашел в этот плейлист , эти треки как оказалось загружены самим пользователем и к медиатеки spotify не имеют отношения, прослушать их я не мог, но как то они залетали в файл context_player_state_restore и создают ошибку. Находятся они выше списка самой истории.
|
Beta Was this translation helpful? Give feedback.
-
Начиная с версии 1.6.2 я так понял поменялся путь по умолчанию, теперь он вида "Goofy data/id-аккаунта" вместо "Goofy data" В итоге история встала. У себя я путь поправил руками, что бы история дальше крутилась, а в целом наверное можно подставить какую-то переменную с уникальным id вместо старой папки "goofy data". |
Beta Was this translation helpful? Give feedback.
-
Хотел поменять чтение файла на функцию из const HistoryManager = (function () {
const FILES = ['SpotifyHistoryPC', 'SpotifyHistoryPhone'];
const rootFolder = DriveApp.getFoldersByName(User.id).next();
return {
getTracks: getTracks,
removeTracks: removeTracks,
readTrackIds: readTrackIds,
};
function getTracks() {
return SpotifyRequest.getFullObjByIds('tracks', readTrackIds(), 50);
}
function removeTracks(tracks) {
let trackHistoryIds = readTrackIds();
return tracks.filter((track) => !trackHistoryIds.includes(track.id));
}
function readTrackIds() {
let tracks = [];
for (let i = 0; i < FILES.length; i++) {
let data = tryParseJSON(getFile(FILES[i]));
if (data.play_history && data.play_history.tracks) {
let validTracks = data.play_history.tracks.filter(t => t.uri.includes('spotify:track'));
Combiner.push(tracks, validTracks);
}
}
let trackIds = tracks.map((track) => track.uri.replace('spotify:track:', ''));
return Array.from(new Set(trackIds));
}
function tryParseJSON(file) {
if (!file) return {};
try {
let dataAsString = tryGetBlob(file);
let hashIndex = dataAsString.indexOf('#');
return JSON.parse(dataAsString.substring(hashIndex + 1));
} catch (error) {
Admin.printError(error.stack);
return {};
}
}
function tryGetBlob(file) {
if (!file) return '';
try {
return file.getBlob().getDataAsString();
} catch (error) {
Admin.printError('При получении данных из файла произошла ошибка\n', error.stack);
Admin.pause(5);
return tryGetBlob(file);
}
}
function getFile(filename) {
let files = rootFolder.getFilesByName(filename);
if (files.hasNext()) {
return files.next();
}
}
})(); |
Beta Was this translation helpful? Give feedback.
-
Начиная с |
Beta Was this translation helpful? Give feedback.
-
До недавнего времени всё работало прекрасно. Но в последние дни функция с историей стала сбоить:
Я так понимаю - выше описанная проблема с файлом "context_player_state_restore" меня коснуться не должна, так как сторию прослушивания на десктопе я не использую. Использую только SpotifyHistoryPhone... |
Beta Was this translation helpful? Give feedback.
-
Добавил предупреждение в шапке, пока в новых версиях я не нашел простого варианта брать историю, только откат на старые версии. |
Beta Was this translation helpful? Give feedback.
-
Этот метод перестал работать с новыми версиями приложений Spotify, переходите на новый метод.
Warning
Разработчики Spotify изменили локальный файл в котором хранилась история прослушивания, но если очень хочется
пользоваться данным методом то нужно понижать версию вашего приложения, для Windows это 1.1.84 и ниже, что
бы сделать понижение версии и заблокировать обновления воспользуйтесь этим. Для андроида попробуйте эту версию 8.7.20.1261 Build: 85467771 или ниже.
Всем привет, выкладываю альтернативный вариант для ведения истории прослушивания, спасибо @Chimildic, весь код для этого модуля был написан им. Сделано было это еще перед новым годом, как-то в суматохе не подумал сюда сразу выставить, исправляюсь.
Краткое описание.
Ведение истории прослушивание треков на Android и Windows.
Плюсы:
Минусы:
Суть схемы работы.
Spotify в клиентах для windows, android в открытом доступе, локально хранит историю прослушивания в обычном тексте, этот файл и нужно выслать goofy для его последующей обработки в историю.
Инструкция первого запуска.
1. Копируем код ниже в отдельный файл, например
my-module.gs
, что бы жил независимо от обновлений основной библиотеки.2. Далее например используем вариант для android, для передачи файла с телефона я использую tasker.
TASKS
)Google Drive
. (у меня он самый первый)GD Upload
.GD Upload
.Google drive Account
- ваш аккаунт google.Data / File
- путь к файлу по умолчаниюAndroid/data/com.spotify.music/files/spotifycache/Users/ваш-ID-user/context_player_state_restore
(Если вдруг там пустая папка, то дайте необходимые разрешения для таскера или проверьте туже директорию но на sd-карте)Remote File Name
- имя файла после его выгрузки в google, по умолчаниюSpotifyHistoryPhone
.Remote Folder
- в какую папку выгружать файл на гугл диске, по умолчаниюGoofy data/id-аккаунта
.Overwrite if Exists
. (каждый раз перезаписывать файл)Notification Removed Spotify
то есть файл с историей будет выгружаться каждый раз после того как любое уведомление в spotify будет закрыто, а это всегда будет наш плеер по сути.PROFILES
Событие
Интерфейс
=>Notification Removed
Приложение-владелец
выбираем Spotify, все сохраняем, таскер настроен.3. Создаем функцию для Goofy, идем в
main
и создаем новую функциюtest
4. Проверяем работу, идем в Spotify слушаем пару или больше треков, закрываем Spotify, что бы сработал триггер или другое действие которое назначено у вас.
5. Если выгрузка сработала правильно в Google диске, появится файл
SpotifyHistoryPhone
.6. Идем в
Goofy
и запускаем нашу функциюtest
, проверяем наш новый плейлист test-history, обычно если не фильтровать массив то выходит от 200 до 500 треков истории.7. Последний пункт обвязка функции, в начальном массиве истории дубликаты уже удалены по id, так что фильтровать на повторы в сам массиве новой истории не нужно, я организовал сбор хранение истории через Cache.
Так же для моей истории был создан
Filter.removeTracksid
тот жеFilter.removeTracks
как и основной но фильтрует только по id, кому это не надо могут использовать обычный вариант из основной библиотеки, кто понял зачем тут фильтр по id то вот его код:Так же как и основной код можно добавить в
my-module.gs
.Дальше уже обвязку объяснять не буду, чисто субъективщина пойдет, думаю справитесь.
В заключении добавлю, что способ для Пк версии не особо отличается, просто найдите вариант так же отправлять файл в goofy, для себя выбрал программу
Air Explorer Pro
которую настроил параллельно с планировщиком windows. Триггер для самой функции так же настраивайте под себя, я выбрал на каждый час.Пользуюсь данным способом уже 2 месяца, работает все как часы. Всем спасибо за внимание, и еще раз выражаю огромную благодарность разработчику проекта @Chimildic
Beta Was this translation helpful? Give feedback.
All reactions