Skip to content
levzbPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Tokify

Личный плеер избранных звуков TikTok и своих аудио/видеофайлов. Svelte 5, Node.js, SQLite и ffmpeg. Музыка, обложки, задания импорта и пароль хранятся на вашем Mac в data/. В GitHub хранятся только исходники; личные данные и медиатека исключены из репозитория.

Готовый сайт: http://localhost:8788. Фоновый сервер продолжает импортировать архив, даже если закрыть вкладку. Прогресс виден на карточке выгрузки; нажатие на неё открывает панель обработки. Через иконку в боковой панели можно открыть список уже готовых песен.

Запуск

Требуется Node.js 22.13 или новее и ffmpeg. На этом Mac зависимости и Chromium уже установлены.

При установке с нуля:

npm ci
brew install ffmpeg
npx playwright install chromium
npm run password
npm run build
npm start

npm run password скрывает ввод в терминале и меняет пароль без перезапуска сервера. Минимум шесть символов. Все устройства после смены пароля должны войти заново.

Для первого входа в подготовленную здесь библиотеку откройте локальный файл data/initial-password.txt. Это случайный пароль; он не записан в исходники. Можно сразу задать собственный через npm run password; временный файл при этом удаляется.

Обычный повторный запуск:

npm start

Чтобы сервер работал после закрытия терминала:

npm run start:background

Повтор этой команды не запускает второй сервер на том же порту. Лог — data/server.log, PID — data/server.pid. Остановка фонового процесса:

kill "$(cat data/server.pid)"

Сервер, запущенный через npm start, останавливается Ctrl+C. После перезагрузки Mac сервер нужно запустить снова. Для другого порта используйте PORT=9000 npm start.

Импорт

В TikTok: «Настройки → Конфиденциальность → Скачать данные», формат JSON. На главной выберите ZIP, JSON либо папку; затем нажмите Upload. Доступны все звуки, первые X или ручной выбор, а также своё название выгрузки.

Поддерживается структура реального архива: Likes and Favorites → Favorite Sounds → FavoriteSoundList, ссылки /h5/share/music/ID.html, старые короткие ID, обычные /music/...-ID и /share/music/ID. В добавленном архиве 967 записей; все распознаются. В соответствии с сохранённым решением проекта используются только Favorite Sounds, без лайкнутых видео.

Загрузка идёт на Mac через отдельный Chromium и локальный сервер; TikTok не требует ваших учётных данных. Недоступные звуки остаются серыми с причиной и повторной попыткой в меню. Уже скачанное аудио используется повторно. Незавершённое задание и его прогресс сохраняются в SQLite и продолжаются после перезапуска сервера.

Первые пять звуков были импортированы отдельно для проверки. Основная выгрузка называется «Избранное TikTok · 31.10.2026». Песни в ней используют те же локальные файлы; повторных копий аудио нет. Проверочную выгрузку можно удалить, основная останется.

До первого обращения к TikTok экспорт обычно даёт только ссылку и дату, поэтому настоящие названия и обложки появляются при скачивании. У удалённого звука получить их иногда уже невозможно.

Скачать звук по ссылке

В самом верху главной вставьте ссылку на TikTok, YouTube, SoundCloud или трек Spotify. Вставка запускает поиск автоматически; также можно нажать Find или Enter. Поддерживаются обычные ссылки, короткие vm.tiktok.com / vt.tiktok.com, /t/... и текст из меню «Поделиться».

YouTube и SoundCloud скачиваются через yt-dlp на Mac, с доступными названием, автором и обложкой. Поддерживаются отдельные ролики (включая YouTube Shorts и youtu.be), отдельные треки SoundCloud и короткие ссылки. Каналы, альбомы, целые плейлисты и прямые эфиры не импортируются этой строкой. Максимальная длина — 45 минут на трек. Превью, DRM, закрытые или требующие недоступной авторизации записи не выдаются за полноценную песню; ошибки видны в интерфейсе.

