Skip to content

Commit 923dfca

Browse files
author
ronie
committed
[script.cu.lrclyrics] 6.7.1
1 parent 1b1e3de commit 923dfca

File tree

89 files changed

+285
-2883
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+285
-2883
lines changed

script.cu.lrclyrics/addon.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2-
<addon id="script.cu.lrclyrics" name="CU LRC Lyrics" version="6.6.9" provider-name="Taxigps, ronie">
2+
<addon id="script.cu.lrclyrics" name="CU LRC Lyrics" version="6.7.1" provider-name="Taxigps, ronie">
33
<requires>
44
<import addon="xbmc.python" version="3.0.0"/>
55
<import addon="script.module.beautifulsoup4" version="4.8.2+matrix.1"/>

script.cu.lrclyrics/changelog.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
v6.7.1
2+
- fix genius scraper
3+
- fix musicmatch scraper
4+
- fix supermusic scraper
5+
- remove redundant language files
6+
7+
v6.7.0
8+
- fixed SyntaxWarning errors
9+
110
v6.6.9
211
- python 3.13 compatibility
312
- fixed Genius scraper

script.cu.lrclyrics/lib/culrcscrapers/darklyrics/lyricsScraper.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def search(self, artist, title):
5252
searchResponse = req.text
5353
except:
5454
return None
55-
searchResult = re.findall('<h2><a\shref="(.*?#([0-9]+))".*?>(.*?)</a></h2>', searchResponse)
55+
searchResult = re.findall(r'<h2><a\shref="(.*?#([0-9]+))".*?>(.*?)</a></h2>', searchResponse)
5656
if len(searchResult) == 0:
5757
return None
5858
links = []
@@ -75,7 +75,7 @@ def findLyrics(self, url, index):
7575
res = req.text
7676
except:
7777
return None
78-
pattern = '<a\sname="%index%">(.*?)(?:<h3>|<div)' # require multi line and dot all mode
78+
pattern = r'<a\sname="%index%">(.*?)(?:<h3>|<div)' # require multi line and dot all mode
7979
pattern = pattern.replace('%index%', index)
8080
match = re.search(pattern, res, re.MULTILINE | re.DOTALL)
8181
if match:
@@ -96,7 +96,7 @@ def getAlbumName(self, url):
9696
res = req.text
9797
except:
9898
return ''
99-
match = re.search('<h2>(?:album|single|ep|live):?\s?(.*?)</h2>', res, re.IGNORECASE)
99+
match = re.search(r'<h2>(?:album|single|ep|live):?\s?(.*?)</h2>', res, re.IGNORECASE)
100100
if match:
101101
return ('(' + match.group(1) + ')').replace('\'', '')
102102
else:

script.cu.lrclyrics/lib/culrcscrapers/genius/lyricsScraper.py

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import xbmcaddon
99
import json
1010
import difflib
11+
from bs4 import BeautifulSoup
1112
from lib.utils import *
1213

1314
__title__ = 'genius'
@@ -19,7 +20,7 @@ class LyricsFetcher:
1920
def __init__(self, *args, **kwargs):
2021
self.DEBUG = kwargs['debug']
2122
self.settings = kwargs['settings']
22-
self.url = 'http://api.genius.com/search?q=%s%%20%s&access_token=Rq_cyNZ6fUOQr4vhyES6vu1iw3e94RX85ju7S8-0jhM-gftzEvQPG7LJrrnTji11'
23+
self.url = 'https://genius.com/api/search/multi?per_page=5&q=%s %s'
2324

