Use saved searches to filter your results more quickly
Cancel Create saved search
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window.
Reload to refresh your session.
Веб-приложение для синхронизации и переноса плейлистов с одного музыкального сервиса на другой
License
brintadis/any-sync
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
- Local
- Codespaces
HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.
Лучшая бесплатная программа для синхронизации и бэкапа — FreeFileSync
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
Latest commit message
Commit time
README.md
Сервис для синхронизации и бэкапа плейлистов и треков из различных музыкальных сервисов. С помощью библиотек (spotipy, yandex-music-api) получаем данные по трекам и отправляем их в БД, затем есть возможность синхронизировать его на другом музыкальном сервисе.
Поддерживаемые музыкальные сервисы
- Spotify
- Yandex-Music
- в разработке Apple Music
Сборка репозитория и локальный запуск
Скачайте проект с github:
git clone https://github.com/brintadis/any-sync.git
Создайте виртуальное окружение и установите зависимости:
pip install -r requirments.txt
Для корректной работы Spotify, нужно установить зависимости, предварительно создав приложение в Spotify Dashboard.

На этой странице вам необходимо указать Redirect URIs и точно такой же redirect указать в файле webapp/spotify/spotify.py в переменной REDIRECT_URI . На этой же странице вы получаете Client ID и Client Secret своего Spotify приложения и устанавливаете зависимости в Dockerfile .
ENV SPOTIFY_CLIENT_ID=Your Spotify App Client ID ENV SPOTIFY_CLIENT_SECRET=Your Spotify App Client Secret
В файле docker-compose.yml укажите ключ проекта:
Лучшая программа синхронизации файлов 2022 году — FreeFileSync
— FLASK_SECRET=Your unique flask app secret key
Указываем путь к базе данных(опционально)
Путь к базе данных уже указан. Изменяйте при необходимости файл webapp/config.py
Для запуска сервера в Docker нужно сделать билд в корне проекта с запущенным приложением Docker desktop и выполнить ряд следующих команд:
docker-compose build docker-compose up
Для инициализации базы данных нужно узнать ID docker контейнера нашего приложения, для этого открываем новую консоль и из корня проекта вызываем:
docker ps
Здесь вы должны видеть примерно следующее(id и др. могут различаться):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d890ca35bb46 redis:alpine «docker-entrypoint.s…» About a minute ago Up About a minute 6379/tcp any-sync-redis-1 94cc8ad5f9b1 postgres:13-alpine «docker-entrypoint.s…» About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp any-sync-db-1 8e5ab52a1fc0 any-sync_celery «celery -A webapp.ta…» About a minute ago Up About a minute any-sync-celery-1 876f1a708e6c selenium/standalone-chrome:latest «/opt/bin/entry_poin…» About a minute ago Up About a minute 0.0.0.0:4444->4444/tcp, 5900/tcp any-sync-selenium-1 1fb028204369 any-sync_webapp «flask run -h 0.0.0.…» About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp any-sync-webapp-1
Здесь нам нужно скопировать id контейнера any-sync_webapp, в моем случае 1fb028204369 . Теперь, когда у нас есть id, нужно зайти в bash внутри контейнера. Не закрывая терминал вызывайте следующую команду:
docker exec -it 1fb028204369 bash
Внутри bash вызываем файл create_db.py :
python3 create_db.py
Источник: github.com
Как сделать синхронизацию?
Т.е. при каждом запросе на API, API будет говорить SignalR’y, что нужно оповестить клиентов о новых данных.
Скажите, что можно просто гонять все данные через SignalR, но, например, при первом подключении будет идти запрос на получение всех актуальных данных, а их может быть, например, 10000 (допустим данных о пользователях), SignalR может не вывезти такую нагрузку (сколько у него там ограничение, 32кб?), да и я не думаю, что это правильный путь.
На сколько это реально и правильно ли.
Главный вопрос — как сделать это правильно.
p.s. — нагрузка не большая, поэтому предполагаю, что SignalR и API будут в одном сервере.
Отслеживать
задан 30 окт 2020 в 16:39
689 4 4 серебряных знака 19 19 бронзовых знаков
Я бы использовал SignalR для передачи сообщения о новых данных, после чего клиенты сами должны вызывать нужный API для синхронизации.
30 окт 2020 в 16:47
30 окт 2020 в 16:54
зачем отдавать 10мб в json, делайте отдачу постранично. Ну и 10мб это немного.
30 окт 2020 в 16:55
Серверы можете использовать как вам нравится (зависит от ваших требований), для клиентов разницы нет. Разве что аутентификацию дважды проходить.
30 окт 2020 в 16:57
Холодной старт имеет какую то специфику? Вы на клиенте должны сохранять время последней синхронизации, чтобы не пересылать всю бд, а только те данные, что были со временем последней синхронизации обновлены/добавлены
30 окт 2020 в 16:59
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Я бы использовал SignalR для передачи сообщения о новых данных, после чего клиенты сами должны вызывать нужный API для синхронизации.
Реально ли отдать с API, например, 10МБ данных в JSON’e?
зачем отдавать 10мб в json, делайте отдачу постранично. Ну и 10мб это немного.
Как будет лучше, использовать отдельный сервер с SignalR и отдельный для API? Или можно всё в 1 закинуть?
Серверы можете использовать как вам нравится (зависит от ваших требований), для клиентов разницы нет. Разве что аутентификацию дважды проходить.
Вы на клиенте должны сохранять время последней синхронизации, чтобы не пересылать всю бд, а только те данные, что были со временем последней синхронизации обновлены/добавлены
По идее для вас не должно быть разницы, синхронизируется клиент просто каждые полчаса или по сигналу, апи для синхронизации тот же будет.
А возможно ли использовать один JWT токен для SIgnalR и API, если они будут раздельными?
По поводу jwt — зависит от того, кто и как его выдал, ведь вам на сервере надо будет проверить его валидность.
как правильно сохранить данные у клиента и проверить их на сервере при подключении? Как мне на клиенте понять, что из базы удалили, например, 1 заказ?
Тут много способов. Во первых из бд заказ не удаляется, он помечается как удаленный. Вы можете все действия хранить в отдельной таблице с датой/временем и накатывать эти действия на клиента или вы можете хранить дату последнего изменения заказа в таблице заказов и по этой дате понимать, надо этот заказ синхронизировать или нет. Тут все полностью от вашей задачи зависит.
Источник: ru.stackoverflow.com
Особенности синхронизации в Android-приложении

