source: ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_m3u.lua @ 27875

Last change on this file since 27875 was 27875, checked in by obi, 10 years ago

add xupnpd tpk

File size: 7.6 KB
Line 
1-- Copyright (C) 2011-2013 Anton Burdinuk
2-- clark15b@gmail.com
3-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
4
5function add_playlists_from_dir(dir_path,playlist,plist)
6
7    local d=util.dir(dir_path)
8
9    if d then
10        table.sort(d)
11        local tt={}
12        for i,j in ipairs(playlist) do
13            local path=nil
14            if type(j)=='table' then path=j[1] else path=j end
15            tt[path]=j
16        end
17
18        for i,j in ipairs(d) do
19            if string.find(j,'%.m3u$') then
20                local fname=dir_path..j
21                if not tt[fname] then
22                    table.insert(plist,fname)
23                    if cfg.debug>0 then print('found unlisted playlist \''..fname..'\'') end
24                end
25            end
26        end
27    end
28end
29
30function playlist_new_folder(parent,name)
31    local child={}
32    parent.size=parent.size+1
33    child.name=name
34    child.objid=parent.objid..'_'..parent.size
35    child.parent=parent
36    child.size=0
37    child.elements={}
38    parent.elements[parent.size]=child
39    return child
40end
41
42function playlist_sort_elements(pls)
43    if cfg.sort_files~=true or pls==nil or pls.elements==nil then return end
44    table.sort(pls.elements,function(a,b) return string.lower(a.name)<string.lower(b.name) end)
45end
46
47function playlist_fix_sub_tree(pls)
48    playlist_sort_elements(pls)
49    for i,j in ipairs(pls.elements) do
50        j.objid=pls.objid..'_'..i
51        j.parent=pls
52
53        if j.elements then
54            playlist_fix_sub_tree(j)
55        else
56            j.type=util.getfext(j.url)
57
58            if not mime[j.type] then j.type=cfg.default_mime_type end
59        end
60
61    end
62end
63
64function playlist_attach(parent,pls)
65    parent.size=parent.size+1
66    pls.objid=parent.objid..'_'..parent.size
67    pls.parent=parent
68    parent.elements[parent.size]=pls
69end
70
71function get_m3u_count(plist)
72    local count=0
73    for i,j in ipairs(plist) do
74        if type(j)=='table' then j=j[1] end
75        if string.find(j,'%.m3u$') then count=count+1 end
76    end
77    return count
78end
79
80function reload_playlists()
81    playlist_data={}
82    playlist_data.name='root'
83    playlist_data.objid='0'
84    playlist_data.size=0
85    playlist_data.elements={}
86
87    local plist=clone_table(playlist)
88
89    add_playlists_from_dir(cfg.playlists_path,playlist,plist)
90    if cfg.feeds_path~=cfg.playlists_path then add_playlists_from_dir(cfg.feeds_path,playlist,plist) end
91
92    local pls_folder=playlist_data
93
94    if cfg.group==true and get_m3u_count(plist)>0 then
95        pls_folder=playlist_new_folder(playlist_data,'Playlists')
96    end
97
98    local groups={}
99
100    for i,j in ipairs(plist) do
101
102        local pls
103
104        if type(j)=='table' then
105
106            if string.find(j[1],'%.m3u$') then pls=m3u.parse(j[1]) else pls=m3u.scan(j[1]) end
107
108            if pls then
109                if j[2] then pls.name=j[2] end
110                if j[3] then pls.acl=j[3] end
111            end
112        else
113            if string.find(j,'%.m3u$') then pls=m3u.parse(j) else pls=m3u.scan(j) end
114        end
115
116        if pls then
117            if pls.filesystem then
118                playlist_attach(playlist_data,pls)
119            else
120                playlist_attach(pls_folder,pls)
121            end
122
123            if cfg.debug>0 then print('playlist \''..pls.name..'\'') end
124
125            if pls.filesystem then
126                playlist_fix_sub_tree(pls)
127            else
128                local udpxy=cfg.udpxy_url
129
130                for ii,jj in ipairs(pls.elements) do
131
132                    if udpxy then
133                        if string.find(jj.url,'^udp://@') or string.find(jj.url,'^rtp://@') then
134                            jj.url=string.format('%s/%s/%s',udpxy,string.sub(jj.url,1,3),string.sub(jj.url,8))
135                        end
136                    end
137
138                    if not jj.type then
139                        if pls.type then
140                            jj.type=pls.type
141                        else
142                            jj.type=util.getfext(jj.url)
143                        end
144                    end
145
146                    if pls.plugin and not jj.plugin then jj.plugin=pls.plugin end
147
148                    if pls.dlna_extras and not jj.dlna_extras then jj.dlna_extras=pls.dlna_extras end
149
150                    if not mime[jj.type] then jj.type=cfg.default_mime_type end
151
152                    jj.objid=pls.objid..'_'..ii
153                    jj.parent=pls
154                    if cfg.debug>1 then print('\''..jj.name..'\' '..jj.url..' <'..jj.type..'>') end
155
156                    if cfg.group==true then
157                        local group_title=jj['group-title']
158                        if group_title then
159                            local group=groups[group_title]
160                            if not group then
161                                group={}
162                                group.name=group_title
163                                group.elements={}
164                                group.size=0
165                                group.virtual=true
166                                groups[group_title]=group
167                            end
168
169                            local element=clone_table(jj)
170                            element.parent=group
171                            element.objid=nil
172                            group.size=group.size+1
173                            group.elements[group.size]=element
174                        end
175                    end
176                end
177            end
178        end
179    end
180
181    if cfg.group==true then
182        for i,j in pairs(groups) do
183
184            if cfg.debug>0 then print('group \''..j.name..'\'') end
185
186            playlist_attach(playlist_data,j)
187
188            for ii,jj in ipairs(j.elements) do
189                jj.objid=j.objid..'_'..ii
190            end
191        end
192    end
193
194end
195
196function find_playlist_object(s)
197    if not s then return nil end
198
199    local pls=nil
200
201    for i in string.gmatch(s,'([^_]+)') do
202        if not pls then
203            if string.find(i,'^%d+$') then pls=playlist_data else return nil end
204        else
205            if not pls.elements then return nil end           
206            pls=pls.elements[tonumber(i)]
207        end
208    end
209    return pls
210end
211
212function rss_merge(new,old,max_num)
213
214    local tt={}
215
216    for i,j in ipairs(old) do tt[j.title]=j end
217    for i,j in ipairs(new) do if tt[j.title] then j.link=nil end end
218
219    tt={} local idx=1
220
221    for i,j in ipairs(new) do if idx>max_num then break end if j.link then tt[idx]=j idx=idx+1 end end
222
223    for i,j in ipairs(old) do if idx>max_num then break end tt[idx]=j idx=idx+1 end
224
225    return tt
226end
227
228function rss_parse_m3u(path)
229    local t={}
230
231    local x=m3u.parse(path)
232    if x and x.elements then
233        local idx=1
234        for i,j in ipairs(x.elements) do
235            t[idx]={ ['title']=j.name, ['link']=j.url, ['logo']=j.logo }
236            idx=idx+1
237        end
238    end
239
240    return t
241end
242
243function rss_parse_feed(url,logo_regexp)
244    local t={}
245
246    local feed_data=http.download(url)
247
248    if not feed_data then return t end
249
250    if not logo_regexp then logo_regexp='url="(.-)"' end
251
252    local x=xml.find('rss/channel',xml.decode(feed_data))
253
254    feed_data=nil
255
256    if x and x['@elements'] then
257        local idx=1
258        for i,j in ipairs(x['@elements']) do
259            if j['@name']=='item' then
260                local title=nil if j.title then title=j.title['@value'] end
261                local link =nil if j.link then link=j.link['@value'] end
262                local logo =nil if j.enclosure then logo=j.enclosure['@attr'] end
263
264                if logo then logo=string.match(logo,logo_regexp) end
265
266                if title and link then
267                    t[idx]={ ['title']=title, ['link']=link, ['logo']=logo }
268                    idx=idx+1
269                end
270            end
271        end
272    end
273    return t
274end
275
276reload_playlists()
Note: See TracBrowser for help on using the repository browser.