mcbot/cmds/tvcal.lua
author Mikael Berthe <mikael@lilotux.net>
Thu, 30 Sep 2010 20:44:08 +0200
changeset 43 7f9ecc483f73
parent 39 237af42156a1
child 57 100a831f4f12
permissions -rw-r--r--
tvcal: fix firstep's
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
#! /usr/bin/env lua
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
-- Data extractor for http://www.pogdesign.co.uk/cat/
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
-- Mikael BERTHE, 2010-04-18
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
require "libs.shcmd"
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
local tvcal = { ["desc"] = "Display TV calendar" }
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
local tvcaldata = {}
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
local tvcaldata_timestamp
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
-- Function from PIL
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
local function pairsByKeys (t, f)
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
    local a = {}
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
    for n in pairs(t) do table.insert(a, n) end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
    table.sort(a, f)
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
    local i = 0      -- iterator variable
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
    local iter = function ()   -- iterator function
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
        i = i + 1
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
        if a[i] == nil then return nil
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
        else return a[i], t[a[i]]
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
        end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
    end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
    return iter
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
local function parse_webpage (url)
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
    local contents = shcmd("curl "..url)
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
39
237af42156a1 Add checks after shcmd() calls
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
    31
    if not contents then
237af42156a1 Add checks after shcmd() calls
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
    32
        return nil, "Could not fetch calendar, please try again later!"
237af42156a1 Add checks after shcmd() calls
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
    33
    end
237af42156a1 Add checks after shcmd() calls
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
    34
36
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
    local tabregex = '<td id="d_(%d+_%d+_%d%d%d%d)" class="t?o?day"%s*>%s*\n%s*'..
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
                     '<table>(.-)</table>'
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
    for day, tab in string.gmatch(contents, tabregex) do
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
        local epregex
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
        local d, m, y = day:match("^(%d+)_(%d+)_(%d%d%d%d)$")
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
        day = string.format("%04d-%02d-%02d", y, m, d)
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    42
43
7f9ecc483f73 tvcal: fix firstep's
Mikael Berthe <mikael@lilotux.net>
parents: 39
diff changeset
    43
        epregex = '<td><a id="[^"]+" href="[^"]+" class="eplink%s*%w*"%s*>([^<]+)</a>'
7f9ecc483f73 tvcal: fix firstep's
Mikael Berthe <mikael@lilotux.net>
parents: 39
diff changeset
    44
        epregex = epregex .. '<span class="seasep%s*%w*"%s*></span><br />'
7f9ecc483f73 tvcal: fix firstep's
Mikael Berthe <mikael@lilotux.net>
parents: 39
diff changeset
    45
        epregex = epregex .. '<span class="seasep%s*%w*"%s*>([^<]+)</span>[%s\n]*</td>'
36
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
        local shows = {}
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
        for name, ep in string.gmatch(tab, epregex) do
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
            name = name:gsub("&quot;", "\""):gsub("&amp;", "&")
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
            name = name:gsub("&lt;", "<"):gsub("&gt;", ">")
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
            name = name:gsub("&#39;", "'")
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    52
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
            local obj = {
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
                ["name"] = name,
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
                ["ep"] = ep
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
                }
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
            table.insert(shows, obj)
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
        end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
        tvcaldata[day] = shows
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
    end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
    tvcaldata_timestamp = os.date("%F")
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
    return true
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
local function tvcal_by_date (d)
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
    if not tvcaldata[d] then
37
9d7f19e4e4fe Add support for tvcal +n
Mikael Berthe <mikael@lilotux.net>
parents: 36
diff changeset
    67
        return "No episode found for this date ("..d..")"
36
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
    end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    69
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
    local r = "Shows on " .. d .. ":\n"
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
    for i,j in ipairs(tvcaldata[d]) do
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
        r = r .. j.name .. " (" ..j.ep .. ")\n"
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
    end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
    r = r:gsub("\n+$", "")
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
    return r
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
38
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
    78
local function tvcal_by_name (name, plain)
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
    79
    local action = plain and "contain" or "match"
36
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    80
    local r = ""
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
    name = name:lower()
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
    for day, obj in pairsByKeys(tvcaldata) do
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    84
        for i,j in ipairs(obj) do
38
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
    85
            if j.name:lower():find(name, 1, plain) then
36
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    86
                r = r .. day .. "\t" .. j.name .. " (" ..j.ep .. ")\n"
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    87
            end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    88
        end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
    end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    90
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    91
    if r == "" then
38
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
    92
        return "No episode found "..action.."ing this string"
36
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    93
    end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    94
    r = r:gsub("\n+$", "")
38
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
    95
    return "Episodes "..action.."ing \""..name.."\":\n" .. r
36
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    97
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    98
function tvcal.cmd (arg)
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    99
    if not tvcaldata_timestamp or tvcaldata_timestamp ~= os.date("%F") then
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   100
        tvcaldata = {} -- Empty the previous list
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   101
        local r, err = parse_webpage("http://www.pogdesign.co.uk/cat/")
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   102
        if not r then return nil, err end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   103
        -- Fetch next month as well...
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   104
        local m = tonumber(os.date("%m"))+1
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   105
        local y = os.date("%Y")
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   106
        if m > 12 then m = 1; y = y + 1; end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   107
        parse_webpage("http://www.pogdesign.co.uk/cat/"..m.."-"..y)
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   108
    end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   109
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   110
    if not arg or arg == "today" then
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   111
        arg = os.date("%F")
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   112
    elseif arg == "tomorrow" then
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   113
        arg = os.date("%F", os.date("%s")+86400)
37
9d7f19e4e4fe Add support for tvcal +n
Mikael Berthe <mikael@lilotux.net>
parents: 36
diff changeset
   114
    elseif arg:match("^%+%d+$") then
9d7f19e4e4fe Add support for tvcal +n
Mikael Berthe <mikael@lilotux.net>
parents: 36
diff changeset
   115
        local n = tonumber(arg:match("^%+(%d+)$"))
9d7f19e4e4fe Add support for tvcal +n
Mikael Berthe <mikael@lilotux.net>
parents: 36
diff changeset
   116
        if n < 60 then
9d7f19e4e4fe Add support for tvcal +n
Mikael Berthe <mikael@lilotux.net>
parents: 36
diff changeset
   117
            arg = os.date("%F", os.date("%s")+86400*n)
9d7f19e4e4fe Add support for tvcal +n
Mikael Berthe <mikael@lilotux.net>
parents: 36
diff changeset
   118
        end
36
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   119
    end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   120
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   121
    if arg:match("^%d%d%d%d%-%d%d%-%d%d$") then
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   122
        return tvcal_by_date(arg)
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   123
    end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   124
38
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
   125
    -- Is it a pattern? (string surrounded by quotes)
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
   126
    local plain = arg:match('^"(.*)"$')
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
   127
    if plain then
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
   128
        arg = plain
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
   129
        plain = false
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
   130
    else
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
   131
        plain = true
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
   132
    end
a51ddbce247b Add regex support to tvcal
Mikael Berthe <mikael@lilotux.net>
parents: 37
diff changeset
   133
    return tvcal_by_name(arg, plain)
36
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   134
end
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   135
2aedd0749666 Actually add tvcal file
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   136
mcbot_register_command("tvcal", tvcal)