Spotify: сайт получает только информацию о треке. Полное аудио непосредственно из Spotify не скачивается, 30-секундное превью не используется. Нажмите Find on YouTube, проверьте варианты и выберите Choose. После этого показан настоящий источник YouTube, и его аудио можно скачать обычной кнопкой Import. Совпадение названия не гарантирует совпадение версии записи, поэтому источник выбирается вручную.

Для YouTube и SoundCloud один раз установите загрузчик: npm run setup:media (нужны интернет, Python 3.11+ и уже установленный ffmpeg). На этом Mac он уже установлен. Инструмент и зависимости находятся в приватном data/tools/yt-dlp/; глобальный Python не изменяется. Этой же командой можно обновить yt-dlp, если площадки изменились. Вместо локальной установки можно указать исполняемый файл через TOKIFY_YTDLP. Куки браузера и учётные данные сервисов автоматически не читаются.

Если звук доступен, появятся название, автор, длительность, обложка и кнопка Import. Поиск не скачивает аудио и не создаёт песню. После Import звук добавляется в ту же закреплённую выгрузку «Мои файлы», куда попадают собственные файлы, и в All songs. Отдельная выгрузка для ссылок не создаётся. Уже скачанное аудио используется повторно; для песни, которая уже есть в этой выгрузке, показана кнопка Open. Ошибки скачивания остаются серыми в плейлисте и доступны для повторной попытки.

У любой добавленной песни через меню ⋯ доступны Rename song и Edit author — для файлов, ссылок и выгрузок TikTok. Изменения сразу видны в списках и плеере; пользовательские название и автор сохраняются после перезапуска и повторного скачивания. Автор может быть пустым.

Предпросмотр ссылки действует 10 минут и хранится только в памяти сервера. После перезапуска сервера нужно найти ссылку заново, но принятое скачивание продолжится. Приватные, удалённые, регионально недоступные или заблокированные TikTok страницы могут не находиться; иногда помогает ссылка на сам звук.

Проверка на изолированной библиотеке: npm run test:links — TikTok; npm run test:media — общий интерфейс YouTube / SoundCloud / Spotify. Chromium и WebKit с экраном iPhone; внешние сервисы в автоматических браузерных тестах заменены тестовыми ответами.

Выбрать и обрезать отрывок

У любой скачанной песни откройте ⋯ → Trim audio. Редактор общий для TikTok, YouTube, SoundCloud и собственных файлов. В нём показаны обложка, автор, исходная длительность и звуковая дорожка. Передвиньте белые границы или введите точные Start / End в секундах. Минимум — 0,5 секунды. Для длинной записи используйте Zoom to selection; Fit возвращает всю дорожку.

Play excerpt прослушивает выбранный участок, кнопка повтора включает/отключает цикл предпрослушивания. Обычный плеер на время редактирования останавливается. Save excerpt применяет отрывок ко всем плейлистам, где есть эта песня. Cancel ничего не меняет. Скачанный файл не перезаписывается: можно снова открыть редактор, расширить границы или нажать Restore original → Save excerpt.

При поиске по ссылке основная кнопка теперь Import. Import & trim сначала добавляет и скачивает запись в «Мои файлы», затем открывает редактор. Если после этого отменить редактор, импортированная полная запись останется в библиотеке. У уже добавленной записи доступна кнопка Trim audio. У Spotify сначала нужно выбрать источник YouTube — редактор работает с реальным скачанным аудио.

Переходы и повтор используют сохранённый диапазон; новые MP3/ZIP тоже содержат выбранный участок. Уже подготовленные ранее файлы остаются в прежнем виде, для нового диапазона нужна новая выгрузка. Выбор отрывка и изменения сохраняются в SQLite и работают без интернета, если аудио уже скачано. Повторное скачивание оригинала сохраняет выбранный диапазон и пользовательские название/автора. Обрезка не создаёт вторую независимую копию песни.