При разработке многих Android-приложений требуется организовать процесс синхронизации данных с данными на сервере. Есть два основных способа как данную синхронизацию можно реализовать.
Первый способ — классический (наиболее популярный и наиболее простой) — с помощью AlarmManager и Service. Например, как описано в этой статье.
Второй способ — «правильный» (но пока что, видимо, редко кем используемый) — с помощью SyncAdapter.
Разрабатывая своё приложение, изначально я попытался реализовать «правильный» (т.е. второй способ).
О том, как его реализовать — чуть ниже. Расскажу сначала о том, с какими сложностями и особенностями я столкнулся при его реализации.
Особенности реализации синхронизации с помощью SyncAdapter
Прежде всего — данный метод достаточно плохо описан в документации. Хотя на сайте разработчиков Android и есть пример реализации, более хорошим примером (с пояснениями) будет статья по этой ссылке.
Для работы данного способа синхронизации необходимо создание отдельного типа эккаунта специально для Вашего предложения (если существующие эккаунты, например, эккаунты Google не подходят), а это — тема для отдельной статьи (пример можно посмотреть, например, тут).
Данный эккаунт будет доступен в разделе Settings / Accounts Sync.
Как быть если Вашему процессу синхронизации не нужен эккаунт? Придется создавать dummy-эккаунт.
Если Ваше приложение будет синхронизировать данные с существующими базами — контактами телефона, событиями календаря или, например, фотографиями, то тут все проще (и большинство примеров в сети именно про такой тип синхронизации). Если же синхронизация будет производиться со своими данными, то необходимо, чтоб был создан свой ContentProvider.
Как быть, если Ваше приложение не хочет делиться своей базой с другими приложениями? Придется создавать dummy-ContentProvider, например, такой.
Если все сделано, и даже свой SyncAdapter написан (см. ниже как), то теперь синхронизация будет автоматически запускаться когда изменились данные в локальной базе.
Если синхронизацию нужно запустить вручную, то для этого есть функция requestSync(), ниже будет написано об ограничениях функции. Если нужно запускать синхронизацию автоматически, то для этого есть другая функция — addPeriodicSync(). Хотя работает она лишь на Android 2.2 или выше. Но работает данная функция отлично — например, если в момент синхронизации нет интернет-соединения, то синхронизация произойдет автоматически в тот момент, когда оно появится.
Как реализовать синхронизацию с помощью SyncAdapter’а
Что же требуется сделать для реализации синхронизации с помощью SyncAdapter? (перевод ответа c StackOverflow)
1. Уведомить Android, что приложение поддерживает синхронизацию
Для этого в AndroidManifest.xml необходимо указать сервис синхронизации:
где name — имя, соответствующее имени класса для синхронизации (об этом — чуть ниже); exported — делает сервис доступным другим компонентам (в т.ч. и ContentResolver, который используется для взаимодействия с сервисом синхронизации); intent-filter позволяет перехватывать событие, требующее синхронизацию (возникает, например, когда синхронизация запрошена функцией RequestSync() Вашего ContentResolver’a).
2. Создать сервис (службу) для нахождения SyncAdapter’a
Ваш класс должен расширять Service, в нем должна быть переменная экземпляра AbstractThreadedSyncAdapter. Он должен реализовывать public IBinder onBind(Intent) и должен возвращать SyncAdapterBinder.
Достаточно многое должно быть реализовано в этом классе, т.к. данный сервис предоставляет стандартный интерфейс для SyncAdapter Android’a.
3. Создать класс SyncAdapter для непосредственного осуществления синхронизации
mySyncAdapter — место, где содержится сама логика синхронизации. Когда приходит время синхронизации, вызывается onPerformSync().
4. Осуществить связывание (binding) между типом эккаунта и Content Authority
В пункте 1, в файле AndroidManifest.xml, в поле name мы указали значение, которую и образует связь между ContentAuthority и эккаунтом. AndroidManifest.xml ссылается на другой xml-файл. В нашем примере это sync_myapp.xml: