Basado en youtube-dl: VK music

imagen

En 2020 utilizamos diferentes servicios de música, pero como reliquia de una época pasada, en el perfil olvidado de VK, muchos tienen música. No hay función de descarga, pero ¿qué sucede si necesita desesperadamente guardar la grabación de audio?

Dado que dicho software no se encontró en el dominio público, a excepción de un par de servicios web que requieren autorización a través de VK (que no es muy seguro), bajo el corte consideraremos el proceso de crear una utilidad autohospedada en C # moderno para cargar su audio, que no fusiona los datos del perfil con terceros. servicios.



Uno de los valores del trabajo de un programador es la simplicidad y, si es posible, el código conciso. Por lo tanto, pegaremos varias bibliotecas existentes para obtener la solución deseada.

La utilidad funcionará así:

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


En primer lugar, creemos un repositorio y describamos las dependencias del proyecto en un archivo 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>


Después de eso, con la conciencia tranquila, puede comenzar a escribir código. Necesitaremos autorización de la utilidad en VK con acceso completo a nuestro perfil. Y como podemos ver, gracias al ecosistema .NET, es increíblemente fácil hacer esto:

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


Describamos el punto de entrada y el filtro de las grabaciones de audio cargadas. Usamos programas de nivel superior para esto y validamos los argumentos directamente en el archivo Application.cs, mientras inicializamos la 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" +
    )
};


Llevar el lema para buscar una grabación de audio a mayúsculas

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


Y usamos Linq para todas las grabaciones de audio con su entrada. Un agradecimiento especial a habrauserSuperHackerVkpara obtener un enlace mp3 con un archivo .

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, todo lo que queda es cargar el audio encontrado:

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


¡Eso es todo! La utilidad está escrita y lista para uso personal. Se nota cómo C # se está convirtiendo cada vez más en una buena multiherramienta cada año que le permite resolver cualquier rango de tareas. Las extensiones a las capacidades sintácticas que parecen saturar el lenguaje cuando se anuncian, en la práctica, por el contrario, le permiten acortar el código y hacerlo simple y comprensible.



Un repositorio en GitHub con adiciones menores y documentación de lanzamiento .

¡Tengan todos un buen día!



All Articles