استنادًا إلى youtube-dl: موسيقى VK

صورة

في عام 2020 ، نستخدم خدمات موسيقية مختلفة ، ولكن كأحد بقايا حقبة ماضية ، في ملف تعريف VK المنسي ، يمتلك الكثيرون موسيقى. لا توجد وظيفة تنزيل ، ولكن ماذا لو كنت في أمس الحاجة إلى حفظ التسجيل الصوتي؟

نظرًا لأن مثل هذا البرنامج لم يتم العثور عليه في المجال العام ، باستثناء بعض خدمات الويب التي تتطلب ترخيصًا عبر VK (وهو ليس آمنًا جدًا) ، فسننظر في عملية إنشاء أداة مساعدة ذاتية الاستضافة في C # الحديثة لتحميل الصوت الخاص بك ، والتي لا تدمج بيانات ملف التعريف إلى جهة خارجية خدمات.



إحدى قيم عمل المبرمج هي البساطة ، وإذا أمكن ، الرمز المختصر. لذلك ، سنقوم بلصق العديد من المكتبات الموجودة للحصول على الحل المطلوب.

ستعمل الأداة على النحو التالي:

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


بادئ ذي بدء ، دعونا ننشئ مستودعًا ونصف تبعيات المشروع في ملف 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>


بعد ذلك ، وبضمير مرتاح ، يمكنك البدء في كتابة التعليمات البرمجية. سنحتاج إلى إذن الأداة المساعدة في VK مع الوصول الكامل إلى ملفنا الشخصي. وكما نرى ، بفضل نظام .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;
    }
}


دعونا نصف نقطة الدخول وتصفية التسجيلات الصوتية المحملة. نحن نستخدم برامج عالية المستوى لهذا الأمر ونتحقق من صحة الوسائط في ملف Application.cs ، أثناء تهيئة واجهة برمجة التطبيقات

var vk = args.Length switch
{
    3 => LoginToVkApi(args[0], args[1]),
    _ => throw new ArgumentException("Invalid arguments. Usage:\n" +
        "  dotnet vkm [login] [password] [audio]\n" +
    )
};


جلب lemma للبحث عن تسجيل صوتي بأحرف كبيرة

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


ونستخدم Linq لجميع التسجيلات الصوتية مع إدخالها. شكر خاص ل habrauserسوبيرهاكرل طريقة للحصول على وصلة 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 مع إضافات طفيفة ووثائق التشغيل .

اتمنى لكم يوما سعيدا!



All Articles