Very minor comment: Add some empty lines to visually separate the blocks in this function. Example:

```
show_captions = xml.get('show_captions') 
if show_captions:
    video.show_captions = json.loads(show_captions)

source = _get_first_external(xml, 'source')
if source:
    video.source = source
```