Catalogue Delivery Service ## Sections • [Getting Started](https://docs-api-contentdelivery.tunedglobal.com/getting-started.md): Catalogue Delivery Service (CDS) The Catalogue Delivery Service (CDS) is Tuned Global's solution for clients who want to run their own music platform using our catalogue. Rather than building on top of Tuned Global's white label apps, advanceAPIs or web player. The client takes ownership of the experience, using our catalogue feed as the foundation while building their own applications or apis on top of it. This is the right path if you're building a bespoke music experience, your own apps, search, playlisting, user accounts, and more. Tuned Global handles the ingestion, standardisation, and enrichment of catalogue metadata, along with the storage of audio files and artwork. You handle everything your users see and interact with. As part of your agreement, you send us play activity data so that Tuned Global can produce accurate end-of-month reports for rights holders and labels. Where a client prefers to not manage any APIs or metadata, Tuned Global has an Advanced API (aAPI) solution that manages these requirements. Please discuss this requirement directly with your Tuned Global account executive. Integration Overview You connect to our catalogue delivery system once via a shared data feed, pull down your catalogue metadata and assets, and then report back every time a track is played. That's it. The feed setup is a one-time configuration. Metadata ingestion is your team reading and storing our catalogue data. Asset downloads happen on-demand as users request content. Play logging is the mechanism that drives both label reporting and your monthly billing, so it's important to get right. Step-by-Step Integration Step 1: Feed Setup Configure the JSON feed that Tuned Global will write your catalogue JSON data to. There are three options: Title Description Title Option Who configures it What you provide TG-hosted S3 Tuned Global Nothing, we share the bucket details, access key, and secret key. Client S3 Client YouCreate an S3 bucket in your AWS account and provide us the bucket details and access keys so our CDS can write JSON files to it Your SFTP Client Share SFTP credentials so our system can export JSON files to your server Evaluation / trial? You can download a sample JSON file here — it contains 200 albums from a test catalogue. No feed setup required to get started. Step 2: Metadata Ingestion Once the feed is live, begin consuming the JSON files from S3 or SFTP and persisting the metadata in your system. Key things to handle at this stage: Rights enforcement — apply territory, platform, and label restrictions accurately as you ingest. This is a label requirement and errors here are difficult to correct downstream. Asset references — the JSON contains references to images and audio assets. Use the Asset APIs to download these separately. Step 3: Asset Delivery (Songs & Images) When a user requests a track or artwork, call the relevant API to retrieve the file: Stream API — downloads the audio asset Image API — downloads album or track artwork Important — implicit fetch logging: Every call to the Stream API automatically generates a fetch log on our side. These logs are aggregated at month-end to calculate the per-play fees payable to Tuned Global. No additional action is needed from you here, but you should be aware that each asset download is a billable event. Step 4: Play Logging (LogPlay API) Call the LogPlay API every time a track is streamed by an end user. This is separate from the fetch log in Step 3: Title Description Title Log type Who creates it Purpose Fetch log (Step 3) Created automatically by our system on each Stream API call TG's Monthly billing to you Play log (Step 4) Sent explicitly by your system on each user play event Label reporting and royalty distribution Both are required. The fetch log alone is not sufficient for label reporting, you must send the explicit LogPlay event on every user-initiated stream. Once you're familiar with the integration steps above, head to the Integration Models section to determine which model best fits your use case and infrastructure requirements. • [Integration Models](https://docs-api-contentdelivery.tunedglobal.com/getting-started/integration-models.md): The CDS is designed for clients that want to build and operate their own music streaming experience, rather than using a white-label product. You're essentially integrating Tuned Global as your content and licensing backend, while entirely owning the front-end product or the API layer for user and subscription management, playlisting, search and recommendations and so on. Integration Models The CDS supports three different integration models, Depending on your infrastructure appetite and budget, you can choose how much content you store yourself versus stream on demand from Tuned Global. The three models below go from maximum client control to minimum client storage overhead. Model 1 — Full Storage You store everything: metadata, images, and audio You pull the full catalogue i.e. metadata, artwork, and audio files and host it all on your own infrastructure. Every asset is available locally, so your platform has no dependency on Tuned Global's systems at playback time. The only touchpoint back to Tuned Global is logging each play via our LogPlay API whenever an end user streams a track. Best for clients who need maximum independence, have the storage capacity, and want full control over delivery performance. Model 2 — Store Metadata & Images, Stream Audio On Demand You store metadata and images. Audio is fetched live from Tuned Global when a user presses play. You host the catalogue metadata and artwork, but audio files are never stored on your side, they're delivered by Tuned Global's systems in real time when a user requests a track. Since audio files are by far the largest assets, this significantly reduces your storage costs and infrastructure complexity. As with Model 1, each play must still be logged back to Tuned Global via the LogPlay API as an end user streams a track. Best for clients who want a responsive catalogue experience without the overhead of managing large audio libraries. Model 3 — Store Metadata Only, Stream Everything Else On Demand You store metadata only. Images and audio are both fetched live from Tuned Global when needed. You hold only the catalogue metadata. Artwork and audio are delivered on demand by Tuned Global, meaning images can also be served at any size or resolution your application requires, without you needing to manage image variants. As with all integration models, each play must still be logged back to Tuned Global via the LogPlay API whenever an end user streams a track. Best for clients who want the lightest possible infrastructure footprint and are happy to rely on Tuned Global's delivery systems for all media. • [API Reference](https://docs-api-contentdelivery.tunedglobal.com/api-reference.md): This API provides READ access to public information content. Tuned Global APIs are RESTful APIs available via the https protocol with documentation available via a Swagger interface. The APIs are self documented and provide information on input parameters and return models. API responses are available as XML or JSON. This documentation is an overview of the Swagger interface with additional context on usage. Unless explicitly stated in either your direct licensor agreements or your Tuned Global agreements, Tuned Global catalogue, being either the assets or metadata, cannot be used to train Machine Learning or AI models. Swagger Interface: https: https://api-delivery-connect.tunedglobal.com/swagger/ui/index Note: Select Version 5 from dropdown on Swagger interface This documentation pertains only to the V5 Content Delivery API. It assumes that you receive a catalogue metadata feed from Tuned Global and use this data in your system. This API requires that you use the product IDs in your catalogue feed to access assets for these products. • [Authentication](https://docs-api-contentdelivery.tunedglobal.com/authentication.md): This section outlines the essential aspects of authenticating your requests to access our API services securely. Authentication is a crucial step in ensuring that only authorized users and applications can interact with our APIs, protecting sensitive data and maintaining the integrity of our services. Types of Authentication We offer different authentication methods to suit diverse use cases and requirements. The most common authentication mechanisms supported by our APIs are: API Key Authentication : This method involves including a unique API key with each request under a specific Http header. The API key acts as a simple yet effective way to identify and authorize applications or users. Basic HTTP Authentication: Basic HTTP Authentication is a widely-used, simple, and stateless authentication method. It involves including the username and password in the request's "Authorization" header encoded in Base64 format. It is essential to use this method only over secure connections (HTTPS) to prevent credentials from being transmitted in plaintext. HMAC Authentication: HMAC (Hash-based Message Authentication Code) is a more advanced authentication method that ensures both integrity and authenticity of API requests. It involves generating a cryptographic hash using secret keys and the request data, which is then sent along with the request. The server verifies the hash to authenticate the request and detect any tampering. Getting Started with Authentication To start using the API and benefit from its functionality, clients will need to obtain the necessary authentication credentials from Tuned Global. The process typically involves registering for an API key, obtaining the required username and password for Basic HTTP Authentication, or to be able to generate the HMAC credentials, depending on the authentication method you choose. In the following sub sections, we'll provide step-by-step guides and code examples for each authentication type to help you seamlessly integrate authentication into your applications. • [API Key Authentication](https://docs-api-contentdelivery.tunedglobal.com/authentication/api-key-authentication.md): This method involves including a unique API key with each request under a special http header called “StoreId”. Tuned Global will provide the API key once your details are registered in our system. Since this model only requires an API Key in the header, it does not deliver sensitive information and is used to request catalogue metadata i.e. search, images etc. Examples Following are the usage examples from the curl and postman. Plain text curl -X GET --header "Accept: application/json" --header "StoreId: TESTAPIKEY" "https://api-delivery-connect.tunedglobal.com/api/v5/search/master/songs?filter.name=hello • [Basic HTTP Authentication](https://docs-api-contentdelivery.tunedglobal.com/authentication/basic-http-authentication.md): This relates to the play log end points as noted in the documentation. The logging endpoints are only applicable where Tuned Global is responsible for generating reports on the behalf of a client. If a client is managing their reports internally, then the endpoint (and basic http auth) isn't required. This model uses a simple challenge and response mechanism with which a server can request authentication information (Username and password) from a client. The client passes the authentication information to the server in an Authorization header e.g. Authorization: Basic <credentials>, where <credentials> is the Base64 encoding of Username and password joined by a single colon; Note: Please include the API Key under the ‘StoreId: TestKey’ http header with Basic HTTP Authentication. Examples Following are the usage examples from the curl and postman. Plain text curl --location '' --header 'StoreId: TestAPIKey' --header 'Content-Type: application/json' --header 'Authorization: Basic VGVzdEFjY2Vzc0tleUZyb21URzpUZXN0U2VjcmV0S2V5RnJvbVRH' --data '{ "UserId": 0, "TrackId": 0, "Country": "string", "LogPlayType": "Start", "Seconds": 0, "Source": "Queue", "PlayType": "Stream", "SourceId": 0, "UserIp": "string", "DeviceId": 0, "SubId": 0, "Guid": "string", "AudioQuality": "low", "ExternalPlanId": "string" }' 'https://api-delivery-connect.tunedglobal.com/api/v5/play/logplay' • [HMAC Authentication](https://docs-api-contentdelivery.tunedglobal.com/authentication/hmac-authentication.md): Hash-based message authentication code (HMAC) is a mechanism for calculating a message authentication code involving a hash function in combination with a secret key. This can be used to verify the integrity and authenticity of a message (sent from a client to a server or server to server). If an intermediate party attempts to intercept and alter an API call for malicious reasons, or where a fault in an intermediary proxy drops key header information, the signature will not match and the API call will be denied. Our HMAC generator tool can be used to create API calls and and generate the OAuth signature using your API key and secret. Generating HMAC Tuned Global will provide the client with a public (Access Key) and a private secret (Secret Key). Both of the keys are base-64 encoded strings, which means they should never contain any non-base-64 characters and the length of each key is always a multiple of 4. It's the client’s responsibility is to store the Secret Key securely and never share it with other parties. HMAC tokens are one time use only i.e. client needs to generate a new HMAC for every request to the server even if it's for the same resource. The client must Hash the request content using MD5 hashing algorithm. This typically applies to HTTP GET, PUT and POST requests in which the data is sent to the server in the request body or in query string parameters. Following fields are required to create HMAC signature Access key (to be provided by tuned) Secret Key (to be provided by tuned) Http method (Get, Post, Put etc) UTF-8 encoded request-URI (e.g https://api-delivery-connect.tunedglobal.com/v5/assets encoded using UTF-8) encoded payload (for POST request only) nonce timestamp Steps Generate a new GUID (to be used as nonce) and a Unix timestamp. See this .net fiddler for an example of how to generate a nonce and timestamp. Encode the full URI using UTF-8 encoding. Note: Ensure the encoded string is all in lowercase. Note: Steps 3 - 5 are only applicable for POST requests with a JSON object in the payload. Skip to step 6 for http GETAsset requests or requests where there is no Payload to be sent. Serialize the Json object / payload that needs to be sent. (Only for POST requests) Convert the serialized Json object / payload to bytes using UTF-8 encoding table (Only for POST requests) Hash the above byte array using the standard MD5 hashing algorithm and convert the hashed output back to base64 string. (Only for POST requests) Construct a string by concatenating all the fields above to create raw signatures.The expected format is: <access-key><HTTP-method><request-URI><encoded-payload OR string.empty if no payload required><nonce><timestamp> Convert formatted raw signature string from above to bytes array using UTF 8 encoding. Convert the secret key provided by TG, into a byte array. Hash this full concatenated raw signature string using standard HMAC SHA256 hashing algorithm using the secret key byte array. Convert the hashed result array from above to the Base64 string. This is the final string which will be used as the unique signature for the request. Build Authorization Header value.This value should contain access key, request signature from the step above, nonce and timestamp separated by colon “:”. The expected format is: {access-key}:{request-signature}:{nonce}:{timestamp} Add an http Header called Authorization to the request. And the value should be Tuned-HMAC e.g Authorization: Tuned-HMAC {access-key}:{request-signature}:{nonce}:{timestamp} Code Samples for Generating HMAC DotNet Plain text public JsonResult GenerateHMAC() { // Pre-generated access/secret keys. TG to provide to the client. var accessKey = "TESTaBcdEfGhONtnZf6y"; var secretKey = "T35TKLhx5UsRJAJnzwx62bbqFhdqDyBy"; // Api to retrieve the Stream URL var endpoint = "https://api-delivery-connect.tunedglobal.com/api/v5/assets/122256677/stream?quality=High"; //STEP 1: Generate nonce and timestamp // Nonce string nonce = Guid.NewGuid().ToString("N"); // Timestamp using unix time DateTime epochStart = new DateTime(1970, 01, 01, 0, 0, 0, 0, DateTimeKind.Utc); TimeSpan timeSpan = DateTime.UtcNow - epochStart; string requestTimeStamp = Convert.ToUInt64(timeSpan.TotalSeconds).ToString(); // STEP 2: Encode request url using UTF8 encoding //Note: Ensure the encoded string is all in lowercase. var uri = System.Web.HttpUtility.UrlEncode(endpoint, Encoding.UTF8); //Note: Skip to step 6 for http GET requests or requests where there is no Payload to be sent with the request // STEP 3: Serialize Json object / payload var data = new SampleRequestPayload { Id = 1, Name = "Joe Bloggs"} ; //Serialize to string string serializedData = JsonConvert.SerializeObject(data); // STEP 4: Convert serialized payload to bytes using UTF8 encoding table byte[] content = Encoding.UTF8.GetBytes(serializedData); // Initialize authentication code var authCode = string.Empty; // STEP 5: Hash the request body using MD5 hashing algorithm MD5 md5 = MD5.Create(); byte[] requestContentHash = md5.ComputeHash(content); // Convert hashed data to base 64 string string requestContentBase64String = Convert.ToBase64String(requestContentHash); // STEP 6: Create Raw signature string. Format: {your-access-key}{http-method}{request-url}{request-body-base64-string}{nonce}{timestamp} string signatureRawData = String.Format("{0}{1}{2}{3}{4}{5}", accessKey, "PUT", uri, requestContentBase64String, nonce, requestTimeStamp); // STEP 7: Convert formatted signature raw string to bytes byte[] signature = Encoding.UTF8.GetBytes(signatureRawData); // STEP 8: Coverty secret key to byte array var secretKeyByteArray = Convert.FromBase64String(secretKey); //STEP 9: Create HMAC for signature string using secret key byte array using (HMACSHA256 sha = new HMACSHA256(secretKeyByteArray)) { // Sign the request byte[] signatureBytes = sha.ComputeHash(signature); // STEP 10: Convert the signatureBytes result to base64 string string requestSignatureBase64String = Convert.ToBase64String(signatureBytes); //STEP 11: Generate authentication code. Format: {your-access-key}:{signature}:{nonce}:{timestamp} //This is the file signature string that needs to be sent in Tuned-HMAC auth header authCode = string.Format("{0}:{1}:{2}:{3}", accessKey, requestSignatureBase64String, nonce, requestTimeStamp); } return Json(authCode); } Javascript for node.js Plain text const crypto = require("crypto"); const https = require("https"); // provided by Tuned Global const accessKey = "accessKeyFromTG"; const secretKey = "SecretKeyFromTG"; function generateNonce() { return crypto.randomBytes(16).toString("hex"); } function generateTimestamp() { return Math.floor(Date.now() / 1000); } function urlEncode(uri) { const uriEncoded = encodeURIComponent(uri); return uriEncoded.replace(/%\w\w/g, match => match.toLowerCase()); } function md5Hash(content) { return crypto.createHash("md5").update(content).digest("base64"); } function hmacSha256(secretKeyBytes, message) { return crypto .createHmac("sha256", secretKeyBytes) .update(message) .digest("base64"); } function generateAuthorizationHeader(method, uri, payload) { const nonce = generateNonce(); const timestamp = generateTimestamp(); const ecodedUri = urlEncode(uri); const rawSignature =accessKey + method + ecodedUri +""+ nonce + timestamp; const rawSignatureBytes = Buffer.from(rawSignature, "utf-8"); const secretKeyBytes = Buffer.from(secretKey, "base64"); const requestSignature = hmacSha256(secretKeyBytes, rawSignatureBytes); return Tuned-HMAC ${accessKey}:${requestSignature}:${nonce}:${timestamp}; } // Usage example // 123456789 const method = "GET"; const uri = "https://api-delivery-connect.tunedglobal.com/api/v5/assets/123456789/stream?quality=High&assetType=AAC"; const payload = {}; var test = generateAuthorizationHeader(method, uri, payload); Python Plain text import base64 import codecs from hashlib import md5, sha256 import hmac import json import os import requests import time from typing import Any from uuid import uuid4 import urllib.parse def timestamp() -> str: return str(int(time.time())) def get_nonce(): # return secrets.token_urlsafe() return uuid4().hex def encode_url(url: str) -> str: encoded = urllib.parse.quote(url, safe="", encoding="utf8") # Due to a quirk in how .NET's System.Web.HttpUtility.UrlEncode method works # we need to manually lower-case the converted string _except_ for the URL # query parameter keys and values. See the test for an example if urllib.parse.urlparse(url).query: encoded_question_mark = "%3F" pos = encoded.find(encoded_question_mark) lower_url = encoded[:pos].lower() upper_query = encoded[pos:] lower_query = [] i = 0 while i < len(upper_query): char = upper_query[i] if char == "%": # if escaped character, convert to lower lower_query.append(upper_query[i: i+3].lower()) i += 3 else: # don't convert lower_query.append(char) i += 1 encoded = lower_url + "".join(lower_query) return encoded else: return encoded.lower() def encode_json_obj(obj: Any) -> str: utf8_obj = codecs.encode(json.dumps(obj), encoding="utf8") hashed_obj = md5(utf8_obj).digest() base64_obj = base64.b64encode(hashed_obj) return str(base64_obj) def create_signature( access_key: str, secret_key: str, http_method: str, url: str, request_content: Any = None, ) -> str: nonce = get_nonce() ts = timestamp() encoded_request = encode_json_obj(request_content) if request_content is not None else "" encoded_url = encode_url(url) sig_str = f"{access_key}{http_method}{encoded_url}{encoded_request}{nonce}{ts}" sig_utf8 = codecs.encode(sig_str, encoding="utf8") secret_key_bytes = base64.b64decode(secret_key) sig_bytes = hmac.digest(secret_key_bytes, msg=sig_utf8, digest=sha256) request_sig = codecs.decode(base64.b64encode(sig_bytes)) auth_code = f"Tuned-HMAC {access_key}:{request_sig}:{nonce}:{ts}" return auth_code access_key = "accessKeyFromTG" secret_key = "SecretKeyFromTG" store_id_val = "TestApiKey" http_method = "GET" url = " https://api-delivery-connect.tunedglobal.com/api/v5/assets/123456789/stream?quality=High&assetType=AAC " sig = create_signature( access_key=access_key, secret_key=secret_key, http_method=http_method, url=url, request_content=None, ) headers = { "StoreId": store_id_val, "Authorization": sig } print(headers) • [Search](https://docs-api-contentdelivery.tunedglobal.com/search.md): Welcome to the Search API section of our comprehensive API documentation, where you gain access to an array of powerful search capabilities to traverse our extensive catalogue (restricted to what you have licensed). The Search API empowers developers like you to seamlessly integrate and leverage our vast collection, enabling efficient retrieval of the relevant content. Integrating our Search API into your applications is a streamlined process with developer-friendly API endpoints. Our documentation provides comprehensive insights into request structures, query parameters, and response formats, ensuring a seamless integration experience. Getting Started To initiate your exploration of the master catalogue and harness the power of our Search API, please refer to the technical documentation below. Dive into the details of constructing search queries and leverage the full potential of our API to deliver personalized and compelling content experiences. Security Model Search API uses the API Key security model. Please refer to the API Key Authentication section of the documentation for more details. • [Album Search](https://docs-api-contentdelivery.tunedglobal.com/search/album-search.md): The Album search API will return the albums that meet your search criteria. The album list you are searching on is the same as per your agreement with Tuned Global. That means either label(s) in their entirety or where you are only receiving a subset of catalogue content, then that subset only. You do not have access to any labels that you have not licensed. Critical Rights Management Unless you specify in your query to return only live content, the API will also return future releases. It is your responsibility to ensure that your systems will not display future releases to your users prior to their release date. Ensure that you are displaying territorially available songs to your users by including the territory in the request. ISO 3166-1 2CHAR • [Song Search](https://docs-api-contentdelivery.tunedglobal.com/search/song-search.md): The song search API will return the songs that meet your search criteria. The song list you are searching on is the same as per your agreement with Tuned Global. That means either label(s) in their entirety or where you are only receiving a subset of catalogue content, then that subset only. You do not have access to any labels that you have not licensed. Critical Rights Management Unless you specify in your query to return only live content, the API will also return future releases. It is your responsibility to ensure that your system will not display future releases to your users prior to their release date. Ensure that you are displaying territorially available songs to your users by including the territory in the request. ISO 3166-1 2CHAR • [Catalogue](https://docs-api-contentdelivery.tunedglobal.com/content.md): Welcome to the Catalogue API section of our API documentation. Use these APIs to view catalogue information or allow specific catalogue items into for your service. Security Model Catalogue Delivery Service APIs uses the API Key security model. Please refer to the API Key Authentication section of the documentation for more details. • [Retrieve Tracks for an Album](https://docs-api-contentdelivery.tunedglobal.com/content/retrieve-detailed-track-listing-for-the-specified-release.md): Use this API to retrieve track details about an Album. The album ID {id} is provided within the JSON feed, use that id in your request and retrieve the detailed listing of tracks on that album. Critical Rights Management Please note that this API will also return future releases. It is your responsibility to ensure that your systems will not display future releases to your users prior to their release date along with territorial restrictions as outlined in the CDS Metadata Feed. Explore the response section for fields that are returned in the response. • [Retrieve Song detail](https://docs-api-contentdelivery.tunedglobal.com/content/retrieve-detail-about-a-specific-track.md): Use this API to retrieve song details. The track or song ID {id} is provided within the JSON feed or by using the API to retrieve an albums track list. Use that id in your request and retrieve the detailed track information. Critical Rights Management Please note that this API will also return future releases. It is your responsibility to ensure that your systems will not display future releases to your users prior to their release date along with territorial restrictions as outlined in the CDS Metadata Feed. Explore the response section for fields that are returned in the response. • [Upload Allowed Songs](https://docs-api-contentdelivery.tunedglobal.com/content/uploadallowedsongs.md): This API is used to control the products that are ingested and made available in your system. A typical use case may be that a Catalogue Delivery Partner (label or aggregator) provides a list of sings where they have both publishing and master rights. These may be the only songs you wish to make available in your system for that deliver partner. You can then use this API to upload a list of songs that are allowed to be made available. When they apprear via the Tuned Global supply chain, these songs will be allowed for this delivery partner. Note: This functionality must be enabled in your system on a label by label basis by Tuned Global personnel. Contact Tuned Global support to discuss this requirement. You will need an excel (.xslx) file to allow songs by label Id. Tuned shall provide the label ids for each delivery partner and youn will use this id in the API request. Where publisher clearance is enabled, these isrcs will be sent to the publisher first before they are allowed into your service. The Excel upload file needs to be in the following format. • [Get Assets](https://docs-api-contentdelivery.tunedglobal.com/asset.md): Welcome to the Assets API section of our comprehensive API documentation. This section showcases a set of powerful APIs that enable you to access and retrieve catalogue media effortlessly. Use these APIs to access assets, being full length audio files, preview audio files or image URLs than can be used in conjunction with the Tuned Global image service. Getting Started To get started, simply choose the API that aligns with your requirements and follow the documentation provided below. Each API documentation includes endpoint details, parameters, and sample requests and responses to guide you through the integration process Security Model All Asset APIs use the HMAC security model. Please refer to the HMAC section of this documentation for more details. • [Retrieve the image URL for album/track](https://docs-api-contentdelivery.tunedglobal.com/asset/retrieve-the-image-url-for-album-track.md): Our Image API allows you to retrieve high-quality images programmatically. You can use this API with our image engine. More details are available below . Critical Rights Management Please note that this API will also return future releases. It is your responsibility to ensure that your systems will not display future releases to your users prior to their release date along with territorial restrictions as outlined in the CDS Metadata Feed . • [Image Engine](https://docs-api-contentdelivery.tunedglobal.com/asset/retrieve-the-image-url-for-album-track/image-engine.md): Resize / Apply Filters // Watermark / Crop / More You can use Tuned Global’s automatic image resizing end-point in order to generate images in the size you wish. The system will resize from the original image automatically. In order to use and access these images, you will need to first get the Thumbor settings from the TUNED APIs or TUNED directly. The standard URL for Thumbor is provided below in the example, if you have custom URLs configured this may change. In order to get an image., you can then add the Thumbor URL ahead of the image URL (available from the APIs) along with the parameters to resize the image. An image example is here: https://dxfve6m7pg0pq.cloudfront.net/unsafe /420x420/d16npyvi7pcxgr.cloudfront.net /images1004/100/4_0/060/252/790/910/3/104_1004_00602527909103_20220222_1307.jpg Yellow = Thumbor URL Fixed URL - this is provided to you by Tuned Global Use this for all your thumbor requests Orange = request parameters Detailed below Green = image information returned in the GetImageURL Note that the API will return the full URL to the image. In the example above this would be: https://d16npyvi7pcxgr.cloudfront.net/images1004/100/4_0/060/252/790/910/3/104_1004_00602527909103_20220222_1307.jpg This image will be the full sized image delivered by the label (format may be converted) Exclude the https:// component and use the remainder in your Thumbor request. Image Request You must build your URL to request an image suitable for your application. Below is a Basic model, for a quick start. There is also an Advanced section if you want to customise and optimise the images being retrieved. BASIC To simply ask for a resized image, simply specify the size of the image as follows; [Thumbor URL] / unsafe/[image size] / [image URL returned in API] Image size is defines in pixels width x height Example: [Thumbor URL] = https://dxfve6m7pg0pq.cloudfront.net / unsafe/[image size] = unsafe/ [image URL returned in API] = d16npyvi7pcxgr.cloudfront.net/images1004/100/4_0/060/252/790/910/3/104_1004_00602527909103_20220222_1307.jpg Full URL: https://dxfve6m7pg0pq.cloudfront.net/unsafe/420x1420/d16npyvi7pcxgr.cloudfront.net/images1004/100/4_0/060/252/790/910/3/104_1004_00602527909103_20220222_1307.jpg Note: This example is the same as Crop in Advanced below. It is NOT a proportional resize but will crop the image as defined below. If you wish to proportionally resize you should use Fit ADVANCED Re-Size Define the width and height you wish the image to be resized to, within the parameters below; Crop If you do not specify to fit an image within a container, the image will be resized to the largest dimension (w or h) and then cropped to the smallest dimension. Eg. Below the same image is set to size 420x1420 https://dxfve6m7pg0pq.cloudfront.net/unsafe/420x1420/d16npyvi7pcxgr.cloudfront.net/images1004/100/4_0/060/252/790/910/3/104_1004_00602527909103_20220222_1307.jpg Notes: The image is now 1420 high and cropped to the centre 420 If either dimension number is negative, the image will be flipped horizontally or vertically Fit Use the fit-in parameter to ensure an images first into a container with no cropping. The example URL is https://dxfve6m7pg0pq.cloudfront.net/unsafe/fit-in/420x420/d16npyvi7pcxgr.cloudfront.net/images1004/100/4_0/060/252/790/910/3/104_1004_00602527909103_20220222_1307.jpg The image will be scaled proportionally to fit into the smallest dimension (w or h) Eg. Below the same image is set to size 420x1420 https://dxfve6m7pg0pq.cloudfront.net/unsafe/fit-in/420x1420/d16npyvi7pcxgr.cloudfront.net/images1004/100/4_0/060/252/790/910/3/104_1004_00602527909103_20220222_1307.jpg Notes: The image retains its proportions and full image (no crop) but is resized to its lowest dimension being 420 If either dimension number is negative, the image will be flipped horizontally or vertically Filters You can specify multiple filters within a request. Some examples are below. You can specify more than one filter separated by a colon. Quality Quality is measured from 1-100, higher being better. You may want to experiment with qualities to ensure that your users experience is optimal (and fast). We recommend a quality setting of 70 as being a good compromise between quality and size. https://dxfve6m7pg0pq.cloudfront.net/unsafe/fit-in/420x420/filters:quality(70)/d16npyvi7pcxgr.cloudfront.net/images1004/100/4_0/060/252/790/910/3/104_1004_00602527909103_20220222_1307.jpg Brightness and Contrast Adjust the brightness and contract for a specific effect in your application. Both are measured for from -100 to 100 https://dxfve6m7pg0pq.cloudfront.net/unsafe/fit-in/420x420/filters:quality(70):brightness(-10):contrast(100)/d16npyvi7pcxgr.cloudfront.net/images1004/100/4_0/060/252/790/910/3/104_1004_00602527909103_20220222_1307.jpg Format Define if you want to force a format. The system will normally return a jpeg file, but depending on the original format it may at times return a png. A JPEG will deliver the smallest file size and hence is recommended. format(jpeg) or format(png) https://dxfve6m7pg0pq.cloudfront.net/unsafe/fit-in/420x420/filters:quality(70):brightness(-10):contrast(100):format(jpeg)/d16npyvi7pcxgr.cloudfront.net/images1004/100/4_0/060/252/790/910/3/104_1004_00602527909103_20220222_1307.jp Watermark Define if you wish to use a watermark over your images. You can define location, opacity and more Usage: watermark(imageUrl, x, y, alpha [, w_ratio [, h_ratio]]) Description This filter adds a watermark to the image. It can be positioned inside the image with the alpha channel specified and optionally resized based on the image size by specifying the ratio (see Resizing). Arguments imageUrl - Watermark image URL. It is very important to understand that the same image loader that Thumbor uses will be used here. If this URL contains parentheses they MUST be url encoded, since these are the characters Thumbor uses as delimiters for filter parameters. x - Horizontal position that the watermark will be in. Positive numbers indicate position from the left and negative numbers indicate position from the right. If the value is ‘center’ (without the single quotes), the watermark will be centered horizontally. If the value is ‘repeat’ (without the single quotes), the watermark will be repeated horizontally. If the value is a positive or negative number followed by a ‘p’ (ex. 20p) it will calculate the value from the image width as percentage y - Vertical position that the watermark will be in. Positive numbers indicate position from the top and negative numbers indicate position from the bottom. If the value is ‘center’ (without the single quotes), the watermark will be centered vertically. If the value is ‘repeat’ (without the single quotes), the watermark will be repeated vertically If the value is a positive or negative number followed by a ‘p’ (ex. 20p) it will calculate the value from the image height as percentage alpha - Watermark image transparency. Should be a number between 0 (fully opaque) and 100 (fully transparent). w_ratio - percentage of the width of the image the watermark should fit-in, defaults to ‘none’ (without the single quotes) which means it won’t be limited in the width on resizing but also won’t be resized based on this value h_ratio - percentage of the height of the image the watermark should fit-in, defaults to ‘none’ (without the single quotes) which means it won’t be limited in the height on resizing but also won’t be resized based on this value Example: https://dxfve6m7pg0pq.cloudfront.net/unsafe/fit-in/420x420/filters:watermark(https://d2byqs7e78w6a1.cloudfront.net/DEMO/video/test_meta2/tg-logo-web-1.png,-10,-70p,50)/d16npyvi7pcxgr.cloudfront.net/images1004/100/4_0/060/252/790/910/3/104_1004_00602527909103_20220222_1307.jpg Speak to Tuned Global about your specific needs as further filters are available (eg. Blur, Saturation and more) • [Retrieve stream URL for a track](https://docs-api-contentdelivery.tunedglobal.com/asset/retrieve-stream-url-for-a-track.md): This API provides direct access to the signed song URLs, allowing you to integrate music into your backends or the apps with ease. This API facilitates two distinct use cases. The first use case entails requesting access to the music assets for the purpose of storing or ingest them into your own system. This implies that the music files are transmitted to the end user via your system, rather than directly from Tuned Global. In this scenario, there is no need to include any supplementary information in the header. Additionally, the transmission of territory information is not required, as it is assumed that territorial access control will be implemented within your own system. The second use case involves delivering streaming functionality to end users directly from the Tuned Global system, using this API. In this context, it is crucial to consider territorial restrictions and to include additional header information that enhances resilience against URL hijacking. For specifics regarding the usage of session_id information, refer to the details provided below. The signed song URL will only provide you temporary access to the music files. This TTL (Time to live) is measured in seconds and hence you should only request the URL when you need it and then consume it immediately. Session salting Usage notes. Generate a unique GUID for each request for a play (GetStream). Pass this GUID to the GetStreamAPI in a http header with the key called ‘ session_id ’. The GetStream API will read the value of this session_id key from the header and add its encrypted value to the CDN token when returning the stream location URL. You MUST use the same session_id value that was passed into the GetStream API above, when calling the returned CDN url. As per above this is a key called ‘ session_id ’ within the http header request. It is important to note that the name and value of this session_id key in the http header of the getStream API and CDN url, are case sensitive, the values have to be an exact match. These values are matched to the encrypted token and if they are not identical you will be denied a stream and get a 401 error. See examples below Critical Rights Management Please note that this API provides access restrictions based on the territory sent through with the request and that the product is available (release date). Where you are downloading the product asset on your system for end user delivery, you will need to request the file once it becomes available as per the CDS Metada Fee d information provided. • [Retrieve preview URL for a track](https://docs-api-contentdelivery.tunedglobal.com/asset/retrieve-preview-url-for-a-track.md): With the Song Preview API, you can obtain short song preview URLs, perfect for offering music samples, or implementing song previews within your application. Critical Rights Management Please note that this API will also return future releases. It is your responsibility to ensure that your systems will not display future releases to your users prior to their release date along with territorial restrictions as outlined in the CDS Metadata Feed • [Log Plays](https://docs-api-contentdelivery.tunedglobal.com/log-play.md): Welcome to the Log Play API section of our comprehensive API documentation. This section outlines the functionalities that allow you to efficiently log user plays to be able to generate the Label reports as well as music usage and user activity reports. Note: This section is only applicable if Tuned Global is responsible for managing the internal and external (label) reports. For reporting purposes, it is necessary to log the 30 second point of play. However we would suggest that best practice is to log Start of Play, 30 seconds, the Skip action (and the seconds at which this action occurs) and End of File. This leads to better insights into the behaviour of your users and your application. Getting Started To start logging plays and unlocking valuable analytics and insights into user behaviour and content performance, refer to the technical documentation below. Explore the play logging endpoints, understand the data format, and get started with implementing the Log Play APIs in your applications. Security Model All Log Play APIs use the Basic HTTP Auth security model. Please refer to the Basic HTTP Auth section of this documentation for more details. • [Log a play for the specified track](https://docs-api-contentdelivery.tunedglobal.com/log-play/log-play-for-a-specific-track.md): Log a play for the specified track. A typical Play log has the following PlayLogType sequence Plain text LogPlayType:Start, Seconds: 0 LogPlayType:Progress, Seconds: 30 LogPlayType:End, Seconds: 167 (total song duration) LogPlayType:Skip, Seconds: 19 (Point at which the track was skipped) This API is used for reporting plays for licensing reporting and analytics. Consult with Tuned Global to ensure you are logging the correct actions for your Rights Holder Agreements. This API is for logging a single action. • [Log plays in batches](https://docs-api-contentdelivery.tunedglobal.com/log-play/log-plays-in-batches.md): This API is used for reporting plays for licensing reporting. Consult with Tuned Global to ensure you are logging the correct actions for your Rights Holder Agreements. This API is for logging multiple plays (a batch of plays). • [CDS Metadata Feed](https://docs-api-contentdelivery.tunedglobal.com/content-delivery-service.md): Tuned Global provides a metadata delivery feed as part of its Catalogue Delivery Specification. Tuned Global accepts catalogue feeds from many labels in different formats. Our ingestion program, Intaga, automatically processes these feeds and normalises the metadata structures. These Tuned Global metadata feeds enable clients to access this normalised structure and receive continuing updates of new products, changed products and takedowns. You can use the information in these metadata feeds with the Tuned Global Catalogue Delivery APIs detailed here order to access assets. These assets may be Album Artwork, Audio and Video files as per your license agreement. The Tuned Global Catalogue Delivery Service provides a JSON formatted feed on a scheduled basis. Once the initial feed has been provided, updates can be scheduled every hour, day or week - depending on your needs. These feeds will be made available via an sFTP location that you can access OR an AWS S3 Bucket if you are currently an AWS user. The files are available for 30 days at which point they are deleted. If you wish to archive these files, that is your responsibility. Note: If your S3 location is being used, these files will not be deleted and you will need to manage any delete policies within your AWS infrastructure. OnBoarding The onboarding process will be as follows; The Tuned Global Operations team will connect with you once your service has been approved internally. You will provide either S3 details for Metadata files or you will provide a Public Key for sFTP access. The team can assist on these items. Tuned will deliver a number of JSON test files as per the specification below. You will import these files and confirm that you were able to complete this successfully with Tuned Tuned will initiate the initial feed, that includes your licensed catalogue content. Precedence Whenever information is conveyed through this Catalogue Delivery Specification, it represents a complete and accurate declaration concerning the Album and Track metadata. This implies that such information should be regarded as self-contained and authoritative, thereby replacing any existing data related to these products within your system. Manage your Risk It is critical that you process files in date/time order from oldest to newest. This is to ensure integrity of data in updates and takedowns. You must take special note of item 2.22 - action. This item denotes whether to treat this product (album) as a new product, an update to your existing data or a takedown. Rights Management One of the most critical items to manage is the availability of a product, being an Album or a Track. Making a product available prior to its live date or not removing it after an end date is a significant breach of your licensing agreement and should be treated as a high level risk. As a general overview the logic to manage rights and availability is: The following provides instructions on when to make a track OR an album available to your audience. Only where there is a tick against all the elements should you make an album or track available. Please keep in mind that rights to Albums and Tracks are distinct. The below instructions depend on whether Tuned Global is providing Publishing data or not. NOTE: REFERENCE TO NOT MAKING AN ALBUM OR TRACK AVAILABLE (LIVE) MEANS, ALL ASPECTS OF AN ALBUM AND OR TRACK. THIS INCLUDES PREVIEWS, ARTWORK, TITLES INCLUDING ALL METADATA. TERRITORIES AND RIGHTS The JSON feed for the Catalogue Delivery Service may contain territories for which you are not licensed. It is important that within your own system you capture which territories are licensed for a recordLabel (2.32 - labelOwnerID) and then ensure that you only display these products on availability of rights AND having a license for this record label for this territory. Where you wish TUNED to process and manage all rights transparently, we can do so via an Advanced API service. RULE 1 Check if Action (2.22) is a TAKEDOWN If YES, no further analysis is required, remove the entire album and all its tracks immediately RULE 2 Check Metadata below, depending on your use case Where Tuned Global is NOT providing Publishing Data Title Album Level Rights 2.36 distFlg =0 ✓ 2.38 rights Start Date <=Today and End Date >=Today for each territory. ✓ Album Notes: If no Tracks (below) have rights, you should not display the Album information as no tracks will be available to end users. Title Track Level Rights 2.38 Rights (Album Level) Start Date <=Today and End Date >=Today for each territory. ✓ 2.57 distFlg =0 ✓ 2.60 rights Start Date <=Today and End Date >=Today for each territory. (Applicable to Master rights only). ✓ Where Tuned Global IS providing Publishing Data Title Album Level Rights 2.36 distFlg =0 ✓ 2.38 rights Start Date <=Today and End Date >=Today for each territory. ✓ Album Notes: Publishing Data is only applicable at a track level. If no Tracks (below) have both Master and Publishing rights for a territory, you should not display the Album information as no tracks will be available to end users . Title Track Level Rights 2.38 Rights (Album Level) Start Date <=Today and End Date >=Today for each territory. ✓ 2.57 distFlg =0 ✓ 2.60 rights Start Date <=Today and End Date >=Today for each territory. (Applicable to Master rights only). ✓ 2.72 pubRights A territory is provided. Note, this means that you can make available for the provided territories only, this should be subject to the end user’s territory. (Applicable to Publishing rights only). ✓ • [JSON Specification](https://docs-api-contentdelivery.tunedglobal.com/content-delivery-service/json-specification.md): Metadata Structure Each JSON file has a maximum of 1000 albums. Where there are more than 1000 albums per update, then multiple JSON files will be delivered. The naming structure of the JSON files is as follows; TG_{yyyyMMdd}_{HHmmss}.json The metadata delivered within the JSON file is as follows; OBJECTS (Overview) Below are the objects that you will expect to receive in your feed. Title Description Title Description Title SECTION DESCRIPTION Sub Objects Ref REQ? Album releaseId 2.21 Y action 2.22 Y upc 2.23 Y grid 2.24 N type 2.25 Y title display 2.26 Y language artistId 2.27 Y artistName display 2.28 Y language genre genreName 2.29 N subGenreName contributors id 2.69 N role name discCount 2.30 Y trackCount 2.31 Y recordLabel labelOwnerId 2.32 Y labelOwnerName subRecordLabel labelOwnerId 2.33 N labelOwnerName displayLabel 2.34 Y provisionProducerLine 2.35 N distFlg 2.36 Y originalReleaseDate 2.37 Y rights startDate 2.38 Y endDate country type mediaFlg 2.39 Y explicit 2.40 Y contentLanguage 2.70 N custom1 2.41 N custom2 2.42 N custom3 2.43 N custom4 2.44 N custom5 2.45 N imageLocation 2.46 N Track discNumber 2.47 Y trackNumber 2.48 Y trackId 2.49 Y grid 2.50 N isrc 2.51 Y duration 2.52 Y title display 2.53 Y language artistId 2.54 Y artistName artistName.display 2.55 Y artistName.language Y genre genreName 2.56 Y* subGenreName distFlg 2.57 Y displayLabel 2.58 Y contributors id 2.69 N role name provisionProducerLine 2.59 N rights startDate 2.60 Y endDate country type mediaFlg 2.61 Y explicit 2.62 Y audioLocation 2.68 N contentLanguage 2.71 N pubRights 2.72 N custom1 2.63 N custom2 2.64 N custom3 2.65 N custom4 2.66 N custom5 2.67 N Definitions ALBUM 2.21 releaseId Title TunedGlobal`s unique album identifier ID. Use this ID for access to album assets such as artwork (via catalogue delivery API) FORMAT: String MANDATORY: Y 2.22 action Title This object will describe the delivery. Options are New , Update or Takedown . Recommended best practice is; New Action: Add all metadata to your system as a new item. Best practice is to test for the existence of this ID, even though it is denoted as new. Note that to make an album or track active on your system you must still check the Album Rights (2.38) and Track Rights (2.60) and ensure that you are complying with the startDate (in a territory for which you have a license) to give people access to the asset. Note: This is a critical requirement of your licensing, otherwise you will be in Breach of your agreement. Update Action; Treat an update as a New, being to delete the metadata in your system and re-insert as per a New. This includes fetching new objects as they may have been updated by the label. Notes An update can be a takedown in that the endDate in rights has been updated to be a past, today or future date. You must check these dates and manage the availability of the products on your system. This means that if an endDate is past or today, then the album or track should NOT be available. If it is a future date, you must create a system to make this product unavailable at that time. TUNED will not send through an additional update for this item. To make an album or track active on your system you must still check the Album Rights (2.38) and Track Rights (2.60) and ensure that you are complying with the startDate (in a territory for which you have a license) to give people access to the asset. Rights management is a critical requirement of your licensing, otherwise you will be in Breach of your agreement. If an Takedown, you can assume you can remove all the rights to this item immediately and make it unavailable on your system. I=INSERT (NEW), U=UPDATE, X=TAKEDOWN FORMAT: String MANDATORY: Y 2.23 upc Title The UPC that identifies this release. Note that a UPC is not unique, multiple labels may deliver the same UPC. This is for information only, rely on the releaseId as a unique property. FORMAT: String MANDATORY: Y 2.24 grid Title The GRID that identifies this release. FORMAT: String MANDATORY: N 2.25 type Title Denotes the type of release, Album, Single, EP etc. FORMAT: String MANDATORY: Y 2.26 title Title This is an array denoting the title of the album. The array supports multiple languages. The objects are; display: The Title to display language: denoting the ISO code for the language. display FORMAT: String MANDATORY: Y language FORMAT: String (ISO 3166-1 alpha-2) MANDATORY: Y 2.27 artistId Title Denotes the artist ID. Use this ID to build your own Artist Data System. FORMAT: String MANDATORY: Y 2.28 artistName Title This is an array denoting the name of the artist. The array supports multiple languages. The objects are; display: The Artist Name to display language: denoting the ISO code for the language. display FORMAT: String MANDATORY: Y language FORMAT: String (ISO 3166-1 alpha-2) MANDATORY: Y 2.29 genre Title This is an array denoting the genre of the album. The array supports multiple genres. The objects are; genreName: A primary genre for this album subGenreName: denoting a sub genre to the primary genre. genreName FORMAT: String MANDATORY: N subGenreName FORMAT: String MANDATORY: N 2.30 discCount Title Denotes number of discs for this Album. FORMAT: Number MANDATORY: Y 2.31 trackCount Title Denotes number of tracks for this Album. FORMAT: Number MANDATORY: Y 2.32 recordLabel Title This is a parent tag denoting the record label of the album. The objects are; labelOwnerID: This is the TG id of delivering party labelOwnerName: denoting the name of the delivering party. labelOwnerId FORMAT: Number MANDATORY: Y labelOwnerName FORMAT: String MANDATORY: Y 2.33 subRecordLabel Title This is a parent tag denoting the delivering sub label. This is used where the main delivering party is an aggregator (i.e. Merlin) and the actual label is then the sub record label. The objects are; labelOwnerID: This is the TG id of delivering party labelOwnerName: denoting the name of the delivering party labelOwnerId FORMAT: Number MANDATORY: Y labelOwnerName FORMAT: String MANDATORY: Y 2.34 displayLabel Title Display label (eg. LaFace records). FORMAT: String MANDATORY: Y 2.35 provisionProducerLine Title C Line for display only FORMAT: String MANDATORY: Y 2.36 distFlg Title Denotes general avail;ability of this album for display purposes. Streaming rights are at a track level. 0 = Album Distribution is available, 1 = Album Distribution is NOT available FORMAT: String MANDATORY: Y 2.37 originalReleaseDate Title Denotes original release date of album. If unavailable the release date will be used. FORMAT: String, yyyy-mm-dd MANDATORY: Y 2.38 rights Title This is an array denoting the availability of the album. Granular streaming rights are at a track level. The array supports multiple territories. Note: The JSON feed shall often contain more territories than you have licensed. You need to ensure that you check that you have a license for the RecordLabelID (2.32) for the applicable territory. The objects are; startDate: the start date for access, sent with UTC offset endDate: the end date for access country: the applicable territory in ISO 3166 format(WW denotes worldwide) type: the usage type such as streaming or download, streaming is the default. startDate FORMAT: String, YYYY-MM-DD MANDATORY: Y endDate FORMAT: String, YYYY-MM-DD MANDATORY: Y country FORMAT: String, (ISO 3166-1 alpha-2 includes WW) MANDATORY: Y type FORMAT: String MANDATORY: Y 2.39 mediaFlag Title Denotes if the Album is a video or audio album 1: Audio only 2: Video only FORMAT: Number MANDATORY: Y 2.40 explicit Title Denotes if the album contains explicit lyrics Options are True or False FORMAT: String MANDATORY: Y 2.41 custom1 Title Custom field for client (eg. BPM or key). This custom field is currently used to send BPM FORMAT: String MANDATORY: N 2.42 custom2 Title Custom field for client (eg. BPM or key) FORMAT: String MANDATORY: N 2.43 custom3 Title Custom field for client (eg. BPM or key) FORMAT: String MANDATORY: N 2.44 custom4 Title Custom field for client (eg. BPM or key) FORMAT: String MANDATORY: N 2.45 custom5 Title Custom field for client (eg. BPM or key) FORMAT: String MANDATORY: N 2.46 imageLocation Title No longer used. Use the Catalogue Delivery API to request the asset FORMAT: String MANDATORY: N 2.70 contentLanguage Title This denotes the language of the performance. It is only made available if it is explicitly sent through by the Licensor, otherwise this will be NULL FORMAT: String (ISO 639-2 alpha-3) MANDATORY: N TRACK (List) 2.47 discNumber Title The disc number of this release FORMAT: Number MANDATORY: Y 2.48 trackNumber Title The track number of this release. Note if there are 2 discs the numbering will continue as a total track count, not per disc. FORMAT: Number MANDATORY: Y 2.49 trackId Title TunedGlobal`s unique track identifier ID. Use this ID for access to track assets such as audio or video files (via catalogue delivery API) FORMAT: String MANDATORY: Y 2.50 grid Title The GRID that identifies this track. FORMAT: String MANDATORY: N 2.51 isrc Title The ISRC that identifies this track. Note that an ISRC is not unique, labels may deliver the same ISRC on different albums. This is for information only, rely on the trackId as a unique property. FORMAT: String MANDATORY: Y 2.52 duration Title The duration of the track in seconds FORMAT: Number MANDATORY: Y 2.53 title Title This is an array denoting the title of the track. The array supports multiple languages. The objects are; display: The Title to display and Language: denoting the ISO code for the language. display FORMAT: String MANDATORY: Y language FORMAT: String (ISO 3166-1 alpha-2) MANDATORY: Y 2.54 artistID Title Denotes the artist ID. Use this ID to build your own Artist Data System. FORMAT: String MANDATORY: Y 2.55 artistName Title This is an array denoting the name of the artist. The array supports multiple languages. The objects are; display: The Artist Name to display and Language: denoting the ISO code for the language. display FORMAT: String MANDATORY: Y language FORMAT: String (ISO 3166-1 alpha-2) MANDATORY: Y 2.56 genre Title This is an array denoting the genre of the track. The array supports multiple genres. The objects are; genreName: A primary genre for this album and subGenreName: denoting a sub genre to the primary genre. genreName FORMAT: String MANDATORY: N subGenreName FORMAT: String MANDATORY: N 2.57 distFlg Title Denotes general availability of this album for display purposes. Streaming rights are at a track level. 0 = Album Distribution is available, 1 = Album Distribution is NOT available FORMAT: String MANDATORY: Y 2.58 displayLabel Title Display label (eg. LaFace records). FORMAT: String MANDATORY: Y 2.59 provisionProducerLine Title P Line for display only FORMAT: String MANDATORY: Y 2.60 rights Title This is an array denoting the availability of a track in regards to its Master Rights only (not Publishing Rights). Granular streaming rights are at a track level. The array supports multiple territories and usage types. Note: The JSON feed shall often contain more territories than you have licensed. You need to ensure that you check that you have a license for the RecordLabelID (2.32) for the applicable territory. The objects are; startDate: the start date for access, sent with UTC offset endDate: the end date for access country: the applicable territory in ISO 3166 format (WW denotes worldwide) type: the usage type such as streaming or download, streaming is the default. Dates are formatted as follows: YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00) where: YYYY = four-digit year MM = two-digit month (01=January, etc.) DD = two-digit day of month (01 through 31) hh = two digits of hour (00 through 23) mm = two digits of minute (00 through 59) ss = two digits of second (00 through 59) TZD = time zone designator (Z or +hh:mm or -hh:mm) startDate FORMAT: String, YYYY-MM-DDThh:mm:ssTDZ MANDATORY: Y endDate FORMAT: String, YYYY-MM-DDThh:mm:ssTDZ MANDATORY: Y country FORMAT: String, (ISO 3166-1 alpha-2 includes WW) MANDATORY: Y type FORMAT: String MANDATORY: Y 2.61 mediaFlag Title Denotes if the Album is a video or audio album 1: Audio only 2: Video only FORMAT: Number MANDATORY: Y 2.62 explicit Title Denotes if the track contains explicit lyrics Options are True or False FORMAT: String MANDATORY: Y 2.63 custom1 Title Custom field for client (Currently used to provide BPM) FORMAT: String MANDATORY: N 2.64 custom2 Title Custom field for client (eg. Tag Value, such as mood) FORMAT: String MANDATORY: N 2.65 custom3 Title Custom field for client (eg. Tag Value, such as mood) FORMAT: String MANDATORY: N 2.66 custom4 Title Custom field for client (eg. Tag Value, such as mood, usually used for LyricFind id, if licensed) FORMAT: String MANDATORY: N 2.67 custom5 Title Custom field for client (eg. Tag Value, such as mood) FORMAT: String MANDATORY: N 2.68 audioLocation Title No longer used. Use the Catalogue Delivery API to request the asset FORMAT: String MANDATORY: N 2.69 contributors Title This is an array denoting the contributor. The array supports multiple contributors. The objects are; id: artist id if the name exist in the artist table, else the value will be 0 role: contributor role name: contributor name id FORMAT: Number MANDATORY: N role FORMAT: String MANDATORY: N name FORMAT: String MANDATORY: N 2.71 contentLanguage Title This denotes the language of the performance. It is only made available if it is explicitly sent through by the Licensor, otherwise this will be NULL FORMAT: String (ISO 639-2 alpha-3) MANDATORY: N 2.72 pubRights Title This is an array denoting the availability of a track in regards to its Publishing Rights only (not Master Rights). The array supports multiple territories and is only displayed for a territory where it has been denoted that 100% of Publishing Rights are available. The object within the array is; country: the applicable territory in ISO 3166 format country FORMAT: String, (ISO 3166-1 alpha-2) MANDATORY: N • [JSON Example](https://docs-api-contentdelivery.tunedglobal.com/content-delivery-service/json-example.md): An example of a deliver is below; JSON { "releaseId": "94069589", "action": "I", "upc": "07043280046019", "grid": "", "type": "Single", "title": [ { "display": "Mammagutt", "language": "EN" } ], "artistId": "508974", "artistName": [ { "display": "Carina Dahl", "language": "EN" } ], "genre": [ { "genreName": "Pop", "subGenreName": null } ], "contributors": [ { "id": 508974, "role": "Main Artist", "name": "Carina Dahl" } ], "discCount": 1, "trackCount": 1, "recordLabel": { "labelOwnerId": 1004, "labelOwnerName": "Universal" }, "subRecordLabel": { "labelOwnerId": 1004, "labelOwnerName": "Universal" }, "displayLabel": "Tylden & Co", "provisionProducerLine": "2020 Hells Bells Records ℗ 2020 Hells Bells Records, distributed by Universal Music AS, Norway", "distFlg": "1", "originalReleaseDate": "2020-10-16", "rights": [ { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "CI", "type": "streaming" }, { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "CM", "type": "streaming" }, { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "SN", "type": "streaming" }, { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "ML", "type": "streaming" }, { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "GA", "type": "streaming" }, { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "AU", "type": "streaming" } ], "mediaFlg": 1, "explicit": "False", "imageLocation": null, "contentLanguage": "ENG", "custom1": null, "custom2": null, "custom3": null, "custom4": null, "tracks": [ { "discNumber": 1, "trackNumber": 1, "trackId": "94069590", "grid": "", "isrc": "NOGTH2046010", "duration": 167000, "title": [ { "display": "Mammagutt", "language": "EN" } ], "artistId": "508974", "artistName": [ { "display": "Carina Dahl", "language": "EN" } ], "genre": [ { "genreName": "Pop", "subGenreName": null } ], "contributors": [ { "id": 508974, "role": "Main Artist", "name": "Carina Dahl" } ], "distFlg": "1", "displayLabel": "Tylden & Co", "provisionProducerLine": "2020 Hells Bells Records ℗ 2020 Hells Bells Records, distributed by Universal Music AS, Norway", "rights": [ { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "CI", "type": "streaming" }, { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "CM", "type": "streaming" }, { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "AU", "type": "streaming" }, { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "GA", "type": "streaming" }, { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "ML", "type": "streaming" }, { "startDate": "2020-10-16T00:00:00+11:00", "endDate": "9999-01-01T00:00:00+11:00", "country": "SN", "type": "streaming" } ], "mediaFlg": 1, "explicit": "False", "audioLocation": null, "contentLanguage": "ENG", "pubRights": [ { "country": "AU" }, { "country": "US" }, { "country": "GB" }, { "country": "NZ" } ], "custom1": "132.6", "custom2": null, "custom3": null, "custom4": null, "custom5": null } ] }