Проверка: npm run test:clips. Изолированные тесты проверяют границы, прослушивание, отмену, сохранение, проигрывание нового диапазона, повторное открытие, восстановление оригинала и Import & trim; физический iPhone не используется.

Свои аудио и видео

В зоне «Archive or media files» можно выбрать несколько аудио/видеофайлов или папку. Сразу после выбора файлы загружаются во временное приватное хранилище на Mac и проверяются через ffprobe. Фото и документы отклоняются ещё в браузере; сервер повторно проверяет тип и реальное содержимое. Видео без аудиодорожки и повреждённые файлы получают ошибку до окна импорта и не добавляются в библиотеку. Если в наборе есть подходящие файлы, можно продолжить с ними; причины отклонения остальных показаны в зоне загрузки.

Нажмите Upload, чтобы открыть предпросмотр проверенных файлов. Как в шапке плейлиста, слева показана обложка, справа — название и автор. Нажмите прямо на текст для редактирования: видимых полей ввода нет. Название по умолчанию берётся из имени файла без расширения, автора можно оставить пустым. Нажмите Import для добавления. Повторно передавать файл не нужно — используется уже проверенный оригинал. Название и автора можно менять и после добавления через меню песни: Rename song и Edit author.

Сервер извлекает первую аудиодорожку и сохраняет AAC/M4A. Разрешены распространённые аудио- и видеоформаты: например MP3, WAV, FLAC, M4A, OGG, MP4, MOV, WebM, MKV. У видео первый кадр становится обложкой, у аудио используется встроенная картинка, если она есть. Если картинки нет, показана обычная музыкальная заглушка; свою обложку можно поставить через меню песни.

Все внешние песни автоматически попадают в одну выгрузку «Мои файлы», закреплённую первой в Uploads, и в All songs. Очередь, повтор, переходы и добавление в другие плейлисты работают так же, как для TikTok. Одинаковое содержимое распознаётся по SHA-256: повторный импорт использует готовое аудио и обновляет введённые название/автора, без новой копии песни.

Предпросмотр действует 24 часа. Временные оригиналы и картинки удаляются при отмене или во время очередной очистки. После успешного извлечения остаются только аудио и обложка. Если ошибка возникла уже при извлечении проверенного файла, его оригинал сохраняется приватно в data/uploads/ для повторной обработки.

Максимальный размер файла — 512 МБ. Очень длинные записи могут превысить лимит декодирования в памяти (примерно 45 минут при 48 кГц стерео). ZIP/JSON по-прежнему обрабатываются как экспорт TikTok: их следует загружать отдельно от медиафайлов. Окно обработки можно скрыть. При перезагрузке страницы принятые в обработку файлы продолжат обрабатываться; для ещё не подтверждённых файлов понадобится снова открыть выбор.

Проверка в отдельной временной библиотеке, без изменений вашей музыки:

npm run test:files

iPhone

Для быстрой проверки подключите iPhone к той же Wi-Fi сети, что и Mac, и откройте в Safari http://<IP-Mac>:8788. IP можно посмотреть в настройках сети macOS. Адрес localhost на телефоне указывает на сам телефон.

Для постоянного использования и системных медиакнопок используйте HTTPS. Вариант для личного доступа — Tailscale:

  1. Установите Tailscale на Mac и iPhone, войдите в один аккаунт и включите соединение на обоих устройствах.

  2. Включите HTTPS-сертификаты в настройках DNS своей сети Tailscale, если сервис предложит это сделать.

  3. На Mac запустите:

    tailscale serve --bg http://127.0.0.1:8788
  4. Откройте показанный HTTPS-адрес в Safari на iPhone. Войдите по паролю.

  5. Safari → «Поделиться» → «На экран “Домой”» → «Добавить». Запускайте плеер с появившейся иконки. При первом запуске с иконки может потребоваться повторный вход.

