def run(self):
        try:
            database, cursor = connectEpgDB()
            epg_db = EpgDb(database, cursor)
            kodisleep(getTimeSleep())

            # Getting last update date.
            update_date = epg_db.getLastUpdateDate()

            if not doStartupUpdate() or epg_db.firstTimeRuning():
                return

            current_time = dt.fromtimestamp(time())
            update_time = strToDatetime(update_date)

            delta = current_time - update_time

            if delta.days < getUpdateFrequency():
                return

            epg_xml = EpgXml(database, cursor, progress_bar=False)
            epg_xml.getXMLTV()
            epg_db.setUpdateDate()

            epg_xml.close()
            epg_db.close()
            del epg_xml
            del epg_db

        except Exception as e:
            log("%s %s" % (DEBUG_HEADER, e.message), LOGERROR)
    def onClick(self, controlId):
        if controlId == 5001:
            self.close()

        elif controlId == 5002:
            logo = self.list_items[self.getControl(50).getSelectedPosition()]
            if not logo is None:
                database, cursor = connectEpgDB()
                epgDb = EpgDb(database, cursor)

                name = str(uuid4()) + logo[logo.rfind(r"."):]
                dest = join(settings.getChannelsLogoPath(), name)
                try:
                    copy(logo, dest)
                    epgDb.updateChannel(self.id_channel, logo=name)
                except:
                    if settings.DEBUG:
                        notify(EDIT_LOGO_ERROR)
                    del database
                    del cursor
                    epgDb.close()
                    del epgDb
                    return

                self.refresh = True
                self.close()
    def refresh(self):
        loading = SplashScreen(self, self.epgView.width, self.epgView.bottom)
        loading.start()

        x = self.epgView.current_x
        y = self.epgView.current_y
        start_time = self.epgView.start_time
        stop_time = self.epgView.stop_time
        id_channel = self.epgView.start_channel_id

        self.clear()

        database, cursor = connectEpgDB()

        self.epgView = EPGGridView(self)
        self.epgDb = EPGXML.EpgDb(database, cursor)
        self.epgView.setGlobalDataGrid(self.epgDb.getEpgGrid())

        self.epgView.current_x = x
        self.epgView.current_y = y
        self.epgView.start_time = start_time
        self.epgView.stop_time = stop_time
        self.epgView.start_channel_id = id_channel

        self.epgView.displayChannels()
        self.epgView.setFocus(x, y)
        loading.stop()
    def onInit(self):
        xbmcgui.WindowXMLDialog.onInit(self)
        self.titleLabel = self.getControl(EditControls.CHANNEL_LABEL)
        self.titleLabel.setLabel(ACTIONS_EDIT_CHANNEL + "[CR]" +
                                 self.display_name)

        self.programLabel = self.getControl(EditControls.PROGRAM_LABEL)
        self.programLabel.setLabel(ACTIONS_PROGRAM_LABEL + "[CR]" +
                                   self.program_title)

        self.getControl(
            EditControls.CHANNEL_HIDE).setLabel(ACTIONS_HIDE_CHANNEL)
        self.getControl(
            EditControls.CHANNEL_RENAME).setLabel(ACTIONS_RENAME_CHANNEL)
        self.getControl(EditControls.QUIT).setLabel(ACTIONS_QUIT_WINDOW)
        self.getControl(
            EditControls.CHANNEL_LOGO_UPDATE).setLabel(ACTIONS_LOGO_UPDATE)
        self.getControl(
            EditControls.PROGRAM_START).setLabel(ACTIONS_PROGRAM_START)
        self.getControl(
            EditControls.PROGRAM_REMINDER).setLabel(ACTIONS_PROGRAM_REMIND)
        self.setFocus(self.getControl(EditControls.PROGRAM_START))

        if not settings.useProgramsReminder():
            self.removeControl(self.getControl(EditControls.PROGRAM_REMINDER))
            self.getControl(EditControls.PROGRAM_START).controlDown(
                self.getControl(EditControls.CHANNEL_HIDE))
        else:
            database, cursor = connectEpgDB()
            epgDb = EpgDb(database, cursor)

            program_start = epgDb.getProgramStartDate(self.program_id)
            if program_start < datetime.now() + settings.getRemindersTime():
                self.getControl(
                    EditControls.PROGRAM_REMINDER).setVisible(False)

            remind = epgDb.hasReminder(self.program_id)
            if remind:
                self.getControl(EditControls.PROGRAM_REMINDER).setLabel(
                    ACTIONS_PROGRAM_FORGET_REMIND)

            epgDb.close()
            del database
            del cursor
            del epgDb

        self.win_logo = LogoEditWindowXML('logo-edit-window.xml',
                                          settings.getAddonPath())
        self.win_sf = SuperFavouritesXMLDialog('superfavourites-window.xml',
                                               settings.getAddonPath())
    def onInit(self):

        if self.epgDb is None:
            database, cursor = connectEpgDB()

            self.epgView = EPGGridView(self)
            loading = SplashScreen(self, self.epgView.width,
                                   self.epgView.bottom)
            loading.start()
            self.epgDb = EPGXML.EpgDb(database, cursor)
            self.epgView.setGlobalDataGrid(self.epgDb.getEpgGrid())
            self.epgView.displayChannels()
            self.epgView.setFocus(0, 0)

            self.editWindow = EditWindow('epg-menu-edit.xml',
                                         settings.getAddonPath())
            loading.stop()
        else:
            self.refresh()
    def onClick(self, controlId):
        self.titleLabel.setLabel(ACTIONS_EDIT_CHANNEL + "[CR]" +
                                 self.display_name)
        refreshSkin = True

        # Close
        if controlId == EditControls.QUIT:
            self.close()

        # Channel actions
        elif controlId in [
                EditControls.CHANNEL_HIDE, EditControls.CHANNEL_RENAME,
                EditControls.CHANNEL_LOGO_UPDATE
        ]:
            database, cursor = connectEpgDB()
            epgDb = EpgDb(database, cursor)

            # Hide channel from EPG
            if controlId == EditControls.CHANNEL_HIDE:
                if epgDb.isChannelHidden(self.id_channel):
                    epgDb.updateChannel(self.id_channel, visible=False)
                    self.getControl(EditControls.CHANNEL_HIDE).setLabel(
                        ACTIONS_UNHIDE_CHANNEL)
                else:
                    epgDb.updateChannel(self.id_channel, visible=True)
                    self.getControl(EditControls.CHANNEL_HIDE).setLabel(
                        ACTIONS_HIDE_CHANNEL)

            # Rename the current channel.
            elif controlId == EditControls.CHANNEL_RENAME:
                new_name = xbmcgui.Dialog().input("ACTIONS_RENAME_TITLE",
                                                  self.display_name)
                if not new_name is None or new_name == "":
                    epgDb.updateChannel(self.id_channel, display_name=new_name)
                    # renaming sf directory if 'display names' are used.
                    if not settings.getSFFoldersPattern(
                    ) == settings.AddonConst.SF_XMLTV_ID_PATTERN:
                        joined = join(settings.getSFFolder(translate=True),
                                      self.display_name)
                        if exists(joined):
                            rename(
                                joined,
                                join(settings.getSFFolder(translate=True),
                                     new_name))
                        else:
                            mkdir(
                                join(settings.getSFFolder(translate=True),
                                     new_name))

                        self.display_name = new_name
                        self.titleLabel.setLabel(ACTIONS_EDIT_CHANNEL +
                                                 "[CR]" + self.display_name)

            # Update channel logo
            elif controlId == EditControls.CHANNEL_LOGO_UPDATE:
                source = xbmcgui.Dialog().select(
                    EDIT_LOGO_HEADER,
                    [EDIT_LOGO_FROM_LOCAL, EDIT_LOGO_THE_LOGODB])

                # Start local source dialog browser
                if source == 0:
                    n_logo = xbmcgui.Dialog().browse(2, EDIT_LOGO_HEADER,
                                                     'files')
                    if not n_logo is None:
                        name = str(uuid4()) + n_logo[n_logo.rfind(r"."):]
                        dest = join(settings.getChannelsLogoPath(), name)
                        try:
                            copy(n_logo, dest)
                            epgDb.updateChannel(self.id_channel, logo=name)
                        except:
                            if settings.DEBUG:
                                notify(EDIT_LOGO_ERROR)
                            del database
                            del cursor
                            epgDb.close()
                            del epgDb
                            return

                # Start TheLogoDb search
                elif source == 1:
                    thelogodb = TheLogoDbChannel(self.display_name)
                    if thelogodb.search():
                        progress = xbmcgui.DialogProgress()
                        progress.create(DIALOG_TITLE, SFX_ICONS_DOWNLOAD)

                        # Display found logos.
                        logos = thelogodb.getLogos()
                        logos_local = []

                        import ssl
                        from urllib2 import urlopen, HTTPError
                        from os.path import isdir
                        from shutil import rmtree

                        ssl._create_default_https_context = ssl._create_unverified_context
                        dest_dir = join(
                            xbmc.translatePath("special://home/temp"),
                            "logos_tmp")

                        if not isdir(dest_dir):
                            mkdir(dest_dir)
                        i = 1
                        for logo in logos:
                            progress.update(int((i / float(len(logos))) * 100),
                                            "", EDIT_LOGOS_SEARCH)
                            try:
                                if not logo is None:
                                    dest_file = join(
                                        dest_dir, logo[logo.rfind(r"/") + 1:])
                                    download = urlopen(logo, timeout=30)

                                    tsf = open(dest_file, "w")
                                    tsf.write(download.read())
                                    tsf.close()
                                    del tsf
                                    logos_local.append(dest_file)
                                    i += 1
                            except HTTPError as e:
                                if e.code in [
                                        304, 301, 400, 401, 403, 404, 500, 502,
                                        503, 504
                                ]:
                                    notify(EDIT_LOGO_ERROR)
                                progress.close()

                        progress.close()

                        self.win_logo.addToList(logos_local)
                        self.win_logo.id_channel = self.id_channel
                        self.win_logo.doModal()
                        refreshSkin = self.win_logo.refresh

                        rmtree(dest_dir)

                    else:
                        xbmcgui.Dialog().ok(EDIT_LOGO_HEADER,
                                            EDIT_NO_LOGO_FOUND)

            del database
            del cursor
            epgDb.close()
            del epgDb
            if not self.parent is None and refreshSkin:
                self.parent.refresh()

        # Program actions.
        elif controlId in [
                EditControls.PROGRAM_REMINDER, EditControls.PROGRAM_START
        ]:

            if controlId == EditControls.PROGRAM_REMINDER:
                database, cursor = connectEpgDB()
                epgDb = EpgDb(database, cursor)
                if epgDb.hasReminder(self.program_id):
                    self.getControl(EditControls.PROGRAM_REMINDER).setLabel(
                        ACTIONS_PROGRAM_REMIND)
                    epgDb.removeReminder(self.program_id)
                else:
                    self.getControl(EditControls.PROGRAM_REMINDER).setLabel(
                        ACTIONS_PROGRAM_FORGET_REMIND)
                    epgDb.addReminder(self.program_id)

                if not self.parent is None and refreshSkin:
                    self.parent.refresh()

                del database
                del cursor
                epgDb.close()
                del epgDb

            elif controlId == EditControls.PROGRAM_START:
                database, cursor = connectEpgDB()
                request = "SELECT logo FROM channels WHERE id=%i" % self.id_channel
                cursor.execute(request)
                logo = cursor.fetchone()[0]

                del cursor
                del database

                logo_channel = ""
                if not logo is None:
                    logo_channel = join(getChannelsLogoPath(), logo)

                self.win_sf.setChannel(self.id_channel, logo_channel)
                self.win_sf.doModal()
                del self.win_sf
                self.close()
    def displayChannels(self):
        self.reset(clear_grid=True)
        EPG_page = self.__getGridPortion()

        gridControls = []
        idx = 0
        for channel in EPG_page:
            y = self.top + self.cellHeight * idx + int((self.cellHeight / 14))

            if not settings.useXMLTVSourceLogos():
                pchannel = xbmcgui.ControlLabel(
                    16, y + 2, 180, self.cellHeight - 8,
                    "[B]" + channel["display_name"] + "[/B]")
            else:
                logo = channel["logo"]

                if logo != "" and logo is not None:
                    logo = join(settings.getChannelsLogoPath(), logo)
                    if exists(logo):
                        pchannel = xbmcgui.ControlImage(16,
                                                        y + 2,
                                                        170,
                                                        self.cellHeight - 8,
                                                        logo,
                                                        aspectRatio=2)
                    else:
                        pchannel = xbmcgui.ControlLabel(
                            16, y + 2, 180, self.cellHeight - 8,
                            "[B]" + channel["display_name"] + "[/B]")
                else:
                    pchannel = xbmcgui.ControlLabel(
                        16, y + 2, 180, self.cellHeight - 8,
                        "[B]" + channel["display_name"] + "[/B]")

            gridControls.append(pchannel)
            self.labelControls.append(pchannel)

            # Program details.
            controls_x_grid = []
            programs = channel["programs"]

            if len(programs) == 0:

                pbutton = xbmcgui.ControlButton(
                    self.left, self.top + self.cellHeight * idx,
                    self.right - self.left - 2, self.cellHeight - 2,
                    PROGRAM_NO_INFOS, settings.getFocusTexture(),
                    settings.getNoFocusTexture())

                gridControls.append(pbutton)
                controls_x_grid.append({
                    "db_id": None,
                    "desc": PROGRAM_NO_INFOS,
                    "title": PROGRAM_NO_INFOS,
                    "start": None,
                    "stop": None,
                    "control": pbutton,
                    "cdisplay_name": channel["display_name"],
                    "cdb_id": channel["db_id"],
                    "logo": channel["logo"]
                })
            for program in programs:

                program_start = strToDatetime(program["start"])
                program_end = strToDatetime(program["end"])

                deltaStart = program_start - self.start_time
                deltaStop = program_end - self.start_time

                y = self.top + self.cellHeight * idx
                x = self.secondsToX(deltaStart.seconds)

                if deltaStart.days < 0:
                    x = self.left

                width = self.secondsToX(deltaStop.seconds) - x

                if x + width > self.right:
                    width = self.right - x

                width -= 2

                if width < 28:
                    program["title"] = ""

                if not settings.useProgramsReminder():
                    focusTexture = settings.getFocusTexture()
                    noFocusTexture = settings.getNoFocusTexture()
                else:
                    # Checking if program is to be reminded.
                    database, cursor = connectEpgDB()
                    epgDb = EpgDb(database, cursor)
                    remind = epgDb.hasReminder(int(program["db_id"]))
                    epgDb.close()
                    del database
                    del cursor
                    del epgDb

                    if remind:
                        focusTexture = settings.getReminderFocusTexture()
                        noFocusTexture = settings.getReminderNoFocusTexture()
                    else:
                        focusTexture = settings.getFocusTexture()
                        noFocusTexture = settings.getNoFocusTexture()

                pbutton = xbmcgui.ControlButton(x,
                                                y,
                                                width,
                                                self.cellHeight - 2,
                                                program["title"],
                                                noFocusTexture=noFocusTexture,
                                                focusTexture=focusTexture)

                gridControls.append(pbutton)
                controls_x_grid.append({
                    "db_id": program["db_id"],
                    "desc": program["desc"],
                    "title": program["title"],
                    "start": program_start,
                    "stop": program_end,
                    "control": pbutton,
                    "cdisplay_name": channel["display_name"],
                    "cdb_id": channel["db_id"],
                    "logo": channel["logo"]
                })
            self.append(controls_x_grid)
            idx += 1

        self.window.addControls(gridControls)
Beispiel #8
0
 def __init__(self):
     self.database, self.cursor = connectEpgDB()
     self.epg_db = EpgDb(self.database, self.cursor)
'''''' '''''' '''''' '''''' ''''''
'''    Plugin entry point. '''
'''''' '''''' '''''' '''''' ''''''

if __name__ == '__main__':
    # Checking for bad configuration.
    ok, error_msg = settings.checkMandatorySettings()
    if not ok:
        xbmcgui.Dialog().ok(strings.DIALOG_TITLE,
                            strings.BAD_ADDON_CONFIGURATION,
                            error_msg.encode("utf-8", "ignore"),
                            strings.CONFIGURATION_TAKE_TIME_MSG)
        settings.addon.openSettings()

    else:
        database, cursor = connectEpgDB()
        epgDb = EPGXML.EpgDb(database, cursor)
        # Populate and create tables in case of first start
        if epgDb.firstTimeRuning():
            xbmcgui.Dialog().ok(strings.DIALOG_TITLE,
                                strings.SFX_FIRST_START_DETECTED)
            epgXml = EPGXML.EpgXml(database, cursor, progress_bar=True)

            if epgXml.getXMLTV():
                epgDb.setFirstTimeRuning(0)
                epgDb.setUpdateDate()
                xbmc.sleep(1000)
                # Super favourites folder init.
                sf_folder = superfavourites.SuperFavouritesIptvFolder()
                sf_folder.createSubFolders()
                # All is done, restart required