Flexible Field Types#

If your plugin uses flexible fields to store numbers or other non-string values, you can specify the types of those fields. A rating plugin, for example, might want to declare that the rating field should have an integer type:

from beets.plugins import BeetsPlugin
from beets.dbcore import types


class RatingPlugin(BeetsPlugin):
    item_types = {"rating": types.INTEGER}

    @property
    def album_types(self):
        return {"rating": types.INTEGER}

A plugin may define two attributes: item_types and album_types. Each of those attributes is a dictionary mapping a flexible field name to a type instance. You can find the built-in types in the beets.dbcore.types and beets.library modules or implement your own type by inheriting from the Type class.

Specifying types has several advantages:

  • Code that accesses the field like item['my_field'] gets the right type (instead of just a string).

  • You can use advanced queries (like ranges) from the command line.

  • User input for flexible fields may be validated and converted.

  • Items missing the given field can use an appropriate null value for querying and sorting purposes.