Skip to content

Commit

Permalink
track info database
Browse files Browse the repository at this point in the history
  • Loading branch information
L2501 committed Apr 26, 2019
1 parent 4e92511 commit 178d256
Show file tree
Hide file tree
Showing 3 changed files with 7,289 additions and 51 deletions.
55 changes: 31 additions & 24 deletions default.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
import xbmc
from xbmc import executebuiltin
from xbmcgui import ListItem
from xbmcplugin import addDirectoryItem, endOfDirectory, setResolvedUrl, setContent
from xbmcplugin import addDirectoryItems, addDirectoryItem, endOfDirectory, setResolvedUrl, setContent
from resources.lib.musicmp3 import musicMp3
from resources.lib import isodate


try:
from urllib.parse import quote as orig_quote
Expand All @@ -29,7 +29,7 @@ def unquote(s):
plugin.name = addon.getAddonInfo("name")

USER_DATA_DIR = xbmc.translatePath(addon.getAddonInfo("profile")).decode("utf-8") # !!
MEDIA_DIR = os.path.join(xbmc.translatePath(xbmcaddon.Addon().getAddonInfo('path')).decode("utf-8"), 'resources', 'media')
MEDIA_DIR = os.path.join(xbmc.translatePath(xbmcaddon.Addon().getAddonInfo("path")).decode("utf-8"), "resources", "media")
FANART = os.path.join(MEDIA_DIR, "fanart.jpg")
MUSICMP3_DIR = os.path.join(USER_DATA_DIR, "musicmp3")
if not os.path.exists(MUSICMP3_DIR):
Expand Down Expand Up @@ -66,7 +66,7 @@ def index():
def musicmp3_albums_main(sort):
for i, gnr in enumerate(musicmp3_api.gnr_ids):
li = ListItem("{0} {1} Albums".format(sort.title(), gnr[0]))
li.setArt({"fanart": FANART, "icon": os.path.join(MEDIA_DIR, "genre", '{0}.jpg'.format(gnr[0].lower().replace(' ','').replace('&','_')))})
li.setArt({"fanart": FANART, "icon": os.path.join(MEDIA_DIR, "genre", "{0}.jpg".format(gnr[0].lower().replace(" ", "").replace("&", "_")))})
addDirectoryItem(plugin.handle, plugin.url_for(musicmp3_albums_gnr, sort, i), li, True)
endOfDirectory(plugin.handle)

Expand All @@ -82,13 +82,15 @@ def musicmp3_albums_gnr(sort, gnr):
section = "main"

