Documentação Api Sincronizador

Synchronizer

Endpoints legados usados pelo software SyncDataMusic para sincronizar mídias, playlists, comerciais e comandos entre a plataforma e as estações. Autenticação via ACCESS_TOKEN/AUTH_CODE embutido na própria URL (não usa header Authorization).

GET /api/scheduled-tasks/{AUTH_CODE}/ Verifica agendamento de tarefas

Verifica agendamento de tarefas.

Parâmetros de URL

AUTH_CODEobrigatórioCódigo de autorização de uma máquina da empresa. Composto de 10 dígitos alfanuméricos. Ex: 1912B5DD69.

Parâmetros GET (querystring)

typeOpcional. Enviar syncplay para retornar apenas as tarefas do player Syncplay (reload_next_position, reload_now, update_software_syncplay). Quando omitido, retorna as tarefas padrão de sincronização.

200Sucesso (padrão, tarefas de sincronização)

{
    "code": 200,
    "tasks": {
        "force_sync_parcial": {
            "active": true,
            "scheduled": "08\/11\/2018 00:15:00"
        },
        "force_sync_complete": {
            "active": false,
            "scheduled": false
        },
        "set_directories": {
            "active": false,
            "scheduled": false
        },
        "get_configs": {
            "active": false,
            "scheduled": false
        },
        "set_configs": {
            "active": false,
            "scheduled": false
        },
        "check_version_software": {
            "active": false,
            "scheduled": false
        },
        "update_updater_software": {
            "active": false,
            "scheduled": false
        }
    }
}

200Sucesso (com ?type=syncplay, tarefas do player Syncplay)

{
    "code": 200,
    "tasks": {
        "reload_next_position": {
            "active": false,
            "scheduled": false
        },
        "reload_now": {
            "active": false,
            "scheduled": false
        },
        "update_software_syncplay": {
            "active": false,
            "scheduled": false
        }
    }
}

500Código não encontrado

{
    "message": "Código não encontrado.",
    "code": 500
}
POST PUT /api/confirm-scheduled-task/ Confirma a execução de uma tarefa agendada

Confirma a execução de uma tarefa agendada.

Parâmetros POST

auth_codeobrigatórioCódigo da estação.
taskobrigatórioNome da tarefa executada (case-insensitive, será convertido para minúsculas).

200Sucesso

{
    "code": 200
}

404Parâmetro não encontrado

{
    "message": "Parâmetro não encontrados",
    "code": 404
}

404Código não encontrado

{
    "message": "Código não encontrado.",
    "code": 404
}

500Task não informada

{
    "message": "Task não informada.",
    "code": 500
}

400Falha ao atualizar conexão

{
    "message": "Não foi possível atualizar a última conexão.",
    "code": 400
}
GET /api/sync-structure/{ACCESS_TOKEN}/{SCOPE}/ Estrutura de pastas

Estrutura de pastas.

Parâmetros de URL

ACCESS_TOKENobrigatórioCódigo de autorização do cliente. Composto de 32 dígitos alfanuméricos. Ex: 4FFE2F70B6B915FD1C97B45EE9321377.
SCOPEobrigatórioEscopo de permissão da requisição. Sempre em caixa alta. Enviar somente um escopo, ex: MEDIAS_DOWNLOAD.

200Sucesso

{
    "MEDIAS_DOWNLOAD": {
        "alias": "Mídias",
        "tree": [
            "Medias\/5-Vem\/",
            "Medias\/9-Promos e Cabs\/"
        ]
    }
}

130Forbidden (token inválido)

{
    "status": "forbidden",
    "message": "SyncAuth Error: access denied, invalid token",
    "code": 130
}

401Token expirado

{
    "status": "error",
    "message": "ApiAccessToken Error: token has expired",
    "code": 401
}
GET /api/sync-files/{ACCESS_TOKEN}/{SCOPE}/{PAGE}/{TYPE_SYNC}/{TIMESTAMP} Sincronizar arquivos

Sincronizar arquivos.

Parâmetros de URL

ACCESS_TOKENobrigatórioCódigo de autorização do cliente. Composto de 32 dígitos alfanuméricos. Ex: 4FFE2F70B6B915FD1C97B45EE9321377.
SCOPEobrigatórioEscopo de permissão da requisição. Sempre em caixa alta. Enviar somente um escopo, ex: PLAYLIST_DOWNLOAD.
PAGEobrigatórioPágina requisitada. Número inteiro.
TYPE_SYNCobrigatórioTipo de sincronização: complete (sincronização completa), parcial (retorna apenas mídias atualizadas desde a última sincronização) ou timestamp (retorna apenas mídias atualizadas desde uma determinada data).
TIMESTAMPTimestamp para busca de informações. Opcional.

Campos da resposta de sucesso: query.next (boolean, indica se existe uma próxima página), query.page (inteiro, página atual), query.date (datetime, data do último arquivo atualizado).

200Sucesso

{
    "PLAYLIST_DOWNLOAD": {
        "files": [
            {
                "path": "Playlist\/1\/",
                "path_download": "1\/2018\/05\/",
                "file": "Mus20180514.txt",
                "hash": "db65184cc490551a9be0b67acfe59b62"
            }
        ],
        "query": {
            "next": false,
            "page": "1",
            "date": "2018-05-24T11:43:18-03:00"
        },
        "no_media": [
            {
                "id": 1,
                "dir": "\/midias\/proofs\/playlist\/1\/1\/2018\/04\/Mus20180430.txt",
                "hash": "18d536ff867c91a3a5d610e065c58e23"
            },
            {
                "id": 2,
                "dir": "\/proofs\/playlist\/1\/1\/2018\/05\/Mus20180503.txt",
                "hash": "b2ba85e69b07d9c98461371e5af6ee6a"
            }
        ]
    }
}

132Forbidden (escopo sem permissão)

{
    "status": "forbidden",
    "message": "SyncScope Error: permission denied to access the target scope",
    "code": 132
}

401Token expirado

{
    "status": "error",
    "message": "ApiAccessToken Error: token has expired",
    "code": 401
}
GET /api/sync-deletes/{ACCESS_TOKEN}/{SCOPE} Lista de arquivos deletados

Lista de arquivos deletados.

Parâmetros de URL

ACCESS_TOKENobrigatórioCódigo de autorização do cliente. Composto de 32 dígitos alfanuméricos. Ex: 4FFE2F70B6B915FD1C97B45EE9321377.
SCOPEobrigatórioEscopo de permissão da requisição. Sempre em caixa alta. Enviar somente um escopo, ex: MUSICS_DELETE.

200Sucesso

{
    "MUSICS_DELETE": {
        "files": [
            {
                "path": "Musics\/",
                "file": "Bob Dylan = Lay Lady Lay.mp3",
                "hash": "689b0cc5831d38397ba3e336dbf3eba7"
            },
            {
                "path": "Musics\/",
                "file": "Bryan Adams = Heaven.mp3",
                "hash": "9a4073a66b43d9f06a6b7840d682bfd7"
            }
        ]
    }
}

131Ação inválida

{
    "status": "error",
    "message": "SyncScope Error: invalid action",
    "code": 131
}

401Token expirado

{
    "status": "error",
    "message": "ApiAccessToken Error: token has expired",
    "code": 401
}
GET /api/download-file/{ACCESS_TOKEN}/{SCOPE}/ Download de arquivo

Download de arquivo. Ex: GET /api/download-file/{ACCESS_TOKEN}/{SCOPE}/?path=71c78e9b9741b6f93ca7efb8cb8a763e_606a0fef09184e9633780fb283845444.mp3

Parâmetros de URL

ACCESS_TOKENobrigatórioCódigo de autorização do cliente. Composto de 32 dígitos alfanuméricos. Ex: 4FFE2F70B6B915FD1C97B45EE9321377.
SCOPEobrigatórioEscopo de permissão da requisição. Sempre em caixa alta. Enviar somente um escopo, ex: MUSICS_DOWNLOAD.

Parâmetros GET (querystring)

pathobrigatórioChave (key) do objeto no storage a ser baixado, retornada nos campos path/path_download de /api/sync-files. Não é um caminho de sistema de arquivos, é a chave do objeto salva no storage.

OBS: em caso de sucesso, o endpoint responde com um redirect (302) direto para a URL assinada do arquivo no storage; não há corpo JSON na resposta de sucesso.

302Sucesso (redirect)

Redireciona diretamente para a URL assinada do arquivo no storage. Sem corpo de resposta.

404Upload não encontrado

{
    "status": "error",
    "message": "SyncScope Error: Upload not found",
    "code": 404
}

500Falha ao baixar

{
    "status": "error",
    "message": "SyncDownload Error: could not download the target file",
    "code": 500
}
GET /api/request-existing-files/{ACCESS_TOKEN}/{SCOPE}/{MEDIA_TYPE_ID} Lista de arquivos que já existem na plataforma

Lista de arquivos que já existem na plataforma.

Parâmetros de URL

ACCESS_TOKENobrigatórioCódigo de autorização do cliente. Composto de 32 dígitos alfanuméricos. Ex: 4FFE2F70B6B915FD1C97B45EE9321377.
SCOPEobrigatórioEscopo de permissão da requisição. Sempre em caixa alta. Enviar somente um escopo, ex: MUSICS_REPOSITORIES_UPLOAD.
MEDIA_TYPE_IDobrigatórioId da pasta.

OBS: o campo files retorna um mapa de nome do arquivo => hash md5 dos arquivos já existentes na plataforma para o escopo/pasta informados.

200Sucesso

{
    "status": "success",
    "code": 200,
    "files": {
        "Acústicos & Valvulados = O Dia D é Hoje.mp3": "bedfce4369aa61db16f76e962a2475c1",
        "Snow Patrol = Open Your Eyes.mp3": "1e24d8b92b7b90183e78a21a9fd5ee19"
    }
}

401Token expirado

{
    "status": "error",
    "message": "ApiAccessToken Error: token has expired",
    "code": 401
}

500Mais de um escopo enviado

{
    "status": "error",
    "message": "SyncScope Error: only one scope per request is allowed",
    "code": 500
}
GET /api/request-permission-upload/{ACCESS_TOKEN}/{SCOPE} Requisição de código de autorização para upload

Requisição de código de autorização para upload. Ex: /api/request-permission-upload/{ACCESS_TOKEN}/{SCOPE}?hash=291b4b33217a592fb248154f931ca0f3&media_type=1

Parâmetros de URL

ACCESS_TOKENobrigatórioCódigo de autorização do cliente. Composto de 32 dígitos alfanuméricos. Ex: 4FFE2F70B6B915FD1C97B45EE9321377.
SCOPEobrigatórioEscopo de permissão da requisição. Sempre em caixa alta. Enviar somente um escopo, ex: MUSICS_REPOSITORIES_UPLOAD.

Parâmetros GET (querystring)

hashobrigatórioMD5 gerado do binário do arquivo a ser enviado.
media_typeobrigatórioIndica o tipo da mídia ou pasta que será enviada.

OBS: os campos extensions e mime_type retornam uma string contendo um JSON serializado (json_encode aplicado duas vezes), não um array/objeto direto.

200Sucesso

{
    "status": "success",
    "message": "upload authorization successfully granted",
    "unique_code": "9F4945B8724D6CEC313D447EAA8A5AA8",
    "code": 200,
    "extensions": "{\"0\": \"wave\", \"1\": \"wav\", \"2\": \"mp3\", \"3\": \"ogg\"}",
    "mime_type": "{\"0\": \"audio\\\/vnd.wav\", \"1\": \"audio\\\/vnd.wave\", \"2\": \"audio\\\/wave\", \"3\": \"audio\\\/wav\", \"4\": \"audio\\\/x-wav\", \"5\": \"audio\\\/x-pn-wav\", \"6\": \"audio\\\/mpeg\", \"7\": \"audio\\\/mp3\", \"8\": \"audio\\\/ogg\"}"
}

401Token expirado

{
    "status": "error",
    "message": "ApiAccessToken Error: token has expired",
    "code": 401
}

409Arquivo já existe

{
    "status": "error",
    "message": "SyncUpload Error: file exist",
    "code": 409
}

500Falha ao gerar código único

{
    "status": "error",
    "message": "SyncAuth Error: unique upload code could not be generated",
    "code": 500
}

500Mais de um escopo enviado

{
    "status": "error",
    "message": "SyncScope Error: only one scope per request is allowed",
    "code": 500
}
POST /api/create-file/{ACCESS_TOKEN}/{UNIQUE_CODE}/{SCOPE} Fazer upload de um arquivo

Fazer upload de um arquivo.

Parâmetros de URL

ACCESS_TOKENobrigatórioToken de acesso. Composto de 32 dígitos alfanuméricos. Ex: 4FFE2F70B6B915FD1C97B45EE9321377.
UNIQUE_CODEobrigatórioCódigo de autorização para upload, obtido em /api/request-permission-upload. Composto de 32 dígitos alfanuméricos. Ex: 9F4945B8724D6CEC313D447EAA8A5AA8.
SCOPEobrigatórioEscopo de permissão da requisição. Sempre em caixa alta. Enviar somente um escopo, ex: MUSICS_REPOSITORIES_UPLOAD.

Parâmetros (multipart/form-data)

fileobrigatórioArquivo enviado.
hashobrigatórioMD5 gerado do binário do arquivo enviado.
media_typeObrigatório para os escopos MEDIAS_REPOSITORIES_UPLOAD/MUSICS_REPOSITORIES_UPLOAD/PRODUCTS_SUPPORTS_UPLOAD; indica o id da pasta/tipo de mídia que será enviada.

OBS: os escopos MUSICS_REPOSITORIES_UPLOAD e DRIVE_REPOSITORIES_UPLOAD não tentam localizar um registro existente para atualizar (modo fallback: "musics/drives are always stored in fallback mode"); o resultado é sempre a criação de um novo objeto (resposta 201, "new object synced successfully").

200Sucesso (atualiza arquivo já existente)

{
    "status": "success",
    "code": 200,
    "message": "object synced to existing entry successfully",
    "data": {
        "id": 4821,
        "size": 5432110,
        "mime": "audio\/mpeg",
        "key": "8af4ab22b873b05638cb864257884a1b_4b1e3a622a1e4b07d22875bcaa39f8ff.mp3",
        "uri": "{URL assinada do arquivo no storage}"
    }
}

201Sucesso (novo objeto sincronizado)

{
    "status": "success",
    "code": 201,
    "message": "new object synced successfully",
    "data": {
        "id": 4822,
        "size": 5432110,
        "mime": "audio\/mpeg",
        "key": "9be5ab22b873b05638cb864257884a1c_5c2e3a622a1e4b07d22875bcaa39f900.mp3",
        "uri": "{URL assinada do arquivo no storage}"
    }
}

401Token expirado

{
    "status": "error",
    "message": "ApiAccessToken Error: token has expired",
    "code": 401
}

403Código de autorização não confere com o token

{
    "status": "forbidden",
    "message": "SyncAuth Error: authorization code does nos match the given access token",
    "code": 403
}

500Hash não confere

{
    "status": "error",
    "message": "SyncUploader Error: the given hash does not match the calculated file hash",
    "code": 500
}

500Mais de um escopo enviado

{
    "status": "error",
    "message": "SyncScope Error: only one scope per request is allowed",
    "code": 500
}
GET /api/notifications/{ACCESS_TOKEN}/{SCOPE} Busca notificações do sistema

Busca notificações do sistema.

Parâmetros de URL

ACCESS_TOKENobrigatórioToken de acesso. Composto de 32 dígitos alfanuméricos. Ex: 4FFE2F70B6B915FD1C97B45EE9321377.
SCOPEobrigatórioEscopo de permissão da requisição. Sempre em caixa alta. Enviar somente um escopo, ex: SYSTEM_NOTIFICATION.

200Sucesso

{
    "status": "success",
    "code": 200,
    "data": [
        {
            "id": 1,
            "subject": "Nova versão do Syn Music",
            "message": "Olá, a nova versão do software SyncDataMusic já está disponível para Download"
        }
    ]
}

401Token expirado

{
    "status": "error",
    "message": "ApiAccessToken Error: token has expired",
    "code": 401
}

404Notificações não encontradas

{
    "status": "error",
    "message": "SyncScope Error: notifications not found.",
    "code": 404
}

500Mais de um escopo enviado

{
    "status": "error",
    "message": "SyncScope Error: only one scope per request will be accepted.",
    "code": 500
}
GET /api/media-list/{ACCESS_TOKEN}/{SCOPE} Requisição media list

Requisição media list.

Parâmetros de URL

ACCESS_TOKENobrigatórioToken de acesso. Composto de 32 dígitos alfanuméricos. Ex: 4FFE2F70B6B915FD1C97B45EE9321377.
SCOPEobrigatórioEscopo de permissão da requisição. Sempre em caixa alta. Único escopo suportado: MUSICS_READ.

Campos da resposta de sucesso: unique_code (código de autorização para upload, usado no POST deste mesmo endpoint), search (extensões e mime types aceitos para buscar arquivos já existentes), send (extensões e mime types aceitos no upload via POST). Os campos extensions e mime_type de search/ send retornam uma string contendo um JSON serializado.

200Sucesso

{
    "status": "success",
    "message": "upload authorization successfully granted",
    "unique_code": "657A620BE74D728E1B404B0E0C10CA14",
    "code": 200,
    "search": {
        "extensions": "{\"0\": \"wave\", \"1\": \"wav\", \"2\": \"mp3\", \"3\": \"ogg\"}",
        "mime_type": "{\"0\": \"audio\\\/vnd.wav\", \"1\": \"audio\\\/wave\", \"2\": \"audio\\\/wav\", \"3\": \"audio\\\/x-wav\", \"4\": \"audio\\\/x-pn-wav\", \"5\": \"audio\\\/mpeg\", \"6\": \"audio\\\/mp3\", \"7\": \"audio\\\/ogg\"}"
    },
    "send": {
        "extensions": "{\"0\": \"json\"}",
        "mime_type": "{\"0\": \"application\\\/json\"}"
    }
}

401Token expirado

{
    "status": "error",
    "message": "ApiAccessToken Error: token has expired",
    "code": 401
}

500Falha ao gerar código único

{
    "status": "error",
    "message": "SyncAuth Error: unique upload code could not be generated",
    "code": 500
}
POST /api/media-list/{ACCESS_TOKEN}/{SCOPE} Upload media list

Upload media list.

Atenção: na implementação atual, o único escopo permitido para este endpoint (MUSICS_READ) é explicitamente tratado como erro dentro de SyncUploaderService::upload() ("SyncUpload Error: MUSICS_READ"). Ou seja, este endpoint atualmente sempre retorna erro para qualquer envio, mesmo com dados válidos.

Parâmetros de URL

ACCESS_TOKENobrigatórioToken de acesso. Composto de 32 dígitos alfanuméricos. Ex: 4FFE2F70B6B915FD1C97B45EE9321377.
SCOPEobrigatórioEscopo de permissão da requisição. Sempre em caixa alta. Único escopo suportado: MUSICS_READ.

Parâmetros POST

fileobrigatórioArquivo enviado.
uniq_idobrigatórioCódigo de autorização para upload (unique_code retornado pelo GET deste endpoint).
hashobrigatórioMD5 gerado do binário do arquivo enviado.

200Sucesso

Não aplicável — ver nota acima; toda requisição atualmente resulta em erro.

0Erro (comportamento atual, ocorre em toda requisição)

{
    "status": "error",
    "message": "SyncUpload Error: MUSICS_READ",
    "code": 0
}

401Token expirado (validação prévia)

{
    "status": "error",
    "message": "ApiAccessToken Error: token has expired",
    "code": 401
}

500Mais de um escopo enviado (validação prévia)

{
    "status": "error",
    "message": "SyncScope Error: only one scope per request is allowed",
    "code": 500
}
POST /api/set-directories/{ACCESS_TOKEN}/{SCOPE} Setagem de configuração de diretórios completos

Setagem de configuração de diretórios completos.

Parâmetros de URL

ACCESS_TOKENobrigatórioToken de acesso. Composto de 32 dígitos alfanuméricos. Ex: 4FFE2F70B6B915FD1C97B45EE9321377.
SCOPEobrigatórioEscopo de permissão da requisição. Sempre em caixa alta. Enviar escopo: DIRECTORIES.

Parâmetros POST

directoriesobrigatórioArray com os dados dos caminhos completos.
typeString 'download' ou 'upload'. Quando omitido, assume 'download'.

Exemplo de directories

[
    'Musics' => ['C:/Programs Files/Musicas'],
    'Medias' => [
        '22' => 'C:/Programs Files/Medias/CHAMADAS',
        '38' => 'C:/Programs Files/Medias/VINHETAS',
        '41' => 'C:/Programs Files/Medias/PROGRAMETES',
    ],
];

200Sucesso

{
    "message": null,
    "code": 200
}

401Token expirado

{
    "status": "error",
    "message": "ApiAccessToken Error: token has expired",
    "code": 401
}

404Parâmetros não encontrados

{
    "status": "error",
    "message": "SyncScope Error: parameters not found.",
    "code": 404
}

500Mais de um escopo enviado

{
    "status": "error",
    "message": "SyncScope Error: only one scope per request will be accepted.",
    "code": 500
}

Radio Play Sync

Endpoints usados pelo player Syncplay para obter configurações, playlists e comandos, baixar arquivos, registrar reprodução e enviar logs de execução.

GET /api/radio-play/sync/configs/{AUTH_CODE}/ Obtém configurações do SyncPlay

Obtém configurações do SyncPlay.

Parâmetros de URL

AUTH_CODEobrigatórioCódigo de autorização do sync (auth_code).

OBS: rota implementada por SynchronizerController::getSyncplayConfigs (via SynchronizerService). A classe RadioPlaySyncController também define um método getConfigs() com apidoc semelhante, porém nenhuma rota aponta para ele atualmente — está sem uso.

200Sucesso (cliente é uma rádio)

{
    "isSyncRadio": true,
    "mix": {
        "mix_media": 300,
        "mix_commercial": 300,
        "mix_music": 3000,
        "mix_others": 300,
        "mix_vem": 300,
        "mix_bumper": 300,
        "mix_right_time": 300,
        "mix_prefix_and_right_time": 300,
        "mix_prefix_and_temperatures": 300,
        "music_fade_out_time": 300,
        "media_fade_out_time": 300
    },
    "SyncplayCommands": {
        "Hora Certa": {
            "path_right_time": "C:\/Programs Files\/comandos\/hora certa",
            "path_right_time_prefix": "C:\/Programs Files\/comandos\/prefixo hora certa",
            "use_prefix": true,
            "type_right_time": 1
        },
        "Temperatura": {
            "path_temperature": null,
            "path_temperature_prefix": null,
            "use_prefix": false
        }
    },
    "listStreamingIn": []
}

200Sucesso (cliente não é uma rádio)

{
    "isSyncRadio": false
}

404Estação não encontrada

{
    "status": "error",
    "message": "Estação não encontrada",
    "code": 404
}

404Cliente não encontrado

{
    "status": "error",
    "message": "Cliente não encontrado",
    "code": 404
}

404Rádio não encontrada

{
    "status": "error",
    "message": "Rádio não encontrada",
    "code": 404
}
GET /api/radio-play/sync/playlists/{AUTH_CODE}/ Sincroniza playlists disponíveis para o sync

Sincroniza playlists disponíveis para o sync.

Parâmetros de URL

AUTH_CODEobrigatórioCódigo de autorização do sync (auth_code).

OBS: rota implementada por SynchronizerController::getPlaylists. A classe RadioPlaySyncController também define um método getPlaylists() idêntico, porém nenhuma rota aponta para ele — está sem uso.

200Sucesso

{
    "data": [
        {
            "id": 100,
            "date": "2020-03-23",
            "hash": "a214214dfdsg3432423fdgsd234"
        }
    ]
}

404Código de autorização não encontrado

{
    "status": "error",
    "message": "Record not found in table \"api_authorization_codes\"",
    "code": 404
}
GET /api/radio-play/sync/download/{AUTH_CODE}/{TYPE}/{ID} Download de arquivos do SyncPlay (playlist/comercial/comando)

Download de arquivos do SyncPlay (playlist/comercial/comando).

Parâmetros de URL

AUTH_CODEobrigatórioCódigo de autorização do sync (auth_code).
TYPEobrigatórioTipo do arquivo a ser baixado. Único tipo implementado atualmente: playlist. 'command' e 'commercial' estão mapeados mas ainda não implementados (retornam erro 400).
IDobrigatórioId do registro (ex: id da playlist) que será baixado.

OBS: em caso de sucesso, o endpoint responde com um redirect (302) direto para a URL assinada do arquivo no storage; não há corpo JSON na resposta de sucesso.

302Sucesso (redirect)

Redireciona diretamente para a URL assinada do arquivo no storage. Sem corpo de resposta.

400Tipo command não implementado

{
    "status": "error",
    "message": "Tipo command não implementado.",
    "code": 400
}

400Tipo commercial não implementado

{
    "status": "error",
    "message": "Tipo commercial não implementado.",
    "code": 400
}

400Tipo não reconhecido

{
    "status": "error",
    "message": "Tipo foo não reconhecido.",
    "code": 400
}

404Falha ao baixar

{
    "status": "error",
    "message": "Não foi possivel fazer o download.",
    "code": 404
}
GET /api/radio-play/sync/commercials/{AUTH_CODE}/ Sincroniza comerciais disponíveis para o sync
Atenção: endpoint ainda não implementado. O código sempre retorna uma lista vazia em data (ver comentário "TODO" em RadioPlaySyncController::getCommercials).

Parâmetros de URL

AUTH_CODEobrigatórioCódigo de autorização do sync.

200Sucesso (comportamento atual)

{
    "data": []
}

405Verbo HTTP diferente de GET

{
    "status": "error",
    "message": "Method Not Allowed",
    "code": 405
}
GET /api/radio-play/sync/commands/{AUTH_CODE}/ Sincroniza comandos disponíveis para o sync
Atenção: endpoint ainda não implementado. O código sempre retorna uma lista vazia em data (ver comentário "TODO" em RadioPlaySyncController::getCommands).

Parâmetros de URL

AUTH_CODEobrigatórioCódigo de autorização do sync.

200Sucesso (comportamento atual)

{
    "data": []
}

405Verbo HTTP diferente de GET

{
    "status": "error",
    "message": "Method Not Allowed",
    "code": 405
}
POST /api/radio-play/player/set-played Registra item reproduzido pelo SyncPlay

Registra item reproduzido pelo SyncPlay.

Headers

authcodeobrigatórioCódigo de autorização do sync (diferente dos demais endpoints, que usam o auth_code na URL).

Parâmetros POST

