-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPlexInterface.rb
141 lines (120 loc) · 3.14 KB
/
PlexInterface.rb
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
require 'dnssd'
require 'net/http'
require 'rexml/document'
require 'digest/sha1'
require './PlexRedis'
class PlexInterface
SERVER_SERVICE = '_plexmediasvr._tcp.'
def initialize
@servers = nil
@server = nil
@pRedis = PlexRedis.new
init_server
end
def search section_id, query
ids = @pRedis.search @server['name'], section_id, query
ids.each do |id|
p plex_get 'library/metadata/'+id
end
end
def init_server
last_server = @pRedis.get_config 'last_server'
pick_server last_server
check_server
if last_server == nil
@pRedis.set_config 'last_server', @server['name']
end
check_indexes
end
def check_indexes
get_sections().each do |section_id, section_type|
search_key = nil
REXML::Document.new(plex_get('library/sections/'+section_id)).elements.each('MediaContainer/Directory') do |element|
if element.attributes.has_key? 'search'
search_key = element.attributes['key']
end
end
if search_key != nil
xml = plex_get 'library/sections/'+section_id+'/'+search_key
oldsha1sum = @pRedis.get_config(@server['name']+'_'+section_id+'_sha1sum')
sha1sum = Digest::SHA1.base64digest(xml)
if sha1sum != oldsha1sum
STDERR.puts 'reindexing '+@server['name']+' : '+section_id
@pRedis.reindex @server['name'], section_type, section_id, xml
else
STDERR.puts 'index up to date for '+@server['name']+' : '+section_id
end
end
end
end
def get_sections
xml = plex_get 'library/sections'
doc = REXML::Document.new xml
sections = {}
doc.elements.each('MediaContainer/Directory') do |element|
sections[element.attributes['key']]=element.attributes['type']
end
return sections
end
def check_server
xml = plex_get ''
doc = REXML::Document.new xml
if doc.elements.empty?
raise 'Unable to read data from server'
end
end
def plex_get uri
return Net::HTTP.get(URI('http://'+@server['host']+':'+@server['port']+'/'+uri))
end
def get_available_servers
#because my mac sucks at dnssd (hillariously)
if SKIP_DNSSD
STDERR.puts 'Skip DNS-SD'
@servers = {'main' => {'host' => 'localhost', 'port' => '32400', 'name' => 'main'}}
return @servers
end
if @servers != nil
return @servers
end
rawServers = {}
DNSSD.browse '_plexmediasvr._tcp.', 'local' do |reply|
rawServers[reply.name] ||= reply
end
STDERR.sync = true
STDERR.print 'Looking for servers'
1.times do
STDERR.print '.'
sleep 1
end
STDERR.puts 'Done'
@servers = {}
rawServers.each do |key, reply|
DNSSD.resolve reply.name, reply.type, 'local' do |resolve_reply|
@servers[resolve_reply.name] = {'host' => resolve_reply.target.chomp('.'), 'port' => resolve_reply.port, 'name' => resolve_reply.name}
end
end
STDERR.print 'Resolving servers'
1.times do
STDERR.print '.'
sleep 1
end
STDERR.puts 'Done'
return @servers
end
def pick_server name=nil
get_available_servers
if @servers.empty?
raise 'No servers available.'
end
if name == nil
@server = @servers[@servers.keys[0]]
else
if @servers.has_key? name
@server = @servers[name]
else
raise ArgumentError, '#{name} not found in server list'
end
end
return @server
end
end