Gentle bump…
Based on the local media agent, I’ve tried to write my own agent to get more atom data out of my M4Vs.
#local media assets agent<br />
import os<br />
from mp4file import atomsearch, mp4file<br />
<br />
class localMediaMovieMTI(Agent.Movies):<br />
name = 'Local Media Assets (Movies) - MTI'<br />
languages = [Locale.Language.NoLanguage]<br />
primary_provider = False<br />
contributes_to = ['com.plexapp.agents.imdb', 'com.plexapp.agents.none']<br />
<br />
def search(self, results, media, lang):<br />
results.Append(MetadataSearchResult(id = 'null', score = 100))<br />
<br />
def update(self, metadata, media, lang):<br />
# Set title if needed.<br />
if media and metadata.title is None: metadata.title = media.title<br />
<br />
for i in media.items:<br />
for part in i.parts:<br />
getMetadataAtoms(part, metadata)<br />
<br />
def getMetadataAtoms(part, metadata):<br />
mp4fileTags = mp4file.Mp4File(part.file.decode('utf-8'))<br />
<br />
#Coverart - WORKS<br />
try: metadata.posters['atom_coverart'] = Proxy.Media(find_data(mp4fileTags, 'moov/udta/meta/ilst/coverart'))<br />
except: pass<br />
try:<br />
title = find_data(mp4fileTags, 'moov/udta/meta/ilst/title') #Name<br />
Log("Title: " + title)<br />
metadata.title = title<br />
except: pass<br />
<br />
#Collection from album atom - WORKS<br />
try:<br />
album = find_data(mp4fileTags, 'moov/udta/meta/ilst/album') #collection<br />
if len(album) > 0:<br />
albumList = album.split('/')<br />
metadata.collections.clear()<br />
for a in albumList:<br />
metadata.collections.add(a.strip())<br />
except: pass<br />
<br />
#Summary from long/short decription atom - WORKS<br />
try:<br />
try:<br />
summary = find_data(mp4fileTags, 'moov/udta/meta/ilst/ldes')<br />
except:<br />
summary = find_data(mp4fileTags, 'moov/udta/meta/ilst/desc')<br />
metadata.summary = summary<br />
except:<br />
pass<br />
<br />
#Genres from genre atom - WORKS<br />
try:<br />
genres = find_data(mp4fileTags, 'moov/udta/meta/ilst/genre')<br />
if len(genres) > 0:<br />
genList = genres.split('/')<br />
metadata.genres.clear()<br />
for g in genList:<br />
metadata.genres.add(g.strip())<br />
except: pass<br />
<br />
#Studio from copyright atom - FAILS<br />
try:<br />
copyright = find_data(mp4fileTags, 'moov/udta/meta/ilst/cptr')<br />
Log("Copyright: " + copyright)<br />
#if len(copyright) > 0:<br />
#metadata.studio.clear()<br />
#metadata.studio = copyright<br />
except:<br />
pass<br />
<br />
#Content rating from rating atom - FAILS<br />
try:<br />
rating = find_data(mp4fileTags, 'moov/udta/meta/ilst/rating')<br />
Log("Rating: " + rating)<br />
#if len(rating) > 0:<br />
#metadata.studio.clear()<br />
#metadata.content_rating = rating<br />
except:<br />
pass<br />
<br />
#Roles from artist atom - WORKS<br />
try:<br />
artists = find_data(mp4fileTags, 'moov/udta/meta/ilst/artist')<br />
artList = artists.split('/')<br />
metadata.roles.clear()<br />
for a in artList:<br />
role = metadata.roles.new()<br />
role.actor = a.split(' ')[0]<br />
role.role = a.split(' ')[1].strip('()')<br />
except:<br />
pass<br />
<br />
#Release date from year atom - WORKS<br />
try:<br />
releaseDate = find_data(mp4fileTags, 'moov/udta/meta/ilst/year')<br />
releaseDate = releaseDate.split('T')[0]<br />
parsedDate = Datetime.ParseDate(releaseDate)<br />
metadata.year = parsedDate.year<br />
metadata.originally_available_at = parsedDate.date()<br />
except:<br />
pass<br />
<br />
def find_data(atom, name):<br />
child = atomsearch.find_path(atom, name)<br />
data_atom = child.find('data')<br />
Log(data_atom)<br />
#Log(data_atom.attrs)<br />
if data_atom and 'data' in data_atom.attrs: return data_atom.attrs['data']
As indicated in the code, some things work, other things don't such as the copyright (which I'd like to map to metadata.studio) and the rating (metadata.content_Rating) atoms.
Looking at the framework, it seems that the atoms are defined in atom.py (in mp4file in the localmedia.bundle), but the find_data function only returns a very limited set of atoms.
[This file](http://dl.dropbox.com/u/103104/Plex/Testter.m4v) is tiny and is tagged with multiple atoms.
Edit:
Here are the atoms contained in the above file:
Atom "©nam" contains: Title 1<br />
Atom "©ART" contains: TestActor1 (TestRole1)/TestActor2 (TestRole2)/TestActor3 (TestRole3)<br />
Atom "©alb" contains: Album 1<br />
Atom "©gen" contains: Genre1 / Genre2 / Genre3<br />
Atom "©day" contains: 2012<br />
Atom "trkn" contains: 1<br />
Atom "disk" contains: 1<br />
Atom "desc" contains: Description<br />
Atom "ldes" contains: Long Description<br />
Atom "cprt" contains: Studio<br />
Atom "hdvd" contains: 1<br />
Atom "stik" contains: Short Film<br />
Atom "rtng" contains: Explicit Content<br />
Atom "----" [iTunEXTC] contains: mpaa|R|400|<br />
Atom "----" [iTunMOVI] contains: <?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><br />
<plist version="1.0"><br />
<dict><br />
<key>cast</key><br />
<array><br />
<dict><br />
<key>name</key><br />
<string>Test</string><br />
</dict><br />
</array><br />
<key>directors</key><br />
<array><br />
<dict><br />
<key>name</key><br />
<string>Director 1 / Director 2 / Director 3</string><br />
</dict><br />
</array><br />
<key>screenwriters</key><br />
<array><br />
<dict><br />
<key>name</key><br />
<string>Writer 1 / Writer 2 / Writer 3</string><br />
</dict><br />
</array><br />
</dict><br />
</plist><br />
<br />
Atom "covr" contains: 1 piece of artwork
Thanks for any advice.