li = ListItem("{0} {1} Albums".format(sort.title(), sub_gnr[0]))
li.setArt({"fanart": FANART, "icon": os.path.join(MEDIA_DIR, "genre", musicmp3_api.gnr_ids[int(gnr)][0].lower(),'{0}.jpg'.format(sub_gnr[0].lower().replace(' ','').replace('&','_')))})
addDirectoryItem(
plugin.handle,
plugin.url_for(musicmp3_main_albums, section, sub_gnr[1], sort, "0"),
li,
True,
li.setArt(
{
"fanart": FANART,
"icon": os.path.join(
MEDIA_DIR, "genre", musicmp3_api.gnr_ids[int(gnr)][0].lower(), "{0}.jpg".format(sub_gnr[0].lower().replace(" ", "").replace("&", "_"))
),
}
)
addDirectoryItem(plugin.handle, plugin.url_for(musicmp3_main_albums, section, sub_gnr[1], sort, "0"), li, True)
endOfDirectory(plugin.handle)


Expand All @@ -108,9 +110,9 @@ def musicmp3_search(cat):
elif cat == "albums":
albums = musicmp3_api.search(keyboardinput, cat)
for a in albums:
li = ListItem("{0}[CR][COLOR=darkmagenta]{1}[/COLOR]".format(a.get("name"), a.get("artist")))
li = ListItem("{0}[CR][COLOR=darkmagenta]{1}[/COLOR]".format(a.get("title"), a.get("artist")))
li.setArt({"thumb": a.get("image"), "icon": a.get("image")})
li.setInfo("music", {"title": a.get("name"), "artist": a.get("artist"), "album": a.get("name"), "year": a.get("date")})
li.setInfo("music", {"title": a.get("title"), "artist": a.get("artist"), "album": a.get("title"), "year": a.get("date")})
li.setProperty("Album_Description", a.get("details"))
addDirectoryItem(plugin.handle, plugin.url_for(musicmp3_album, quote(a.get("link"))), li, True)
setContent(plugin.handle, "albums")
Expand All @@ -119,7 +121,7 @@ def musicmp3_search(cat):
endOfDirectory(plugin.handle)


@plugin.route("/musicmp3/main_albums/<section>/<gnr_id>/<sort>/<index>/")
@plugin.route("/musicmp3/main_albums/<section>/<gnr_id>/<sort>/<index>")
def musicmp3_main_albums(section, gnr_id, sort, index):
dir_items = 40
index = int(index)
Expand All @@ -139,10 +141,10 @@ def musicmp3_main_albums(section, gnr_id, sort, index):
context_menu.append(("Previous {0}+".format(previous_index), previous_page))

for a in albums:
li = ListItem("{0}[CR][COLOR=darkmagenta]{1}[/COLOR]".format(a.get("name"), a.get("artist")))
li = ListItem("{0}[CR][COLOR=darkmagenta]{1}[/COLOR]".format(a.get("title"), a.get("artist")))
li.setArt({"thumb": a.get("image"), "icon": a.get("image")})
li.addContextMenuItems(context_menu)
li.setInfo("music", {"title": a.get("name"), "artist": a.get("artist"), "album": a.get("name"), "year": a.get("date")})
li.setInfo("music", {"title": a.get("title"), "artist": a.get("artist"), "album": a.get("title"), "year": a.get("date")})
addDirectoryItem(plugin.handle, plugin.url_for(musicmp3_album, quote(a.get("link"))), li, True)
setContent(plugin.handle, "albums")
if fixed_view_mode:
Expand Down Expand Up @@ -180,9 +182,9 @@ def artists_albums(link):
url = unquote(link)
albums = musicmp3_api.artist_albums(url)
for a in albums:
li = ListItem("{0}[CR][COLOR=darkmagenta]{1}[/COLOR]".format(a.get("name"), a.get("artist")))
li = ListItem("{0}[CR][COLOR=darkmagenta]{1}[/COLOR]".format(a.get("title"), a.get("artist")))
li.setArt({"thumb": a.get("image"), "icon": a.get("image")})
li.setInfo("music", {"title": a.get("name"), "artist": a.get("artist"), "album": a.get("name"), "year": a.get("date")})
li.setInfo("music", {"title": a.get("title"), "artist": a.get("artist"), "album": a.get("title"), "year": a.get("date")})
li.setProperty("Album_Description", a.get("details"))
addDirectoryItem(plugin.handle, plugin.url_for(musicmp3_album, quote(a.get("link"))), li, True)
setContent(plugin.handle, "albums")
Expand All @@ -195,15 +197,16 @@ def artists_albums(link):
def musicmp3_album(link):
url = unquote(link)
tracks = musicmp3_api.album_tracks(url)
_directory_items = []
for t in tracks:
li = ListItem(t.get("name"))
_infolabels = {"title": t.get("title"), "artist": t.get("artist"), "album": t.get("album"), "duration": t.get("duration")}
li = ListItem(t.get("title"))
li.setProperty("IsPlayable", "true")
li.setArt({"thumb": t.get("image"), "icon": t.get("image")})
li.setInfo(
"music",
{"title": t.get("name"), "artist": t.get("artist"), "album": t.get("album"), "duration": isodate.parse_duration(t.get("duration")).total_seconds()},
)
addDirectoryItem(plugin.handle, plugin.url_for(musicmp3_play, track_id=t.get("id"), rel=t.get("rel")), li, False)
li.setInfo("music", _infolabels)
_directory_items.append((plugin.url_for(musicmp3_play, track_id=t.get("track_id"), rel=t.get("rel")), li, False))

addDirectoryItems(plugin.handle, _directory_items)
setContent(plugin.handle, "songs")
if fixed_view_mode:
executebuiltin("Container.SetViewMode({0})".format(songs_view_mode))
Expand All @@ -212,7 +215,11 @@ def musicmp3_album(link):

@plugin.route("/musicmp3/play/<track_id>/<rel>")
def musicmp3_play(track_id, rel):
li = ListItem(path=musicmp3_api.play_url(track_id, rel))
_track = musicmp3_api.get_track(rel)
_infolabels = {"title": _track.title, "artist": _track.artist, "album": _track.album, "duration": _track.duration}
li = ListItem(_track.title, path=musicmp3_api.play_url(track_id, rel))
li.setInfo("music", _infolabels)
li.setArt({"thumb": _track.image, "icon": _track.image})
li.setMimeType("audio/mpeg")
li.setContentLookup(False)
setResolvedUrl(plugin.handle, True, li)
Expand Down
81 changes: 54 additions & 27 deletions resources/lib/musicmp3.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import os
import isodate
import requests
import requests_cache
from bs4 import BeautifulSoup
from datetime import timedelta
from datetime import timedelta, datetime
from urlparse import urljoin
from peewee import *

try:
from http.cookiejar import LWPCookieJar
Expand All @@ -19,25 +21,46 @@ def quote(s, safe=""):
return orig_quote(s.encode("utf-8"), safe.encode("utf-8"))


db = SqliteDatabase(None)


class BaseModel(Model):
class Meta:
database = db


class Track(BaseModel):
rel = CharField(unique=True)
track_id = TextField()
image = TextField()
duration = TextField()
album = TextField()
artist = TextField()
title = TextField()


class musicMp3:
def __init__(self, cache_dir):
if not os.path.exists(cache_dir):
cache_dir = os.getcwd()
TRACKS_DB = os.path.join(cache_dir, "tracks.db")
COOKIE_FILE = os.path.join(cache_dir, "lwp_cookies.dat")
db.init(TRACKS_DB)
db.connect()
db.create_tables([Track], safe=True)
self.base_url = "https://musicmp3.ru/"
self.user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:66.0) Gecko/20100101 Firefox/66.0"
self.s = requests_cache.CachedSession(
os.path.join(cache_dir, "cache"),
allowable_methods="GET",
expire_after=timedelta(hours=40),
old_data_on_error=True,
os.path.join(cache_dir, "cache"), allowable_methods="GET", expire_after=timedelta(hours=40), old_data_on_error=True
)
self.s.cookies = LWPCookieJar(filename=COOKIE_FILE)
self.s.headers.update({"User-Agent": self.user_agent})
if os.path.isfile(COOKIE_FILE):
self.s.cookies.load(ignore_discard=True, ignore_expires=True)

