@@ -143,6 +143,102 @@ def get_song_info(self, song_id, quality=4):
143143 return None
144144
145145
146+ class XcvtsApi :
147+ """小尘API - 波点音乐点歌接口,作为备用音源"""
148+
149+ def __init__ (self ):
150+ self .desc = "小尘API(波点音乐)"
151+ self .base_url = "https://api.xcvts.cn/api/music/bdyy"
152+ self .default_quality = "320kmp3"
153+
154+ def search_and_get_url (self , keyword , quality = None ):
155+ """
156+ 通过关键词搜索歌曲并获取音频URL
157+
158+ 参数:
159+ keyword: 搜索关键词(歌名/歌手名)
160+ quality: 音质,可选值: 20201kmflac, 2000kflac, 320kmp3, 128kmp3, 48kaac, 192kogg, 100kogg
161+ 返回:
162+ dict: {'name', 'artist', 'cover', 'play_url', 'lrc'} 或 None
163+ """
164+ params = {
165+ 'msg' : keyword ,
166+ 'n' : 1 ,
167+ 'type' : 'json' ,
168+ }
169+ if quality :
170+ params ['br' ] = quality
171+ else :
172+ params ['br' ] = self .default_quality
173+
174+ try :
175+ response = requests .get (self .base_url , params = params , timeout = 15 )
176+ response .raise_for_status ()
177+ data = response .json ()
178+
179+ if data .get ('code' ) != 200 :
180+ print (f"小尘API错误: { data } " )
181+ return None
182+
183+ song_data = data .get ('data' )
184+ if not song_data or not song_data .get ('play_url' ):
185+ print ("小尘API: 未获取到有效的音频URL" )
186+ return None
187+
188+ return song_data
189+
190+ except requests .exceptions .RequestException as e :
191+ print (f"小尘API请求失败: { e } " )
192+ return None
193+
194+ def get_lyrics (self , keyword ):
195+ """
196+ 通过关键词获取歌词
197+
198+ 参数:
199+ keyword: 搜索关键词
200+ 返回:
201+ str: 歌词文本,失败返回 None
202+ """
203+ params = {
204+ 'msg' : keyword ,
205+ 'n' : 1 ,
206+ 'type' : 'lyric' ,
207+ }
208+ try :
209+ response = requests .get (self .base_url , params = params , timeout = 15 )
210+ response .raise_for_status ()
211+ return response .text
212+ except requests .exceptions .RequestException as e :
213+ print (f"小尘API歌词请求失败: { e } " )
214+ return None
215+
216+ def get_mp3_data (self , keyword , quality = None ):
217+ """
218+ 通过关键词搜索并下载音频数据
219+
220+ 参数:
221+ keyword: 搜索关键词
222+ quality: 音质
223+ 返回:
224+ tuple: (is_success, audio_response, song_data_or_none)
225+ """
226+ song_data = self .search_and_get_url (keyword , quality )
227+ if not song_data :
228+ return False , None , None
229+
230+ audio_url = song_data .get ('play_url' )
231+ try :
232+ audio_response = requests .get (audio_url , timeout = 30 )
233+ content_type = audio_response .headers .get ('Content-Type' , '' )
234+ if 'text/html' in content_type or audio_response .status_code != 200 :
235+ return False , None , None
236+ return True , audio_response , song_data
237+ except requests .exceptions .RequestException as e :
238+ print (f"小尘API下载失败: { e } " )
239+ return False , None , None
240+
241+
146242if __name__ == '__main__' :
147243 api = NCMApi ()
148244 # playlist_id = input("Playlist id: ")
0 commit comments