-- vim:set ft=lua: dofile(mg.script_name:gsub('[^\\/]*$','')..'util.lua') function format(reset) if reset=='tvguide' then edcb.WritePrivateProfile('GUIDE', nil, '',ini) edcb.WritePrivateProfile('BACKGROUND', nil, '',ini) return '番組表設定を初期化しました' elseif reset=='sort' then edcb.WritePrivateProfile('SORT', nil, '',ini) edcb.WritePrivateProfile('HIDE', nil, '',ini) return '並び替え設定を初期化しました' end end function save(post) local titleControl=GetVarInt(post,'titleControl-PC')+GetVarInt(post,'titleControl-SP') for i=0,10000 do local v=GetVarInt(post,'titleControl',0,32,i) if not v then break end titleControl=titleControl+v end --edcb.WritePrivateProfile('SET', 'tkntrec', GetVarInt(post,'tkntrec')==1,ini) edcb.WritePrivateProfile('SET', 'Roboto', GetVarInt(post,'Roboto')==1,ini) edcb.WritePrivateProfile('SET', 'subGenreoption', mg.get_var(post,'subGenreoption'),ini) edcb.WritePrivateProfile('SET', 'PAGE_COUNT', GetVarInt(post,'PAGE_COUNT',0,100000),ini) edcb.WritePrivateProfile('SET', 'FIND_BY_OPEN', GetVarInt(post,'FIND_BY_OPEN')==1,ini) edcb.WritePrivateProfile('SET', 'XBUF', GetVarInt(post,'XBUF'),ini) edcb.WritePrivateProfile('SET', 'Olympic', GetVarInt(post,'Olympic')==1,ini) edcb.WritePrivateProfile('GUIDE', 'oneseg', GetVarInt(post,'oneseg')==1,ini) edcb.WritePrivateProfile('GUIDE', 'hover', GetVarInt(post,'hover')==1,ini) edcb.WritePrivateProfile('GUIDE', 'titleControl', titleControl,ini) edcb.WritePrivateProfile('GUIDE', 'ONE_MIN_PX', GetVarInt(post,'ONE_MIN_PX',1,100000),ini) edcb.WritePrivateProfile('GUIDE', 'MARGIN_HOUR', GetVarInt(post,'MARGIN_HOUR',0,23),ini) edcb.WritePrivateProfile('GUIDE', 'MARGIN_MIN', GetVarInt(post,'MARGIN_MIN',1,100000),ini) edcb.WritePrivateProfile('GUIDE', 'service', GetVarInt(post,'w_service',10,100000),ini) edcb.WritePrivateProfile('GUIDE', 'service_sp', GetVarInt(post,'w_service_sp',10,100000),ini) edcb.WritePrivateProfile('GUIDE', 'hour', GetVarInt(post,'w_hour',10,100000),ini) edcb.WritePrivateProfile('GUIDE', 'hour_sp', GetVarInt(post,'w_hour_sp',10,100000),ini) edcb.WritePrivateProfile('GUIDE', 'CH_COUNT', GetVarInt(post,'CH_COUNT',0,100000),ini) edcb.WritePrivateProfile('GUIDE', 'sidePanel', GetVarInt(post,'sidePanel')==1,ini) edcb.WritePrivateProfile('GUIDE', 'subChConcat', GetVarInt(post,'subChConcat')==1,ini) edcb.WritePrivateProfile('BACKGROUND', 'background', mg.get_var(post, 'background'),ini) edcb.WritePrivateProfile('BACKGROUND', 'news', mg.get_var(post, 'news'),ini) edcb.WritePrivateProfile('BACKGROUND', 'sports', mg.get_var(post, 'sports'),ini) edcb.WritePrivateProfile('BACKGROUND', 'information', mg.get_var(post, 'information'),ini) edcb.WritePrivateProfile('BACKGROUND', 'drama', mg.get_var(post, 'drama'),ini) edcb.WritePrivateProfile('BACKGROUND', 'music', mg.get_var(post, 'music'),ini) edcb.WritePrivateProfile('BACKGROUND', 'variety', mg.get_var(post, 'variety'),ini) edcb.WritePrivateProfile('BACKGROUND', 'movie', mg.get_var(post, 'movie' or ''),ini) edcb.WritePrivateProfile('BACKGROUND', 'anime', mg.get_var(post, 'anime'),ini) edcb.WritePrivateProfile('BACKGROUND', 'documentary', mg.get_var(post, 'documentary'),ini) edcb.WritePrivateProfile('BACKGROUND', 'theater', mg.get_var(post, 'theater'),ini) edcb.WritePrivateProfile('BACKGROUND', 'education', mg.get_var(post, 'education'),ini) edcb.WritePrivateProfile('BACKGROUND', 'welfare', mg.get_var(post, 'welfare'),ini) edcb.WritePrivateProfile('BACKGROUND', 'extension', mg.get_var(post, 'extension'),ini) edcb.WritePrivateProfile('BACKGROUND', 'other', mg.get_var(post, 'other'),ini) edcb.WritePrivateProfile('BACKGROUND', 'none', mg.get_var(post, 'none'),ini) edcb.WritePrivateProfile('BACKGROUND', 'nothing', mg.get_var(post, 'nothing'),ini) edcb.WritePrivateProfile('BACKGROUND', 'paint', GetVarInt(post,'paint')==1,ini) edcb.WritePrivateProfile('BACKGROUND', 'reserved', mg.get_var(post, 'reserved'),ini) edcb.WritePrivateProfile('BACKGROUND', 'disable', mg.get_var(post, 'disable'),ini) edcb.WritePrivateProfile('BACKGROUND', 'partially', mg.get_var(post, 'partially'),ini) edcb.WritePrivateProfile('BACKGROUND', 'partially_border', mg.get_var(post, 'partially_border'),ini) edcb.WritePrivateProfile('BACKGROUND', 'shortage', mg.get_var(post, 'shortage'),ini) edcb.WritePrivateProfile('BACKGROUND', 'shortage_border', mg.get_var(post, 'shortage_border'),ini) edcb.WritePrivateProfile('SORT', nil, '',ini) for i=0,10000 do local v=mg.get_var(post, 'sort', i) if not v then break end edcb.WritePrivateProfile('SORT', 'sort'..i, v,ini) end edcb.WritePrivateProfile('HIDE', nil, '',ini) for i=0,10000 do local v=mg.get_var(post, 'hide', i) if not v then break end edcb.WritePrivateProfile('HIDE', 'hide'..i, v,ini) end return '保存しました' end ct={ title='設定', js='
\n' ..'
\n' ..'
\n', tab='全般\n' ..'番組表\n' ..'並び替え\n', dialog={{id='dialog',button='
\n'}} } GetChDataList={} for i,v in ipairs(edcb.GetChDataList()) do GetChDataList[v.onid..'-'..v.tsid..'-'..v.sid]=true end edcb.htmlEscape=15 ct.main='
\n
\n
\n' ..'\n' ..'\n' ..'
\n' post=AssertPost() if post then reset=mg.get_var(post,'reset') if reset then messege=format(reset) or '初期化できませんでした' else messege=save(post) or '保存できませんでした' end ct.js=ct.js..'
' end sidePanel=tonumber(edcb.GetPrivateProfile('GUIDE','sidePanel',true,ini))~=0 Roboto=tonumber(edcb.GetPrivateProfile('SET','Roboto',false,ini))~=0 subGenreoption=edcb.GetPrivateProfile('SET','subGenreoption','ALL',ini) PAGE_COUNT=tonumber(edcb.GetPrivateProfile('SET','PAGE_COUNT','30',ini)) Olympic=tonumber(edcb.GetPrivateProfile('SET','Olympic',false,ini))~=0 ct.main=ct.main..'
\n
サイドパネル
\n
\n' ..'
\n' ..'番組詳細等をサイドパネルで表示します
\n' ..'
\n
オリンピック・ワールドカップモード
\n
\n' ..'
\n' ..'番組表のリンクを一覧に表示
\n' ..'
\n
Webフォント "Roboto"
\n' ..'
\n' ..'Material Design推奨フォント
\n' ..'
\n
一覧表示数
\n
\n' ..'
Input is not a number!
\n' ..'0で無制限
\n' ..'
\n
サブジャンル表示
\n
\n' ..'
表示する
\n' ..'
EPG予約のみ
\n' ..'
表示しない
\n' ..'
\n' ..'
\n
ストレージ
' ..'
\n' list={} n=tonumber(edcb.GetPrivateProfile('SET','RecFolderNum',0,'Common.ini')) if n<=0 then --録画保存フォルダが未設定のときは設定関係保存フォルダになる list[1]=edcb.GetPrivateProfile('SET','DataSavePath','','Common.ini') if list[1]=='' then list[1]=edcb.GetPrivateProfile('SET','ModulePath','','Common.ini')..'\\Setting' end end for i=0,n-1 do list[#list+1]=edcb.GetPrivateProfile('SET','RecFolderPath'..i,'','Common.ini') end checked={} for i,v in ipairs(list) do v=v:match('^%a:\\') if v and not checked[v:upper()] then checked[v:upper()]=true free=nil f=edcb.io.popen('fsutil volume diskfree '..v) if f then free,total,avail=f:read('*a'):gsub("[%s',.]",''):match(':(%d+).*:(%d+).*:(%d+)') f:close() end ct.main=ct.main..'
storage\n' ..'
'..v..'
' ..(free and ('%.3f GiB / %.3f GiB'):format(free/1024/1024/1024,total/1024/1024/1024) or '不明')..'
\n' ..'
\n' end end tools=edcb.GetPrivateProfile('SET','ModulePath','','Common.ini')..'\\Tools\\' ffmpeg=edcb.GetPrivateProfile('SET','ffmpeg',tools..'ffmpeg.exe',ini) ffprobe=edcb.GetPrivateProfile('SET','ffprobe',tools..'ffprobe.exe',ini) tsreadex=edcb.GetPrivateProfile('SET','tsreadex',tools..'tsreadex.exe',ini) asyncbuf=edcb.GetPrivateProfile('SET','asyncbuf',tools..'asyncbuf.exe',ini) XBUF=edcb.GetPrivateProfile('SET','XBUF',0,ini) FIND_BY_OPEN=tonumber(edcb.GetPrivateProfile('SET','FIND_BY_OPEN',false,ini))~=0 ct.main=ct.main..'
\n' ..'
\n
動画変換用
' ..'
\n
ffmpeg.exe
'..(edcb.FindFile(ffmpeg, 1) and ffmpeg or '見つかりません')..'
\n
\n' ..'
\n
ffprobe.exe
'..(edcb.FindFile(ffprobe, 1) and ffprobe or '見つかりません')..'
\n
\n' ..'
\n
tsreadex.exe
'..(edcb.FindFile(tsreadex, 1) and tsreadex or '見つかりません')..'
\n
\n' ..'
\n
asyncbuf.exe
'..(edcb.FindFile(asyncbuf, 1) and asyncbuf or '見つかりません')..'
\n
\n' ..'
\n
ffmpeg変換オプション一覧
\n
\n' list = edcb.GetPrivateProfile('set','quality','',ini) if list~='' then ct.main=ct.main..'

