पूरे संगीत-जगत के लिए एक ही इंटरफ़ेस
संगीत का वेब कई स्वतंत्र साइटों में बिखरा हुआ है। Bandcamp आपको एक FLAC और एक Creative Commons लाइसेंस बेचता है; SoundCloud एक ऐसा रीमिक्स स्ट्रीम करता है जिसे और कोई होस्ट नहीं करता; SomaFM श्रोता-समर्थित रेडियो चैनलों का एक समूह चलाता है; और कई समुदाय-संचालित साइटें प्रोग्रेसिव रॉक, जैज़, शास्त्रीय और मेटल के क्यूरेट किए गए विश्वकोश संजोकर रखती हैं। हर साइट की अपनी मार्कअप है, अपनी विचित्रताएँ हैं, और इस बात का अपना विचार है कि “ट्रैक” आख़िर होता क्या है।
हम छोटे, केंद्रित, ओपन-सोर्स पायथन क्लाइंट्स का एक परिवार बनाए रखते हैं जो इस अव्यवस्था को काबू में लाता है। इनमें से हर एक मूल रूप से एक ही काम करता है: यह किसी संगीत स्रोत तक पहुँचता है और आपको वापस टाइप्ड मीडिया-मेटाडेटा मॉडल सौंपता है — भंगुर डिक्शनरियों के बजाय सत्यापित ऑब्जेक्ट — ताकि आपके बाकी कोड को कभी परवाह न करनी पड़े कि डेटा किस साइट से आया। नौ में से सात PyPI पर प्रकाशित हैं; बाक़ी दो सीधे GitHub से इंस्टॉल होते हैं। सभी एक ही शब्दावली बोलते हैं।
यह रही एक झलक।
स्ट्रीमिंग और रेडियो
py_bandcamp Bandcamp को स्क्रेप करता है: ट्रैक, एल्बम, कलाकार और लेबल खोजें; जॉनर टैग से ब्राउज़ करें; किसी सीड से सिफ़ारिशें और संबंधित कलाकार खींचें; और एक स्ट्रीम करने योग्य MP3 URL निकालें। खोजें टाइप्ड Release ऑब्जेक्ट लौटाती हैं जो शीर्षक, आर्टवर्क, जॉनर, क्रेडिट, और — FOSS-प्रेमियों के लिए ख़ासतौर पर अहम — एक SPDX-शैली का लाइसेंस फ़ील्ड लिए होते हैं, जिसमें is_open() जाँच होती है ताकि आप एक Creative Commons रिलीज़ को all-rights-reserved रिलीज़ से अलग बता सकें। एक पूर्ण-विश्वसनीयता वाला एल्बम रूपांतरण माँगने पर क्रमबद्ध ट्रैकलिस्ट भर देता है।
nuvem_de_som हमारा SoundCloud क्लाइंट है, और इस समूह का स्विस-आर्मी चाकू है। तीन स्वतंत्र बैकएंड — एक मेटाडेटा-समृद्ध API बैकएंड, एक निर्भरता-रहित HTML स्क्रेपर, और एक yt-dlp बैकएंड — एक ऑर्केस्ट्रेटर के पीछे बैठते हैं जो सहजता से एक से अगले पर fall back करता है। यह ट्रैक और लोगों को खोजता है, सीधे स्ट्रीम URL (progressive या HLS) हल करता है, ट्रैक और पूरी प्लेलिस्ट डाउनलोड करता है, और यहाँ तक कि कमांड लाइन से खोजने और चलाने के लिए एक टर्मिनल ऐप, nds, भी साथ लाता है। रिलीज़ कोडेक, बिटरेट, जॉनर, देश, SPDX लाइसेंस, और पूरी सेट ट्रैकलिस्ट के साथ लौटती हैं।
radiosoma SomaFM की सार्वजनिक चैनल API को लपेटता है। SomaFM स्पेक्ट्रम का मित्रवत, खुली-API वाला छोर है, और क्लाइंट इसे साफ़-सुथरे ढंग से मॉडल करता है: प्रत्येक चैनल एक कृति है, और प्रत्येक स्ट्रीम एन्कोडिंग — 130 kbps AAC, 256 kbps MP3, 64 और 32 kbps HE-AAC — उस चैनल का अपना Release बन जाता है, ताकि उपभोक्ता सबसे उपयुक्त चुन सके और पहचान के आधार पर डुप्लिकेट हटा सके। recent-tracks फ़ीड इस बात का सुथरा शेड्यूल दिखाती है कि क्या-क्या बज रहा था।
tunein दुनिया के लीनियर रेडियो और IPTV स्टेशनों के लिए एक अनौपचारिक TuneIn क्लाइंट है। एक तेज़ पथ केवल खोज-पेलोड लौटाता है; एक opt-in enrichment कॉल जॉनर, भाषा, देश, कॉल-साइन, और स्लोगन भर देता है। चूँकि TuneIn प्रति स्टेशन कई स्ट्रीम URL लौटाता है — अलग-अलग बिटरेट, मिरर, और प्रोटोकॉल — हर एक अपना Release बन जाता है, फिर से उपभोक्ता को प्लेबैक के समय चुनने देता है। एक छोटी CLI आपको टेबल या JSON आउटपुट देती है।
pyheartradio iHeartRadio की सार्वजनिक API से बात करता है — कोई key नहीं, कोई अकाउंट नहीं। स्टेशन, पॉडकास्ट, कलाकार, ट्रैक, और प्लेलिस्ट खोजें; सीधे ऑडियो स्ट्रीम URL के साथ पॉडकास्ट एपिसोड प्राप्त करें; और समानांतर विवरण-फ़ेच पर भरोसा करें ताकि स्टेशन और कलाकार लुकअप एकसाथ चलें। हर मॉडल एक टाइप्ड मेटाडेटा पाइपलाइन में सीधे बैठाने के लिए to_external_ids() और to_signals() हेल्पर देता है।
संगीत विश्वकोश और अभिलेखागार
इस परिवार का दूसरा भाग महान सामुदायिक कैटलॉग को लक्षित करता है।
pyprogarchives (Prog Archives), pyjazzmusicarchives (Jazz Music Archives) — दोनों PyPI के बजाय सीधे अपने GitHub रिपॉज़िटरी से इंस्टॉल होते हैं — और pyclassicalarchives (Classical Archives) की बनावट लगभग एक-जैसी है: A–Z इंडेक्स ब्राउज़ करें, नाम से खोजें, और जीवनी, देश, और सदस्य-रेटेड डिस्कोग्राफ़ी के साथ एक पूरा कलाकार या संगीतकार पृष्ठ लाएँ। Prog और Jazz Archives HTML स्क्रेप करते हैं; Classical Archives एक सार्वजनिक JSON API को लपेटता है और किसी संगीतकार के एल्बम और एक पुनरावर्ती रूप से समतल की गई कृतियों की वृक्ष-संरचना उजागर करता है। हर मॉडल to_external_ids_dict() के ज़रिए साइट की स्थिर कैनोनिकल id ले जाता है, जो ठीक वही है जो एक कैटलॉग को दूसरे के साथ क्रॉस-रेफ़रेंस करने के लिए चाहिए।
pymetal Encyclopaedia Metallum, यानी Metal Archives के लिए हमारा क्लाइंट है — और इस समूह में सबसे महत्वाकांक्षी। ज़्यादातर स्क्रेपर एक ट्रैक को (id, title, band, album) में समतल कर देते हैं। pymetal उस चीज़ को खोने से इनकार करता है जिसे Metal Archives अलग रखता है: एक ट्रैक कई बैंडों को श्रेय दे सकता है (splits, collaborations), किसी बैंड की लाइनअप समय के अनुसार विभाजित होती है, और एक ट्रैक कई रिलीज़ों पर आ सकता है (संकलन, पुनःसंस्करण, सिंगल्स)। यह हर एक को archive id से कुंजीबद्ध एक प्रथम-श्रेणी entity के रूप में मॉडल करता है, ताकि पुनः-स्क्रेप idempotent रहें। endpoint की सतह विस्तृत है — उन्नत बैंड/एल्बम/गीत खोज, splits पर प्रति-बैंड श्रेय के साथ पूर्ण रिलीज़ पृष्ठ, role-date रेंज के साथ स्थिति-अनुसार विभाजित लाइनअप, समीक्षाएँ, सिफ़ारिशें, बाहरी लिंक, और बोल — सब Pydantic v2 मॉडल के रूप में जो JSON से होकर round-trip करते हैं।
संगीत से परे, tutubo YouTube और YouTube Music को स्क्रेप करता है, और pymal MyAnimeList को कवर करता है — वही टाइप्ड मेटाडेटा पैटर्न व्यापक मीडिया श्रेणियों तक बढ़ाते हुए। सभी एक ही शब्दावली उत्सर्जित करते हैं ताकि एक अकेला डाउनस्ट्रीम उपभोक्ता सब कुछ एकसमान ढंग से संभाल ले।
अनुपालनशील, कम-मात्रा वाली पहुँच के लिए बना
ये क्लाइंट केवल सार्वजनिक कैटलॉग पेज लाते हैं, कम अनुरोध मात्रा पर, और स्क्रैप करने से पहले हर साइट के robots.txt की जाँच करते हैं — देखें
robots.txt और sitemaps वाली पोस्ट
यह देखने के लिए कि यह टोह लेने वाला चरण कैसे काम करता है। पूरे परिवार में HTTP परत प्लग करने योग्य है: डिफ़ॉल्ट रूप से क्लाइंट एक ऐसा ट्रांसपोर्ट इस्तेमाल करते हैं जिसका TLS हैंडशेक असली ब्राउज़र से मेल खाता है (curl_cffi, Chrome के TLS/JA3 से मेल खाता हुआ), ताकि एक शिष्ट क्लाइंट को स्क्रिप्टेड दुरुपयोग के लिए ट्यून किए गए डिटेक्शन सिस्टम द्वारा दुर्भावनापूर्ण स्वचालन के रूप में ग़लत वर्गीकृत न किया जाए। Cloudflare-संरक्षित विश्वकोश अतिरिक्त रूप से जीवित डेटा के लिए एक FlareSolverr इंस्टेंस से होकर मार्ग बना सकते हैं, या एक फ़ॉलबैक के रूप में Internet Archive की Wayback Machine से पढ़ सकते हैं। पार्सिंग परत जानबूझकर इससे स्वतंत्र है कि HTML कैसे आता है, ताकि वही कोड काम करे चाहे आप कोई भी ट्रांसपोर्ट चुनें।
एक क्रॉस-सोर्स म्यूज़िक कैटलॉग
असली फ़ायदा तब मिलता है जब आप इन्हें नौ अलग-अलग औज़ारों के रूप में सोचना बंद करते हैं। चूँकि वे सभी एक ही टाइप्ड मेटाडेटा शब्दावली उत्सर्जित करते हैं और सभी कैनोनिकल बाहरी id उजागर करते हैं, आप एक अकेले कलाकार को Bandcamp, SoundCloud, रेडियो निर्देशिकाओं, और विश्वकोशों में फैला सकते हैं, फिर परिणामों को एक सुसंगत कैटलॉग में समेट सकते हैं — पहचान से डी-डुप्लिकेट, लाइसेंस-सचेत, और किसी सिफ़ारिश इंजन, मीडिया सर्वर, या शोध डेटासेट को खिलाने के लिए तैयार।
इनमें से हर क्लाइंट मुफ़्त सॉफ़्टवेयर है, स्वयं-होस्ट करने योग्य है, और आपके अपने हार्डवेयर पर चलता है, जिसके लिए किसी API key की आवश्यकता नहीं। जिस स्रोत की आपको परवाह है उसे चुनें: यदि वह PyPI पर है तो pip install करें, या pyprogarchives और pyjazzmusicarchives के लिए — जो केवल GitHub पर हैं — pip install git+https://github.com/TigreGotico/<repo> करें, और बनाना शुरू करें।
सभी स्क्रेपर हमारे कंपोज़ेबल, ड्रॉप-इन requests सेशन्स का उपयोग करते हैं। स्ट्रीमिंग और रेडियो क्लाइंट सीधे mediavocab स्कीमा उत्सर्जित करते हैं, और हर क्लाइंट कैनोनिकल बाहरी id उजागर करता है, ताकि संगीत मेटाडेटा media-archivist के साथ एकीकृत हो — जो हमारा क्रॉस-सोर्स इंडेक्सर और डी-डुप्लिकेट करने वाला मेटाडेटा सर्वर है।