كل المقالات

· Casimiro Ferreira· 5 دقيقة قراءة

نقدّم لكم أدوات استخلاص قواعد بيانات الموسيقى

  • Scrapers
  • Media Metadata
  • Music
  • Python
  • FOSS

واجهة واحدة لكامل الويب الموسيقي

الويب الموسيقي مجزّأٌ عبر مواقع مستقلة كثيرة. فـ Bandcamp يبيعك ملف FLAC ورخصة Creative Commons؛ و SoundCloud يبثّ ريمكسًا لا يستضيفه أحدٌ سواه؛ و SomaFM يدير مجموعة من قنوات الراديو المدعومة من المستمعين؛ وثمة عدد من المواقع التي يديرها المجتمع تحتفظ بموسوعات مُنسَّقة للروك التقدّمي والجاز والكلاسيكية والميتال. لكل موقع ترميزه الخاص، ونزواته الخاصة، وتصوّره الخاص لِما يعنيه أصلًا مصطلح “المقطوعة”.

نحن نصون عائلة من عملاء بايثون الصغيرة المركّزة مفتوحة المصدر التي تُروّض تلك الفوضى. وكلٌّ منها يفعل الشيء نفسه من حيث الجوهر: يمدّ يده إلى مصدر موسيقي ويعيد إليك نماذج بيانات وصفية للوسائط مُصنَّفة — كائنات مُتحقَّق منها بدلًا من قواميس هشّة — كي لا يضطر بقية شيفرتك مطلقًا إلى الاكتراث بالموقع الذي جاءت منه البيانات. سبعة من التسعة منشورة على PyPI؛ والاثنان الآخران يُثبَّتان مباشرةً من GitHub. وكلّها تتكلّم المفردات نفسها.

وإليك الجولة.

البثّ والراديو

py_bandcamp يستخلص بيانات Bandcamp: يبحث في المقطوعات والألبومات والفنانين وشركات الإنتاج؛ ويتصفّح حسب وسم النوع الموسيقي؛ ويجلب التوصيات والفنانين ذوي الصلة انطلاقًا من بذرة؛ ويستخرج عنوان MP3 قابلًا للبثّ. تعيد عمليات البحث كائنات Release مُصنَّفة تحمل العنوان والغلاف والأنواع والاعتمادات — والأهم بالنسبة إلى ذوي العقلية المؤيّدة لـ FOSS — حقلَ رخصةٍ على نمط SPDX مع فحص is_open() كي تستطيع التمييز بين إصدار Creative Commons وإصدار محفوظ الحقوق بالكامل. وتُملأ قائمة المقطوعات المرتّبة عند الطلب عبر تحويل ألبومٍ كامل الدقّة.

nuvem_de_som هو عميلنا لـ SoundCloud، وهو مِطواة الجيش السويسري في هذا اللفيف. ثلاث خلفيات مستقلة — خلفية API غنية بالبيانات الوصفية، ومستخلِص HTML بلا تبعيات، وخلفية yt-dlp — تقبع خلف منسّقٍ واحد يتراجع بسلاسة من واحدةٍ إلى التالية. يبحث في المقطوعات والأشخاص، ويحلّ عناوين البثّ المباشرة (التدرّجية أو HLS)، ويُنزّل المقطوعات وقوائم التشغيل بأكملها، بل ويأتي مع تطبيق طرفية، nds، للبحث والتشغيل من سطر الأوامر. وتعود الإصدارات مع الترميز (codec)، ومعدّل البِت، والأنواع، والبلد، ورخصة SPDX، وقوائم المقطوعات الكاملة.

radiosoma يغلّف واجهة القنوات العامة لـ SomaFM. فـ SomaFM هي الطرف الودود المفتوح الواجهة من الطيف، والعميل يُنمذجها بنظافة: كل قناة هي عملٌ واحد، وكل ترميز بثّ — AAC بمعدّل 130 kbps، و MP3 بمعدّل 256 kbps، و HE-AAC بمعدّلَي 64 و32 kbps — يصير Release خاصًّا به لتلك القناة، كي يستطيع المستهلِك انتقاء الأنسب وإزالة التكرار حسب الهوية. وتظهر تغذية المقطوعات الحديثة كجدولٍ مرتّبٍ لِما كان يُبثّ.

tunein هو عميل TuneIn غير رسمي لمحطات الراديو الخطّي و IPTV حول العالم. يعيد مسارٌ سريعٌ حمولة البحث فقط؛ بينما تملأ استدعاءُ إثراءٍ اختياري النوع واللغة والبلد ورمز النداء والشعار. وبما أنّ TuneIn يعيد عناوين بثّ متعددة لكل محطة — بمعدّلات بِت ومرايا وبروتوكولات مختلفة — فإن كلًّا منها يصير Release خاصًّا به، مانحًا المستهلِك مجددًا حرية الاختيار عند التشغيل. وتمنحك واجهة CLI صغيرة مخرجاتٍ في هيئة جدول أو JSON.

pyheartradio يتحدث مع واجهة iHeartRadio العامة — بلا مفتاح، بلا حساب. يبحث في المحطات والبودكاست والفنانين والمقطوعات وقوائم التشغيل؛ ويسترجع حلقات البودكاست مع عناوين بثّ صوتية مباشرة؛ ويعتمد على جلب التفاصيل المتوازي كي تجري عمليات البحث عن المحطات والفنانين بالتزامن. ويوفّر كلُّ نموذجٍ المساعِدَين to_external_ids() وto_signals() للاندماج المباشر في خط أنابيب بيانات وصفية مُصنَّف.

الموسوعات والأرشيفات الموسيقية

يستهدف النصف الثاني من العائلة الفهارس المجتمعية الكبرى.

