Русский
Русский
English
Статистика
Реклама

Из песочницы По мотивам youtube-dl C 9 и музыка ВК

image
В 2020ом мы пользуемся разными музыкальными сервисами, но как реликт ушедшей эпохи, в забытом профиле ВК, у многих хранится музыка. Функции для загрузки нет, но что если позарез нужно спасти аудиозапись?
Под катом рассмотрен процесс создания self-hosted утилиты для загрузки своих аудио, не сливающей данные профиля сторонним сервисам и демонстрирующей мощь экосистемы современного и кроссплатформенного .NET.

Работать утилита будет так:
 dotnet vkm [login] [password] [audio-lemma]

Перво-наперво создадим репозиторий и опишем в одном файле csproj зависимости проекта
<Project Sdk="Microsoft.NET.Sdk">    <PropertyGroup>        <!--Утилита будет работать из консоли-->        <OutputType>Exe</OutputType>        <TargetFramework>netcoreapp3.1</TargetFramework>        <!--Строго запрещаем null -->        <Nullable>enable</Nullable>        <TreatWarningsAsErrors>true</TreatWarningsAsErrors>        <!--И включаем C# 9 -->        <LangVersion>9</LangVersion>    </PropertyGroup>    <ItemGroup>        <!--Зависимость от VK API без необходимости вручную получать токен-->        <PackageReference Include="VkNet" Version="1.56.0" />        <!--Доступ к своим сообщениям, комментариям и музыке-->        <PackageReference Include="VkNet.AudioBypassService" Version="1.7.0" />    </ItemGroup></Project>

После этого с чистой совестью можно приступать к написанию кода. Нам потребуется авторизация утилиты в ВК с полным доступом к своему профилю. И как мы видим, благодаря экосистеме .NET, сделать это невероятно просто:
static class Vk{    internal static VkApi LoginToVkApi(string login, string password)    {        // Включаем доступ к своим сообщениям, комментариям и аудиозаписям        var api = new VkApi(new ServiceCollection().AddAudioBypass());        api.Authorize(new ApiAuthParams        {             ApplicationId = 1980660,            Login = login,             Password = password,             Settings = All         });        $"Login as vk.com/id{api.UserId}".Println(DarkBlue);        return api;    }}

Опишем точку входа и фильтр загружаемых аудиозаписей. Используем для этого top-level programs и прямо в файле Application.cs валидируем аргументы, одновременно инициализируя api
var vk = args.Length switch{    3 => LoginToVkApi(args[0], args[1]),    _ => throw new ArgumentException("Invalid arguments. Usage:\n" +        "  dotnet vkm [login] [password] [audio]\n" +    )};

Приводим лемму для поиска аудиозаписи к upper-case
var lemma = args.Last().ToUpperInvariant();

И грепаем с помощью Linq все аудиозаписи с её вхождением. Отдельное спасибо хабраюзеру SuperHackerVk за способ получения mp3-ссылки регуляркой.
var audios = vk.Audio.Get(new AudioGetParams { Count = 6000 })    .Where(x => x.Title.ToUpperInvariant().Contains(lemma))    .Select(x => (x.Title, Url: Regex.Replace(        x.Url.ToString(),        @"/[a-zA-Z\d]{6,}(/.*?[a-zA-Z\d]+?)/index.m3u8()",        @"$1$2.mp3"    )));

Наконец остается только загрузить свои найденные аудио:
using var http = new HttpClient();foreach (var (title, url) in audios){    $"Downloading {title}...".Println(DarkBlue);    await WriteAllBytesAsync($"{title}.mp3", await http.GetByteArrayAsync(url));}

Вот и все! Утилита написана и готова к использованию в личных целях. Заметно как C# с каждым годом все больше превращается в хороший мультитул, позволяющий решать любой спектр задач. Расширения синтаксических возможностей которые при анонсах кажутся загромождающими язык, на практике напротив, позволяют сократить код и сделать его простым и понятным.

Репозиторий на GitHub c небольшими дополнениями и документацией по запуску.
Всем удачного дня!
Источник: habr.com
К списку статей
Опубликовано: 28.10.2020 06:04:03
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Программирование

Net

Вконтакте api

C

Msbuild

Вконтакте

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru