""" Module for configuration constants available to the entire application. """ from enum import StrEnum, unique from os import path BASE_APP_PATH = path.dirname(path.abspath(__file__)) BASE_PROJECT_PATH = path.dirname(BASE_APP_PATH) BASE_FRONTEND_PATH = path.join(BASE_PROJECT_PATH, "frontend") LOCALHOST: str = "127.0.0.1" class Misc(StrEnum): """Miscellaneous constants.""" NA = "N/A" class HttpMethods(StrEnum): """HTTP methods.""" GET = "GET" class RequestParams(StrEnum): """Request parameters.""" AUDIT_GROUP_ID = "audit_group_id" class HeaderKeys(StrEnum): """Header keys for HTTP requests.""" USER_AGENT = "User-Agent" ACCEPT_LANGUAGE = "Accept-Language" ACCEPT_ENCODING = "Accept-Encoding" ACCEPT = "Accept" REFERER = "Referer" @unique class Auth0(StrEnum): """Auth0 constants.""" CLIENT_ID_SPA = "client_id_spa" CLIENT_ID = "client_id" CLIENT_SECRET = "client_secret" DOMAIN = "domain" AUDIENCE = "audience" GRANT_TYPE = "grant_type" ACCESS_TOKEN = "access_token" SCOPE = "scope" REDIRECT_URI = "redirect_uri" EXPIRES_IN = "expires_in" ISSUER = "issuer" ALGORITHMS = "algorithms" SUB = "sub" @unique class FileTypes(StrEnum): """File types.""" PDF = "pdf" PPTX = "pptx" @unique class FileExtensions(StrEnum): """File extensions.""" PDF = f".{FileTypes.PDF}" PPTX = f".{FileTypes.PPTX}" class ResponseAttributes(StrEnum): """Attributes for API responses.""" SUCCESS = "success" ERROR = "error" DATA = "data" class MiscLower(StrEnum): """Miscellaneous constants.""" ORCHARD = "orchard" ALL = "all" ACTIVE = "active" INACTIVE = "inactive" THIRD_PARTY = "third_party" OWNER = "owner" PUBLIC = "public" PRIVATE = "private" UNLISTED = "unlisted" @unique class AuditTypes(StrEnum): """Audit types.""" SR = "SR" MV = "MV" AT = "AT" SR_UGC1 = "sr_ugc1" SR_UGC2 = "sr_ugc2" SR_UGC3 = "sr_ugc3" class RowTypes(StrEnum): """Row types for audits_rows table.""" ANALYZED = "ANALYZED" CARVED_OUT = "CARVED_OUT" NOT_ACTIVE_RELEASE = "NOT_ACTIVE_RELEASE" NOT_DELIVERED = "NOT_DELIVERED" PRIVATE = "PRIVATE" UNLISTED = "UNLISTED" @unique class Flags(StrEnum): """Audit flags.""" NO_ASSET_ID = "NO_ASSET_ID" CARVED_OUT = "CARVED_OUT" NOT_DELIVERED = "NOT_DELIVERED" NOT_ACTIVE_RELEASE = "NOT_ACTIVE_RELEASE" TERRITORIES_MISSING = "TERRITORIES_MISSING" NO_ACTIVE_REFERENCES = "NO_ACTIVE_REFERENCES" NO_ACTIVE_REFERENCES_REASONS_ORCHARD = "NO_ACTIVE_REFERENCES_REASONS_ORCHARD" NO_ACTIVE_REFERENCES_REASONS_THIRD_PARTY = ( "NO_ACTIVE_REFERENCES_REASONS_THIRD_PARTY" ) CAN_REACTIVATE = "CAN_REACTIVATE" BAD_MATCH_POLICY = "VERIFY_MATCH_POLICY" BAD_TOPIC_CHANNEL = "BAD_TOPIC_CHANNEL" OWNERSHIP_INCOMPLETE = "OWNERSHIP_INCOMPLETE" NO_TOPIC_CHANNEL = "NO_TOPIC_CHANNEL" THIRD_PARTY_CLAIM = "THIRD_PARTY_CLAIM" MUST_CLAIM = "MUST_CLAIM" ASSET_MISSING_ISRC = "ASSET_MISSING_ISRC" @unique class FlagResolutions(StrEnum): NO_ASSET_ID = "NO_ASSET_ID" UPDATE_OWNERSHIP = "UPDATE_OWNERSHIP" UPDATE_OWNERSHIP_REASON = "UPDATE_OWNERSHIP_REASON" NOT_DELIVERED = "NOT_DELIVERED" DELIVER_TRACK = "DELIVER_TRACK" DELIVER_ART_TRACK = "DELIVER_ART_TRACK" ART_TRACK_HAS_READY_STATUS = "ART_TRACK_HAS_READY_STATUS" TAKEN_DOWN = "TAKEN_DOWN" INELIGIBLE_FOR_DELIVERY = "INELIGIBLE_FOR_DELIVERY" PUBLIC_DOMAIN = "PUBLIC_DOMAIN" NON_EXCLUSIVE = "NON_EXCLUSIVE" TRACK_OFFER_TYPE_RESTRICTION = "TRACK_OFFER_TYPE_RESTRICTION" CONFLICT_RESOLUTION = "CONFLICT_RESOLUTION" MRR_ISSUE = "MRR_ISSUE" REDELIVER_TRACK = "REDELIVER_TRACK" IGNORE = "IGNORE" ASSET_OK = "ASSET_OK" NOT_ACTIVE_RELEASE = "NOT_ACTIVE_RELEASE" NO_ACTION_REQUIRED = "NO_ACTION_REQUIRED" TERRITORIES_MISSING = "TERRITORIES_MISSING" BACKFILL_MEAT = "BACKFILL_MEAT" OWNERSHIP_CORRECT = "OWNERSHIP_CORRECT" OWNERSHIP_INCOMPLETE = "OWNERSHIP_INCOMPLETE" TERRITORY_RIGHTS_CORRECT = "TERRITORY_RIGHTS_CORRECT" CAN_REACTIVATE = "CAN_REACTIVATE" REACTIVATE_REFERENCE = "REACTIVATE_REFERENCE" NO_ACTIVE_REFERENCES = "NO_ACTIVE_REFERENCES" INELIGIBLE_REFERENCE = "INELIGIBLE_REFERENCE" REFERENCE_INSUFFICIENT_LENGTH = "REFERENCE_INSUFFICIENT_LENGTH" REFERENCE_EXCLUDED = "REFERENCE_EXCLUDED" REFERENCE_DEACTIVATED_BY_OWNER = "REFERENCE_DEACTIVATED_BY_OWNER" REFERENCE_OVERLAP = "REFERENCE_OVERLAP" NO_FINGERPRINTING_RIGHTS = "NO_FINGERPRINTING_RIGHTS" NO_FINGERPRINTING_RIGHTS_VIDEO = "NO_FINGERPRINTING_RIGHTS_VIDEO" NO_FINGERPRINTING_RIGHTS_CHANNEL = "NO_FINGERPRINTING_RIGHTS_CHANNEL" REFERENCE_FILE_ACTIVE = "REFERENCE_FILE_ACTIVE" NO_ACTIVE_REFERENCES_REASONS_ORCHARD = "NO_ACTIVE_REFERENCES_REASONS_ORCHARD" NO_ACTIVE_REFERENCES_REASONS_THIRD_PARTY = ( "NO_ACTIVE_REFERENCES_REASONS_THIRD_PARTY" ) VERIFY_MATCH_POLICY = "VERIFY_MATCH_POLICY" CORRECT_MATCH_POLICY = "CORRECT_MATCH_POLICY" MATCH_POLICY_CORRECT = "MATCH_POLICY_CORRECT" CARVED_OUT = "CARVED_OUT" NO_TOPIC_CHANNEL = "NO_TOPIC_CHANNEL" LINK_ART_TRACK_TO_CORRECT_TOPIC_CHANNEL = "LINK_ART_TRACK_TO_CORRECT_TOPIC_CHANNEL" ART_TRACK_LINKED_TO_CORRECT_TOPIC_CHANNEL = ( "ART_TRACK_LINKED_TO_CORRECT_TOPIC_CHANNEL" ) BAD_TOPIC_CHANNEL = "BAD_TOPIC_CHANNEL" CLAIM_VIDEO = "CLAIM_VIDEO" CLAIM_VIA_BACON = "CLAIM_VIA_BACON" MANUALLY_CLAIM = "MANUALLY_CLAIM" THIRD_PARTY_CLAIM = "THIRD_PARTY_CLAIM" CLAIM_RELEASED = "CLAIM_RELEASED" MUST_CLAIM = "MUST_CLAIM" ALREADY_CLAIMED = "ALREADY_CLAIMED" CORRECT_METADATA = "CORRECT_METADATA" MANUALLY_CORRECT = "MANUALLY_CORRECT" CORRECT_VIA_BACON = "CORRECT_VIA_BACON" METADATA_CORRECT = "METADATA_CORRECT" class FlagDetails(StrEnum): """Texts for flag details.""" NO_ACTIVE_MATCH_POLICY = "No Active Match Policy" class DBColumns(StrEnum): """MySQL column names as constants.""" GROUP = "group" LABEL_ID = "label_id" LABEL_NAME = "label_name" ERROR = "error" TYPES = "types" TYPE = "type" KEY = "key" VALUE = "value" ROW_IDX = "row_idx" ROW_TYPE = "row_type" ID = "id" CREATED_BY = "created_by" DATE_CREATED = "date_created_utc" DATE_ARCHIVED = "date_archived_utc" DATE_SCHEDULED = "date_scheduled_utc" DATE_STARTED = "date_started_utc" DATE_COMPLETED = "date_completed_utc" DATE_LAST_RESOLVED = "date_last_resolved_utc" ROW_COUNT = "row_count" FLAGS_TOTAL = "flags_total" FLAGS_RESOLVED = "flags_resolved" FLAGS_PENDING = "flags_pending" FLAGS_RESOLVED_PCT = "flags_resolved_pct" ROWS_FLAGGED = "rows_flagged" ROWS_RESOLVED = "rows_resolved" ROWS_PENDING = "rows_pending" SCORE = "score" DATE_SCHEDULED_OR_CREATED = "date_scheduled_or_created_utc" CREATED_PREFIX = "CREATED" class DBAuditLogActions(StrEnum): """Audit log actions.""" CREATED_IMMEDIATE = f"{CREATED_PREFIX}_IMMEDIATE" CREATED_SCHEDULED = f"{CREATED_PREFIX}_SCHEDULED" PENDING = "PENDING" STARTED = "STARTED" COMPLETED = "COMPLETED" STARTED_FETCH = "STARTED_FETCH" COMPLETED_FETCH = "COMPLETED_FETCH" STARTED_ANALYSIS = "STARTED_ANALYSIS" COMPLETED_ANALYSIS = "COMPLETED_ANALYSIS" FAILED = "FAILED" @unique class SnowFlakeColumns(StrEnum): """Snowflake column names.""" ASSET_ID = "asset_id" ISRC = "isrc" UPC = "upc" VIDEO_ID = "video_id" ABBRIVATION = "abbrivation" VTR_COUNTRIES = "vtr_countries" RTR_COUNTRIES = "rtr_countries" STR_COUNTRIES = "str_countries" TERRITORY_LIST = "territory_list" REGISTRY_TERRITORIES = "registry_territories" CONFLICTING_TERRITORIES = "conflicting_territories" LIST_CONFLICTING_TERRITORIES = "list_conflicting_territories" ACTIVE_REFERENCE_IDS = "active_reference_ids" INACTIVE_REFERENCE_IDS = "inactive_reference_ids" IS_ACTIVE_RELEASE = "is_active_release" IS_CARVED_OUT = "is_carved_out" IS_DELIVERED = "is_delivered" MATCH_POLICY = "match_policy" OWNERSHIP = "ownership" ARTIST = "artist" NAME = "name" RELEASE_NAME = "release_name" TRACK_NAME = "track_name" SONG = "song" IS_LOCKED = "is_locked" LOCK_REASON = "lock_reason" CHANNEL_DISPLAY_NAME = "channel_display_name" VIDEO_PRIVACY_STATUS = "video_privacy_status" CONFLICTING_OWNERS = "conflicting_owners" OTHER_OWNERS_CLAIMING = "other_owners_claiming" RECENT_DAILY_AVERAGE_VIEWS = "recent_daily_average" TRACK_ARTISTS = "track_artists" TOTAL_CLAIMS = "total_claims" MATCHED_LABEL_NAME = "matched_label_name" DELIVERED_STATUS = "delivered_status" VIDEO_TITLE = "video_title" TIME_UPLOADED = "time_uploaded" VIEWS = "views" VIDEO_LENGTH = "video_length" class OutputColumns(StrEnum): """Audit output columns.""" AUTOPOPULATED = "autopopulated" AUDIT_FLAG_NO_ASSET_ID = "audit_flag_no_asset_id" AUDIT_FLAG_CARVED_OUT = "audit_flag_carved_out" AUDIT_FLAG_NOT_DELIVERED = "audit_flag_not_delivered" AUDIT_FLAG_NOT_ACTIVE_RELEASE = "audit_flag_not_active_release" AUDIT_FLAG_TERRITORIES_MISSING = "audit_flag_territories_missing" AUDIT_FLAG_NO_ACTIVE_REFERENCES = "audit_flag_no_active_references" AUDIT_FLAG_NO_ACTIVE_REFERENCES_REASONS_ORCHARD = ( "audit_flag_no_active_references_reasons_orchard" ) AUDIT_FLAG_NO_ACTIVE_REFERENCES_REASONS_THIRD_PARTY = ( "audit_flag_no_active_references_reasons_third_party" ) AUDIT_FLAG_CAN_REACTIVATE = "audit_flag_can_reactivate" AUDIT_FLAG_BAD_MATCH_POLICY = "audit_flag_match_policy" AUDIT_FLAG_OWNERSHIP_INCOMPLETE = "audit_ownership_incomplete" AUDIT_FLAG_NO_TOPIC_CHANNEL = "audit_flag_no_topic_channel" AUDIT_FLAG_BAD_TOPIC_CHANNEL = "audit_flag_bad_topic_channel" AUDIT_FLAG_THIRD_PARTY_CLAIM = "audit_flag_third_party_claim" AUDIT_FLAG_MUST_CLAIM = "audit_flag_must_claim" AUDIT_FLAG_ASSET_MISSING_ISRC = "audit_flag_asset_missing_isrc" TERRITORIES_MISSING = "territories_missing" REASON = "reason" REASONS_ORCHARD = "reasons_orchard" REASONS_THIRD_PARTY = "reasons_third_party" CAN_REACTIVATE = "can_reactivate" @unique class FlagTableColumns(StrEnum): """Flag table columns.""" ID = "id" ROW_IDX = "row_idx" AUDIT = "audit" FLAG = "flag" DATE_CREATED_UTC = "date_created_utc" DATE_RESOLVED_UTC = "date_resolved_utc" RESOLUTION = "resolution" RESOLUTION_SUBTYPE = "resolution_subtype" CREATED_BY = "created_by" RESOLVED_BY = "resolved_by" DETAILS = "details" UPC = "upc" ISRC = "isrc" ASSET_ID = "asset_id" VIDEO_ID = "video_id" @unique class YTMatchPolicies(StrEnum): """YouTube Content ID match policies.""" MONETIZE_IN_ALL_COUNTRIES = "Monetize in all countries" BLOCK_IN_ALL_COUNTRIES = "Block in all countries" @unique class YTAssetTypes(StrEnum): """YouTube Content ID asset types.""" SOUND_RECORDING = "sound_recording" @unique class YTOwnershipTypes(StrEnum): """YouTube ownership types.""" PCT_100 = "100.00%" INCLUDE = "Include" EXCLUDE = "Exclude" EXCEPT = "Except" OWNED = "Owned" EVERYWHERE = "Everywhere" OWNED_EVERYWHERE = f"{OWNED} {EVERYWHERE}" OWNED_EVERYWHERE_EXCEPT = f"{OWNED_EVERYWHERE} {EXCEPT}" PCT_100_OWNED = f"{PCT_100} {OWNED}" PCT_100_OWNED_EVERYWHERE = f"{PCT_100} {OWNED_EVERYWHERE}" PCT_100_OWNED_EVERYWHERE_EXCEPT = f"{PCT_100} {OWNED_EVERYWHERE_EXCEPT}" @unique class YTReferenceStatus(StrEnum): """YouTube Content ID reference statuses.""" # DO NOT INCLUDE ANYTHING OTHER THAN YOUTUBE REFERENCE STATUSES # HERE AS THEY ARE USED DYNAMICALLY IN THE CODE! CHECK USAGES # OF THIS STRENUM BEFORE ADDING NEW VALUES! ACTIVE = "active" INACTIVE = "inactive" DELETED = "deleted" COMPUTING_FINGERPRINT = "computing_fingerprint" ACTIVATING = "activating" @unique class YTReferenceReasons(StrEnum): """YouTube Content ID reference reasons.""" CLOSED_BY_OWNER = "CLOSED_BY_OWNER" @unique class YTMisc(StrEnum): """Miscellaneous constants for YouTube.""" TOPIC_CHANNEL_SUFFIX = " - Topic" @unique class Status(StrEnum): """Status of the pipeline task.""" IN_PROGRESS = "IN_PROGRESS" COMPLETED = "COMPLETED" @unique class ErrorMessages(StrEnum): """Error messages for API responses.""" YOUTUBE_NOT_FOUND = "YOUTUBE_NOT_FOUND" @unique class YtCid(StrEnum): """YouTube Content ID API constants.""" FETCH_OWNERSHIP = "fetchOwnership" FETCH_METADATA = "fetchMetadata" FETCH_MATCH_POLICY = "fetchMatchPolicy" ID = "id" TERRITORIES = "territories" OWNER = "owner" OWNERSHIP = "ownership" TYPE = "type" ORIGIN = "origin" ISRC = "isrc" ISRCS = "isrcs" EFFECTIVE = "effective" MINE = "mine" RATIO = "ratio" REFERENCE_CONFLICT = "reference_conflict" PAGE_INFO = "pageInfo" PAGE_TOKEN = "pageToken" NEXT_PAGE_TOKEN = "nextPageToken" TOTAL_RESULTS = "totalResults" ITEMS = "items" PARENT_ASSET_ID = "parentAssetId" CHILD_ASSET_ID = "childAssetId" GENERAL = "general" ACTION = "action" RULES = "rules" TITLE = "title" MONETIZE = "monetize" RESULTS_PER_PAGE = "resultsPerPage" CONDITIONS = "conditions" CONTENT_MATCH_TYPE = "content_match_type" REQUIRED_TERRITORIES = "required_territories" AUDIOVISUAL = "audiovisual" INCLUDE = "include" EXCLUDE = "exclude" class DB(StrEnum): """MySQL database names.""" TYPES = "types" ID = "id" class ItunesSearch(StrEnum): """iTunes Search API constants.""" MEDIA = "media" ENTITY = "entity" TERM = "term" MUSIC = "music" MUSIC_ARTIST = "musicArtist" LIMIT = "limit" @unique class AuditStatus(StrEnum): """Audit status.""" IN_PROGRESS = "IN_PROGRESS" COMPLETED = "COMPLETED" FAILED = "FAILED" class AuditMetaKeys(StrEnum): """DB Audit meta table keys.""" FETCHED_ROWS = "fetched_rows" FETCHED_ROWS_CLEAN = "fetched_rows_clean" FETCHED_ISRCS = "fetched_isrcs" FETCHED_ISRCS_UNIQUE = "fetched_isrcs_unique" FETCHED_ISRCS_CLEAN = "fetched_isrcs_clean" FETCHED_ISRCS_UNIQUE_CLEAN = "fetched_isrcs_unique_clean" SRUGC_TOP_UGC_CLAIM = "srugc_yt_top_ugc_claim" SRUGC_TOP_UGC_CLAIM_TRACK_ARTISTS = "srugc_yt_top_ugc_claim_track_artists" SRUGC_YT_TOTAL_UGC_CLAIMS = "srugc_yt_total_ugc_claims" SRUGC_YT_AVG_DAILY_VIEWS = "srugc_yt_avg_daily_views" SRUGC_YT_CLAIMED_ASSETS_PCT = "srugc_yt_claimed_assets_pct" SRUGC_TRACKS_WITH_UGC_MATCH_PCT = "srugc_tracks_with_ugc_match_pct" class AuditRunErrors(StrEnum): """Audit custom run error codes.""" BASE_DATA_MISSING = "BASE_DATA_MISSING" NEEDS_IMPLEMENTATION = "NEEDS_IMPLEMENTATION" ASSET_AUTO_MATCHING_ERROR = "ASSET_AUTO_MATCHING_ERROR" @unique class User(StrEnum): """Keys for user data.""" ID = "id" SUBJECT = "subject" NAME = "name" NICKNAME = "nickname" EMAIL = "email" LOCALE = "locale" TIMEZONE = "timezone" SCOPES = "scopes" @unique class Auth0Users(StrEnum): """Auth0 user attributes.""" ID = "id" NICKNAME = "nickname" NAME = "name" EMAIL = "email" class MIMETypes(StrEnum): """MIME media types.""" PDF = "application/pdf" PPTX = "application/vnd.openxmlformats-officedocument.presentationml.presentation" XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" @unique class Countries(StrEnum): """ISO 3166-1 alpha-2 country codes.""" RU = "RU" @unique class AnalysisTables(StrEnum): """Names for DataFrames with audit rows extracted for manual analysis.""" CARVED_OUT = RowTypes.CARVED_OUT # SR and AT audits only NOT_DELIVERED = RowTypes.NOT_DELIVERED # SR and AT audits only NOT_ACTIVE_RELEASE = RowTypes.NOT_ACTIVE_RELEASE # SR and AT audits only PRIVATE = RowTypes.PRIVATE # MV audit only UNLISTED = RowTypes.UNLISTED # MV audit only @unique class Tables(StrEnum): """Database tables.""" AUDITS = "audits" AUDITS_FLAGS = "audits_flags" AUDITS_GROUPS = "audits_groups" AUDITS_LOG = "audits_log" AUDITS_ROWS = "audits_rows" AUDITS_META = "audits_meta" AUDITS_ROWS_ROWTYPES = "audits_rows_rowtypes" AUDITS_ROWTYPES = "audits_rowtypes" USERS = "users" USERS_PERMISSIONS = "users_permissions" USERS_PERMISSIONS_LEVELS = "users_permissions_levels" USERS_PERMISSIONS_SCOPES = "users_permissions_scopes" @unique class RowReportCols(StrEnum): """Columns for the exported rows report. These are the system column names.""" LABEL_NAME = "label_name" ISRC = SnowFlakeColumns.ISRC UPC = SnowFlakeColumns.UPC ARTIST = SnowFlakeColumns.NAME RELEASE_NAME = "release_title" TRACK_NAME = "track_title" IS_DELIVERED_TO_YOUTUBE = "is_delivered_to_youtube" IS_OWNERSHIP_CORRECT = "is_ownership_correct" IS_LINKED_TO_CORRECT_TOPIC_CHANNEL = "is_linked_to_correct_topic_channel" IS_ACTIVE_REFERENCE_FILE = "is_active_reference_file" IS_UGC_MATCH_POLICY_CORRECT = "is_ugc_match_policy_correct" IS_CLAIMED_BY_ORCHARD = "is_claimed_by_orchard" ACTIONS_TAKEN_BY_ORCHARD = "actions_taken_by_orchard" ISSUE = "issue" ACTIONS_REQUIRED = "actions_required" ACTION_REQUIRED = "action_required" ADDITIONAL_NOTES = "additional_notes" THIRD_PARTY_LABEL = SnowFlakeColumns.MATCHED_LABEL_NAME CONFLICTING_TERRITORIES = SnowFlakeColumns.CONFLICTING_TERRITORIES LIST_CONFLICTING_TERRITORIES = SnowFlakeColumns.LIST_CONFLICTING_TERRITORIES LABEL_COMMENTS = "label_comments" LABEL_COMMENTS_TERRITORIES = "label_comments_territories" STATUS = "status" CHANNEL_NAME = SnowFlakeColumns.CHANNEL_DISPLAY_NAME TIME_UPLOADED = SnowFlakeColumns.TIME_UPLOADED VIDEO_TITLE = SnowFlakeColumns.VIDEO_TITLE VIDEO_LINK = "video_link" OTHER_OWNERS_CLAIMING = SnowFlakeColumns.OTHER_OWNERS_CLAIMING VIEW_COUNT = SnowFlakeColumns.VIEWS VIDEO_STATUS = SnowFlakeColumns.VIDEO_PRIVACY_STATUS HAS_THIRD_PARTY_CLAIM = "has_third_party_claim" @unique class RowReportColsHuman(StrEnum): """Columns for the exported rows report. These are the human readable column names.""" LABEL_NAME = "Label Name" ISRC = "ISRC" UPC = "UPC" ARTIST = "Artist" RELEASE_NAME = "Release Name" TRACK_NAME = "Track Title" IS_DELIVERED_TO_YOUTUBE = "Delivered to YouTube?" IS_OWNERSHIP_CORRECT = "Ownership Correct?" IS_LINKED_TO_CORRECT_TOPIC_CHANNEL = "Linked to Correct Topic Channel?" IS_ACTIVE_REFERENCE_FILE = "Active Reference File?" IS_UGC_MATCH_POLICY_CORRECT = "UGC Match Policy Correct?" IS_CLAIMED_BY_ORCHARD = "Claimed by Orchard?" ACTIONS_TAKEN_BY_ORCHARD = "Actions The Orchard Has Taken" ADDITIONAL_NOTES = "Additional Notes" ISSUE = "Issue" ACTIONS_REQUIRED = "Actions Required" ACTION_REQUIRED = "Action Required by Label" THIRD_PARTY_LABEL = "3rd Party Label" LIST_CONFLICTING_TERRITORIES = "Conflicting Territories" LABEL_COMMENTS = "LABEL COMMENTS" LABEL_COMMENTS_TERRITORIES = "LABEL COMMENTS - TERRITORIES" STATUS = "Status" CHANNEL_NAME = "Channel Name" UPLOAD_DATE = "Upload Date" VIDEO_TITLE = "Video Title" VIDEO_LINK = "Video Link" THIRD_PARTY_CLAIMANT = "3rd Party Claimant" VIEW_COUNT = "View Count" VIDEO_STATUS = "Video Status" HAS_THIRD_PARTY_CLAIM = "3rd Party Claim?" @unique class RowReportColors(StrEnum): """Colors for the exported rows report.""" FFFFFFFF = "FFFFFFFF" FFFF0000 = "FFFF0000" FF52B5C6 = "FF52B5C6" FFF5C343 = "FFF5C343" FFF9E9B8 = "FFF9E9B8" @unique class RowReportTabs(StrEnum): # Should not exceed 31 characters or Openpyxl will emit a UserWarning AUDIO_NEXT_STEPS = "Audio Next Steps" AUDIO_AUDIT = "Audio Audit" AUDIO_DELETED_CARVED_OUT = "Deleted or Carved-Out Releases" ART_TRACK_AUDIT = "Art Track Audit" ART_TRACK_DELETED_CARVED_OUT = ( "Deleted or Carved-Out ArtTracks" # Shortened to fit 31 characters ) VIDEO_AUDIT = "Video Audit" VIDEO_NEXT_STEPS = "Video Next Steps" VIDEO_MONETIZATION_RESTRICTIONS = "Video Monetization Restrictions" VIDEO_PRIVATE_UNLISTED = "Private or Unlisted Videos" @unique class RowReportTexts(StrEnum): YES = "Yes" NO = "No" OWNERSHIP_CONFLICT = "Ownership Conflict" OWNERSHIP_CONFLICT_YT_TEXT = ( "Please review and respond to this conflict in " "Workstation's Conflict Manager" ) OWNERSHIP_CONFLICT_MRR_TEXT = ( "Please review and confirm exclusive rights in Column K" ) LABEL_COMMENTS_NONE = "-" LABEL_COMMENTS_ASSERT_IN_ALL_TERRITORIES = "Assert in All Territories" LABEL_COMMENTS_RELEASE_IN_ALL_TERRITORIES = "Release in All Territories" LABEL_COMMENTS_ASSERT_IN_SPECIFIC_TERRITORIES = ( "Assert in Specific Territories - Refer to column L" ) LABEL_COMMENTS_RELEASE_IN_SPECIFIC_TERRITORIES = ( "Release in Specific Territories - Refer to column L" ) REVIEW_AUDIO_NEXT_STEPS = "Review the 'Audio Next Steps' tab" REVIEW_VIDEO_NEXT_STEPS = "Review the 'Video Next Steps' tab" MATCH_POLICY_CORRECTED = "Match policy corrected" UPDATED_REACTIVATED_CORRECTED = ( "Ownership updated, reference file reactivated, and match policy corrected" ) REACTIVATED_CORRECTED = "Reference file reactivated and match policy corrected" INELIGIBLE_FOR_DELIVERY = "Ineligible for delivery" CONTAINS_PUBLIC_DOMAIN = "Track contains Public Domain content and is considered ineligible for fingerprinting based on YouTube's guidelines" CONTAINS_INELIGIBLE = "Track contains content that is considered ineligible for fingerprinting based on YouTube's guidelines" FULL_ALBUM_DOWNLOAD_ONLY = ( "Track is set up with “Full Album Download Only” rights in Workstation" ) OWNERSHIP_INCORRECT = "Incorrect ownership" OWNERSHIP_UPDATED = "Ownership updated" OWNERSHIP_REMOVED_PER_LABEL_REQUEST = "Ownership removed per label's request" OWNERSHIP_CONFLICT_INACTIVE_REFERENCE_FILE = ( "Ownership conflict; Inactive reference file" ) INACTIVE_REFERENCE_FILE = "Inactive reference file" REFERENCE_INSUFFICIENT_LENGTH = "Track is under 0:30, does not meet YouTube's length requirement for fingerprinting UGC" REFERENCE_INSUFFICIENT_LENGTH_VIDEO = ( "Video is under 0:30, does not meet " "YouTube's length requirement for fingerprinting UGC" ) REFERENCE_DEACTIVATED = "Reference file deactivated" REFERENCE_DEACTIVATED_BY_OWNER = "Reference file deactivated for containing material that isn't sufficiently distinct for fingerprinting" REFERENCE_EXCLUDED = "Reference file deactivated by YouTube for containing material that isn't sufficiently distinct for fingerprinting" REFERENCE_OVERLAP = "Reference file deactivated by YouTube due to an overlap with third party content" NO_FINGERPRINTING_RIGHTS = ( "UGC matching disabled due to lack of fingerprinting rights" ) DELETED_RELEASE = "Deleted release" CARVED_OUT_RELEASE = "YouTube Content ID carveout" TRACK_DELIVERED = "Track delivered" ART_TRACK_DELIVERED = "Art track delivered" ART_TRACK_LINKED_TO_CORRECT_TOPIC_CHANNEL = ( "Art track linked to correct Topic Channel" ) THIRD_PARTY_CLAIM = "3rd party claim" VIDEO_CLAIMED_BY_THIRD_PARTY = "This video is claimed by the 3rd party claimant(s) listed in Column H. In Column I, indicate if the 3rd party's claim is accurate or not." THIRD_PARTY_CLAIM_VALID = "3rd Party Claim Valid" THIRD_PARTY_CLAIM_INVALID = ( "3rd Party Claim Invalid - Conflict team should ask 3rd party to release claim" ) REVIEW_VIDEO_RESTRICTION = "Review video. In Column H, indicate if we should submit a request to review the restriction." REQUEST_REVIEW = "Request Review" SUBMIT_APPEAL = "Submit Appeal" REQUEST_REVIEW_AND_SUBMIT_APPEAL = "Request Review and Submit Appeal" IGNORE = "Ignore" CLAIMED = "Claimed" CLAIM_RELEASED_PER_LABEL_REQUEST = "Claim released per label's request" @unique class YTAssetNotActiveReasons(StrEnum): """Reasons for which a YouTube asset is not active (i.e. no active references reasons). """ ALMOST_ENTIRELY_EXCLUDED = "ALMOST_ENTIRELY_EXCLUDED" BULK_UPDATER = "BULK_UPDATER" INSUFFICIENT_LENGTH = "INSUFFICIENT_LENGTH" CLOSED_BY_OWNER = "CLOSED_BY_OWNER"