def __del__(self):
db.close()
self.s.cache.remove_old_entries(datetime.utcnow() - timedelta(hours=40))
self.s.cookies.save(ignore_discard=True, ignore_expires=True)
self.s.close()

Expand Down Expand Up @@ -83,7 +106,7 @@ def artists(self, s):
def albums(self, s):
for li in s.find_all("li", class_="unstyled"):
yield {
"name": li.find(class_="album_report__name").get_text(strip=True),
"title": li.find(class_="album_report__name").get_text(strip=True),
"image": li.find(class_="album_report__image").get("src"),
"link": urljoin(self.base_url, li.find(class_="album_report__link").get("href")),
"artist_link": urljoin(self.base_url, li.find(class_="album_report__artist").get("href")),
Expand All @@ -93,18 +116,16 @@ def albums(self, s):

def search(self, text, cat):
params = {"text": text, "all": cat}
r = self.s.get("https://musicmp3.ru/search.html", params=params, headers={"Referer": self.base_url})
r = self.s.get("https://musicmp3.ru/search.html", params=params, headers={"Referer": self.base_url}, timeout=5)
soup = BeautifulSoup(r.text, "html.parser")
_list = []
if cat == "artists":
for artist in soup.find_all(class_="artist_preview"):
_list.append(
{"artist": artist.a.get_text(strip=True), "link": urljoin(self.base_url, artist.a.get("href"))}
)
_list.append({"artist": artist.a.get_text(strip=True), "link": urljoin(self.base_url, artist.a.get("href"))})
elif cat == "albums":
for album in soup.find_all(class_="album_report"):
album_report = {
"name": album.find(class_="album_report__name").get_text(strip=True),
"title": album.find(class_="album_report__name").get_text(strip=True),
"image": album.find(class_="album_report__image").get("src"),
"link": urljoin(self.base_url, album.find(class_="album_report__link").get("href")),
"artist_link": urljoin(self.base_url, album.find(class_="album_report__artist").get("href")),
Expand All @@ -121,8 +142,10 @@ def main_artists(self, start, count):
_list = []
while len(_list) < count:
params = {"type": "artist", "page": _page}
r = self.s.get("https://musicmp3.ru/main_artists.html", params=params, headers={"Referer": self.base_url})
r = self.s.get("https://musicmp3.ru/main_artists.html", params=params, headers={"Referer": self.base_url}, timeout=5)
soup = BeautifulSoup(r.text, "html.parser")
if not soup.a:
break
for index, item in enumerate(self.artists(soup), (_page - 1) * 80):
if len(_list) >= count:
break
Expand All @@ -141,8 +164,10 @@ def main_albums(self, section, gnr_id, sort, start, count):
params["gnr_id"] = gnr_id
if section:
params["section"] = section
r = self.s.get("https://musicmp3.ru/main_albums.html", params=params)
r = self.s.get("https://musicmp3.ru/main_albums.html", params=params, timeout=5)
soup = BeautifulSoup(r.text, "html.parser")
if not soup.li:
break
for index, item in enumerate(self.albums(soup), (_page - 1) * 80):
if len(_list) >= count:
break
Expand All @@ -153,13 +178,13 @@ def main_albums(self, section, gnr_id, sort, start, count):
return _list

def artist_albums(self, url):
r = self.s.get(url, headers={"Referer": self.base_url})
r = self.s.get(url, headers={"Referer": self.base_url}, timeout=5)
soup = BeautifulSoup(r.text, "html.parser")
_artist = soup.find(class_="page_title__h1").get_text(strip=True)
_list = []
for album in soup.find_all(class_="album_report"):
album_report = {
"name": album.find(class_="album_report__name").get_text(strip=True),
"title": album.find(class_="album_report__name").get_text(strip=True),
"image": album.find(class_="album_report__image").get("src"),
"link": urljoin(self.base_url, album.find(class_="album_report__link").get("href")),
"artist_link": url,
Expand All @@ -179,16 +204,25 @@ def album_tracks(self, url):
tracks = []
for song in soup.find_all(class_="song"):
track = {}
track["name"] = song.find(itemprop="name").get_text(strip=True)
track["title"] = song.find(itemprop="name").get_text(strip=True)
track["artist"] = song.find(itemprop="byArtist").get("content")
track["album"] = song.find(itemprop="inAlbum").get("content")
track["duration"] = song.find(itemprop="duration").get("content")
track["image"] = image
track["id"] = song.get("id")
track["duration"] = str(isodate.parse_duration(song.find(itemprop="duration").get("content")).total_seconds())
track["image"] = self.image_url(image)
track["track_id"] = song.get("id")
track["rel"] = song.a.get("rel")[0]
tracks.append(track)

with db.atomic():
Track.replace_many(tracks).execute()
return tracks

def get_track(self, rel):
try:
return Track.get(Track.rel == rel)
except:
return Track()

gnr_ids = [
(
"World",
Expand Down Expand Up @@ -414,14 +448,7 @@ def album_tracks(self, url):
),
(
"Blues",
[
("Blues", "774"),
("Acoustic Blues", "775"),
("Electric Blues", "780"),
("Piano Blues", "784"),
("Blues Rock", "786"),
("Compilations", "774"),
],
[("Blues", "774"), ("Acoustic Blues", "775"), ("Electric Blues", "780"), ("Piano Blues", "784"), ("Blues Rock", "786"), ("Compilations", "774")],
),
(
"Soundtracks",
Expand Down
Loading

0 comments on commit 178d256

Please sign in to comment.