Music: include bitrate for songs (channels + sampling rate won't work yet due to Plex not listing this info for an album's children)

This commit is contained in:
croneter 2020-12-20 17:06:57 +01:00
parent f4923eda22
commit 2ef95b1480
4 changed files with 45 additions and 2 deletions

View file

@ -458,6 +458,7 @@ class Song(MusicMixin, ItemBase):
moods.append(entry.attrib['tag'])
mood = api.list_to_string(moods)
_, path, filename = api.fullpath()
audio_codec = api.audio_codec()
# UPDATE THE SONG #####
if update_item:
LOG.info("UPDATE song plex_id: %s - %s", plex_id, title)
@ -479,6 +480,9 @@ class Song(MusicMixin, ItemBase):
api.userrating(),
comment,
mood,
audio_codec['bitrate'] or 0,
audio_codec['samplingrate'] or 0,
audio_codec['channels'] or 0,
api.date_created(),
kodi_id)
# OR ADD THE SONG #####
@ -506,6 +510,9 @@ class Song(MusicMixin, ItemBase):
0,
0,
mood,
audio_codec['bitrate'] or 0,
audio_codec['samplingrate'] or 0,
audio_codec['channels'] or 0,
api.date_created())
# Link song to artists
artist_name = api.grandparent_title()

View file

@ -348,8 +348,11 @@ class KodiMusicDB(common.KodiDBBase):
iStartOffset,
iEndOffset,
mood,
iBitRate,
iSampleRate,
iChannels,
dateAdded)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
''', (args))
@db.catch_operationalerrors
@ -370,6 +373,9 @@ class KodiMusicDB(common.KodiDBBase):
rating = ?,
comment = ?,
mood = ?,
iBitRate = ?,
iSampleRate = ?,
iChannels = ?,
dateAdded = ?
WHERE idSong = ?
''', (args))

View file

@ -27,6 +27,21 @@ class Media(object):
"""
return self.xml[0][self.part].get(key, self.xml[0].get(key))
def _from_stream_or_part(self, key):
"""
Retrieves XML data 'key' first from the very first stream. If
unsuccessful, tries to retrieve the data from the active part.
If all fails, None is returned.
"""
try:
value = self.xml[0][self.part][0].get(key)
except IndexError:
value = None
if value is None:
value = self.xml[0][self.part].get(key)
return value
def video_codec(self):
"""
Returns the video codec and resolution for the child and part selected.
@ -61,6 +76,19 @@ class Media(object):
answ['bitDepth'] = None
return answ
def audio_codec(self):
"""
Returns the audio codec. If any data is not found on a part-level, the
Media-level data is returned. If that also fails (e.g. for old trailers,
None is returned)
"""
return {
'bitrate': cast(int, self._from_stream_or_part('bitrate')),
'samplingrate': cast(int, self._from_stream_or_part('samplingRate')),
'channels': cast(int, self._from_stream_or_part('channels')),
'gain': cast(float, self._from_stream_or_part('gain'))
}
def mediastreams(self):
"""
Returns the media streams for metadata purposes

View file

@ -560,7 +560,9 @@ def GetAllPlexChildren(key):
Input:
key Key to a Plex item, e.g. 12345
"""
return DownloadChunks("{server}/library/metadata/%s/children" % key)
return DownloadChunks(utils.extend_url(
f'{{server}}/library/metadata/{key}/children',
{'includeElements': 'Stream'}))
class ThreadedDownloadChunk(backgroundthread.Task):