pyprogarchives (Prog Archives)، و**pyjazzmusicarchives** (Jazz Music Archives) — وكلاهما يُثبَّت مباشرةً من مستودعه على GitHub لا من PyPI — و**pyclassicalarchives** (Classical Archives) تتقاسم هيئةً شبه متطابقة: تصفّح الفهرس الأبجدي من A إلى Z، والبحث بالاسم، وجلب صفحة فنان أو ملحّن كاملة مع سيرة ذاتية وبلد وديسكوغرافيا مُقيَّمة من الأعضاء. يستخلص Prog و Jazz Archives بيانات HTML؛ بينما يغلّف Classical Archives واجهة JSON عامة ويكشف ألبومات الملحّن و شجرة أعمالٍ مُسطَّحة تعاوديًّا. ويحمل كلُّ نموذجٍ المعرّف القانوني المستقر للموقع عبر to_external_ids_dict()، وهو تمامًا ما تحتاجه للربط المتبادل بين فهرسٍ وآخر.

pymetal هو عميلنا لـ Encyclopaedia Metallum، أي Metal Archives — وهو الأكثر طموحًا في المجموعة. تُسطّح معظم أدوات الاستخلاص المقطوعة إلى (id, title, band, album). لكن pymetal يرفض أن يفقد ما تحتفظ به Metal Archives منفصلًا: فقد تنسب المقطوعة الفضل إلى فرقٍ متعددة (تقسيمات، تعاونات)، وتشكيلة الفرقة مُقطَّعة عبر الزمن، وقد تظهر المقطوعة في إصدارات عديدة (تجميعات، إعادات إصدار، أغانٍ منفردة). وهو يُنمذج كلًّا منها ككيان من الدرجة الأولى مُفهرَس بمعرّف الأرشيف، كي تكون عمليات إعادة الاستخلاص عديمة الأثر التراكمي (idempotent). ومساحة نقاط الوصول واسعة — بحث متقدّم عن الفرق/الألبومات/الأغاني، وصفحات إصدار كاملة مع نسبةٍ لكل فرقة في التقسيمات، وتشكيلات مقسّمة حسب الحالة مع مجالات تواريخ الأدوار، ومراجعات، وتوصيات، وروابط خارجية، وكلمات — كلّها كنماذج Pydantic v2 تقوم برحلة ذهاب وإياب عبر JSON.

وإلى ما وراء الموسيقى، يستخلص tutubo بيانات YouTube و YouTube Music، ويغطّي pymal موقع MyAnimeList — موسّعًا أنماط البيانات الوصفية المُصنَّفة نفسها عبر فئات وسائط أوسع. وكلّها تُصدر المفردات نفسها كي يتعامل مستهلِكٌ واحدٌ في المصبّ مع كل شيء بصورة موحّدة.

مبنيّة لوصول ممتثِل ومنخفض الحجم

تجلب هذه العملاء صفحات الفهرس العامة فقط، بأحجام طلبات منخفضة، وتتحقق من robots.txt كلّ موقع قبل الاستخلاص — انظر مقالة robots.txt وخرائط المواقع لمعرفة كيف تعمل خطوة الاستطلاع هذه. عبر العائلة كلّها، طبقة HTTP قابلة للتوصيل (pluggable): تستخدم العملاء افتراضيًّا طبقة نقل تطابق مصافحة TLS الخاصة بها مصافحةَ متصفّح حقيقي (curl_cffi مطابقًا لبصمات TLS/JA3 الخاصة بـ Chrome)، كي لا تُصنَّف أنظمة الكشف المضبوطة لمواجهة الإساءة المُسكربة عميلًا حسن السلوك على أنه أتمتة خبيثة. ويمكن للموسوعات المحميّة بـ Cloudflare إضافةً إلى ذلك أن تُوجَّه عبر نسخة FlareSolverr للبيانات الحيّة، أو أن تقرأ من Wayback Machine التابع لـ Internet Archive كبديل احتياطي. وطبقة التحليل مستقلّة عمدًا عن كيفية وصول HTML، ولذا تعمل الشيفرة نفسها أيًّا كانت طبقة النقل التي تختارها.

فهرس موسيقي متعدّد المصادر

المردود الحقيقي هو ما يحدث حين تكفّ عن التفكير في هذه بوصفها تسع أدواتٍ منفصلة. فلأنها جميعًا تُصدر مفردات البيانات الوصفية المُصنَّفة نفسها وتكشف جميعها معرّفات خارجية قانونية، يمكنك أن تنشر فنانًا واحدًا عبر Bandcamp و SoundCloud وأدلّة الراديو والموسوعات، ثم تطوي النتائج في فهرسٍ متماسكٍ واحد — مُزال التكرار حسب الهوية، ومدرِكًا للرخص، وجاهزًا لتغذية محرّك توصية، أو خادم وسائط، أو مجموعة بيانات بحثية.

كلٌّ من هؤلاء العملاء برمجيةٌ حرّة، قابلة للاستضافة الذاتية، وتعمل على عتادك الخاص من دون الحاجة إلى أي مفتاح API. اختر المصدر الذي يهمّك: نفّذ pip install إذا كان على PyPI، أو pip install git+https://github.com/TigreGotico/<repo> لـ pyprogarchives و pyjazzmusicarchives، وهما متاحان على GitHub فقط — وابدأ البناء.

جميع أدوات الاستخلاص تعمل فوق جلسات requests القابلة للتركيب والجاهزة للاستخدام لدينا. ويُصدر عملاء البثّ والراديو مخطط mediavocab مباشرةً، ويكشف كلُّ عميلٍ معرّفات خارجية قانونية، كي تندمج البيانات الوصفية الموسيقية مع media-archivist، مُفهرِسنا متعدّد المصادر وخادم البيانات الوصفية المُزيل للتكرار.