Hi all,
Thought I'd try to give something back to the community. Apologies if this has already been posted.
I have developed a SQLite query which gives me a simple list of all the most important info about my movies. Thought I'd share it here as I imagine it would be of benefit.
I wouldn't have been able to do any of this if not for this discussion thread: https://forums.plex.tv/discussion/31636/howto-query-data-from-plex-on-a-mac/p1 and as such a big hello and hats-off to @SolarPlex
The query I created references 4 tables in the database, and returns:
- Title
- Sort Title
- File Size (calculating it in Gb)
- HD Resolution (i.e. 1080p or 720p - this is done via a calculation so some 1080p may show as 1078p for example)
- Audio Codec (translating the codec short code to English)
- Audio Channels
- Video Codec Bitrate (calculating it into Mbps)
- Year of release
- Duration in minutes
- Duration in hours and minutes
- Content Rating
- Date added to Plex
It's sorted by "Sort Title" and then "Year".
I use this as part of an Automator Application which puts it into a nicely formatted Numbers spreadsheet. Knowing not everyone uses OS X, I'll post just the SQL for you to do with as you please.
Please note, this is SQLite3 code, NOT standard SQL.
First in a nice format that's easy to read...
SELECT
metadata_items.title,
metadata_items.title_sort,
round(cast(media_parts.size as float)/1024/1024/1024,2) || ' Gb',
printf("%.0f", round(cast(media_items.width as float)/1.77777778,0)) || 'p',
CASE
WHEN media_items.audio_codec = 'aac'
THEN 'AAC'
WHEN media_items.audio_codec = 'ac3'
THEN 'Dolby Digital'
WHEN media_items.audio_codec = 'dca'
THEN 'DTS'
WHEN media_items.audio_codec = 'eac3'
THEN 'Dolby Digital Plus'
WHEN media_items.audio_codec = 'flac'
THEN 'FLAC'
WHEN media_items.audio_codec = 'truehd'
THEN 'Dolby TrueHD'
ELSE 'Other Audio' END,
media_items.audio_channels,
printf("%.2f", round(cast(media_streams.bitrate as float)/1000000,2)) || ' Mbps',
metadata_items.year,
(cast(media_items.duration as numeric)/60000) || ' mins',
printf("%.2f", cast(media_items.duration as numeric)/60000/ 60 + cast(media_items.duration as numeric)/60000 % 60 / 100.0) || ' hr',
metadata_items.content_rating,
strftime('%d-%m-%Y', metadata_items.added_at)
FROM
metadata_items
JOIN media_parts
JOIN media_items
JOIN media_streams
WHERE
metadata_items.library_section_id=1
AND media_streams.codec='h264'
AND metadata_items.id=media_items.metadata_item_id
AND media_items.id=media_parts.media_item_id
AND media_items.id=media_streams.media_item_id
ORDER BY
metadata_items.title_sort,
metadata_items.year;
Next in a single string that would need to be used when using Automator or a terminal window (for example)...
SELECT metadata_items.title, metadata_items.title_sort, round(cast(media_parts.size as float)/1024/1024/1024,2) || ' Gb', printf("%.0f", round(cast(media_items.width as float)/1.77777778,0)) || 'p', CASE WHEN media_items.audio_codec = 'aac' THEN 'AAC' WHEN media_items.audio_codec = 'ac3' THEN 'Dolby Digital' WHEN media_items.audio_codec = 'dca' THEN 'DTS' WHEN media_items.audio_codec = 'eac3' THEN 'Dolby Digital Plus' WHEN media_items.audio_codec = 'flac' THEN 'FLAC' WHEN media_items.audio_codec = 'truehd' THEN 'Dolby TrueHD' ELSE 'No Audio' END, media_items.audio_channels, printf("%.2f", round(cast(media_streams.bitrate as float)/1000000,2)) || ' Mbps', metadata_items.year, (cast(media_items.duration as numeric)/60000) || ' mins', printf("%.2f", cast(media_items.duration as numeric)/60000/ 60 + cast(media_items.duration as numeric)/60000 % 60 / 100.0) || ' hr', metadata_items.content_rating, strftime('%d-%m-%Y', metadata_items.added_at) FROM metadata_items JOIN media_parts JOIN media_items JOIN media_streams WHERE metadata_items.library_section_id=1 AND media_streams.codec='h264' AND metadata_items.id=media_items.metadata_item_id AND media_items.id=media_parts.media_item_id AND media_items.id=media_streams.media_item_id ORDER BY metadata_items.title_sort, metadata_items.year;
Hope some of you find it useful. Let me know if anyone has problems.
If you think it would be useful to post a detailed guide on how to build an Automator routine to use this, let me know.