Why are _fullpath/filename/extension class level attributes: I think it's clear (the data must be stored somewhere), the thing is where to init them - either the way it is now, or call `self._fullpath = str` from `__init__`, there's no difference. Since they are auxiliary attributes to the `fullpath` property, I chose former.

The `extra` dictionary: it's not shared between all instances, it's an optional argument (defaulting to empty dict) -- there are some tests instantiating `EpisodeInfo` without passing the `extra` dict (namely `verify_name_gen`).

I don't like especially the `parse` method in `FileParser` class and it's `extra_values`. The code is too complex, I'd also like to simplify it by creating only one instance of `EpisodeInfo` class containing all data. But doing this, there would be no control over keys in `move_files_destination`, `filename_with_episode` etc. available for different episode types.