Это приватный доступ внутри вашей сети Tailscale. Команда tailscale funnel для этого проекта не нужна. Tailscale на этом Mac пока не установлен; подключение вашего аккаунта не выполнялось. См. официальную инструкцию Serve и включение HTTPS.

Mac должен оставаться включённым, сервер должен работать, а iPhone — иметь сетевой доступ к нему. При прослушивании с заблокированным экраном можно использовать caffeinate -i npm start на Mac, чтобы не допустить его автоматического сна. Закрытая крышка ноутбука всё равно может отправить его в сон.

Управление

Нажмите песню для запуска плейлиста. Кнопка повтора слева от номера запускает выбранную песню по кругу с текущим переходом Direct, Fade или Crossfade; повторное нажатие возвращает обычное воспроизведение плейлиста. Меню по правой кнопке, долгому нажатию или кнопке «⋯»: очередь, «играть следующей», добавление в любой плейлист, замена обложки и удаление из плейлиста. На телефоне тяните за ручку справа от песни для изменения порядка; на компьютере можно тянуть саму строку. Нажатие на название плейлиста переименовывает его, на обложку — меняет картинку.

На компьютере: пробел — пауза; стрелки — перемотка на пять секунд; Shift + стрелки — следующий/предыдущий трек. На iPhone коснитесь нижнего мини-плеера, чтобы открыть перемотку, повтор, перемешивание и очередь. Громкость на iPhone регулируется системными кнопками.

Проверки и ограничения

npm test
npm run build

Для браузерных проверок требуются Chromium, WebKit и локальная библиотека с добавленным архивом:

npx playwright install chromium webkit
npm run test:browser

Браузерный тест создаёт временный плейлист из настоящих песен и удаляет его после проверки. Он рассчитан на текущую библиотеку с активным импортом. Для другого адреса задайте TOKIFY_BASE_URL, для файла с паролем — TOKIFY_PASSWORD_FILE. Снимки сохраняются в screenshots/, каталог исключён из Git.

Результаты и честные ограничения iOS описаны в VERIFICATION.md.

Сортировать музыку на Mac без интернета

Дважды нажмите Start Tokify.command в папке проекта. Либо в терминале из папки проекта: npm run offline. Команда запускает локальный сервер и открывает http://localhost:8788/. Если сервер уже запущен, используется он же. Зависимости и сборка должны быть установлены один раз заранее; при офлайн-запуске ничего не скачивается.

Можно выключить Wi-Fi и работать прямо на Mac: создавать и переименовывать плейлисты, выделять несколько песен и добавлять их в нужный плейлист, перетаскивать порядок, убирать песни из плейлиста, менять название и автора, слушать уже скачанное и готовить MP3/ZIP. Всё это работает через localhost и SQLite на самом компьютере. Изменения сохраняются сразу в data/library.sqlite, переживают закрытие браузера и перезапуск сервера; после появления интернета останутся те же плейлисты. Отдельная синхронизация не нужна.

Для раскладки: Home → All songs → Select → отметить песни → Add to playlist → нужный плейлист. Сначала можно создать пустые плейлисты через New playlist. Удаление песни из плейлиста убирает только её принадлежность этому плейлисту, а не песню из остальных выгрузок.

Интернет требуется только для получения новых звуков/обложек с TikTok. Сам Mac и локальный сервер должны быть включены. С телефона в этой же локальной сети можно открыть адрес Mac; без связи с Mac на телефоне используйте заранее сохранённый MP3.

Проверка npm run test:offline запускает изолированную библиотеку офлайн-командой и проходит создание, переименование, массовое добавление, перетаскивание, удаление из плейлиста, изменение названия песни и проигрывание. Chromium и WebKit работают с заблокированными внешними запросами и navigator.onLine=false; проверяется сохранность после перезагрузки страницы и полного перезапуска сервера. Боевую медиатеку тест не меняет.

Слушать в самолёте и без интернета

На главной рядом с переключателем Uploads / All songs есть кнопка со стрелкой вниз — Download library. В плейлисте такая же кнопка находится рядом с Select и ⋯. У отдельной песни: ⋯ → Download audio.