\n' for v in list:gmatch('[^,]+') do ct.main=ct.main..'
- '..v..'
  '..edcb.GetPrivateProfile('MOVIE',v,'',ini)..'
\n' end ct.main=ct.main..'

\n' end ct.main=ct.main..'
\n' ..'
\n
出力バッファの量
\n
\n' ..'
bytes
\n' ..'
\n
名前付きパイプを予想して開く
\n
\n' ..'
\n' ..'一部の環境でリモート視聴が動作しない場合にオンにしてください\n' ..'
\n' ..'
\n' oneseg=tonumber(edcb.GetPrivateProfile('GUIDE','oneseg',false,ini))~=0 hover=tonumber(edcb.GetPrivateProfile('GUIDE','hover',false,ini))~=0 titleControl=tonumber(edcb.GetPrivateProfile('GUIDE','titleControl',1+4+2+32,ini)) ONE_MIN_PX=edcb.GetPrivateProfile('GUIDE','ONE_MIN_PX','4',ini) MARGIN_HOUR=edcb.GetPrivateProfile('GUIDE','MARGIN_HOUR','1',ini) MARGIN_MIN=edcb.GetPrivateProfile('GUIDE','MARGIN_MIN','30',ini) w_service=edcb.GetPrivateProfile('GUIDE','service','210',ini) w_service_sp=edcb.GetPrivateProfile('GUIDE','service_sp','125',ini) w_hour=edcb.GetPrivateProfile('GUIDE','hour','22',ini) w_hour_sp=edcb.GetPrivateProfile('GUIDE','hour_sp','16',ini) CH_COUNT=tonumber(edcb.GetPrivateProfile('GUIDE','CH_COUNT','0',ini)) subChConcat=tonumber(edcb.GetPrivateProfile('GUIDE','subChConcat',true,ini))~=0 ct.main=ct.main..'
\n' ..'
\n
ワンセグ
\n
\n' ..'
\n' ..'
\n
マウスホバー
\n
\n' ..'
\n' ..'ポップアップをマウスホバーで表示
\n' ..'
\n
サブチャンネル結合
\n
\n' ..'
\n' ..'CSでは無効
\n' ..'
\n
番組名の制御
\n
\n' ..'
PC：
追従
\n' ..'
JavaScriptで
\n' ..'
CSSで
\n' ..'
スマホ：
追従
\n' ..'
JavaScriptで
\n' ..'
CSSで
\n' ..'
\n' ..'
チャンネル数
\n
\n' ..'
Input is not a number!
\n' ..'0で無制限
\n' ..'
\n
1分の高さ
\n
\n' ..'
1以上で入力してください
px
\n' ..'
\n
基準時間
\n
\n' ..'
0～23の間で入力してください
時間前
\n' ..'
\n
現在時刻の位置
\n
\n' ..'
0以上で入力してください
分
\n' ..'スクロールする位置をずらします
\n' ..'
\n
チャンネルの幅
\n
\n' ..'
\n
\n
PC 10以上で入力してください
px
\n' ..'
\n
\n
スマホ 10以上で入力してください
px
\n' ..'
\n
時間帯の幅
\n
' ..'
\n
\n
PC 10以上で入力してください
px
\n' ..'
\n
\n
スマホ 10以上で入力してください
px
\n' background=edcb.GetPrivateProfile('BACKGROUND','background','#EEEEEE',ini) news=edcb.GetPrivateProfile('BACKGROUND','news','#B3E5FC',ini) sports=edcb.GetPrivateProfile('BACKGROUND','sports','#FFF9C4',ini) information=edcb.GetPrivateProfile('BACKGROUND','information','#BBDEFB',ini) drama=edcb.GetPrivateProfile('BACKGROUND','drama','#FFCDD2',ini) music=edcb.GetPrivateProfile('BACKGROUND','music','#FFECB3',ini) variety=edcb.GetPrivateProfile('BACKGROUND','variety','#E1BEE7',ini) movie=edcb.GetPrivateProfile('BACKGROUND','movie','#FFE0B2',ini) anime=edcb.GetPrivateProfile('BACKGROUND','anime','#F8BBD0',ini) documentary=edcb.GetPrivateProfile('BACKGROUND','documentary','#C5CAE9',ini) theater=edcb.GetPrivateProfile('BACKGROUND','theater','#DCEDC8',ini) education=edcb.GetPrivateProfile('BACKGROUND','education','#C8E6C9',ini) welfare=edcb.GetPrivateProfile('BACKGROUND','welfare','#B2DFDB',ini) extension=edcb.GetPrivateProfile('BACKGROUND','extension','#FFFFFF',ini) other=edcb.GetPrivateProfile('BACKGROUND','other','#F5F5F5',ini) none=edcb.GetPrivateProfile('BACKGROUND','none','#E0E0E0',ini) nothing=edcb.GetPrivateProfile('BACKGROUND','nothing','#9E9E9E',ini) paint=tonumber(edcb.GetPrivateProfile('BACKGROUND','paint',false,ini))~=0 reserve=edcb.GetPrivateProfile('BACKGROUND','reserved','#FF3D00',ini) disabled=edcb.GetPrivateProfile('BACKGROUND','disable','#757575',ini) partially=edcb.GetPrivateProfile('BACKGROUND','partially','#FFFF00',ini) partially_border=edcb.GetPrivateProfile('BACKGROUND','partially_border','#FF3D00',ini) shortage=edcb.GetPrivateProfile('BACKGROUND','shortage','#FF5252',ini) shortage_border=edcb.GetPrivateProfile('BACKGROUND','shortage_border','#FFEA00',ini) CATEGORY={ 'news', 'sports', 'information', 'drama', 'music', 'variety', 'movie', 'anime', 'documentary', 'theater', 'education', 'welfare', } ct.css='
\n' ct.main=ct.main..'
\n
背景色
\n
\n
\n' ..'
\n' ..'
\n
ジャンル別背景色
\n
\n' ..'
ニュース/報道
\n' ..'
\n' ..'
スポーツ
\n' ..'
\n' ..'
情報/ワイドショー
\n' ..'
\n' ..'
ドラマ
\n' ..'
\n' ..'
音楽
\n' ..'
\n' ..'
バラエティ
\n' ..'
\n' ..'
映画
\n' ..'
\n' ..'
アニメ/特撮
\n' ..'
\n' ..'
ドキュメンタリー/教養
\n' ..'
\n' ..'
劇場/公演
\n' ..'
\n' ..'
趣味/教育
\n' ..'
\n' ..'
福祉
\n' ..'
\n' ..'
拡張
\n' ..'
\n' ..'
その他
\n' ..'
\n' ..'
無指定
\n' ..'
\n' ..'
EPGなし
\n' ..'
\n' ..'
\n' ..'
\n
録画予約済
\n
\n' ..'
\n' ..'
予約済み
\n
' ..'
\n' ..'
予約無効
\n
' ..'
\n' ..'
塗りつぶし
\n' ..'
\n' ..'
一部録画
\n
' ..'
枠
\n' ..'
チューナー不足
\n
' ..'
枠
\n' ..'
\n' ..'
\n' ..'
\n' ..'
\n' ..'
\n' HIDE_SERVICES={} for i=0,1000 do v=edcb.GetPrivateProfile('HIDE','hide'..i,false,ini) if key=='0' then break end HIDE_SERVICES[''..v]=true end a=edcb.GetServiceList() or {} ServiceList={} if edcb.GetPrivateProfile('SORT','sort0',false,ini)~='0' then GetServiceList={} for i,v in ipairs(a) do GetServiceList[v.onid..'-'..v.tsid..'-'..v.sid]=v end for i=0,1000 do key=edcb.GetPrivateProfile('SORT','sort'..i,false,ini) if key=='0' then break end v=GetServiceList[key] if v and GetChDataList[key] then v.hide=HIDE_SERVICES[key] table.insert(ServiceList, v) else --TSID変更検出 for j,w in pairs(GetServiceList) do change=key:match(w.onid..'-(%d+)-'..w.sid..'$') if change and tonumber(change)~=w.tsid and GetChDataList[w.onid..'-'..w.tsid..'-'..w.sid] then w.change=change w.hide=HIDE_SERVICES[key] table.insert(ServiceList, w) GetServiceList[w.onid..'-'..w.tsid..'-'..w.sid]=nil break end end end GetServiceList[key]=nil end for i,v in ipairs(a) do if GetServiceList[v.onid..'-'..v.tsid..'-'..v.sid] then table.insert(ServiceList, v) end end else ServiceList=a table.sort(ServiceList, function(a,b) return ('%04X%04X'):format(a.remote_control_key_id, a.sid)< ('%04X%04X'):format(b.remote_control_key_id, b.sid) end) end NetworkList={} for i,v in ipairs(NetworkIndex()) do NetworkList[i]={} end for i,v in ipairs(ServiceList) do if GetChDataList[''..v.onid..'-'..v.tsid..'-'..v.sid] and (v.partialReceptionFlag or v.service_type==0x01 or v.service_type==0x02 or v.service_type==0xA5 or v.service_type==0xAD) then table.insert(NetworkList[NetworkIndex(v)], '
- ' ..'drag_handle' ..'' ..''..v.service_name..'' ..''..v.sid..(v.change and ' ※TSID変更を検出 '..v.change..'→'..v.tsid..'' or '')..'' -- SID表示サブチャネル判別用 ..'' ..'' ..'' ..'\n' ..'' ..'
\n' ) end end ctt={} for i,v in ipairs(NetworkList) do if #v>0 then ct.main=ct.main..''..NetworkIndex()[i]..'\n' table.insert(ctt, '

\n'..table.concat(v)..'

\n') end end ct.main=ct.main..'
\n'..table.concat(ctt)..[=[
]=] ct=template(ct) mg.write(ct:Pop(Response(200,'text/html','utf-8',ct.len)..(ct.gzip and 'Content-Encoding: gzip\r\n' or '')..'\r\n'))