Исправляет ошибку загрузки фотографий в альбомы VK, создавая последовательную очередь. Предотвращает сбой "быстрого" аплоадера при загрузке пачкой и добавляет опцию заполнения описания из имени файла.
Скрипт предназначен для исправления критической ошибки "быстрого" загрузчика фотографий в альбомы vk.com. Стандартный загрузчик VK при перетаскивании (Drag-and-Drop) большого количества файлов (пачкой) пытается обработать их параллельно, что часто приводит к сбоям, ошибкам сети или "зависанию" процесса.
Данный скрипт решает эту проблему, фундаментально изменяя логику загрузки: он перехватывает все перетаскиваемые файлы и вместо параллельной обработки создает из них строго последовательную очередь. Файлы загружаются один за другим, причем следующий файл не отправляется до тех пор, пока сервер VK не пришлет подтверждение об успешной обработке предыдущего.
В качестве дополнительной функции скрипт предлагает опцию автоматического заполнения поля "Описание" для каждой загруженной фотографии, используя имя файла.
Архитектура скрипта основана на перехвате и модификации нативных функций браузера и скриптов VK.
Патчинг EventTarget.prototype.addEventListener (Перехват Drop-зоны):
listener, он "патчит" саму функцию addEventListener в unsafeWindow.'drop' на зону загрузки (#photos_upload_area_drop).originalDropListener), но подменяет его собственным (customDropHandler).customDropHandler, а не оригинальный обработчик VK.customDropHandler (Формирование очереди):
event.dataTransfer.files.uploaderQueue, обновляет UI (updateQueueIndicator) и вызывает processQueue() для запуска последовательной обработки.processQueue (Последовательный обработчик):
isProcessingQueue.isProcessingQueue === true), функция немедленно завершается.isProcessingQueue = true).uploaderQueue (.shift()).currentFileName (для функции описания).new DragEvent('drop', ...)).originalDropListener.call(...)).Патчинг XMLHttpRequest (Обратная связь и разблокировка):
/al_photos.php?act=finish_add. Этот запрос VK отправляет после того, как файл не просто загружен, но и успешно сохранен на сервере.finish_add) успешно завершается:
isProcessingQueue = false.processQueue(), который берет следующий файл из очереди.finish_add -> разблокировка -> следующий запрос" и создает надежную последовательную очередь.Авто-заполнение описания:
finish_add), если опция fillDescriptionEnabled включена, скрипт:
photoId только что загруженного файла.#photo_edit_row_...).<textarea>.textarea значение currentFileName.blur на textarea, чтобы VK зафиксировал и сохранил изменение.UI и Управление (createControlPanel, MutationObserver):
#gm-script-panel) с главным переключателем (ВКЛ/ВЫКЛ) и чекбоксом для опции описания. Настройки сохраняются через GM_setValue.MutationObserver следит за DOM, чтобы заново отрисовать панель, если VK уничтожит ее при SPA-переходе.vk.com/album* и откройте окно загрузки фотографий.addEventListener: Это продвинутый и надежный метод перехвата, который "бесшовно" встраивается в логику страницы, подменяя обработчик до его вызова.XMLHttpRequest: Использование XHR-перехвата для получения "сигнала" от сервера (finish_add) является единственным надежным способом узнать, что файл действительно обработан, и можно приступать к следующему.DragEvent: Скрипт не использует внутренние функции VK (которые могут измениться), а вместо этого "обманывает" оригинальный обработчик, имитируя нативное событие перетаскивания одного файла.isProcessingQueue: Этот флаг-замок (mutex) — центральный элемент, превращающий хаотичный процесс в упорядоченную очередь и предотвращающий любые "гонки состояний".unsafeWindow: Необходимо для доступа к нативным прототипам EventTarget.prototype и XMLHttpRequest.prototype, которые находятся в контексте страницы, а не в "песочнице" UserScript.Данный скрипт не генерирует файл или текстовый вывод. Его результатом является успешная загрузка всех перетащенных файлов.
Визуальным результатом является:
Очередь: 14/20
IMG_0015.jpg
IMG_0016.jpg
...
Автоматическое заполнение полей "Описание" на странице редактирования загруженных фото:
<textarea class="photos_photo_edit_row_desc_input" ...></textarea>
<textarea class="photos_photo_edit_row_desc_input" ...>My-Awesome-Picture-001.jpg</textarea>