Baseado em youtube-dl: VK music

imagem

Em 2020, utilizamos diversos serviços de música, mas como relíquia de uma época passada, no esquecido perfil VK, muitos têm música. Não há função de download, mas e se você precisar desesperadamente salvar a gravação de áudio?

Como tal software não foi encontrado em domínio público, exceto por alguns serviços da web que requerem autorização via VK (o que não é muito seguro), a seguir consideraremos o processo de criação de um utilitário auto-hospedado em C # moderno para enviar seu áudio, que não mescla dados de perfil a terceiros Serviços.



Um dos valores do trabalho do programador é a simplicidade e, se possível, a concisão do código. Portanto, iremos colar várias bibliotecas existentes para obter a solução desejada.

O utilitário funcionará assim:

 dotnet vkm [login] [password] [audio-lemma]


Em primeiro lugar, vamos criar um repositório e descrever as dependências do projeto em um arquivo csproj

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <!--    -->
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <!--  null   ,    NRE -->
        <Nullable>enable</Nullable>
        <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
        <!--  C# 9     top-level   -->
        <LangVersion>9</LangVersion>
    </PropertyGroup>
    <ItemGroup>
        <!--  VK API     -->
        <PackageReference Include="VkNet" Version="1.56.0" />
        <!--   ,   -->
        <PackageReference Include="VkNet.AudioBypassService" Version="1.7.0" />
    </ItemGroup>
</Project>


Depois disso, com a consciência limpa, você pode começar a escrever códigos. Precisaremos de autorização do utilitário em VK com acesso total ao nosso perfil. E, como podemos ver, graças ao ecossistema .NET, é incrivelmente fácil fazer isso:

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;
    }
}


Vamos descrever o ponto de entrada e o filtro das gravações de áudio carregadas. Usamos programas de nível superior para isso e validamos os argumentos diretamente no arquivo Application.cs, ao inicializar a 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" +
    )
};


Trazendo o lema para procurar uma gravação de áudio em maiúsculas

var lemma = args.Last().ToUpperInvariant();


E usamos o Linq para todas as gravações de áudio com sua entrada. Agradecimentos especiais para habrauserSuperHackerVkpara obter um link de mp3 com um regular .

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"
    )));


Finalmente, tudo o que resta é fazer o upload do áudio encontrado:

using var http = new HttpClient();
foreach (var (title, url) in audios)
{
    $"Downloading {title}...".Println(DarkBlue);
    await WriteAllBytesAsync($"{title}.mp3", await http.GetByteArrayAsync(url));
}


Isso é tudo! O utilitário está escrito e pronto para uso pessoal. É notável como o C # está se transformando cada vez mais em uma boa ferramenta multifuncional a cada ano que permite resolver qualquer variedade de tarefas. Aprimoramentos nos recursos sintáticos que parecem confundir a linguagem quando anunciados, na prática, ao contrário, permitem encurtar o código e torná-lo simples e compreensível.



Repositório GitHub com pequenas adições e documentação de lançamento .

Tenha um ótimo dia a todos!



All Articles