]> jfr.im git - plex-to-listenbrainz.git/blame - plex-to-listenbrainz.php
add track mbid if included
[plex-to-listenbrainz.git] / plex-to-listenbrainz.php
CommitLineData
c425298e
JR
1<?php
2function err($s) {
3 error_log($s);
4}
5if (empty($_GET['token'])) {
6 err("Must specify ?token with your ListenBrainz token.");
7 exit;
8}
9if (empty($_GET['user'])) {
10 err("Must specify ?user with your Plex username.");
11 exit;
12}
13
14$plex = json_decode($_POST['payload'], TRUE);
15if (!in_array($plex['event'], explode(' ', 'media.scrobble media.play media.resume'))) {
16 exit;
17}
18if (mb_strtolower($plex['Account']['title']) != mb_strtolower($_GET['user'])) {
19 exit;
20}
9b8927cb
JR
21if ($plex['Metadata']['type'] != 'track') {
22 exit;
23}
c425298e 24
f084ba46 25$DIR = __DIR__;
c425298e
JR
26$listenbrainz = array(
27 'listen_type' => (($plex['event'] == 'media.scrobble') ? 'single' : 'playing_now'),
28 'payload' => array(array(
29 'track_metadata' => array(
30 'artist_name' => $plex['Metadata']['originalTitle'] ?? $plex['Metadata']['grandparentTitle'],
31 'track_name' => $plex['Metadata']['title'],
32 'release_name' => $plex['Metadata']['parentTitle'],
33 'additional_info' => array(
34 'media_player' => 'Plex',
35 'submission_client' => 'https://jfr.im/git/plex-to-listenbrainz.git/',
f084ba46 36 'submission_client_version' => trim(`git -C $DIR show --summary --pretty=format:%h | head -1`),
c425298e
JR
37 'tracknumber' => $plex['Metadata']['index'],
38 ),
39 ),
40 )),
41);
42if ($plex['event'] == 'media.scrobble') {
43 $listenbrainz['payload'][0]['listened_at'] = time();
44 $listenbrainz['listen_type'] = 'single';
45} else {
46 $listenbrainz['listen_type'] = 'playing_now';
47}
48
49if (!empty($plex['Metadata']['attribution'])) {
50 $listenbrainz['payload'][0]['track_metadata']['additional_info']['music_service'] = implode('.', array_reverse(explode('.', $plex['Metadata']['attribution'])));
51}
52
0a633213
JR
53if (isset($plex['Metadata']['Guid']) && is_array($plex['Metadata']['Guid']) && count($plex['Metadata']['Guid']) && isset($plex['Metadata']['Guid'][0]['id'])) {
54 if (isset($plex['Metadata']['Guid'][0]['id']) && strpos($plex['Metadata']['Guid'][0]['id'], 'mbid://') === 0) {
55 $listenbrainz['payload'][0]['track_metadata']['additional_info']['track_mbid'] = substr($plex['Metadata']['Guid'][0]['id'], 7);
56 }
57}
58
c425298e
JR
59$lb_payload = json_encode($listenbrainz);
60
61$ch = curl_init('https://api.listenbrainz.org/1/submit-listens');
62curl_setopt_array($ch, array(
63 CURLOPT_HTTPHEADER => array(
64 'Content-Type: application/json',
65 'Authorization: Token ' . $_GET['token'],
66 ),
67 CURLOPT_RETURNTRANSFER => TRUE,
68 CURLOPT_POSTFIELDS => json_encode($listenbrainz),
69));
70$resp = curl_exec($ch);
71if ($resp === FALSE) {
72 err("Failed to reach ListenBrainz: curl " . curl_errno($ch) . ": " . curl_error($ch));
73 exit;
74}
75$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
76if ($status != 200) {
77 err("Error response from ListenBrainz: HTTP $status: $resp");
78 exit;
79}
80
81file_put_contents('/home/jrunyon/plexlog', var_export($status, true) . ';' . var_export($resp, true), FILE_APPEND);