typeobrigatórioTipo do item reproduzido: music, media, command, text, ai-prompt, manual, bumper, vem (bumper/vem viram "tag").
foreign_keyId do item reproduzido. Obrigatório, exceto para type manual/text.
audioNome do áudio. Obrigatório quando type for manual ou text.
played_dateobrigatórioData/hora da reprodução.
modelObrigatório quando type=command (ex: StreamingIn).
block_date, file_path, file_time, file_execution_time, nro_int, program_id, ignore_redisOpcionais.

OBS: diferente da maioria dos endpoints desta página, este endpoint define o status HTTP real da resposta (400 Bad Request nos erros de validação abaixo) em vez de sempre responder 200 com um campo "code" interno.

200Sucesso

{
    "code": 200,
    "message": "Arquivo salvo com sucesso",
    "status": "success"
}

400authcode ausente

{
    "message": "Informe o \"authcode\" no header."
}

400foreign_key/audio ausentes

{
    "message": "Informe o parâmetro \"foreign_key\" ou \"audio\", não pode ser os dois vazios."
}

400type ausente

{
    "message": "O parâmetro \"type\" não pode ser vazio."
}

400played_date ausente

{
    "message": "O parâmetro \"played_date\" não pode ser vazio."
}
GET /api/radio-play/player/get-played Consulta últimos itens reproduzidos pelo SyncPlay

Consulta últimos itens reproduzidos pelo SyncPlay. Sem parâmetros.

OBS: endpoint não possui tratamento de erros; falhas inesperadas resultam na página de erro padrão do CakePHP.

200Sucesso (últimos 100 registros, ordenados por id decrescente)

{
    "response": [
        {
            "id": 981,
            "type": "music",
            "audio": "Bob Dylan = Lay Lady Lay.mp3",
            "authcode": "1912B5DD69",
            "played_date": "2021-05-24 11:43:18",
            "branch_id": 12,
            "foreign_key": 4821,
            "model": "Musics"
        }
    ]
}

Sem respostas de erro documentadas.

POST /api/radio-play/sync/save-syncplay-informations Salva informações de versão do player Syncplay

Salva informações de versão do player Syncplay.

Parâmetros POST

auth_codeobrigatórioCódigo de autorização do sync.
version_playerobrigatórioVersão do player Syncplay.

OBS: assim como o endpoint de set-played, este endpoint define o status HTTP real da resposta (400 Bad Request nos erros de validação abaixo) em vez de sempre responder 200.

200Sucesso

{
    "code": 200,
    "message": "Informações do player salvas com sucesso."
}

400auth_code ausente

{
    "message": "Informe o \"auth_code\"."
}

400version_player ausente

{
    "message": "Informe a versão do player."
}

500Falha ao salvar

{
    "message": "Não foi possível salvar as informações do player."
}
POST /api/syncplay/upload-logs Upload de logs do Syncplay

Upload de logs do Syncplay.

Headers

X-SyncPlay-SNobrigatórioSerial Number do player Syncplay.

Parâmetros (multipart/form-data)

fileobrigatórioArquivo de log em JSON.

OBS: este endpoint também define o status HTTP real da resposta (400 Bad Request nos erros abaixo) em vez de sempre responder 200.

200Sucesso (novo arquivo, processamento em background)

{
    "status": "success",
    "message": "Arquivo de log enviado e processamento iniciado.",
    "processed": false
}

200Sucesso (hash já processado anteriormente)

{
    "status": "success",
    "message": "Arquivo de log já processado (hash duplicado).",
    "processed": true
}

400Header X-SyncPlay-SN ausente

{
    "status": "error",
    "message": "O header X-SyncPlay-SN é obrigatório.",
    "processed": false
}

400Serial Number inválido

{
    "status": "error",
    "message": "Serial Number inválido.",
    "processed": false
}

400Nenhum arquivo enviado

{
    "status": "error",
    "message": "Nenhum arquivo de log foi enviado.",
    "processed": false
}