2425
def get_lyrics(self, song):
2526
log('%s: searching lyrics for %s - %s' % (__title__, song.artist, song.title), debug=self.DEBUG)
@@ -29,40 +30,51 @@ def get_lyrics(self, song):
2930
lyrics.lrc = __lrc__
3031
try:
3132
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; rv:77.0) Gecko/20100101 Firefox/77.0'}
32-
url = self.url % (urllib.parse.quote(song.artist), urllib.parse.quote(song.title))
33+
url = self.url % (song.artist, song.title)
3334
req = requests.get(url, headers=headers, timeout=10)
3435
response = req.text
3536
except:
3637
return None
3738
data = json.loads(response)
38-
try:
39-
name = data['response']['hits'][0]['result']['primary_artist']['name']
40-
track = data['response']['hits'][0]['result']['title']
41-
if (difflib.SequenceMatcher(None, song.artist.lower(), name.lower()).ratio() > 0.8) and (difflib.SequenceMatcher(None, song.title.lower(), track.lower()).ratio() > 0.8):
42-
self.page = data['response']['hits'][0]['result']['url']
43-
else:
44-
return None
45-
except:
39+
links = []
40+
if (len(data['response']['sections']) < 2):
41+
return None
42+
for item in data['response']['sections'][1]['hits']:
43+
try:
44+
artistname = item['result']['artist_names']
45+
songtitle = item['result']['title']
46+
url = item['result']['url']
47+
if (difflib.SequenceMatcher(None, song.artist.lower(), artistname.lower()).ratio() > 0.8) and (difflib.SequenceMatcher(None, song.title.lower(), songtitle.lower()).ratio() > 0.8):
48+
links.append((artistname + ' - ' + songtitle, url, artistname, songtitle))
49+
except:
50+
continue
51+
if len(links) == 0:
4652
return None
47-
log('%s: search url: %s' % (__title__, self.page), debug=self.DEBUG)
53+
elif len(links) > 1:
54+
lyrics.list = links
55+
for link in links:
56+
lyr = self.get_lyrics_from_list(link)
57+
if lyr:
58+
lyrics.lyrics = lyr
59+
return lyrics
60+
return None
61+
62+
def get_lyrics_from_list(self, link):
63+
title,url,artist,song = link
64+
log('%s: search url: %s' % (__title__, url), debug=self.DEBUG)
4865
try:
4966
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; rv:77.0) Gecko/20100101 Firefox/77.0'}
50-
req = requests.get(self.page, headers=headers, timeout=10)
67+
req = requests.get(url, headers=headers, timeout=10)
5168
response = req.text
5269
except:
5370
return None
54-
response = html.unescape(response)
55-
matchcode = re.findall('class="Lyrics-.*?">(.*?)</div><div', response, flags=re.DOTALL)
5671
try:
57-
lyricscode = ""
58-
for matchCodeItem in matchcode:
59-
lyricscode = lyricscode + matchCodeItem + '\n'
60-
lyr1 = re.sub('<br/>', '\n', lyricscode)
61-
lyr2 = re.sub('<[^<]+?>', '', lyr1)
62-
lyr3 = lyr2.replace('\\n','\n').strip()
63-
if not lyr3 or lyr3 == '[Instrumental]' or lyr3.startswith('Lyrics for this song have yet to be released'):
64-
return None
65-
lyrics.lyrics = lyr3
66-
return lyrics
72+
matchcode = re.search(r'\\"html\\":\\"(.*?)\\",\\"', response, flags=re.DOTALL)
73+
if matchcode:
74+
lyr1 = matchcode.group(1).replace('\\\\\\', '')
75+
lyr2 = re.sub('<[^<]+?>', '', lyr1)
76+
lyr3 = lyr2.replace('\\\\n','\n').replace("\\'", "'").strip()
77+
lyrics = lyr3
78+
return lyrics
6779
except:
6880
return None

script.cu.lrclyrics/lib/culrcscrapers/musixmatch/lyricsScraper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def get_lyrics(self, song):
4545
response = search.text
4646
except:
4747
return None
48-
matchcode = re.search('Lyrics of (.*?)Writer\(s\): ', response, flags=re.DOTALL)
48+
matchcode = re.search(r'body":"(.*?)"', response, flags=re.DOTALL)
4949
if matchcode:
5050
lyricscode = (matchcode.group(1))
5151
lyr = re.sub('<[^<]+?>', '\n', lyricscode)

script.cu.lrclyrics/lib/culrcscrapers/supermusic/lyricsScraper.py

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,63 +2,89 @@
22
import sys
33
import re
44
import requests
5+
import difflib
56
import html
67
import xbmc
78
import xbmcaddon
9+
from bs4 import BeautifulSoup
810
from lib.utils import *
911

1012
__title__ = 'supermusic'
1113
__priority__ = '250'
1214
__lrc__ = False
1315

16+
headers = {}
17+
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'
18+
1419

1520
class LyricsFetcher:
1621
def __init__(self, *args, **kwargs):
1722
self.DEBUG = kwargs['debug']
1823
self.settings = kwargs['settings']
24+
self.SEARCH_URL = 'https://www.supermusic.cz/najdi.php?hladane=%s+%s&typhladania=skupina'
25+
self.LYRIC_URL = 'https://supermusic.cz/'
1926

