'Read the metadata from the associated file.
If `read_path` is specified, read metadata from that file
instead. Updates all the properties in `_media_fields`
from the media file.
Raises a `ReadError` if the file could not be read.'

def read(self, read_path=None):

    if (read_path is None):
        read_path = self.path
    else:
        read_path = normpath(read_path)
    try:
        mediafile = MediaFile(syspath(read_path))
    except UnreadableFileError as exc:
        raise ReadError(read_path, exc)
    for key in self._media_fields:
        value = getattr(mediafile, key)
        if isinstance(value, six.integer_types):
            if (value.bit_length() > 63):
                value = 0
        self[key] = value
    if (read_path == self.path):
        self.mtime = self.current_mtime()
    self.path = read_path
