let get_albums_response = api
.request("video.getAlbums", &mut get_albums_params)
.await
.unwrap();
[package]
name = "vk-tools"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
tokio = { version = "0.2", features = ["full"] }
vkapi = "0.2.0"
/**
* VK Video Sorting
*
* Этот Rust код представляет собой программу для взаимодействия с VK (VKontakte) API, которая выполняет следующие действия:
* 1. Получает список альбомов пользователя VK с помощью метода "video.getAlbums".
* 2. Запрашивает у пользователя ID альбома, в котором необходимо отсортировать видеоролики.
* 3. Получает список видеороликов из выбранного альбома с помощью метода "video.get".
* 4. Сортирует видеоролики в альбоме на основе заголовков с учетом числовых префиксов.
* 5. Переупорядочивает видеоролики в альбоме в соответствии с отсортированным порядком.
*
* Запуск:
* - Замените "placeholder" на свой токен VK API и желаемый owner_id для взаимодействия с VK API.
* - Запустите программу, и она выведет список альбомов, запросит ID альбома для сортировки видеороликов,
* а затем выведет список видеороликов в новом порядке после сортировки.
*
*/
// Импорт необходимых крейтов и модулей
#[macro_use]
extern crate vkapi;
use regex::Regex;
use std::{cmp::Ordering, io, thread::sleep, time::Duration};
use tokio;
#[tokio::main]
// Функция для сравнения заголовков с числовыми префиксами
async fn main() {
// Создание нового экземпляра клиента VK API с версией "5.131" и языком "ru"
let mut api = vkapi::VK::new("5.131", "ru");
// Установка токена доступа для взаимодействия с VK API (замените placeholder на свой токен)
api.set_access_token("placeholder".to_string());
// Создание параметров запроса для получения списка альбомов пользователя с id "placeholder" (замените placeholder на желаемый owner_id)
let mut get_albums_params = param! {"owner_id" => "placeholder"};
// Выполнение запроса к VK API для получения списка альбомов пользователя
let get_albums_response = api
.request("video.getAlbums", &mut get_albums_params)
.await
.unwrap();
let time_to_sleep = Duration::from_secs(5);
// Асинхронная задержка в течение 5 секунд
sleep(time_to_sleep);
// Вывод найденных альбомов на экран
println!("Найденные альбомы:");
for album in get_albums_response["response"]["items"].members() {
println!("Название: {}, ID: {}", album["title"], album["id"]);
}
// Вывод сообщения пользователю для запроса ID выбранного альбома для сортировки видеороликов
println!("Укажите ID альбома, в котором будем сортировать видеоролики:");
let mut selected_album_id = String::new();
// Чтение ввода пользователя из стандартного потока ввода (stdin)
match io::stdin().read_line(&mut selected_album_id) {
Ok(_) => {
println!("Хорошо. Вы выбрали альбом с ID {}", selected_album_id);
}
Err(error) => {
println!("Ошибка чтения ввода: {}", error);
}
}
// Создание параметров запроса для получения списка видеороликов из выбранного альбома
let mut get_album_videos_params = param! {"album_id" => &selected_album_id};
// Выполнение запроса к VK API для получения списка видеороликов из выбранного альбома
let get_album_videos_response = api
.request("video.get", &mut get_album_videos_params)
.await
.unwrap();
// Определение структуры для представления информации о видео (ID и заголовок)
struct Video {
id: i32,
title: String,
}
let mut sorted_videos: Vec<Video> = Vec::new();
// Вывод на экран видеороликов, находящихся в выбранном альбоме
println!("Видео, которые находятся в выбранном вами альбоме:\n");
for video in get_album_videos_response["response"]["items"].members() {
// Создание объекта Video для каждого видео с ID и заголовком
let vid = Video {
id: video["id"].as_i32().unwrap(),
title: video["title"].as_str().unwrap().to_string(),
};
sorted_videos.push(vid);
}
// Функция для сравнения заголовков с числовыми префиксами
fn compare_titles(title_a: &str, title_b: &str) -> Ordering {
// Определение регулярного выражения для поиска числовых префиксов в начале заголовков
let re = Regex::new(r"^\d+").unwrap();
// Извлечение числовых префиксов из обоих заголовков (если они присутствуют)
let num_a = re
.find(title_a)
.map(|num_str| num_str.as_str().parse::<i32>().unwrap());
let num_b = re
.find(title_b)
.map(|num_str| num_str.as_str().parse::<i32>().unwrap());
// Сравнение числовых префиксов как целых чисел
match (num_a, num_b) {
(Some(num_a), Some(num_b)) => num_a.cmp(&num_b),
_ => title_a.cmp(title_b),
}
}
// Сортировка видеороликов на основе заголовков
sorted_videos.sort_by(|a, b| compare_titles(&a.title, &b.title));
// Вывод отсортированного списка видеороликов на экран
sorted_videos
.iter()
.for_each(|video| println!("{} {}", video.title, video.id));
// Создание переменной "last_processed_video_id" типа i32 и инициализация её значением "0"
let mut last_processed_video_id: String;
// Создание параметров запроса для переупорядочивания видеороликов в альбоме
let mut reorder_videos_first_params = param! {"owner_id" => "placeholder",
"album_id" => &selected_album_id,
"video_id" => &sorted_videos[0].id.to_string(),
"before_video_id" => &get_album_videos_response["response"]["items"][0]["id"].to_string(),
"before_owner_id" => "placeholder"
};
// Выполнение запроса к VK API для переупорядочивания первого видео в альбоме
let reorder_videos_first_response = api
.request("video.reorderVideos", &mut reorder_videos_first_params)
.await
.unwrap();
println!("{}", reorder_videos_first_response);
// Сохранение ID первого видео в качестве последнего обработанного ID виде
last_processed_video_id = sorted_videos[0].id.to_string();
println!("{}", sorted_videos[0].id);
// Асинхронная задержка в течение 5 секунд
sleep(time_to_sleep);
// Переупорядочивание остальных видеороликов в альбоме
for (index, video) in sorted_videos.iter().enumerate() {
if index == 0 {
// Пропустить первый элемент (уже обработан)
continue;
}
let mut p = param! {"owner_id" => "placeholder",
"album_id" => &selected_album_id,
"video_id" => &video.id.to_string(),
"after_video_id" => &last_processed_video_id,
"after_owner_id" => "placeholder"
};
// Выполнение запроса к VK API для переупорядочивания видеоролика
let res = api.request("video.reorderVideos", &mut p).await.unwrap();
println!("{}", res);
println!("{} id:{}", video.title, video.id);
last_processed_video_id = video.id.to_string();
// Асинхронная задержка в течение 5 секунд
sleep(time_to_sleep);
}
}
let get_albums_response = api.request("video.getAlbums", &mut params).await.unwrap();
let mut items: Vec<&JsonValue> = get_albums_response["response"]["items"].members().collect();
items.sort_by(|a, b| a["title"].as_str().cmp(&b["title"].as_str()));