2027
def get_lyrics(self, song):
2128
log('%s: searching lyrics for %s - %s' % (__title__, song.artist, song.title), debug=self.DEBUG)
2229
lyrics = Lyrics(settings=self.settings)
2330
lyrics.song = song
2431
lyrics.source = __title__
2532
lyrics.lrc = __lrc__
26-
artist = song.artist.lower()
27-
title = song.title.lower()
28-
33+
artist = song.artist.lower().replace(' ', '+')
34+
title = song.title.lower().replace(' ', '+')
2935
try:
30-
req = requests.post('https://supermusic.cz/najdi.php', data={'hladane': title, 'typhladania': 'piesen', 'fraza': 'off'})
36+
req = requests.get(self.SEARCH_URL % (artist, title), headers=headers, timeout=10)
3137
response = req.text
3238
except:
3339
return None
3440
req.close()
35-
url = None
36-
try:
37-
items = re.search(r'Počet nájdených piesní.+<br><br>(.*)<BR>', response, re.S).group(1)
38-
for match in re.finditer(r'<a href=(?P<url>"[^"]+?") target="_parent"><b>(?P<artist>.*?)</b></a> - (?P<type>.+?) \(<a href', items):
39-
matched_url, matched_artist, matched_type = match.groups()
40-
if matched_type not in ('text', 'akordy a text'):
41-
continue
42-
if matched_artist.lower() == artist:
43-
url = matched_url.strip('"')
44-
break
45-
except:
46-
return None
47-
48-
if not url:
41+
links = []
42+
soup = BeautifulSoup(response, 'html.parser')
43+
for item in soup.find_all('div', {'class': 'result-item'}):
44+
try:
45+
artistdata = item.find('span', {'class': 'result-artist'})
46+
songdata = item.find('h3', {'class': 'result-title'})
47+
artistname = artistdata.find('a').get_text()
48+
songtitle = songdata.find('a').get_text()
49+
url = songdata.find('a').get('href')
50+
if (difflib.SequenceMatcher(None, song.artist.lower(), artistname.lower()).ratio() > 0.8) and (difflib.SequenceMatcher(None, song.title.lower(), songtitle.lower()).ratio() > 0.8):
51+
links.append((artistname + ' - ' + songtitle, self.LYRIC_URL + url, artistname, songtitle))
52+
except:
53+
continue
54+
if len(links) == 0:
4955
return None
56+
elif len(links) > 1:
57+
lyrics.list = links
58+
for link in links:
59+
lyr = self.get_lyrics_from_list(link)
60+
if lyr:
61+
lyrics.lyrics = lyr
62+
return lyrics
63+
return None
5064

65+
def get_lyrics_from_list(self, link):
66+
title,url,artist,song = link
67+
log('%s: search url: %s' % (__title__, url), debug=self.DEBUG)
5168
try:
52-
req = requests.get('https://supermusic.cz/%s' % url)
53-
response = req.text
54-
lyr = re.search(r'class=piesen>(.*?)</font>', response, re.S).group(1)
55-
lyr = re.sub(r'<sup>.*?</sup>', '', lyr)
56-
lyr = re.sub(r'<br\s*/>\s*', '\n', lyr)
57-
lyr = re.sub(r'<!--.*?-->', '', lyr, flags=re.DOTALL)
58-
lyr = re.sub(r'<[^>]*?>', '', lyr, flags=re.DOTALL)
59-
lyr = lyr.strip('\r\n')
60-
lyr = html.unescape(lyr)
61-
lyrics.lyrics = lyr
62-
return lyrics
69+
response = requests.get(url, headers=headers, timeout=10)
70+
result = response.text
6371
except:
6472
return None
73+
soup = BeautifulSoup(result, 'html.parser')
74+
for item in soup.find_all('a', {'class': 'version-tab'}):
75+
if item.get_text() == 'text':
76+
newurl = self.LYRIC_URL + item.get('href')
77+
if newurl != url:
78+
try:
79+
log('%s: search url: %s' % (__title__, newurl), debug=self.DEBUG)
80+
response = requests.get(newurl, headers=headers, timeout=10)
81+
result = response.text
82+
except:
83+
return None
84+
soup = BeautifulSoup(result, 'html.parser')
85+
try:
86+
lyr = soup.find('div', {'class': 'chord-text'}).get_text()
87+
except:
88+
return None
89+
lyrics = lyr
90+
return lyrics

script.cu.lrclyrics/lib/embedlrc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ def getAPELyrics(bfile, getlrc):
176176
return
177177

178178
def isLRC(lyr):
179-
match = re.compile('\[(\d+):(\d\d)(\.\d+|)\]').search(lyr)
179+
match = re.compile(r'\[(\d+):(\d\d)(\.\d+|)\]').search(lyr)
180180
if match:
181181
return True
182182
else:

