1+ import m3u8
2+ from core import parse
3+
4+ from . import lyrics
5+
6+ def parse_data (data ):
7+ media = {}
8+ media_list = []
9+
10+ attr = data ["attributes" ]
11+
12+ media ["coverUrl" ] = attr ["artwork" ]["url" ].format (
13+ w = attr ["artwork" ].get ("width" ),
14+ h = attr ["artwork" ].get ("height" )
15+ )
16+
17+ if "editorialVideo" in attr :
18+ if "motionDetailSquare" in attr ["editorialVideo" ]:
19+ __data = m3u8 .load (
20+ attr ["editorialVideo" ]["motionDetailSquare" ].get ("video" )
21+ )
22+
23+ streamList = []
24+
25+ for i , variants in enumerate (__data .playlists ):
26+ streamList .append (
27+ {
28+ "id" : i ,
29+ "fps" : variants .stream_info .frame_rate ,
30+ "codec" : "AVC" if "avc" in variants .stream_info .codecs else "HEVC" ,
31+ "range" : variants .stream_info .video_range ,
32+ "bitrate" : f'{ round ((variants .stream_info .average_bandwidth )/ 1000000 , 2 )} Mb/s' ,
33+ "resolution" : f'{ variants .stream_info .resolution [0 ]} x{ variants .stream_info .resolution [1 ]} ' ,
34+ "uri" : variants .uri
35+ }
36+ )
37+
38+ media ["animartwork" ] = streamList
39+
40+ dirname = parse .sanitize (
41+ "{} - {} [{}]{}{}{}" .format (
42+ attr .get ("artistName" ),
43+ attr .get ("name" ),
44+ data ["id" ],
45+ " [S]" if "Single" in attr .get ("name" ) else "" ,
46+ " [EP]" if "EP" in attr .get ("name" ) else "" ,
47+ " [E]" if attr .get ("contentRating" ) == "explicit" else ""
48+ )
49+ )
50+
51+ media ["dir" ] = dirname .replace (' - Single' , '' ).replace (' - EP' , '' )
52+
53+ a = {
54+ "copyright" : attr .get ("copyright" ),
55+ "upc" : attr .get ("upc" ),
56+ "recordlabel" : attr .get ("recordLabel" ),
57+ "trackcount" : attr .get ("trackCount" ),
58+ "album" : attr .get ("name" ),
59+ "albumartist" : attr .get ("artistName" )
60+ }
61+
62+ for item in data ["relationships" ]["tracks" ]["data" ]:
63+ attr = item .get ("attributes" )
64+
65+ filename = parse .sanitize (
66+ "{} - {}{}" .format (
67+ str (attr .get ("trackNumber" )).zfill (2 ),
68+ attr .get ("name" ),
69+ " [E]" if attr .get ("contentRating" ) == "explicit" else ""
70+ )
71+ )
72+
73+ s = {
74+ "id" : item .get ("id" ),
75+ "genre" : attr .get ("genreNames" ),
76+ "releasedate" : attr .get ("releaseDate" ),
77+ "trackno" : attr .get ("trackNumber" ),
78+ "isrc" : attr .get ("isrc" ),
79+ "composer" : attr .get ("composerName" ),
80+ "discno" : attr .get ("discNumber" ),
81+ "song" : attr .get ("name" ),
82+ "songartist" : attr .get ("artistName" ),
83+ "rating" : 4 if attr .get ("contentRating" ) == "explicit" else 0 ,
84+ "file" : filename
85+ }
86+
87+ rela = item .get ("relationships" )
88+ if not rela : rela = {}
89+
90+ if "credits" in rela :
91+ credits = rela ["credits" ].get ("data" )
92+ if credits :
93+
94+ roles = []
95+ creds = {}
96+
97+ for catagory in credits :
98+ for credit in catagory ["relationships" ]["credit-artists" ]["data" ]:
99+ for role in credit ["attributes" ]["roleNames" ]:
100+ if not role in roles :
101+ roles .append (role )
102+ creds [role ] = [credit ["attributes" ]["name" ]]
103+ else :
104+ roleArtist : list = creds [role ]
105+ roleArtist .append (credit ["attributes" ]["name" ])
106+ creds [role ] = roleArtist
107+
108+ s ["credits" ] = creds
109+
110+ if "lyrics" in rela :
111+ if rela ["lyrics" ].get ("data" ):
112+ if rela ["lyrics" ]["data" ][0 ].get ("attributes" ):
113+ s .update (
114+ lyrics .parse (
115+ rela ["lyrics" ]["data" ][0 ]["attributes" ]["ttml" ]
116+ )
117+ )
118+
119+ if item .get ("type" ) == "songs" :
120+ s ["type" ] = 1
121+ elif item .get ("type" ) == "music-videos" :
122+ s ["type" ] = 6
123+
124+ s .update (a )
125+ media_list .append (
126+ parse .opt (s )
127+ )
128+
129+ media ["tracks" ] = media_list
130+ return media
0 commit comments