]>
Commit | Line | Data |
---|---|---|
c425298e JR |
1 | <?php |
2 | function err($s) { | |
3 | error_log($s); | |
4 | } | |
5 | if (empty($_GET['token'])) { | |
6 | err("Must specify ?token with your ListenBrainz token."); | |
7 | exit; | |
8 | } | |
9 | if (empty($_GET['user'])) { | |
10 | err("Must specify ?user with your Plex username."); | |
11 | exit; | |
12 | } | |
13 | ||
14 | $plex = json_decode($_POST['payload'], TRUE); | |
15 | if (!in_array($plex['event'], explode(' ', 'media.scrobble media.play media.resume'))) { | |
16 | exit; | |
17 | } | |
18 | if (mb_strtolower($plex['Account']['title']) != mb_strtolower($_GET['user'])) { | |
19 | exit; | |
20 | } | |
9b8927cb JR |
21 | if ($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 | ); | |
42 | if ($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 | ||
49 | if (!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 |
53 | if (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'); | |
62 | curl_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); | |
71 | if ($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); | |
76 | if ($status != 200) { | |
77 | err("Error response from ListenBrainz: HTTP $status: $resp"); | |
78 | exit; | |
79 | } | |
80 | ||
81 | file_put_contents('/home/jrunyon/plexlog', var_export($status, true) . ';' . var_export($resp, true), FILE_APPEND); |