script.cu.lrclyrics/lib/gui.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ def save_lyrics_to_file(self, lyrics, adjust=None):
253253
# save our manual sync offset to file
254254
adjust = int(adjust * 1000)
255255
# check if there's an existing offset tag
256-
found = re.search('\[offset:(.*?)\]', lyr, flags=re.DOTALL)
256+
found = re.search(r'\[offset:(.*?)\]', lyr, flags=re.DOTALL)
257257
if found:
258258
# get the sum of both values
259259
try:
@@ -436,7 +436,7 @@ def __init__(self, *args, **kwargs):
436436
self.dialog = xbmcgui.Dialog()
437437

438438
def onInit(self):
439-
self.matchlist = ['@', 'www\.(.*?)\.(.*?)', 'QQ(.*?)[1-9]', 'artist ?: ?.', 'album ?: ?.', 'title ?: ?.', 'song ?: ?.', 'by ?: ?.']
439+
self.matchlist = ['@', r'www\.(.*?)\.(.*?)', 'QQ(.*?)[1-9]', 'artist ?: ?.', 'album ?: ?.', 'title ?: ?.', 'song ?: ?.', 'by ?: ?.']
440440
self.text = self.getControl(110)
441441
self.label = self.getControl(200)
442442
self.setup_gui()
@@ -619,12 +619,12 @@ def get_parts(self, line):
619619

620620
def parser_lyrics(self, lyrics):
621621
offset = 0.00
622-
found = re.search('\[offset:\s?(-?\d+)\]', lyrics)
622+
found = re.search(r'\[offset:\s?(-?\d+)\]', lyrics)
623623
if found:
624624
offset = float(found.group(1)) / 1000
625625
self.pOverlay = []
626-
tag1 = re.compile('\[(\d+):(\d\d)[\.:](\d\d)\]')
627-
tag2 = re.compile('\[(\d+):(\d\d)([\.:]\d+|)\]')
626+
tag1 = re.compile(r'\[(\d+):(\d\d)[\.:](\d\d)\]')
627+
tag2 = re.compile(r'\[(\d+):(\d\d)([\.:]\d+|)\]')
628628
lyrics = lyrics.replace('\r\n' , '\n')
629629
sep = '\n'
630630
for x in lyrics.split(sep):

script.cu.lrclyrics/lib/scrapertest.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ def test_scrapers():
6969
dialog.update(16, LANGUAGE(32163) % 'genius')
7070
log('==================== genius ====================', debug=True)
7171
song = Song(opt=lyricssettings)
72-
song.artist = 'Maren Morris'
73-
song.title = 'My Church'
72+
song.artist = 'Michael Jackson'
73+
song.title = 'Beat It'
7474
st = time.time()
7575
lyrics = lyricsScraper_genius.LyricsFetcher(settings=lyricssettings, debug=True).get_lyrics(song)
7676
ft = time.time()
@@ -126,8 +126,8 @@ def test_scrapers():
126126
dialog.update(40, LANGUAGE(32163) % 'lyricsmode')
127127
log('==================== lyricsmode ====================', debug=True)
128128
song = Song(opt=lyricssettings)
129-
song.artist = 'Maren Morris'
130-
song.title = 'My Church'
129+
song.artist = 'M83'
130+
song.title = 'Kim'
131131
st = time.time()
132132
lyrics = lyricsScraper_lyricsmode.LyricsFetcher(settings=lyricssettings, debug=True).get_lyrics(song)
133133
ft = time.time()
@@ -240,8 +240,8 @@ def test_scrapers():
240240
dialog.update(88, LANGUAGE(32163) % 'supermusic')
241241
log('==================== supermusic ====================', debug=True)
242242
song = Song(opt=lyricssettings)
243-
song.artist = 'Karel Gott'
244-
song.title = 'Trezor'
243+
song.artist = 'Madonna'
244+
song.title = 'Holiday'
245245
st = time.time()
246246
lyrics = lyricsScraper_supermusic.LyricsFetcher(settings=lyricssettings, debug=True).get_lyrics(song)
247247
ft = time.time()

script.cu.lrclyrics/resources/language/resource.language.af_za/strings.po

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,6 @@ msgctxt "#32904"
270270
msgid "Music 163"
271271
msgstr ""
272272

273-
msgctxt "#32905"
274-
msgid "Lyricsify"
275-
msgstr ""
276-
277273
msgctxt "#32912"
278274
msgid "Genius"
279275
msgstr ""

0 commit comments

Comments
 (0)