Выберите формат и нажмите Prepare download:

  • One continuous MP3: один аудиофайл со всеми выбранными песнями. Direct, Fade или Crossfade уже записаны в аудио, поэтому между песнями телефону не нужны сайт, сеть или JavaScript. Можно заранее перемешать порядок. В файле есть названия глав и обложка; поддержка отображения глав зависит от проигрывателя.
  • Separate songs · ZIP: отдельные MP3 с названиями, авторами и доступными обложками, UTF-8 плейлист M3U8, JSON-отчёт и список недоступных песен. Автоматическое воспроизведение ZIP как плейлиста требует проигрывателя с поддержкой M3U; «Файлы» позволяют открыть отдельный трек. Для непрерывного прослушивания без установки приложений выбирайте первый вариант.

После подготовки нажмите Download MP3 или Download ZIP. На iPhone сохраните в «Файлы → На iPhone», чтобы файл находился на самом телефоне, а не только в iCloud. Если телефон сейчас не подключён к Mac, скачайте файл на Mac и передайте через AirDrop: включите Wi-Fi и Bluetooth на обоих устройствах, оставьте их рядом, выберите файл в Finder → Поделиться → AirDrop → свой iPhone. Передача между соседними устройствами не требует интернета. После приёма откройте файл на телефоне; Mac можно выключить.

В самолёте авиарежим можно оставить включённым, включив Wi-Fi и Bluetooth обратно для AirDrop. Для подготовки и передачи уже скачанной музыки доступ к TikTok не нужен. Недоступное или ещё не скачанное аудио не включается: число исключённых песен показывается в окне и в отчёте.

Сервер Tokify тоже запускается без интернета: npm run start:background (после уже выполненной сборки). Для прослушивания именно с сайта Mac и iPhone должны быть в общей локальной сети. Сам сайт в этой версии не сохраняется как офлайн-PWA: если Mac недоступен, слушайте сохранённый MP3 через «Файлы» или другой проигрыватель. В полном MP3 порядок и переходы фиксированы; изменить их можно новой выгрузкой. Кнопки и интерфейс Tokify не переносятся внутрь аудиофайла.

Экспорт готовится в фоне, прогресс виден в окне; окно можно скрыть. После перезапуска сервера незавершённая подготовка начинается заново автоматически. Готовый файл повторно используется, пока состав, порядок, метаданные и настройки не изменились. Принятые HTTP-загрузки поддерживают байтовые диапазоны. Все подготовленные файлы, отчёты и промежуточные данные находятся только в игнорируемом Git каталоге data/exports/. ZIP ограничен 4 ГБ; для большей библиотеки выгружайте плейлисты отдельно.

Проверка: npm run test:downloads — Chromium и WebKit с экраном iPhone скачивают настоящий MP3 и проигрывают его из Blob при отключённой сети, включая переход к следующей песне и перемотку. Это не проверка приложения «Файлы», AirDrop или блокировки на физическом iPhone.

Приватные файлы и резервная копия

data/, архив TikTok, аудио и видео, база, .env и скриншоты исключены через .gitignore. В репозиторий входят исходники, тесты, документация и собственные иконки приложения. Пароль создаётся локально командой npm run password и в GitHub не передаётся.

В data/ находятся аудио, обложки, настройки, пароль в виде scrypt-хеша и сессии входа. Новые приватные файлы создаются с доступом только для текущего пользователя macOS. Удаление последнего плейлиста скрывает песни из библиотеки, но сохраняет файлы в приватном кэше: повторный импорт не скачивает их снова, а текущее воспроизведение не обрывается.

Для резервной копии остановите сервер, скопируйте весь data/ в приватное место и запустите сервер снова. TOKIFY_DATA=/другой/путь npm start позволяет изменить место хранения. Для полного удаления библиотеки остановите сервер и удалите её каталог данных; он содержит также пароль и настройки.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages