Skip to main content

Music Metadata - Territories

Build Status Coverage Status GitHub PyPI

A simple library for dealing with territory hierarchies used in music metadata, currently primarily focused on CISAC TIS.

Classes

It has only two classes:

  • Territory - the territory, e.g. World, Europe, Croatia
  • TerritoryList - this class makes including and excluding territories simpler, it also splits territories down when needed

Territory manipulation

World excluding USA results in a minimal list of included territories:

from music_metadata.territories.territory import Territory
from music_metadata.territories.territory_list import TerritoryList

world = Territory.get('2136')
usa = Territory.get('US')

l = TerritoryList()
l.include(world)
l.exclude(usa)

for t in sorted(l, key=lambda x: x.name):
    print(f'{t.tis_n:0>4}', t.name)

Result:

2100 AFRICA
2106 ASIA
0124 CANADA
2113 CENTRAL AMERICA
2120 EUROPE
0484 MEXICO
2130 OCEANIA
2132 SOUTH AMERICA
2134 WEST INDIES

It is simple to list all the countries as well:

for t in sorted(l.countries, key=lambda x: x.name):
    print(f'{t.tis_a:0>4}', t.name)

Result:

AF AFGHANISTAN
AL ALBANIA
DZ ALGERIA
AD ANDORRA
AO ANGOLA
AG ANTIGUA AND BARBUDA
AR ARGENTINA
AM ARMENIA
AU AUSTRALIA
AT AUSTRIA
...

The shorter version also works, yielding same results:

from music_metadata.territories.territory_list import TerritoryList

l = TerritoryList()
l.include('2136')  # WORLD
l.exclude('US')  # USA

for t in sorted(l, key=lambda x: x.name):
    print(f'{t.tis_n:0>4}', t.name)

One can check if a country is finally included in the list:

usa in l
False

Works also with territories deeper in the structure, also with codes:

'hr' in l
True

Share manipulation

Share calculations are also possible, by using a second argument to TerritoryList.include and TerritoryList.add. This second argument can be any objects that allows adding.

from music_metadata.territories.territory import Territory
from music_metadata.territories.territory_list import TerritoryList

world = Territory.get('2136')
usa = Territory.get('US')
canada = Territory.get('CA')

l = TerritoryList()
l.include(world, 25)
l.add(usa, 25)

So, we there is 25 for the whole world and additional 25 for the US. If we ask for values for the US and Canada:

l[usa], l[canada]

We get 50 for the US and 25 for Canada.

(50, 25)

Any numeric type will work out of the box, custom __add__ method might be required for complex objects. Here is an example for a list of numeric fields:

class Shares(list):
    def __add__(self, other):
        return Shares([self[i] + other[i] for i in range(len(self))])   

Compressing output

Long lists can be trimmed, both if they have values and if they do not. Only territories with the same object will be compressed. Consider this:

from music_metadata.territories.territory_list import TerritoryList

l = TerritoryList()
l.include('2136', 25)
l.exclude('HR')
l.add('US', 25)  # US is now at 50
l.include('HR', 25)  # same as it used to be

for t, v in l.items():
    print(f'{t.name}: {v}')
ASIA: 25
OCEANIA: 25
AFRICA: 25
MALTA: 25
ICELAND: 25
... 30 territories cut out ...
MEXICO: 25
UNITED STATES: 50
CROATIA: 25

But, if we compress:

l.compress()

for t, v in l.items():
    print(f'{t.name}: {v}')
CANADA: 25
MEXICO: 25
UNITED STATES: 50
AFRICA: 25
ASIA: 25
EUROPE: 25
OCEANIA: 25
WEST INDIES: 25
SOUTH AMERICA: 25
CENTRAL AMERICA: 25

Metadata

Release files for music-metadata-territories 24.12

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for music-metadata-territories 24.12
File Size Uploaded Provenance
music_metadata_territories-24.12.tar.gz 25.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for music-metadata-territories 24.12
File Interpreter ABI Platform
music_metadata_territories-24.12-py3-none-any.whl Python 3 none any Details

Total release size: 50.2 kB

Release files / music_metadata_territories-24.12.tar.gz

Download URL music_metadata_territories-24.12.tar.gz
Size 25.2 kB
Tags Source
SHA-256 checksum
How to use checksums
5ea4dd2a278143f1170fc6b5fd24a850e2a0a5732aae2a69ffd56757bce19b26
BLAKE2b-256 checksum
How to use checksums
2c89d7a364579a09d7573a6464ccf5089f9106ae07ddfcc0683fa555126b25f8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.0.1 CPython/3.12.3

Release files / music_metadata_territories-24.12-py3-none-any.whl

Download URL music_metadata_territories-24.12-py3-none-any.whl
Size 25.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4d807466c9b9e2071de162334fe6f30b75b4aca67927768196ce73db56d04faf
BLAKE2b-256 checksum
How to use checksums
a717927066cabb0d27cd65d476378b7d8f061abfae4593703ee91b85b80fee10
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.0.1 CPython/3.12.3

Security for music-metadata-territories 24.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page