123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- using BeatLyrics.Tool.DataProvider.OnlineLyric.Models;
- using BeatLyrics.Tool.Models;
- using Newtonsoft.Json;
- using System;
- using System.Linq;
- namespace BeatLyrics.Tool.DataProvider.OnlineLyric
- {
- public class NeteaseCloudMusicLyricProvider : LyricProvider
- {
- public override LyricSearchResultItem[] Search(string songName, string artist)
- {
- var url = $"https://music.163.com/api/search/get/web?hlposttag=&s={songName} {artist}&type=1&offset=0&total=true&limit=20";
- var wc = new System.Net.WebClient { Encoding = System.Text.Encoding.UTF8 };
- var json = wc.DownloadString(url);
- var parsed = JsonConvert.DeserializeAnonymousType(json, new
- {
- result = new
- {
- songs = new[]
- {
- new
- {
- id = 0,
- name = (string) null,
- duration=0,
- artists = new[]
- {
- new
- {
- name = (string) null,
- }
- },
- alias=(string[])null,
- }
- },
- }
- });
- var arr = parsed.result.songs.Select(p => new LyricSearchResultItem(nameof(NeteaseCloudMusicLyricProvider))
- {
- Id = p.id.ToString(),
- Name = p.name,
- Artists = string.Join(";", p.artists.Select(q => q.name)),
- Duration = p.duration,
- Remarks = string.Join(Environment.NewLine, p.alias)
- }).ToArray();
- return arr;
- }
- public override bool GetDetail(LyricSearchResultItem input)
- {
- if (input.ProviderName != nameof(NeteaseCloudMusicLyricProvider)) throw new ArgumentException("Provider no matched");
- var url = $"https://music.163.com/api/song/lyric?id={input.Id}&lv=1&kv=1&tv=1";
- var wc = new System.Net.WebClient { Encoding = System.Text.Encoding.UTF8 };
- var json = wc.DownloadString(url);
- var obj = JsonConvert.DeserializeAnonymousType(json, new
- {
- lrc = new
- {
- lyric = (string)null
- },
- klyric = new
- {
- lyric = (string)null
- },
- tlyric = new
- {
- lyric = (string)null
- }
- });
- if (string.IsNullOrWhiteSpace(obj.lrc?.lyric)) return false;
- input.DetailsText = obj.lrc.lyric;
- input.Details = ParseLrc(obj.lrc.lyric, input.Duration);
- if (input.Details.Count == 0)
- {
- var lines = obj.lrc.lyric.Split('\r', '\n');
- var pos = 0;
- var step = 1000;
- var len = 500;
- input.Details.Add(new LyricDetailExt
- {
- Text = "** Warning: Only text found **",
- DurationMs = len,
- TimeMs = pos,
- });
- pos += step;
- foreach (var line in lines)
- {
- if (string.IsNullOrWhiteSpace(line)) continue;
- input.Details.Add(new LyricDetailExt
- {
- Text = line,
- DurationMs = len,
- TimeMs = pos,
- });
- pos += step;
- }
- }
- if (false == string.IsNullOrWhiteSpace(obj.tlyric?.lyric))
- {
- input.DetailsTranslatedText = obj.tlyric.lyric;
- input.DetailsTranslated = ParseLrc(obj.tlyric.lyric, input.Duration);
- }
- input.IsDetailsLoaded = true;
- return true;
- }
- }
- }
|