-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmopidy-twitter.js
More file actions
86 lines (74 loc) · 2.45 KB
/
mopidy-twitter.js
File metadata and controls
86 lines (74 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env node
'use strict'
var Mopidy = require('mopidy')
var Twitter = require('twitter')
var userHome = require('user-home')
var fs = require('fs')
var path = require('path')
var configDir = path.join(userHome, '.config', 'mopidy-twitter')
var optionsFile = path.resolve(configDir, 'options.json')
var config = {
mopidy: require(path.resolve(configDir, 'mopidy.json')),
twitter: require(path.resolve(configDir, 'twitter.json')),
options: fs.existsSync(optionsFile) ? require(optionsFile) : {}
}
var client = new Twitter(config.twitter)
var currentTrack = null
var tweetTimeout = null
var artistsToString = function (artists) {
var artistNames = artists.map(function (artist) { return artist.name })
var len = artistNames.length
return (len === 0) ? 'Unknown Artist'
: (len === 1) ? artistNames[0]
: artistNames.slice(0, len - 1).join(', ') + ' & ' + artistNames[len - 1]
}
var trackToString = function (track) {
var artists = (track.artists && track.artists.length)
? artistsToString(track.artists) + ' - '
: ''
return artists + track.name
}
var truncate = function (str, max) {
return (str.length <= max) ? str : str.substr(0, max - 1) + '…'
}
var tweet = function () {
var status = '♫ Now Playing: ' + currentTrack
console.info('Posting tweet:', status)
client.post('statuses/update', {status: truncate(status, 140)}, function (err) {
if (err) {
console.error('Error posting tweet:', err)
} else {
console.info('Tweet successfully posted')
}
})
}
var acceptTrack = function (track) {
var trackStr = track ? trackToString(track) : null
console.info('Track:', (currentTrack !== null) ? currentTrack : '(none)')
if (trackStr !== currentTrack) {
currentTrack = trackStr
if (tweetTimeout) {
clearTimeout(tweetTimeout)
tweetTimeout = null
}
if (currentTrack !== null) {
var delay = (typeof config.options.delay === 'number')
? config.options.delay
: 5000
tweetTimeout = setTimeout(tweet, delay)
}
}
}
var host = config.mopidy.hostname + ':' + (config.mopidy.port || 6680)
var mopidy = new Mopidy({
webSocketUrl: 'ws://' + host + '/mopidy/ws',
callingConvention: 'by-position-or-by-name'
})
mopidy.on('state:online', function () {
mopidy.playback.getCurrentTrack()
.then(acceptTrack)
.catch(console.error)
mopidy.on('event:trackPlaybackStarted', function (data) {
acceptTrack(data.track || data[Object.keys(data)[0]].track)
})
})