コード例 #1
0
def downloaded_files():
    try:
        _logger = logger('downloaded_files')
        import os
        import datetime
        current_directory = os.getcwd()
        _dir = os.path.join(current_directory, r'Downloads')
        if not os.path.exists(_dir):
            os.makedirs(_dir)
        ext = [".epub", ".py", ".pdf", ".docx", ".zip"]
        files = []
        for fn in os.listdir(_dir):
            for ex in ext:
                if fn.endswith(ex):
                    files.append(fn)
        file_details = []
        for f in files:
            info = []
            path = os.path.join(_dir, f)
            info.append(f)
            info.append("size:" + str(os.stat(path).st_size) + " bytes")
            info.append(
                "modified:" +
                str(datetime.datetime.fromtimestamp(os.stat(
                    path).st_mtime))[:-10] + "")
            file_details.append(info)

        if file_details == []:
            file_details = [["No Book in Downloads"]]
        return file_details

    except:
        _logger.error('application exited with exception: %r' %
                      traceback.format_exc())
        raise
    finally:
        pass
コード例 #2
0
ファイル: sp_main.py プロジェクト: vis2alll/pustkalaya
def main(stdscr, args):

    top, left = stdscr.getbegyx()  # top left coordinate of the screen
    rows, cols = stdscr.getmaxyx()  # size of screen

    console.init(stdscr)

    from console.logger import logger

    _logger = logger('main')

    try:
        from os import path
        import traceback
        from console.application import Application
        from console.ui.editor import Editor
        from console.ui.window import Window, EditorWindow, PromptWindow
        from console.enums import DEFAULT_WINDOW
        from console.config import PROMPT_HEIGHT
        from console.core.prompt_buffer import PromptBuffer
        #        from binding import load_custom_binding

        _logger.debug('terminal size %dx%d' % (rows, cols))

        #--------------------------------------------------

        book_buffer = ReaderBuffer()
        book_buffer.is_readonly = False

        booklistwindow = EditorWindow(name=BOOKLIST_WINDOW,
                                      top=top,
                                      left=left,
                                      rows=rows - PROMPT_HEIGHT,
                                      columns=cols,
                                      buf=book_buffer,
                                      wrap=True)

        #--------------------------------------------------

        login_buffer = LoginBuffer()
        login_buffer.is_readonly = False

        loginwindow = EditorWindow(name=LOGIN_WINDOW,
                                   top=top,
                                   left=left,
                                   rows=rows - PROMPT_HEIGHT,
                                   columns=cols,
                                   buf=book_buffer,
                                   wrap=True)

        #---------------------------------------------------

        edit_buffer = PromptBuffer()
        edit_buffer.is_readonly = False

        editwindow = EditorWindow(name=DEFAULT_WINDOW,
                                  top=top,
                                  left=left,
                                  rows=rows - PROMPT_HEIGHT,
                                  columns=cols,
                                  buf=edit_buffer,
                                  wrap=False)

        editor = Editor(
            rows - PROMPT_HEIGHT,  # editable area height
            cols,  # editable area width
            rows - PROMPT_HEIGHT,  # prompt row
            PROMPT_HEIGHT,  # height of prompt window(1)
            cols,
            windows=[editwindow, booklistwindow, loginwindow],  #
            initial_focused_window=BOOKLIST_WINDOW)  #BOOKLIST_WINDOW )

        registry = MergedRegistry(
            [console.default_bindings(),
             load_custom_binding()])

        app = Application(editor, registry=registry)
        app.run()

    except:
        _logger.error('application exited with exception: %r' %
                      traceback.format_exc())
        raise
    finally:
        pass
コード例 #3
0
 def delete(self):
     _logger = logger('reader_buffer')
     _logger.error(': deleting file...')
コード例 #4
0
class ReaderBuffer(BufferBase):
    _logger = logger('reader-buffer')

    def __init__(self, name='', text=''):
        BufferBase.__init__(self, name)

        self._text = text
        self._files = downloaded_files()
        self.lvl = 0
        self.index = 0

    @property
    def text(self):
        return self._files[self.lvl][self.index]

    @text.setter
    def text(self, value):
        self._text = value
        self.emit(EventType.TEXT_CHANGED)

    def cursor_right(self):
        self.index += 1
        if self.index > len(self._files[self.lvl]) - 1:
            self.index = 0

        self.emit(EventType.TEXT_CHANGED)

    def cursor_left(self):
        self.index -= 1
        if self.index < 0:
            self.index = len(self._files[self.lvl]) - 1

        self.emit(EventType.TEXT_CHANGED)

    def cursor_up(self):
        self.index = 0
        self.lvl -= 1
        if self.lvl < 0:
            self.lvl = len(self._files) - 1

        self.emit(EventType.TEXT_CHANGED)

    def cursor_down(self):
        self.index = 0
        self.lvl += 1
        if self.lvl > len(self._files) - 1:
            self.lvl = 0

        self.emit(EventType.TEXT_CHANGED)

    def top(self):
        pass

    def bottom(self):
        pass

    def enter(self):
        _logger = logger('reader_buffer')
        _logger.error(': opening selected file...')

    def delete(self):
        _logger = logger('reader_buffer')
        _logger.error(': deleting file...')
コード例 #5
0
 def enter(self):
     _logger = logger('reader_buffer')
     _logger.error(': opening selected file...')
コード例 #6
0
class ReaderBuffer(BufferBase):
    _logger = logger('reader-buffer')
    try:

        def __init__(self, name='', text=''):
            BufferBase.__init__(self, name)

            self._text = text

            #        _files=downloaded_files()
            #        if _files==[]:
            #            self._files=[["No Books in Download"]]
            #        else:
            #            self._files = _files

            self._files = downloaded_files()
            self.prev_files = []
            self.lvl = 0
            self.prev_lvl = 0
            self.index = 0
            self.prev_index = 0
            self.prev_total_books = 0
#            self.end_msg="end of list"

        @property
        def text(self):
            return self._files[self.lvl][self.index]

        @text.setter
        def text(self, value):
            self._text = value
            self.emit(EventType.TEXT_CHANGED)

        def cursor_right(self):
            self.index += 1
            if self.index > len(self._files[self.lvl]) - 1:
                #            self.index=len(self._files[self.lvl])-1
                self.index = 0  #circular movement

            self.emit(EventType.TEXT_CHANGED)

        def cursor_left(self):
            self.index -= 1
            if self.index < 0:
                #            self.index=0
                self.index = len(self._files[self.lvl]) - 1  #circular movement

            self.emit(EventType.TEXT_CHANGED)

        def cursor_up(self):
            self.index = 0
            self.lvl -= 1
            if self.lvl < 0:
                self.lvl = 0
    #            self.lvl=len(self._files)-1    #circular movement

            self.emit(EventType.TEXT_CHANGED)

        def cursor_down(self):
            self.index = 0
            self.lvl += 1
            if self.lvl > len(self._files) - 1:
                self.lvl = len(self._files) - 1

        #            self.lvl=0     #circular movement

            self.emit(EventType.TEXT_CHANGED)

        @property
        def is_readonly(self):
            return self._readonly_document

        @is_readonly.setter
        def is_readonly(self, value):
            self._readonly_document = value

        def top(self):
            pass

        def bottom(self):
            self.index = 0
            self.lvl = -1
            try:
                self.emit(EventType.TEXT_CHANGED)
            except:
                pass

        def reset(self):
            self.index = 0
            self.lvl = 0
            try:
                self.emit(EventType.TEXT_CHANGED)
            except:
                pass

        def enter(self, file_path):
            _logger = logger('reader_buffer')
            _logger.error(file_path)

        def delete(self):
            _logger = logger('reader_buffer')
            _logger.error('  deleting file...')

        def go_to_prev_state(self):
            self.index = self.prev_index
            self.lvl = self.prev_lvl
            self._files = self.prev_files
            self.emit(EventType.TEXT_CHANGED)

    except:
        _logger.error('application exited with exception: %r' %
                      traceback.format_exc())
        raise
    finally:
        pass
コード例 #7
0
class ReaderBuffer(BufferBase):
    _logger = logger('reader-buffer')

    def __init__(self, name='', text=''):
        BufferBase.__init__(self, name)

        self._text = text

        #        _files=downloaded_files()
        #        if _files==[]:
        #            self._files=[["No Books in Download"]]
        #        else:
        #            self._files = _files

        self._files = downloaded_files()
        self.prev_files = []
        self.lvl = 0
        self.prev_lvl = 0
        self.index = 0
        self.prev_index = 0

    @property
    def text(self):
        return self._files[self.lvl][self.index]

    @text.setter
    def text(self, value):
        self._text = value
        self.emit(EventType.TEXT_CHANGED)

    def cursor_right(self):
        self.index += 1
        if self.index > len(self._files[self.lvl]) - 1:
            self.index = len(self._files[self.lvl]) - 1
#            self.index=0

        self.emit(EventType.TEXT_CHANGED)

    def cursor_left(self):
        self.index -= 1
        if self.index < 0:
            self.index = 0
#            self.index=len(self._files[self.lvl])-1

        self.emit(EventType.TEXT_CHANGED)

    def cursor_up(self):
        self.index = 0
        self.lvl -= 1
        if self.lvl < 0:
            self.lvl = 0
#            self.lvl=len(self._files)-1

        self.emit(EventType.TEXT_CHANGED)

    def cursor_down(self):
        self.index = 0
        self.lvl += 1

        if self.lvl > len(self._files) - 1:
            self.lvl = len(self._files) - 1

    #            self.lvl=0

#        if pcs.menu_lvl=="11" and sp.latest_page>1:
#            self.lvl = len(self._files)
#            sp.get_latest_books()

        self.emit(EventType.TEXT_CHANGED)

    @property
    def is_readonly(self):
        return self._readonly_document

    @is_readonly.setter
    def is_readonly(self, value):
        self._readonly_document = value

    def top(self):
        pass

    def bottom(self):
        pass

    def reset(self):
        self.index = 0
        self.lvl = 0
        try:
            self.emit(EventType.TEXT_CHANGED)
        except:
            pass

    def enter(self):
        _logger = logger('reader_buffer')
        _logger.error('  opening selected file...')

    def delete(self):
        _logger = logger('reader_buffer')
        _logger.error('  deleting file...')

    def go_to_prev_state(self):
        self.index = self.prev_index
        self.lvl = self.prev_lvl
        self._files = self.prev_files
        self.emit(EventType.TEXT_CHANGED)
コード例 #8
0
def load_custom_binding():
    _logger = logger('load_custom_binding')
    try:
        registry = Registry(EditorWindow)
        handle = registry.add_binding

        window_name = "MENU_LIST"
        from reader import process_choice_selection
        pcs = process_choice_selection(window_name)

        @handle(Keys.Home)
        def _(event):
            try:
                event.app.editor.focus(BOOKLIST_WINDOW)
                event.current_window.buffer._files = downloaded_files()
                event.current_window.buffer.reset()
                event.current_window.buffer.emit(EventType.TEXT_CHANGED)
            except Exception as e:
                event.app.editor.error('unknown error %r' % e)

        @handle(Keys.ControlH)
        def _(event):
            try:
                from login import _login
                pcs.sp = None
                pcs.bs = None
                pcs.login = _login()
            except:
                pass
            lst = [
                MenuItem('sugamya pustkalaya', 's',
                         lambda app: pcs.choice_selection(event, "1")),
                MenuItem('bookshare', 'b',
                         lambda app: pcs.choice_selection(event, "2")),
                #                    MenuItem('gutenberg','3', lambda app: pcs.choice_selection(event,"3")),
                #                    MenuItem('local books','4', lambda app: pcs.choice_selection(event,"4")),
                MenuItem('quits', 'q',
                         lambda app: pcs.choice_selection(event, "q")),
            ]
            pcs.get_user_input(event.app, lst)

    #    @handle(Keys.Delete)
    #    def _(event):
    #        try:
    #            event.current_window.buffer.delete()
    #        except Exception as e:
    #            event.app.editor.error('unknown error %r' % e)

    #    @handle(Keys.Left)
    #    @handle(Keys.BackTab)
    #    def _(event):
    #        try:
    #            if event.current_window.buffer._files==[]:
    #                event.app.editor.error('No book found')
    #            else:
    #                event.current_window.buffer.cursor_left()
    #        except Exception as e:
    #            event.app.editor.error('unable to navigate %r' % e)

    #    @handle(Keys.Right)

        @handle(' ')
        def _(event):
            try:
                event.app.editor.focus(BOOKLIST_WINDOW)
                if event.current_window.buffer._files == []:
                    event.app.editor.error('No book found Space')
                else:
                    event.current_window.buffer.cursor_right()

            except Exception as e:
                event.app.editor.error('unable to navigate %r' % e)

        @handle(Keys.Up)
        def _(event):
            try:
                handle = None
                if pcs.menu == "sp":
                    handle = pcs.sp
                elif pcs.menu == "bs":
                    handle = pcs.bs

                event.app.editor.focus(BOOKLIST_WINDOW)

                buf = event.current_window.buffer
                lvl = buf.lvl

                if not handle == None and lvl == 0:
                    event.app.editor.error('start of list')

                elif event.current_window.buffer._files == []:
                    event.app.editor.error('No book found UP')
                else:
                    event.current_window.buffer.cursor_up()
            except Exception as e:
                event.app.editor.error('unable to navigate %r' % e)

        @handle(Keys.Down)
        def _(event):
            try:
                handle = None
                if pcs.menu == "sp":
                    handle = pcs.sp
                elif pcs.menu == "bs":
                    handle = pcs.bs

                event.app.editor.focus(BOOKLIST_WINDOW)
                buf = event.current_window.buffer
                if buf._files == []:
                    event.app.editor.error('No book found DOwn')

                lvl = buf.lvl
                if not handle == None and lvl == len(
                        handle.book_repo) - 1 and handle.total_books == str(
                            len(handle.book_repo)):
                    event.app.editor.error('end of list')

                elif not handle == None and lvl == len(handle.book_repo) - 1:
                    if pcs.menu_lvl in ["1-4"]:
                        buf.cursor_down()
                    else:
                        event.app.editor.focus(BOOKLIST_WINDOW)
                        handle.pre_fetch_books()
                        buf._files = handle.book_repo
                        buf.lvl = lvl + 1
                        buf.index = 0
                        buf.emit(EventType.TEXT_CHANGED)

                else:
                    buf.cursor_down()
            except Exception as e:
                event.app.editor.error('unable to navigate  %r ' %
                                       str(e)[0:50])

        def _search_book_id(*args):
            event = args[0]
            book_id = str(args[-1])
            if book_id == "" or ' ' in book_id:
                get_book_id_input(event)
            try:
                pcs.handle.get_book_id(book_id)
                pcs.menu_lvl = "1-1-id"
            except IndexError:
                event.app.editor.message('Book not Found id')
            except Exception as e:
                event.app.editor.error(' %r ' % str(e)[0:60])

        def get_book_id_input(event):

            event.app.editor.input('search with id:',
                                   "PROMPT_WINDOW",
                                   on_ok_handler=_search_book_id)

    #    @handle(Keys.ControlF)
    #    def _(event):
    #        if pcs.menu=="sp":
    #            pcs.handle=pcs.sp
    #            choice="1"
    #        elif pcs.menu=="bs":
    #            pcs.handle=pcs.bs
    #            choice="2"
    #        if  not handle==None and pcs.menu_lvl in ["1-1"]:
    #            get_book_id_input(event)

        @handle(Keys.ControlR)
        def _(event):
            if not pcs.sp == None and pcs.menu_lvl in [
                    "1-1", "1-2", "1-3-b", "1-4-b"
            ]:
                try:
                    event.app.editor.focus(BOOKLIST_WINDOW)
                    lvl = pcs._event.current_window.buffer.lvl
                    book_id = pcs.sp.book_repo[lvl][-1].split("(")[0].strip(
                    ).split(":")[-1].strip()  #pcs.sp.book_repo[lvl][-1][3:]
                    #                    event.app.editor.error(' %r ' % book_id)
                    pcs.sp.request_book_download(book_id)
                except Exception as e:
                    event.app.editor.error(' %r ' % e)

        @handle(Keys.PageUp)
        def _(event):
            handle = None
            if pcs.menu == "sp":
                handle = pcs.sp
            elif pcs.menu == "bs":
                handle = pcs.bs
            if not handle == None and pcs.menu_lvl in [
                    "1-1",
                    "1-2",
                    "1-3-b",
                    "1-4",
                    "1-4-b",
                    "1-5",
            ]:
                event.app.editor.focus(BOOKLIST_WINDOW)
                pcs._event.current_window.buffer.reset()

        @handle(Keys.PageDown)
        def _(event):
            handle = None
            if pcs.menu == "sp":
                handle = pcs.sp
            elif pcs.menu == "bs":
                handle = pcs.bs

            if not handle == None and pcs.menu_lvl in [
                    "1-1", "1-2", "1-3-b", "1-4", "1-4-b", "1-5"
            ]:
                event.app.editor.focus(BOOKLIST_WINDOW)
                pcs._event.current_window.buffer.index = 0
                pcs._event.current_window.buffer.lvl = len(
                    handle.book_repo) - 1
                pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)

    #            pcs._event.current_window.buffer.bottom()

        @handle(Keys.Backspace)
        def _(event):
            handle = None

            if pcs.menu == "sp":
                handle = pcs.sp
                choice = "1"
            elif pcs.menu == "bs":
                handle = pcs.bs
                choice = "2"
            if not handle == None and pcs.menu_lvl in [
                    "1", "2", "1-1", "1-2", "1-3", "1-3-b", "1-3-e", "1-4",
                    "1-4-b", "1-5", "1-m", "1-e"
            ]:
                if pcs.menu_lvl in ["1-m", "1-4-b"]:
                    event.app.editor.focus(BOOKLIST_WINDOW)
                    pcs._event.current_window.buffer.go_to_prev_state()
                    pcs.menu_lvl = pcs.prev_menu_lvl
                    handle.book_repo = pcs._event.current_window.buffer._files
                    handle.total_books = pcs._event.current_window.buffer.prev_total_books

                if pcs.menu_lvl in ["1-3-e", "1-3-b"]:
                    pcs.menu_lvl == "1-3"
                    pcs._event.current_window.buffer.reset()
                    pcs.get_user_input(event.app, pcs.search_menu_lst)

                else:
                    try:
                        event.app.editor.focus(BOOKLIST_WINDOW)
                        pcs._event.current_window.buffer._files = downloaded_files(
                        )
                        pcs._event.current_window.buffer.reset()
                        pcs.choice_selection(event, choice)
                    except Exception as e:
                        event.app.editor.error(' %r ' % e)

        @handle(Keys.ControlD)
        def _(event):
            if pcs.menu == "sp" and pcs.menu_lvl in ["1-5"]:
                try:
                    event.app.editor.focus(BOOKLIST_WINDOW)
                    lvl = pcs._event.current_window.buffer.lvl
                    book_id = pcs.sp.book_repo[lvl][-1].split("(")[0].strip(
                    ).split(":")[-1].strip()  #pcs.sp.book_repo[lvl][-1][3:]
                    event.app.editor.message('downloading...')
                    import threading
                    t = threading.Thread(target=pcs.sp.download_book,
                                         args=(book_id, ))
                    t.start()
                    pcs.sp.download_threads.append(t)
                except Exception as e:
                    event.app.editor.error(' %r ' % str(e)[0:60])

            if pcs.menu == "bs" and pcs.menu_lvl in [
                    "1-1", "1-2", "1-3-b", "1-4-b", "1-m"
            ]:
                try:
                    event.app.editor.focus(BOOKLIST_WINDOW)
                    lvl = pcs._event.current_window.buffer.lvl
                    #                    repo=pcs._event.current_window.buffer._files[-1]
                    #                    book_id=pcs.remove_book_index([repo])[-1][-1]
                    book_id = pcs.bs.book_repo[lvl][-1].split("(")[0].strip(
                    ).split(":")[-1].strip()  #pcs.sp.book_repo[lvl][-1][3:]
                    #                event.app.editor.message('downloading...')
                    pcs.bs.book_download(book_id)
    #                import threading
    #                t_bs=threading.Thread(target=pcs.bs.book_download, args=(book_id,))
    #                t_bs.start()
    #                pcs.bs.download_threads.append(t)
                except Exception as e:
                    event.app.editor.error(' %r ' % str(e)[0:60])

        @handle(Keys.Enter)
        def _(event):
            handle = None
            if pcs.menu == "sp":
                handle = pcs.sp
                choice = "1"
            elif pcs.menu == "bs":
                handle = pcs.bs
                choice = "2"

            if not handle == None and pcs.menu_lvl in ["1-4"]:
                handle.c_page_index = 1
                try:
                    event.app.editor.focus(BOOKLIST_WINDOW)
                    #                    handle.book_repo_temp=handle.book_repo
                    lvl = pcs._event.current_window.buffer.lvl
                    handle.category_name = handle.book_repo[lvl][-1].split(
                        "(")[0].strip()
                    handle.book_repo = []
                    handle.c_book_repo = []
                    #                    pcs._event.current_window.buffer.reset()
                    handle.category_book_search(handle.category_name)
                except Exception as e:
                    event.app.editor.error(' %r ' % e)

            if pcs.menu_lvl in ["1-3-e"]:
                pcs.menu_lvl == "1-3"
                pcs.get_user_input(event.app, pcs.search_menu_lst)

            if not handle == None and pcs.menu_lvl in ["1-e"]:
                #            from local_books import downloaded_files

                try:
                    event.app.editor.focus(BOOKLIST_WINDOW)
                    pcs._event.current_window.buffer._files = downloaded_files(
                    )
                    pcs._event.current_window.buffer.reset()
                    pcs.choice_selection(event, choice)
                except Exception as e:
                    event.app.editor.error(' %r ' % e)

            if not handle == None and pcs.menu_lvl in ["1-m"]:
                #            from local_books import downloaded_files
                try:
                    event.app.editor.focus(BOOKLIST_WINDOW)
                    pcs._event.current_window.buffer.go_to_prev_state()
                    pcs.menu_lvl = pcs.prev_menu_lvl
    ##                pcs._event.current_window.buffer._files= downloaded_files()
    ##                pcs._event.current_window.buffer.reset()
    #                pcs.choice_selection(event, choice)
                except Exception as e:
                    event.app.editor.error(' %r ' % str(e)[0:60])
            if handle == None:
                try:
                    import os
                    current_directory = os.getcwd()
                    _dir = os.path.join(current_directory, r'Downloads')
                    event.app.editor.focus(BOOKLIST_WINDOW)
                    lvl = event.current_window.buffer.lvl
                    f = event.current_window.buffer._files[lvl][0]
                    path = os.path.join(_dir, f)
                    event.current_window.buffer.enter(path)
                except Exception as e:
                    event.app.editor.error(' %r ' % str(e)[0:60])

        return registry

    except:
        _logger.error('application exited with exception: %r' %
                      traceback.format_exc())
        raise
    finally:
        pass
コード例 #9
0
 def enter(self, file_path):
     _logger = logger('reader_buffer')
     _logger.error(file_path)
コード例 #10
0
ファイル: login.py プロジェクト: vis2alll/pustkalaya
class _login():
    _logger = logger('_login')
    try:

        def __init__(self):
            self.userid = None
            self.password = None
            self.login_lvl = None
            self.event = None
            self.pcs = None
            self.login_status = 0
            self.login_tag = ""

        def _on_password_ok(self, *args):

            self.password = str(args[-1])
            #            self.event.app.editor.error(str(self.pcs.sp.check_credentials(self.userid,self.password)))
            if self.login_tag == "sp":
                self.password = "******"
                handle = self.pcs.sp
                choice = "1"
                response = handle.check_credentials(self.userid, self.password)
                if response == 1:
                    self.login_status = 1
                    self.login_lvl = self.login_tag
                    handle.login_status = True
                    self.pcs.next_func()

                else:
                    if self.pcs.menu_lvl in ["1-5"]:
                        self.pcs.choice_selection(self.event, choice)
                    self.event.app.editor.error(str(response))

    #        if self.login_tag=="bs":
    #            self.password="******"
    #            handle=self.pcs.bs
    #            choice="2"

        def get_password(self):
            self.event.app.editor.input('password:'******'userid:',
                                   "PROMPT_WINDOW",
                                   on_ok_handler=self._on_userid_ok)

    except:
        _logger.error('application exited with exception: %r' %
                      traceback.format_exc())
        raise
    finally:
        pass
コード例 #11
0
ファイル: login_buffer.py プロジェクト: vis2alll/NALP
class LoginBuffer(BufferBase):
    _logger = logger('login-buffer') 

    def __init__(self, name = '' ,text=""):
        BufferBase.__init__(self, name)
        self._text = text
                
        self.userid=""
        self.password=""
        
    @property
    def text(self):
        return self._text

    @text.setter
    def text(self, value):
        self._text = value
        self.emit(EventType.TEXT_CHANGED)

    @property
    def cursor(self):
        return self._cursor

    @cursor.setter
    def cursor(self, value):
        self._cursor = value

        if self._cursor >= len(self.text):
            if self.is_readonly:
                self._cursor = max(len(self.text) - 1, 0)
            else:
                self._cursor = len(self.text)
        if self._cursor < 0:
            self._cursor = 0

        self.emit(EventType.CURSOR_MOVED)

    @property
    def is_readonly(self):
        return self._readonly_document


    @is_readonly.setter
    def is_readonly(self, value):
        self._readonly_document = value

    @property
    def selection_range(self):
        return None

    @property
    def format_ranges (self):
        return []

    def insert_text(self, ch):
        if self.is_readonly:
            BufferBase._logger.debug('buffer is readonly')
            return

        text = chr(ch)
        if len(self.text) == 0:
            self._text = text
        else:
            first = u''
            last = u''

            if self._cursor > 0:
                first = self.text[:self._cursor]

            if self._cursor <= len(self.text):
                last = self.text[self._cursor:]

            self._text = first + text + last

        self._cursor += 1
        self.emit(EventType.TEXT_CHANGED)

    def remove(self, count = -1):
        if self.is_readonly:
            BufferBase._logger.debug('buffer is readonly')
            return

        # nothing to delete
        if (len(self.text) == 0 or
                (self.cursor == 0 and count < 0) or
                (self.cursor == len(self.text) and count > 0)):
                return

        first = u''
        last = u''

        if count < 0: # backspace
            count = -count
            first = self.text[:self._cursor - count]
            if self._cursor < len(self.text):
                last = self.text[self._cursor:]

            self._cursor -= count
        else: # delete
            last = self.text[self._cursor + count:]
            if self._cursor > 0:
                first = self.text[:self._cursor]

        self._text = first + last

        self.emit(EventType.TEXT_CHANGED)

    def enter(self):
        pass

    def cursor_up(self, rows = 1):
        pass

    def cursor_down(self, rows = 1):
        pass

    def cursor_left(self, cols = 1):
        self.cursor = self.cursor - cols

    def cursor_right(self, cols = 1):
        self.cursor = self.cursor + cols

    def cursor_beg(self):
        self.cursor = 0

    def cursor_end(self):
        self.cursor = len(self.text)

    def top(self):
        pass

    def bottom(self):
        pass

    def previous(self, blocktype):
        return None

    def next(self, blocktype):
        return None

    def delete(self):
        pass

    # search and replace
    def reset_search(self):
        self._new_search = True
        self._search_text = None

    def search(self, search_text, back_search):
        raise NotImplementedError

    def _find_match(self, back_search):
        raise NotImplementedError


    def next_match(self, search_text, back_search, from_top = False):
        return None

    def replace(self, search_text, replace_text, back_search):
        return None

    def replace_all(self, search_text, replace_text, back_search):
        return None

    # clipboard
    def clipboard_copy(self):
        self.toggle_property(BufferBase.PROPERTY_SELECTION, reset = False)
        BufferBase._logger.info('clipboard_copy not implemented')

    def clipboard_cut(self):
        self.toggle_property(BufferBase.PROPERTY_SELECTION, reset = False)
        BufferBase._logger.info('clipboard_cut not implemented')

    def clipboard_paste(self):
        BufferBase._logger.info('clipboard_paste not implemented')

    def clipboard_delete(self):
        self.toggle_property(BufferBase.PROPERTY_SELECTION, reset = False)
        BufferBase._logger.info('clipboard_delete not implemented')

    def toggle_property(self, prop, **args):
        if prop == BufferBase.PROPERTY_READONLY:
            self._readonly_document = not self._readonly_document
            self.focus()
        elif prop == BufferBase.PROPERTY_BOLD:
            self._bold_forced_on = not self._bold_on
            self._bold_on = self._bold_forced_on
        elif prop == BufferBase.PROPERTY_ITALIC:
            self._italic_forced_on = not self._italic_on
            self._italic_on = self._italic_forced_on
        elif prop == BufferBase.PROPERTY_UNDERLINE:
            self._underline_forced_on = not self._underline_on
            self._underline_on = self._underline_forced_on
        elif prop == BufferBase.PROPERTY_SELECTION:
            if self._selection_on:
                reset = args.pop('reset', True)
                self.emit(EventType.TEXT_CHANGED)
            else:
                self.emit(EventType.TEXT_CHANGED)
            self._selection_on = not self._selection_on
        else:
            pass

    def get_property(self, prop):
        if prop == BufferBase.PROPERTY_READONLY:
            return self._readonly_document
        elif prop == BufferBase.PROPERTY_BOLD:
            return self._bold_on
        elif prop == BufferBase.PROPERTY_ITALIC:
            return self._italic_on
        elif prop == BufferBase.PROPERTY_UNDERLINE:
            return self._underline_on
        elif prop == BufferBase.PROPERTY_SELECTION:
            return self._selection_on
        else:
            return None

    def set_property(self, prop, value):
        assert isinstance(value, bool)
        if prop == BufferBase.PROPERTY_READONLY:
            self._readonly_document = value
        elif prop == BufferBase.PROPERTY_BOLD:
            self._bold_on = value
        elif prop == BufferBase.PROPERTY_ITALIC:
            self._italic_on = value
        elif prop == BufferBase.PROPERTY_UNDERLINE:
            self._underline_on = value
        elif prop == BufferBase.PROPERTY_SELECTION:
            self._selection_on = value
        else:
            raise ValueError('invalid property name')
    @property
    def is_selection_on(self):
        return self._selection_on
コード例 #12
0
class SugamyaPustakalya():

    try:
        _logger = logger('SugamyaPustakalya')
        #    KEY = 'D72551A2C3319E892DF355AAB1C55FCEEAE91A2236C39B931513155440537'
        KEY = os.environ.get(str(sugamya_key))
        URL = 'https://library.daisyindia.org/NALP/rest/NALPAPIService/getNALPData/'

        def __init__(self, pcs):

            self.pcs = pcs
            self.WINDOW = "BOOKLIST_WINDOW"
            self.userid = None
            self.password = None
            self.book_repo = []
            self.book_repo_temp = []
            self.l_page_index = 1
            self.p_page_index = 1
            self.s_page_index = 1
            self.c_page_index = 1
            self.d_page_index = 1
            self._on_search_ok = None
            self.search_input = ""
            self.all_urls = {}
            self.category_name = ""
            self.download_threads = []
            self.login_status = False
            self.l_book_repo = []
            self.p_book_repo = []
            self.s_book_repo = []
            self.c_book_repo = []
            self.d_book_repo = []
            self.total_books = "0"

        def check_credentials(self, userid, password):
            self.userid = userid
            self.password = password

            page = 1
            try:
                data = requests.get(self.URL + 'latest/page/' + str(page) +
                                    '/limit/20/format/JSON?API_key=' +
                                    self.KEY,
                                    verify=False)
                try:
                    authString = self.userid + ":" + self.password
                    #                authString = "26353" + ':' +"9m85twwz"
                    encoded = base64.b64encode(bytearray(
                        authString.encode())).decode()
                    headers = {
                        'Authorization': 'Basic ' + encoded,
                        "page": "1",
                        "limit": "1",
                        "format": "xml",
                        "API_key": self.KEY
                    }
                    data = requests.post(
                        "https://library.daisyindia.org/NALP/rest/NALPAPIService/fetchUserDownloadRequests",
                        headers=headers,
                        verify=False)

                    if (data.status_code == 200):
                        parsedData = minidom.parseString(data.text)
                        msg = parsedData.getElementsByTagName('message')

                        if msg == []:
                            return 1
                        else:
                            return "invalid credentials..."
                    else:
                        err = "Error:" + str(data) + str(data.status_code)
                        return err

                except Exception as e:
                    return str(e.message)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                msg = str(e)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

        def fetch_books(self, menu):

            if menu == "latest":
                self.menu_lvl = "1-1"
                #            choice="1"
                page = self.l_page_index
                repo = self.l_book_repo
                url = self.URL + menu + '/page/' + str(
                    page) + '/limit/20/format/JSON?API_key=' + self.KEY

            if menu == "popular":
                self.menu_lvl = "1-2"
                #            choice="2"
                page = self.p_page_index
                repo = self.p_book_repo
                url = self.URL + "popularbooks/noOfTimesDelivered/1/startDate/1017-01-01/endDate/4017-12-15/page/" + str(
                    page) + "/limit/250/format/xml?API_key=" + self.KEY

    #        page=1424
            try:
                data = requests.get(url, verify=False)
                if (data.status_code == 200):
                    parsedData = minidom.parseString(data.text.encode('utf-8'))

                    books = parsedData.getElementsByTagName('result')
                    if (len(books) == 0):
                        s = parsedData.getElementsByTagName("string")
                        msg = ""
                        for i in s:
                            msg = msg + str(i.firstChild.nodeValue) + "."

                        if not repo == []:
                            self.pcs.copy_buffer()
                            self.pcs.menu_lvl = "1-m"
                            self.pcs.show_msg(msg)
    #                        self.pcs._event.app.editor.focus(self.WINDOW)
    #                        self.pcs._event.current_window.buffer._files = [[msg]]
    #                        self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
                        else:
                            self.pcs.menu_lvl = "1-e"
                            self.pcs.show_msg(msg)
                            #                        self.pcs.bs_choice_selection(self.pcs._event, "1") #bs
                            #                        self.pcs._event.app.editor.error('Network is unreachable')
                            return
                    else:
                        #                    n=len(books)
                        self.total_books = parsedData.getElementsByTagName(
                            'total-results')[0].firstChild.nodeValue
                        #                    self.num_pages=parsedData.getElementsByTagName('num-pages')[0].firstChild.nodeValue
                        for i, book in enumerate(books):

                            row = []
                            for child in book.childNodes:
                                if (len(child.childNodes) !=
                                        0) and child.tagName != "id":
                                    row.append(
                                        str(child.localName) + ":" +
                                        str(child.firstChild.nodeValue))

                            row.append("id:" + str(
                                book.getElementsByTagName('id')
                                [0].firstChild.nodeValue))

                            repo.append(row)

                        repo = self.pcs.insert_book_index(
                            repo, self.total_books)

                    self.book_repo = repo
                    self.pcs._event.app.editor.focus(self.WINDOW)
                    self.pcs._event.current_window.buffer._files = self.book_repo
                    self.pcs._event.current_window.buffer.emit(
                        EventType.TEXT_CHANGED)
                    page += 1

                    if menu == "latest":
                        self.l_page_index = page
                        self.l_book_repo = repo

                    if menu == "popular":
                        self.p_page_index = page
                        self.p_book_repo = repo

                else:
                    self.pcs.menu_lvl = "1-e"
                    msg = "Error, server replied with" + str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)

        def pre_fetch_books(self):

            if self.pcs.menu_lvl == "1-1":
                menu = "latest"
                page = self.l_page_index
                repo = self.l_book_repo
                url = self.URL + menu + '/page/' + str(
                    page) + '/limit/20/format/JSON?API_key=' + self.KEY

            if self.pcs.menu_lvl == "1-2":
                menu = "popular"
                page = self.p_page_index
                repo = self.p_book_repo
                url = self.URL + "popularbooks/noOfTimesDelivered/1/startDate/1017-01-01/endDate/4017-12-15/page/" + str(
                    page) + "/limit/250/format/xml?API_key=" + self.KEY
            if self.pcs.menu_lvl == "1-3-b":
                menu = "search"
                search = self.search_input
                page = self.s_page_index
                repo = self.s_book_repo

                if self.pcs.search_lvl == "1":
                    url = self.URL + "id/" + search + "/page/" + str(
                        page) + "/limit/250/format/xml?API_key=" + self.KEY
                if self.pcs.search_lvl == "2":
                    url = self.URL + "title/" + search + "/page/" + str(
                        page) + "/limit/250/format/xml?API_key=" + self.KEY
                if self.pcs.search_lvl == "3":
                    url = self.URL + "author/" + search + "/page/" + str(
                        page) + "/limit/250/format/xml?API_key=" + self.KEY
                if self.pcs.search_lvl == "4":
                    url = self.URL + "authortitle/" + search + "/page/" + str(
                        page) + "/limit/250/format/xml?API_key=" + self.KEY
    #            if self.pcs.search_lvl=="5":
    #                url=self.URL + "authortitle/" + search + "/page/"+str(page)+"/limit/250/format/xml?API_key=" + self.KEY

#                url=self.URL + "authortitle/" +self.search_input + "/page/"+str(page)+"/limit/250/format/xml?API_key=" + self.KEY
            if self.pcs.menu_lvl == "1-4-b":
                menu = "category"
                page = self.c_page_index
                repo = self.c_book_repo
                url = self.URL + "category/" + self.category_name + "/page/" + str(
                    page) + "/limit/52/format/xml?API_key=" + self.KEY

            tmp_repo = []
            self.queued_repo = []
            #        tmp_repo.append([str(page)])
            try:
                data = requests.get(
                    url,
                    verify=False)  # during production remove verify = false
                if (data.status_code == 200):
                    parsedData = minidom.parseString(data.text.encode('utf-8'))
                    books = parsedData.getElementsByTagName('result')

                    if (len(books) == 0):
                        s = parsedData.getElementsByTagName("string")
                        s = s[::-1]
                        msg = ""
                        for i in s:
                            msg = msg + str(i.firstChild.nodeValue) + "."

                        if not repo == []:
                            self.pcs.copy_buffer()
                            self.pcs.menu_lvl = "1-m"
                            self.pcs.show_msg(msg)
    #                        self.pcs._event.app.editor.focus(self.WINDOW)
    #                        self.pcs._event.current_window.buffer._files = [[msg]]
    #                        self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
                        else:
                            if self.pcs.menu_lvl == "1-3-b":
                                self.pcs.menu_lvl = "1-3-e"
                            else:
                                self.pcs.menu_lvl = "1-e"
                            self.pcs.show_msg(msg)
                            self.pcs.show_msg(msg)
                            #                        self.pcs.bs_choice_selection(self.pcs._event, "1") #bs
                            #                        self.pcs._event.app.editor.error('Network is unreachable')
                            return
                    else:
                        self.total_books = parsedData.getElementsByTagName(
                            'total-results')[0].firstChild.nodeValue
                        for i, book in enumerate(books):
                            row = []
                            for child in book.childNodes:
                                if (len(child.childNodes) !=
                                        0) and child.tagName != "id":
                                    row.append(
                                        str(child.localName) + ":" +
                                        str(child.firstChild.nodeValue))

                            row.append("id:" + str(
                                book.getElementsByTagName('id')
                                [0].firstChild.nodeValue))

                            tmp_repo.append(row)

                        repo = self.pcs.remove_book_index(repo)
                        tmp_repo = repo + tmp_repo
                        tmp_repo = self.pcs.insert_book_index(
                            tmp_repo, self.total_books)

                    repo = tmp_repo
                    self.book_repo = repo
                    page += 1

                    if self.pcs.menu_lvl == "1-1":
                        self.l_page_index = page
                        self.l_book_repo = repo
                    if self.pcs.menu_lvl == "1-2":
                        self.p_page_index = page
                        self.p_book_repo = repo
                    if self.pcs.menu_lvl == "1-3-b":
                        self.s_page_index = page
                        self.s_book_repo = repo
                    if self.pcs.menu_lvl == "1-4-b":
                        self.c_page_index = page
                        self.c_book_repo = repo

                else:
                    if self.pcs.menu_lvl == "1-3-b":
                        self.pcs.menu_lvl = "1-3-e"
                    else:
                        self.pcs.menu_lvl = "1-e"
                    msg = "Error, server replied with" + str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)

        def get_latest_books(self):
            try:
                if self.l_book_repo == []:
                    self.fetch_books("latest")
                else:
                    self.menu_lvl = "1-1"
                    self.book_repo = self.l_book_repo
                    self.pcs._event.app.editor.focus(self.WINDOW)
                    self.pcs._event.current_window.buffer._files = self.book_repo
                    self.pcs._event.current_window.buffer.emit(
                        EventType.TEXT_CHANGED)
            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)
                self.pcs.show_msg(msg)

        def get_popular_books(self):
            # Get popular books from bookshare.org
            try:
                if self.p_book_repo == []:
                    self.fetch_books("popular")
                else:
                    self.menu_lvl = "1-2"
                    self.book_repo = self.p_book_repo
                    self.pcs._event.app.editor.focus(self.WINDOW)
                    self.pcs._event.current_window.buffer._files = self.book_repo
                    self.pcs._event.current_window.buffer.emit(
                        EventType.TEXT_CHANGED)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

    #    def get_popular_books(self):
    #
    #        page=self.latest_page
    #        try:
    #            if self.p_book_repo==[]:
    #                data = requests.get(self.URL + "popularbooks/noOfTimesDelivered/1/startDate/2017-01-01/endDate/2017-12-15/page/"+str(page)+"/limit/17/format/xml?API_key=" + self.KEY, verify=False) # during production remove verify = false
    #                if(data.status_code == 200):
    #                    parsedData = minidom.parseString(data.text);
    #                    books = parsedData.getElementsByTagName('result')
    #                    if(len(books) == 0):
    #    #                        print("No books found")
    #                        pass
    #                    else:
    #                        n=len(books)
    #                        i=0
    #                        for book in books:
    #                            i+=1
    #                            book_index=" ("+str(i)+"/"+str(n)+")"
    #                            row=[]
    #                            for child in book.childNodes:
    #                              if(len(child.childNodes)!=0) and child.tagName != "id":
    #                                row.append(str(child.localName)+":"+str(child.firstChild.nodeValue))
    #
    #                            row.append("id:"+str(book.getElementsByTagName('id')[0].firstChild.nodeValue))
    #                            self.p_book_repo.append(row)
    #
    #                else:
    #                    self.pcs.menu_lvl="1-e"
    #                    msg="Error, server replied with"+ str(data.status_code)
    #                    self.pcs.show_msg(msg)
    #
    #            self.book_repo=self.p_book_repo
    #            self.menu_lvl="1-2"
    #            self.pcs._event.app.editor.focus(self.WINDOW)
    #            self.pcs._event.current_window.buffer._files = self.book_repo
    #            self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
    #            self.latest_page+=1
    ##                if self.pcs._event.current_window.buffer.next_page==True :
    ##                    self.pcs._event.app.editor.error("page"+str(self.latest_page))
    #
    #        except Exception as e:
    #            self.userid=None
    #            self.pcs.menu_lvl="1-e"
    #            msg=str(e)#"Network unreachable"
    #            self.pcs.show_msg(msg)
    ##            self.pcs._event.app.editor.error('Network is unreachable')
    #

        def _set_input_var(self, *args):

            #        self.pcs._event.app.editor.error(str(type(args[0])))

            if str(args[-1]) == "":
                self.get_search_input()

            self.search_input = str(args[-1])
            self.search_book()

        def get_search_input(self):
            self.pcs.menu_lvl = "1-3-e"
            self.pcs._event.current_window.buffer._files = [["Empty Search"]]
            self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
            self.pcs._event.app.editor.input('search input:',
                                             "PROMPT_WINDOW",
                                             on_ok_handler=self._set_input_var)

        def search_book(self):
            # Search books by Title/Author from user given user input
            search = self.search_input
            page = self.s_page_index
            self.s_book_repo = self.book_repo
            repo = self.s_book_repo

            if self.pcs.search_lvl == "1":
                url = self.URL + "id/" + search + "/page/" + str(
                    page) + "/limit/250/format/xml?API_key=" + self.KEY
            if self.pcs.search_lvl == "2":
                url = self.URL + "title/" + search + "/page/" + str(
                    page) + "/limit/250/format/xml?API_key=" + self.KEY
            if self.pcs.search_lvl == "3":
                url = self.URL + "author/" + search + "/page/" + str(
                    page) + "/limit/250/format/xml?API_key=" + self.KEY
            if self.pcs.search_lvl == "4":
                url = self.URL + "authortitle/" + search + "/page/" + str(
                    page) + "/limit/250/format/xml?API_key=" + self.KEY
#            if self.pcs.search_lvl=="5":
#                url=self.URL + "authortitle/" + search + "/page/"+str(page)+"/limit/250/format/xml?API_key=" + self.KEY

            try:
                data = requests.get(
                    url,
                    verify=False)  # during production remove verify = false

                if (data.status_code == 200):
                    parsedData = minidom.parseString(data.text.encode("utf-8"))
                    books = parsedData.getElementsByTagName('result')
                    if (len(books) == 0):
                        s = parsedData.getElementsByTagName("string")
                        s = s[::-1]
                        msg = ""
                        for i in s:
                            msg = msg + str(i.firstChild.nodeValue) + "."

                        if not repo == []:
                            self.pcs.copy_buffer()
                            self.pcs.menu_lvl = "1-m"
                            self.pcs.show_msg(msg)
    #                        self.pcs._event.app.editor.focus(self.WINDOW)
    #                        self.pcs._event.current_window.buffer._files = [[msg]]
    #                        self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
                        else:
                            self.pcs.menu_lvl = "1-3-e"
                            self.pcs.show_msg(msg)
                            #                        self.pcs.bs_choice_selection(self.pcs._event, "1") #bs
                            #                        self.pcs._event.app.editor.error('Network is unreachable')
                            return
                    else:
                        self.total_books = parsedData.getElementsByTagName(
                            'total-results')[0].firstChild.nodeValue
                        for book in books:
                            row = []
                            for child in book.childNodes:
                                if (len(child.childNodes) != 0
                                        and child.tagName != "id"):
                                    row.append(
                                        str(child.localName) + ":" + str(
                                            child.firstChild.nodeValue.encode(
                                                "utf-8")))
    #                            all_ids.append(book.getElementsByTagName('id')[0].firstChild.nodeValue)
                            row = row[::-1]
                            row.append("id:" + str(
                                book.getElementsByTagName('id')
                                [0].firstChild.nodeValue))
                            self.book_repo.append(row)

                        self.pcs.menu_lvl = "1-3-b"
                        self.book_repo = self.pcs.insert_book_index(
                            self.book_repo, self.total_books)
                        self.s_book_repo = self.book_repo
                        self.pcs._event.app.editor.focus(self.WINDOW)
                        self.pcs._event.current_window.buffer._files = self.book_repo
                        self.pcs._event.current_window.buffer.emit(
                            EventType.TEXT_CHANGED)
                        self.pcs.copy_buffer()
                        page += 1
                        self.s_page_index = page

                else:
                    self.pcs.menu_lvl = "1-3-e"
                    msg = "Error server replied with: " + str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                search = ""
                self.pcs.menu_lvl = "1-3-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

        def get_book_categories(self):

            #        self.book_repo=[]
            page = 1  #self.c_page_index
            repo = self.c_book_repo
            try:
                data = requests.get(
                    self.URL + "categorylist/page/" + str(page) +
                    "/limit/52/format/xml?API_key=" + self.KEY,
                    verify=False)  # during production remove verify = false
                if (data.status_code == 200):
                    parsedData = minidom.parseString(data.text.encode("utf-8"))
                    #                xml=parsedData.toxml('utf-8')

                    categories = parsedData.getElementsByTagName('title')

                    if (len(categories) == 0):
                        s = parsedData.getElementsByTagName("string")
                        s = s[::-1]
                        msg = ""
                        for i in s:
                            msg = msg + str(i.firstChild.nodeValue) + "."

                        if not repo == []:
                            self.pcs.copy_buffer()
                            self.pcs.menu_lvl = "1-m"
                            self.pcs.show_msg(msg)
    #                        self.pcs._event.app.editor.focus(self.WINDOW)
    #                        self.pcs._event.current_window.buffer._files = [[msg]]
    #                        self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
                        else:

                            self.pcs.menu_lvl = "1-e"
                            self.pcs.show_msg(msg)
                            #                        self.pcs.bs_choice_selection(self.pcs._event, "1") #bs
                            #                        self.pcs._event.app.editor.error('Network is unreachable')
                            return
                    else:
                        self.total_books = parsedData.getElementsByTagName(
                            'total-results')[0].firstChild.nodeValue
                        for category in categories:
                            self.book_repo.append(
                                [category.firstChild.nodeValue])

                    self.book_repo = self.pcs.insert_book_index(
                        self.book_repo, self.total_books)
                    #                self.book_repo.append([self.pcs._event.current_window.buffer.end_msg])
                    self.pcs._event.app.editor.focus(self.WINDOW)
                    self.pcs._event.current_window.buffer._files = self.book_repo
                    #                self.pcs._event.current_window.buffer.reset()
                    self.pcs._event.current_window.buffer.emit(
                        EventType.TEXT_CHANGED)
                    self.pcs.menu_lvl = "1-4"
                    page += 1
                    self.pcs.copy_buffer()
    #                self.c_page_index=page

                else:
                    self.pcs.menu_lvl = "1-e"
                    msg = "Error, server replied with" + str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

        def category_book_search(self, category_name):

            #        self.book_repo=[]
            page = self.c_page_index
            repo = self.book_repo
            try:
                data = requests.get(
                    self.URL + "category/" + category_name + "/page/" +
                    str(page) + "/limit/250/format/xml?API_key=" + self.KEY,
                    verify=False)

                if (data.status_code == 200):
                    parsedData = minidom.parseString(data.text.encode("utf-8"))
                    books = parsedData.getElementsByTagName('result')
                    #                xml=parsedData.toxml('utf-8')
                    if (len(books) == 0):
                        s = parsedData.getElementsByTagName("string")
                        s = s[::-1]
                        msg = ""
                        for i in s:
                            msg = msg + str(i.firstChild.nodeValue) + "."

                        if not repo == []:
                            self.pcs.copy_buffer()
                            self.pcs.menu_lvl = "1-m"
                            self.pcs.show_msg(msg)
    #                        self.pcs._event.app.editor.focus(self.WINDOW)
    #                        self.pcs._event.current_window.buffer._files = [[msg]]
    #                        self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
                        else:
                            self.pcs.menu_lvl = "1-e"
                            self.pcs.show_msg(msg)
                            #                        self.pcs.bs_choice_selection(self.pcs._event, "1") #bs
                            #                        self.pcs._event.app.editor.error('Network is unreachable')
                            return
                    else:
                        self.total_books = parsedData.getElementsByTagName(
                            'total-results')[0].firstChild.nodeValue
                        for book in books:
                            row = []
                            for child in book.childNodes:
                                if (len(child.childNodes) != 0
                                        and child.tagName != "id"):
                                    row.append(
                                        str(child.localName) + ":" +
                                        str(child.firstChild.nodeValue))
    #                            all_ids.append(book.getElementsByTagName('id')[0].firstChild.nodeValue)
                            row = row[::-1]
                            row.append("id:" + str(
                                book.getElementsByTagName('id')
                                [0].firstChild.nodeValue))
                            self.book_repo.append(row)

                    self.book_repo = self.pcs.insert_book_index(
                        self.book_repo, self.total_books)
                    self.c_book_repo = self.book_repo
                    self.pcs._event.app.editor.focus(self.WINDOW)
                    self.pcs._event.current_window.buffer._files = self.book_repo
                    self.pcs._event.current_window.buffer.reset()
                    self.pcs._event.current_window.buffer.emit(
                        EventType.TEXT_CHANGED)
                    page += 1
                    self.c_page_index = page
                    self.pcs.menu_lvl = "1-4-b"

    #                self.c_book_repo=self.book_repo
    #                self.book_repo=self.pcs.insert_book_index(self.book_repo,self.total_books)
    #                self.pcs._event.app.editor.focus(self.WINDOW)
    #                self.pcs._event.current_window.buffer._files = self.book_repo
    #                if page==1:
    #                    self.pcs._event.current_window.buffer.reset()
    #                self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
    #                page+=1
    #                self.c_latest_page=page
    #                self.pcs.menu_lvl="1-4-b"

                else:
                    self.pcs.menu_lvl = "1-e"
                    msg = "Error, server replied with" + str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                msg = str(e)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

        def get_book_id(self, id):
            # Search a particular book by ID
            page = self.latest_page
            #        id=str(id)
            try:
                data = requests.get(
                    self.URL + "id/" + str(id) + "/page/" + str(page) +
                    "/limit/25/format/xml?API_key=" +
                    self.KEY)  # during production remove verify = false
                if (data.status_code == 200):
                    row = []
                    parsedData = minidom.parseString(data.text)
                    #                xml=parsedData.toxml('utf-8')

                    try:
                        msg = parsedData.getElementsByTagName(
                            'string')[0].firstChild.nodeValue
                        if msg == "No data existing":
                            self.pcs.menu_lvl = "1-m"
                            self.pcs.show_msg(msg)
                    except:
                        pass

    #                title = parsedData.getElementsByTagName('title')[0].firstChild.nodeValue
    #                author = parsedData.getElementsByTagName('author')[0].firstChild.nodeValue
    #                synopsis = parsedData.getElementsByTagName('brief-synopsis')[0]
    #                row.append(title)
    #                row.append(author)
    #
    #                if(len(synopsis.childNodes) != 0):
    #                    row.append(synopsis.firstChild.nodeValue)
    #                row.append(id)
    #
    #                self.book_repo=[row]
    #                self.pcs._event.app.editor.focus(self.WINDOW)
    ##                os.system('clear')
    #                self.pcs._event.current_window.buffer._files = self.book_repo
    #                self.pcs._event.current_window.buffer.reset()
    #                self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)

                else:

                    self.pcs.menu_lvl = "1-m"
                    msg = "id not found"
                    #                msg="Error, server replied with "+ str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                exc_type, exc_obj, exc_tb = sys.exc_info()
                fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]

                self.userid = None
                self.pcs.menu_lvl = "1-e"
                msg = "asdawe a af" + str(
                    exc_tb.tb_lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

        def request_book_download(self, id):
            def send_request():
                page = 1  #self.latest_page
                try:
                    authString = self.userid + ":" + self.password
                    #            authString = "26353" + ':' +"9m85twwz"
                    encoded = base64.b64encode(bytearray(
                        authString.encode())).decode()
                    #            print(id)
                    headers = {
                        'Authorization': 'Basic ' + encoded,
                        "page": str(page),
                        "limit": "1",
                        "format": "xml",
                        "API_key": self.KEY,
                        "bookId": id,
                        "formatId": '6'
                    }
                    data = requests.post(
                        "https://library.daisyindia.org/NALP/rest/NALPAPIService/raiseBookDownloadRequest",
                        headers=headers,
                        verify=False)

                    if (data.status_code == 200):
                        parsedData = minidom.parseString(data.text)
                        if parsedData.getElementsByTagName('message') != []:
                            message = parsedData.getElementsByTagName(
                                'message')[0]
                            self.pcs._event.app.editor.message("request sent")
    #                        self.pcs._event.app.editor.message(str(id))
    #                self.pcs._event.app.editor.focus(self.WINDOW)
                        else:
                            self.pcs._event.app.editor.message(
                                "Not available to download")
                    else:
                        self.pcs.menu_lvl = "1-e"
                        msg = "Error, server replied with" + str(
                            data.status_code)
                        self.pcs.show_msg(msg)
                except Exception as e:
                    self.userid = None
                    self.pcs.menu_lvl = "1-e"
                    msg = str(e)  #"Network unreachable"
                    self.pcs.show_msg(msg)

            #            self.pcs._event.app.editor.error('Network is unreachable')

            if self.login_status == False:
                self.pcs.next_func = send_request
                self.pcs.login.login_process(self.pcs, self.pcs._event, "sp")

            else:
                send_request()

        def get_requested_books(self):
            # download books that are ready for downloading
            #        self.pcs._event.current_window.buffer._files=[["invalid input"]]
            #        self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
            ##        choice="1"
            ##        self.pcs.choice_selection(self.pcs._event, choice)

            def get_books():
                page = self.latest_page
                try:
                    authString = self.userid + ":" + self.password
                    #            authString = "26353" + ':' "9m85twwz"
                    encoded = base64.b64encode(bytearray(
                        authString.encode())).decode()
                    #            print(id)
                    headers = {
                        'Authorization': 'Basic ' + encoded,
                        "page": str(page),
                        "limit": "10",
                        "format": "xml",
                        "API_key": self.KEY
                    }
                    data = requests.post(
                        "https://library.daisyindia.org/NALP/rest/NALPAPIService/fetchUserDownloadRequests",
                        headers=headers,
                        verify=False)

                    if (data.status_code == 200):
                        parsedData = minidom.parseString(data.text)

                        #                    xml=parsedData.toxml('utf-8')
                        #                    self.pcs._event.current_window.buffer._files = [[xml]]
                        #                    self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
                        #                    return

                        count = 1 + (self.latest_page - 1) * 10

                        books = parsedData.getElementsByTagName('result')
                        #                t = PrettyTable(['ID', 'TITLE', 'STATUS'])
                        for book in books:
                            status = book.getElementsByTagName(
                                'available-to-download'
                            )[0].firstChild.nodeValue
                            row = [
                                str(count),
                                book.getElementsByTagName('title')
                                [0].firstChild.nodeValue, status
                            ]
                            if (status == 'Available for Download'):
                                self.all_urls[str(
                                    count)] = book.getElementsByTagName(
                                        'downloadUrl')[0].firstChild.nodeValue
                            count += 1
                            self.book_repo.append(row)
        #                print self.book_repo
                        self.menu_lvl = "1-5"
                        #                os.system('clear')

                        self.pcs._event.current_window.buffer._files = self.book_repo
                        #                self.pcs._event.app.editor.focus(self.WINDOW)
                        #                os.system('clear')
                        #                self.pcs._event.current_window.buffer.reset()
                        self.pcs._event.current_window.buffer.emit(
                            EventType.TEXT_CHANGED)
                        self.latest_page += 1
                        self.pcs.copy_buffer()

                    else:
                        self.pcs.menu_lvl = "1-e"
                        msg = "Error, server replied with" + str(
                            data.status_code)
                        self.pcs.show_msg(msg)

                except Exception as e:
                    self.userid = None
                    self.pcs.menu_lvl = "1-e"
                    msg = str(e)  #"Network unreachable"
                    self.pcs.show_msg(msg)

        #            self.pcs._event.app.editor.error('Network is unreachable')

            if self.login_status == False:
                self.pcs.next_func = get_books
                self.pcs.login.login_process(self.pcs, self.pcs._event, "sp")

            else:
                get_books()

        def download_book(self, response):
            def chdir(dir):
                if directory_exists(dir) is False:
                    #                os.makedirs(final_dir)
                    ftp.mkd(dir)
                ftp.cwd(dir)

            def directory_exists(dir):
                filelist = []
                ftp.retrlines('LIST', filelist.append)
                for f in filelist:
                    if f.split()[-1] == dir and f.upper().startswith('D'):
                        return True
                return False

            try:
                #            final_dir=''
                import os
                current_dir = os.getcwd()
                final_dir = os.path.join(current_dir, str(download_folder))
                #            if not os.path.exists(final_dir):
                #               os.makedirs(final_dir)

                url = self.all_urls[response].split('/')
                host = url[2].split(':')[0]
                port = url[2].split(':')[1]
                filename = url[4]

                ftp = ftplib.FTP(host)
                ftp.login(self.userid, self.password)
                chdir(final_dir)
                #            try:
                #                ftp.cwd(final_dir)
                #            except Exception as e:
                #                self.pcs._event.app.editor.error('FTP dwD: '+str(e)[0:60])

                ftp.retrbinary("RETR " + url[3] + "/" + url[4],
                               open(filename, 'wb').write)

                #            ftp.close()
                #            ftp.quit()

                self.pcs._event.app.editor.error('Download completed ' +
                                                 str(filename)[0:50])

            except KeyError:
                self.pcs._event.app.editor.error('queued')

    #        except Exception as e:
    #            self.pcs._event.app.editor.error('dwld: '+str(e)[0:50])

            except Exception as e:
                self.userid = None
                msg = str(e)  #"Network unreachable"
                #            self.pcs.show_msg(msg)
                self.pcs._event.app.editor.error(msg)

        def logout(self):
            choice = "1"
            self.pcs.choice_selection(self.pcs._event, choice)
            if self.login_status == True:
                self.login_status = False
                self.userid = None
                self.password = None
                self.pcs._event.app.editor.error(
                    'logged out of sugamya pustkalay')
            else:
                self.pcs._event.app.editor.error('already logged out')

    except:
        _logger.error('application exited with exception: %r' %
                      traceback.format_exc())
        raise
    finally:
        pass
コード例 #13
0
class Bookshare():
    _logger = logger('_login')
    try:
        #    KEY='fh6re3gjwczpyx8f3xfzs8qr'# new 4 july
        KEY = os.environ.get(str(bookshare_key))
        URL = 'https://api.bookshare.org/book/'

        def __init__(self, pcs):
            self.pcs = pcs
            self.WINDOW = "BOOKLIST_WINDOW"
            self.userid = None
            self.password = None
            self.book_repo = []
            self.book_repo_temp = []
            self.l_page_index = 1
            self.p_page_index = 1
            self.s_page_index = 1
            self.c_page_index = 1
            self._on_search_ok = None
            self.search_input = ""
            self.all_urls = {}
            self.category_name = ""
            self.download_threads = []
            self.login_status = False
            self.l_book_repo = []
            self.p_book_repo = []
            self.s_book_repo = []
            self.c_book_repo = []
            self.count = 1  #
            self.total_books = "0"

        def fetch_books(self, menu):

            if menu == "latest":
                self.menu_lvl = "1-1"
                #            choice="1"
                page = self.l_page_index
                repo = self.l_book_repo

            if menu == "popular":
                self.menu_lvl = "1-2"
                #            choice="2"
                page = self.p_page_index
                repo = self.p_book_repo

    #        page=415
            try:
                data = requests.get(
                    self.URL + menu + "/limit/50/format/xml/page/" +
                    str(page) + "?api_key=" + self.KEY,
                    verify=False)  # during production remove verify = false
                if (data.status_code == 200):
                    parsedData = minidom.parseString(data.text.encode('utf-8'))

                    books = parsedData.getElementsByTagName('result')
                    if (len(books) == 0):
                        s = parsedData.getElementsByTagName("string")
                        s = s[::-1]
                        msg = ""
                        for i in s:
                            msg = msg + str(i.firstChild.nodeValue) + "."

                        if not repo == []:
                            self.pcs.copy_buffer()
                            self.pcs.menu_lvl = "1-m"
                            self.pcs.show_msg(msg)
    #                        self.pcs._event.app.editor.focus(self.WINDOW)
    #                        self.pcs._event.current_window.buffer._files = [[msg]]
    #                        self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
                        else:
                            self.pcs.menu_lvl = "1-e"
                            self.pcs.show_msg(msg)
                            #                        self.pcs.bs_choice_selection(self.pcs._event, "1") #bs
                            #                        self.pcs._event.app.editor.error('Network is unreachable')
                            return

    #                    pass
                    else:
                        #                    n=len(books)
                        self.total_books = parsedData.getElementsByTagName(
                            'string')[0].firstChild.nodeValue.split(
                                "of")[-1].strip()
                        #                    self.num_pages=parsedData.getElementsByTagName('num-pages')[0].firstChild.nodeValue.split("of")[-1].strip()
                        for i, book in enumerate(books):
                            #                        book_index=" ("+str(i+1)+"/"+str(n)+")"
                            row = []
                            row.append('author:' + str(
                                book.getElementsByTagName('author')
                                [0].firstChild.nodeValue.encode('utf-8')))
                            row.append('title:' + str(
                                book.getElementsByTagName('title')
                                [0].firstChild.nodeValue.encode('utf-8')))
                            #                        synopsis = str(book.getElementsByTagName('brief-synopsis')[0].firstChild.nodeValue.encode('utf-8'))
                            #                        if(len(synopsis) != 0):
                            #                            row.append("synopsis:"+synopsis)
                            row.append('id:' + str(
                                book.getElementsByTagName('id')
                                [0].firstChild.nodeValue.encode('utf-8')))

                            repo.append(row)

                        repo = self.pcs.insert_book_index(
                            repo, self.total_books)

                    self.book_repo = repo
                    self.pcs._event.app.editor.focus(self.WINDOW)
                    self.pcs._event.current_window.buffer._files = self.book_repo
                    self.pcs._event.current_window.buffer.emit(
                        EventType.TEXT_CHANGED)
                    #                self.pcs.copy_buffer()
                    page += 1

                    if menu == "latest":
                        self.l_page_index = page
                        self.l_book_repo = repo

                    if menu == "popular":
                        self.p_page_index = page
                        self.p_book_repo = repo

                else:
                    self.pcs.menu_lvl = "1-e"
                    msg = "Error, server replied with" + str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)

        def pre_fetch_books(self):

            if self.pcs.menu_lvl == "1-1":
                menu = "latest"
                page = self.l_page_index
                repo = self.l_book_repo
                url = self.URL + menu + "/limit/100/format/xml/page/" + str(
                    page) + "?api_key=" + self.KEY

            if self.pcs.menu_lvl == "1-2":
                menu = "popular"
                page = self.p_page_index
                repo = self.p_book_repo
                url = self.URL + menu + "/limit/100/format/xml/page/" + str(
                    page) + "?api_key=" + self.KEY

            if self.pcs.menu_lvl == "1-3-b":
                menu = "search"
                search = self.search_input
                page = self.s_page_index
                repo = self.s_book_repo
                #                url=self.URL + "search/" + self.search_input + "/limit/250/format/page/" + str(page) + "?api_key=" + self.KEY

                if self.pcs.search_lvl == "1":
                    url = self.URL + "id/" + search + "/limit/250/format/page/" + str(
                        page) + "?api_key=" + self.KEY
                if self.pcs.search_lvl == "2":
                    url = self.URL + "search/title/" + search + "/limit/250/format/page/" + str(
                        page) + "?api_key=" + self.KEY
                if self.pcs.search_lvl == "3":
                    url = self.URL + "search/author/" + search + "/limit/250/format/page/" + str(
                        page) + "?api_key=" + self.KEY
                if self.pcs.search_lvl == "4":
                    url = self.URL + "search/" + search + "/limit/250/format/page/" + str(
                        page) + "?api_key=" + self.KEY
                if self.pcs.search_lvl == "5":
                    url = self.URL + "searchFTS/" + search + "/limit/250/format/page/" + str(
                        page) + "?api_key=" + self.KEY

            if self.pcs.menu_lvl == "1-4-b":
                menu = "book_in_category"
                page = self.c_page_index
                repo = self.c_book_repo
                url = "https://api.bookshare.org/book/search/category/" + self.category_name + "/limit/100/format/page/" + str(
                    page) + "?api_key=" + self.KEY

            tmp_repo = []
            self.queued_repo = []
            #        tmp_repo.append([str(page)])
            try:
                data = requests.get(
                    url,
                    verify=False)  # during production remove verify = false
                if (data.status_code == 200):
                    parsedData = minidom.parseString(data.text.encode('utf-8'))
                    books = parsedData.getElementsByTagName('result')
                    if (len(books) == 0):
                        s = parsedData.getElementsByTagName("string")
                        s = s[::-1]
                        msg = ""
                        for i in s:
                            msg = msg + str(i.firstChild.nodeValue) + "."

                        if not repo == []:
                            self.pcs.copy_buffer()
                            self.pcs.menu_lvl = "1-m"
                            self.pcs.show_msg(msg)
    #                        self.pcs._event.app.editor.focus(self.WINDOW)
    #                        self.pcs._event.current_window.buffer._files = [[msg]]
    #                        self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
                        else:
                            if self.pcs.menu_lvl == "1-3-b":
                                self.pcs.menu_lvl = "1-3-e"
                            else:
                                self.pcs.menu_lvl = "1-e"
                            self.pcs.show_msg(msg)
                            self.pcs.show_msg(msg)
                            #                        self.pcs.bs_choice_selection(self.pcs._event, "1") #bs
                            #                        self.pcs._event.app.editor.error('Network is unreachable')
                            return

                    else:
                        self.total_books = parsedData.getElementsByTagName(
                            'string')[0].firstChild.nodeValue.split(
                                "of")[-1].strip()
                        for i, book in enumerate(books):
                            #                        book_index=" ("+str(i+1)+"/"+str(n)+")"
                            row = []
                            row.append('author:' + str(
                                book.getElementsByTagName('author')
                                [0].firstChild.nodeValue.encode('utf-8')))
                            row.append('title:' + str(
                                book.getElementsByTagName('title')
                                [0].firstChild.nodeValue.encode('utf-8')))
                            #                        synopsis = str(book.getElementsByTagName('brief-synopsis')[0].firstChild.nodeValue.encode('utf-8'))
                            #                        if(len(synopsis) != 0):
                            #                            row.append("synopsis:"+synopsis)
                            row.append('id:' + str(
                                book.getElementsByTagName('id')
                                [0].firstChild.nodeValue.encode('utf-8')))
                            tmp_repo.append(row)

                        repo = self.pcs.remove_book_index(repo)
                        tmp_repo = repo + tmp_repo
                        tmp_repo = self.pcs.insert_book_index(
                            tmp_repo, self.total_books)

                    repo = tmp_repo
                    self.book_repo = repo
                    self.queued_repo = repo
                    #                self.pcs.copy_buffer()
                    page += 1

                    if self.pcs.menu_lvl == "1-1":
                        self.l_page_index = page
                        self.l_book_repo = repo
                    if self.pcs.menu_lvl == "1-2":
                        self.p_page_index = page
                        self.p_book_repo = repo
                    if self.pcs.menu_lvl == "1-3-b":
                        self.s_page_index = page
                        self.s_book_repo = repo
                    if self.pcs.menu_lvl == "1-4-b":
                        self.c_page_index = page
                        self.c_book_repo = repo

                else:
                    if self.pcs.menu_lvl == "1-3-b":
                        self.pcs.menu_lvl = "1-3-e"
                    else:
                        self.pcs.menu_lvl = "1-e"
                    msg = "Error, server replied with" + str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)

        def get_latest_books(self):
            # Get latest books from bookshare.org
            #        self.pcs.copy_buffer()

            try:
                if self.l_book_repo == []:
                    self.fetch_books("latest")

                else:
                    self.menu_lvl = "1-1"
                    self.book_repo = self.l_book_repo
                    self.pcs._event.app.editor.focus(self.WINDOW)
                    self.pcs._event.current_window.buffer._files = self.book_repo
                    self.pcs._event.current_window.buffer.emit(
                        EventType.TEXT_CHANGED)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

        def get_popular_books(self):
            # Get popular books from bookshare.org
            try:
                if self.p_book_repo == []:
                    self.fetch_books("popular")
                else:
                    self.menu_lvl = "1-2"
                    self.book_repo = self.p_book_repo
                    self.pcs._event.app.editor.focus(self.WINDOW)
                    self.pcs._event.current_window.buffer._files = self.book_repo
                    self.pcs._event.current_window.buffer.emit(
                        EventType.TEXT_CHANGED)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

        def _set_input_var(self, *args):
            #        self.pcs._event.app.editor.error(str(type(args[0])))
            self.search_input = str(args[-1])
            self.pcs.menu_lvl = "1-3"
            self.search_book()

        def get_search_input(self):
            self.pcs.menu_lvl = "1-3-e"
            self.pcs._event.current_window.buffer._files = [["No match found"]]
            self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
            self.pcs._event.app.editor.input('search input:',
                                             "PROMPT_WINDOW",
                                             on_ok_handler=self._set_input_var)

        def search_book(self):
            # Search books by Title/Author from user given user input
            search = self.search_input
            page = self.s_page_index
            self.s_book_repo = self.book_repo
            repo = self.s_book_repo

            if self.pcs.search_lvl == "1":
                url = self.URL + "id/" + search + "/limit/250/format/page/" + str(
                    page) + "?api_key=" + self.KEY
            if self.pcs.search_lvl == "2":
                url = self.URL + "search/title/" + search + "/limit/250/format/page/" + str(
                    page) + "?api_key=" + self.KEY
            if self.pcs.search_lvl == "3":
                url = self.URL + "search/author/" + search + "/limit/250/format/page/" + str(
                    page) + "?api_key=" + self.KEY
            if self.pcs.search_lvl == "4":
                url = self.URL + "search/" + search + "/limit/250/format/page/" + str(
                    page) + "?api_key=" + self.KEY
            if self.pcs.search_lvl == "5":
                url = self.URL + "searchFTS/" + search + "/limit/250/format/page/" + str(
                    page) + "?api_key=" + self.KEY

            try:
                data = requests.get(
                    url,
                    verify=False)  # during production remove verify = false

                if (data.status_code == 200):
                    parsedData = minidom.parseString(data.text.encode("utf-8"))
                    books = parsedData.getElementsByTagName('result')
                    if (len(books) == 0):
                        s = parsedData.getElementsByTagName("string")
                        s = s[::-1]
                        msg = ""
                        for i in s:
                            msg = msg + str(i.firstChild.nodeValue) + "."

                        if not repo == []:
                            self.pcs.copy_buffer()
                            self.pcs.menu_lvl = "1-m"
                            self.pcs.show_msg(msg)
    #                        self.pcs._event.app.editor.focus(self.WINDOW)
    #                        self.pcs._event.current_window.buffer._files = [[msg]]
    #                        self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
                        else:
                            self.pcs.menu_lvl = "1-3-e"
                            self.pcs.show_msg(msg)
                            #                        self.pcs.bs_choice_selection(self.pcs._event, "1") #bs
                            #                        self.pcs._event.app.editor.error('Network is unreachable')
                            return
                    else:
                        self.total_books = parsedData.getElementsByTagName(
                            'string')[0].firstChild.nodeValue.split(
                                "of")[-1].strip()
                        for book in books:
                            row = []
                            row.append('author:' + str(
                                book.getElementsByTagName('author')
                                [0].firstChild.nodeValue.encode('utf-8')))
                            row.append('title:' + str(
                                book.getElementsByTagName('title')
                                [0].firstChild.nodeValue.encode('utf-8')))
                            #                        synopsis = str(book.getElementsByTagName('brief-synopsis')[0].firstChild.nodeValue.encode('utf-8'))
                            #                        if(len(synopsis) != 0):
                            #                            row.append("synopsis:"+synopsis)
                            row.append('id:' + str(
                                book.getElementsByTagName('id')
                                [0].firstChild.nodeValue.encode('utf-8')))
                            self.book_repo.append(row)

                        self.pcs.menu_lvl = "1-3-b"
                        self.s_book_repo = self.book_repo = self.pcs.insert_book_index(
                            self.book_repo, self.total_books)
                        self.pcs._event.app.editor.focus(self.WINDOW)
                        self.pcs._event.current_window.buffer._files = self.book_repo
                        self.pcs._event.current_window.buffer.emit(
                            EventType.TEXT_CHANGED)
                        page += 1
                        self.s_page_index = page
                        self.pcs.copy_buffer()

                else:
                    self.pcs.menu_lvl = "1-3-e"
                    msg = "Error server replied with: " + str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                search = ""
                self.pcs.menu_lvl = "1-3-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

        def get_book_categories(self):

            #        self.book_repo=[]
            page = 1  #self.c_page_index
            repo = self.c_book_repo
            try:
                data = requests.get(
                    "https://api.bookshare.org/reference/category/list/limit/250/format/page/"
                    + str(page) + "?api_key=" + self.KEY,
                    verify=False)  # during production remove verify = false

                if (data.status_code == 200):
                    parsedData = minidom.parseString(data.text.encode("utf-8"))
                    #                xml=parsedData.toxml('utf-8')

                    categories = parsedData.getElementsByTagName('name')
                    #                print categories

                    if (len(categories) == 0):
                        s = parsedData.getElementsByTagName("string")
                        s = s[::-1]
                        msg = ""
                        for i in s:
                            msg = msg + str(i.firstChild.nodeValue) + "."

                        if not repo == []:
                            self.pcs.copy_buffer()
                            self.pcs.menu_lvl = "1-m"
                            self.pcs.show_msg(msg)
    #                        self.pcs._event.app.editor.focus(self.WINDOW)
    #                        self.pcs._event.current_window.buffer._files = [[msg]]
    #                        self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
                        else:

                            self.pcs.menu_lvl = "1-e"
                            self.pcs.show_msg(msg)
                            #                        self.pcs.bs_choice_selection(self.pcs._event, "1") #bs
                            #                        self.pcs._event.app.editor.error('Network is unreachable')
                            return
                    else:
                        #                    count = 1+(self.latest_page-1)*10
                        #                    all_categories = {}
                        self.total_books = parsedData.getElementsByTagName(
                            'string')[0].firstChild.nodeValue.split(
                                "of")[-1].strip()
                        for category in categories:
                            self.book_repo.append(
                                [category.firstChild.nodeValue])
    #                        all_categories[str(count)] = category.firstChild.nodeValue
    #                        count+=1

                    self.book_repo = self.pcs.insert_book_index(
                        self.book_repo, self.total_books)
                    #                self.book_repo.append([self.pcs._event.current_window.buffer.end_msg])
                    self.pcs._event.app.editor.focus(self.WINDOW)
                    self.pcs._event.current_window.buffer._files = self.book_repo
                    #                self.pcs._event.current_window.buffer.reset()
                    self.pcs._event.current_window.buffer.emit(
                        EventType.TEXT_CHANGED)
                    self.pcs.menu_lvl = "1-4"
                    page += 1
                    self.pcs.copy_buffer()

    #                self.c_page_index=page

                else:
                    self.pcs.menu_lvl = "1-e"
                    msg = "Error, server replied with" + str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

        def category_book_search(self, category_name):
            page = self.c_page_index
            repo = self.book_repo
            try:
                #            data = requests.get(self.URL + "category/" + category_name + "/format/page/?api_key=" + self.KEY, verify=False)
                data = requests.get(
                    "https://api.bookshare.org/book/search/category/" +
                    category_name + "/limit/250/format/page/" + str(page) +
                    "?api_key=" + self.KEY,
                    verify=False)
                if (data.status_code == 200):
                    parsedData = minidom.parseString(data.text.encode("utf-8"))
                    xml = parsedData.toxml('utf-8')
                    books = parsedData.getElementsByTagName('result')

                    if (len(books) == 0):
                        #                    pass
                        self.pcs._event.app.editor.error(category_name)
                        return
                        for i in s:
                            msg = msg + str(i.firstChild.nodeValue) + "."

                        if not repo == []:
                            self.pcs.copy_buffer()
                            self.pcs.menu_lvl = "1-m"
                            self.pcs.show_msg(msg)
    #                        self.pcs._event.app.editor.focus(self.WINDOW)
    #                        self.pcs._event.current_window.buffer._files = [[msg]]
    #                        self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
                        else:
                            self.pcs.menu_lvl = "1-e"
                            self.pcs.show_msg(msg)
                            #                        self.pcs.bs_choice_selection(self.pcs._event, "1") #bs
                            #                        self.pcs._event.app.editor.error('Network is unreachable')
                            return
                    else:
                        self.total_books = parsedData.getElementsByTagName(
                            'string')[0].firstChild.nodeValue.split(
                                "of")[-1].strip()
                        for book in books:
                            row = []
                            row.append('author:' + str(
                                book.getElementsByTagName('author')
                                [0].firstChild.nodeValue.encode('utf-8')))
                            row.append('title:' + str(
                                book.getElementsByTagName('title')
                                [0].firstChild.nodeValue.encode('utf-8')))
                            #                        synopsis = str(book.getElementsByTagName('brief-synopsis')[0].firstChild.nodeValue.encode('utf-8'))
                            #                        if(len(synopsis) != 0):
                            #                            row.append("synopsis:"+synopsis)
                            row.append('id:' + str(
                                book.getElementsByTagName('id')
                                [0].firstChild.nodeValue.encode('utf-8')))
                            self.book_repo.append(row)

                    self.book_repo = self.pcs.insert_book_index(
                        self.book_repo, self.total_books)
                    self.c_book_repo = self.book_repo
                    self.pcs._event.app.editor.focus(self.WINDOW)
                    self.pcs._event.current_window.buffer._files = self.book_repo  #[[msg]]# [[xml]]#
                    self.pcs._event.current_window.buffer.reset()
                    self.pcs._event.current_window.buffer.emit(
                        EventType.TEXT_CHANGED)
                    page += 1
                    self.c_page_index = page
                    self.pcs.menu_lvl = "1-4-b"

                else:
                    self.pcs.menu_lvl = "1-e"
                    msg = "Error, server replied with" + str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                self.category_name = ""
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

        def get_book_id(self, id):
            # Search a particular book by ID
            try:
                data = requests.get(
                    self.URL + "id/" + str(id) + "/format/xml?api_key=" +
                    self.KEY,
                    verify=False)  # during production remove verify = false

                if (data.status_code == 200):
                    row = []
                    parsedData = minidom.parseString(data.text.encode('utf-8'))

                    #                        row=[]
                    #                        row.append('author:'+str(book.getElementsByTagName('author')[0].firstChild.nodeValue.encode('utf-8')))
                    #                        row.append('title:'+str(book.getElementsByTagName('title')[0].firstChild.nodeValue.encode('utf-8')))
                    ##                        row.append('brief-synopsis:'+str(book.getElementsByTagName('brief-synopsis')[0].firstChild.nodeValue.encode('utf-8')))
                    #                        row.append('id:'+str(book.getElementsByTagName('id')[0].firstChild.nodeValue.encode('utf-8')))
                    #                        self.book_repo.append(row)

                    title = 'title:' + str(
                        book.getElementsByTagName('title')
                        [0].firstChild.nodeValue.encode('utf-8'))
                    author = 'author:' + str(
                        book.getElementsByTagName('author')
                        [0].firstChild.nodeValue.encode('utf-8'))
                    synopsis = "synopsis:" + parsedData.getElementsByTagName(
                        'brief-synopsis')[0].encode('utf-8')
                    row.append(title)
                    row.append(author)

                    if (len(synopsis.childNodes) != 0):
                        row.append(synopsis.firstChild.nodeValue)
                    row.append(id)
                    self.book_repo = [row]
                    self.pcs._event.app.editor.focus(self.WINDOW)
                    self.pcs._event.current_window.buffer._files = self.book_repo
                    self.pcs._event.current_window.buffer.reset()
                    self.pcs._event.current_window.buffer.emit(
                        EventType.TEXT_CHANGED)

                else:
                    self.pcs.menu_lvl = "1-e"
                    msg = "Error, server replied with" + str(data.status_code)
                    self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"
                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs.show_msg(msg)
    #            self.pcs._event.app.editor.error('Network is unreachable')

        def _on_password_ok(self, *args):
            self.password = str(args[-1])
            self.pcs._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
            #        self.pcs.copy_buffer()
            #        go_to_prev_state

            self.pcs._event.app.editor.error("Downloading.")

            self.star_download_thread()

        def _on_userid_ok(self, *args):
            self.userid = str(args[-1])

            self.pcs._event.app.editor.input(
                'password:'******'userid:',
                                             "PROMPT_WINDOW",
                                             on_ok_handler=self._on_userid_ok)

        def book_download(self, id):

            #        self.userid="vis2alll"
            #        self.password="******"
            if self.count == 1:
                id = 1930029
                self.count += 1
            elif self.count == 2:
                id = 1932427
                self.count += 1
            else:
                id = 1930040
                self.count = 1
            self.book_id = id
            if self.userid == None:
                self.get_login_credentials()
            else:
                self.pcs._event.app.editor.error("Downloading...")
                self.star_download_thread()

        def star_download_thread(self):

            t = threading.Thread(target=self.start_download)
            t.start()
            self.download_threads.append(t)

        def start_download(self):
            try:
                id = self.book_id

                m = hashlib.md5(str(self.password)).hexdigest()
                data = requests.get(
                    "https://api.bookshare.org/download/content/" + str(id) +
                    "/version/1/for/" + str(self.userid) + "?api_key=" +
                    self.KEY,
                    headers={"X-password": m},
                    stream=True)  # during production remove verify = false

                if data.status_code == 200:
                    if data.headers.get('content-type') == "application/zip":
                        current_dir = os.getcwd()
                        filename = data.headers.get(
                            "content-disposition").partition("=")[2]
                        final_dir = os.path.join(
                            current_dir,
                            str(download_folder) + str(filename)[:-4])
                        if not os.path.exists(final_dir):
                            os.makedirs(final_dir)

                        import zipfile, StringIO
                        z = zipfile.ZipFile(StringIO.StringIO(data.content))
                        z.extractall(final_dir)
                        #                    z.extractall()
                        self.pcs._event.app.editor.error(
                            'Download completed ' + str(filename)[0:50])

                    elif data.headers.get('content-type').startswith(
                            "text/xml"):
                        self.userid = None
                        try:
                            parsedData = minidom.parseString(
                                data.text.encode('utf-8'))
                            #                        sc=parsedData.getElementsByTagName('status-code')[0].firstChild.nodeValue
                            msg = parsedData.getElementsByTagName('string')
                            #                        xml=parsedData.toxml('utf-8')
                            str_lst = []
                            for item in msg:
                                str_lst.append(str(item.firstChild.nodeValue))

                            self.pcs.menu_lvl = "1-m"
                            self.pcs.copy_buffer()
                            self.pcs._event.app.editor.focus(self.WINDOW)
                            self.pcs._event.current_window.buffer._files = [
                                str_lst
                            ]
                            self.pcs._event.current_window.buffer.reset()
                            self.pcs._event.current_window.buffer.emit(
                                EventType.TEXT_CHANGED)
    #                        self.pcs.copy_buffer()

                        except Exception as e:
                            self.userid = None
                            self.pcs.menu_lvl = "1-e"
                            msg = str(e)  #"Network unreachable"
                            self.pcs.show_msg(msg)
    #                        exc_type, exc_obj, exc_tb = sys.exc_info()
    #                        self.pcs._event.app.editor.error("345: "+str(exc_type))

                    else:
                        self.userid = None
                        self.pcs.menu_lvl = "1-e"
                        msg = str(data.headers.get(
                            'content-type')) + "content-type not supported."
                        self.pcs.show_msg(msg)

            except Exception as e:
                self.userid = None
                self.pcs.menu_lvl = "1-e"

                exc_type, exc_obj, tb = sys.exc_info()
                lineno = tb.tb_lineno
                msg = str(e) + str(lineno)  #"Network unreachable"
                self.pcs._event.app.editor.error(msg)
    #            self.pcs.show_msg(msg)

        def logout(self):
            choice = "2"
            self.pcs.choice_selection(self.pcs._event, choice)
            self.login_status = False
            self.userid = None
            self.password = None
            self.pcs._event.app.editor.error('logged out of bookshare')

    except:
        _logger.error('application exited with exception: %r' %
                      traceback.format_exc())
        raise
    finally:
        pass
コード例 #14
0
ファイル: reader.py プロジェクト: vis2alll/pustkalaya
class process_choice_selection():
    try:
        _logger = logger('reader-buffer')

        def __init__(self, window_name=None):
            self._event = None
            self.window_name = window_name
            self.reader_menu_lst = None
            self.lvl = 0
            self.menu_lvl = ""
            self.sp = None
            self.bs = None
            self.login_lvl = ""
            self.login = _login()
            self.menu = ""
            self.next_func = None
            self.handle = None
            self.prev_menu_lvl = None
            self.search_lvl = None
            self.search_menu_lst = None
#            self.prev_total_books=0

        def choice_selection(self, _event, choice):
            self._event = _event
            app = _event.app

            choice = str(choice)
            if choice == '1':

                if self.sp == None:
                    self.sp = SugamyaPustakalya(self)
    #
    #                if not self.login.login_lvl=="sp":
    #                    self.login.login_process(self,_event,"sp")

    #            else:
                self.menu = "sp"
                self.menu_lvl = "1"
                lst = [
                    MenuItem('Latest books', 'l',
                             lambda app: self.sp_choice_selection(app, '1')),
                    MenuItem('Popular books', 'p',
                             lambda app: self.sp_choice_selection(app, '2')),
                    MenuItem('Search Books by', 's',
                             lambda app: self.sp_choice_selection(app, '3')),
                    MenuItem('Book Categories', 'c',
                             lambda app: self.sp_choice_selection(app, '4')),
                    MenuItem('Downloads', 'd',
                             lambda app: self.sp_choice_selection(app, '5')),
                    MenuItem('Logout', 'x',
                             lambda app: self.sp_choice_selection(app, 'x')),
                    MenuItem('Go Back', 'z',
                             lambda app: self.sp_choice_selection(app, 'b')),
                    #                     MenuItem('quits', 'q', lambda app: self.sp_choice_selection(app, 'q'))
                ]

                #                if  self.login.login_lvl=="sp":
                self.get_user_input(app, lst)

    #                else:
    #                    app.editor.message( 'ELSE,READER in sp: ' )

            elif choice == '2':
                if self.bs == None:
                    self.bs = Bookshare(self)
    #                if not self.login.login_lvl=="bs":
    #                    self.login.login_process(self,_event,"bs")

    #            else:
                self.menu = "bs"
                self.menu_lvl = "1"
                lst = [
                    MenuItem('Latest books', 'l',
                             lambda app: self.bs_choice_selection(app, '1')),
                    MenuItem('Popular books', 'p',
                             lambda app: self.bs_choice_selection(app, '2')),
                    MenuItem('Search Books by', 's',
                             lambda app: self.bs_choice_selection(app, '3')),
                    MenuItem('Book Categories', 'c',
                             lambda app: self.bs_choice_selection(app, '4')),
                    #                     MenuItem('Downloads', '5', lambda app: self.bs_choice_selection(app, '5')),
                    MenuItem('Logout', 'x',
                             lambda app: self.bs_choice_selection(app, 'x')),
                    MenuItem('Go Back', 'z',
                             lambda app: self.bs_choice_selection(app, 'b')),
                    #                     MenuItem('quits', 'q', lambda app: self.bs_choice_selection(app, 'q'))
                ]

                #            if  self.login.login_lvl=="bs":
                self.get_user_input(app, lst)

    #            else:
    #                app.editor.message( 'ELSE READER in bs menu: ' )

            elif choice == '3':
                pass
    #            self.menu_lvl="3"
    #            app.editor.message('gutenberg ')
            elif choice == '4':
                pass
    #            self.menu_lvl="4"
    #            app.editor.message('local books ')
            elif choice == 'q':

                def _on_yes(e):
                    self.menu_lvl = "1"
                    try:
                        self.sp = None
                        self.bs = None
                        self.login = _login()
                        #                self._event.current_window.buffer._files=[[""]]
                        self._event.current_window.buffer.reset()
                        #                self._event.current_window.buffer._files=downloaded_files()
                        self.sp.logout()
                    except:
                        pass

                    try:
                        self.bs.logout()
                    except:
                        pass

                def _on_no(e):
                    self.get_user_input(app, self.reader_menu_lst)

                app.editor.confirm('confirm quit?(y/n)',
                                   on_yes_handler=_on_yes,
                                   on_no_handler=_on_no)
            else:
                app.editor.message('\nInvalid choice.\n ')

        def bs_choice_selection(self, app, choice):
            self.bs.book_repo = []
            if choice == '1':
                self.menu_lvl = "1-1"
                #            self.bs.book_repo=[]
                #            self.show_msg("opening..")
                self.bs.get_latest_books()

            elif choice == '2':
                self.menu_lvl = "1-2"
                #            self.bs.book_repo=[]
                self.bs.get_popular_books()

            elif choice == '3':
                self.menu_lvl = "1-3"
                #            self.bs.book_repo=[]

                self.search_menu_lst = [
                    MenuItem(
                        'id', '1',
                        lambda app: self.search_choice_selection(app, '1')),
                    MenuItem(
                        'title ', '2',
                        lambda app: self.search_choice_selection(app, '2')),
                    MenuItem(
                        'author', '3',
                        lambda app: self.search_choice_selection(app, '3')),
                    MenuItem(
                        'title/author', '4',
                        lambda app: self.search_choice_selection(app, '4')),
                    MenuItem(
                        'full text search', '5',
                        lambda app: self.search_choice_selection(app, '5')),
                    MenuItem(
                        'back', 'z',
                        lambda app: self.search_choice_selection(app, 'b')),
                ]

                self.get_user_input(app, self.search_menu_lst)
#                self.bs.get_search_input()

            elif choice == '4':
                self.menu_lvl = "1-4"
                #            self.bs.book_repo=[]
                self.bs.c_page_index = 1
                self.bs.get_book_categories()

            elif choice == '5':
                self.menu_lvl = "1-5"
                #            self.bs.book_repo=[]
                self.all_urls = {}
                self.bs.get_requested_books()

            elif choice == 'x':

                def _on_yes(e):
                    self.bs.logout()

                def _on_no(e):
                    choice = "2"
                    self.choice_selection(self._event, choice)

                app.editor.confirm('confirm logout?(y/n)',
                                   on_yes_handler=_on_yes,
                                   on_no_handler=_on_no)

            elif choice == 'b':
                self.menu_lvl = "1"
                self.get_user_input(app, self.reader_menu_lst)

            elif choice == 'q':

                def _on_yes(e):
                    self.menu_lvl = "1"
                    try:
                        self.bs = None
                        self.login = _login()
                        #                self._event.current_window.buffer._files=[[""]]
                        self._event.current_window.buffer.reset()
                        #                self._event.current_window.buffer._files=downloaded_files()
                        self.bs.logout()
                    except:
                        pass

                def _on_no(e):
                    choice = "2"
                    self.choice_selection(self._event, choice)

                app.editor.confirm('confirm quit?(y/n)',
                                   on_yes_handler=_on_yes,
                                   on_no_handler=_on_no)

            else:
                app.editor.message('\nInvalid choice.\n ')

        def search_choice_selection(self, app, choice):
            handle = None
            if self.menu == "sp":
                handle = self.sp
                mode = "1"
            elif self.menu == "bs":
                handle = self.bs
                mode = "2"

            handle.s_book_repo = handle.book_repo = []

            if choice == '1':
                self.search_lvl = "1"
                handle.s_page_index = 1

            if choice == '2':
                self.search_lvl = "2"
                handle.s_page_index = 1
            if choice == '3':
                self.search_lvl = "3"
                handle.s_page_index = 1
            if choice == '4':
                self.search_lvl = "4"
                handle.s_page_index = 1
            if choice == '5':
                self.search_lvl = "5"
                handle.s_page_index = 1
            if choice == 'b':
                self.menu_lvl = "1-3"
                self.choice_selection(self._event, mode)
                return

            handle.get_search_input()

        def sp_choice_selection(self, app, choice):
            self.sp.book_repo = []
            if choice == '1':
                self.menu_lvl = "1-1"
                #            app.editor.message("fetching books...")
                #            self.sp.book_repo=[]
                self.sp.latest_page = 1
                self.sp.get_latest_books()

            elif choice == '2':
                self.menu_lvl = "1-2"
                #            app.editor.message('Popular books ')
                #            self.sp.book_repo=[]
                self.sp.latest_page = 1
                self.sp.get_popular_books()

            elif choice == '3':
                self.menu_lvl = "1-3"
                #            self.bs.book_repo=[]

                self.search_menu_lst = [
                    MenuItem(
                        'id', '1',
                        lambda app: self.search_choice_selection(app, '1')),
                    MenuItem(
                        'title ', '2',
                        lambda app: self.search_choice_selection(app, '2')),
                    MenuItem(
                        'author', '3',
                        lambda app: self.search_choice_selection(app, '3')),
                    MenuItem(
                        'title/author', '4',
                        lambda app: self.search_choice_selection(app, '4')),
                    #                         MenuItem('full text search', '5', lambda app: self.search_choice_selection(app, '5')),
                    MenuItem(
                        'back', 'z',
                        lambda app: self.search_choice_selection(app, 'b')),
                ]

                self.get_user_input(app, self.search_menu_lst)

            elif choice == '4':
                self.menu_lvl = "1-4"
                #            app.editor.message('Book Categories')
                #            self.sp.book_repo=[]
                self.sp.latest_page = 1
                self.sp.get_book_categories()

            elif choice == '5':
                self.menu_lvl = "1-5"
                #            app.editor.message('Downloads ')
                #            self.sp.book_repo=[]
                self.sp.latest_page = 1
                self.all_urls = {}
                self.sp.get_requested_books()

            elif choice == 'x':

                def _on_yes(e):
                    self.sp.logout()

                def _on_no(e):
                    choice = "1"
                    self.choice_selection(self._event, choice)

                app.editor.confirm('confirm logout?(y/n)',
                                   on_yes_handler=_on_yes,
                                   on_no_handler=_on_no)

            elif choice == 'b':
                self.menu_lvl = "1"
                #                                    app.editor.message('Go Back ')
                self.get_user_input(app, self.reader_menu_lst)
            elif choice == 'q':

                def _on_yes(e):
                    self.menu_lvl = "1"
                    try:
                        self.sp = None
                        self.login = _login()
                        self._event.current_window.buffer.reset()
                        self.sp.logout()
                    except:
                        pass

                def _on_no(e):
                    choice = "1"
                    self.choice_selection(self._event, choice)

                app.editor.confirm('confirm quit?(y/n)',
                                   on_yes_handler=_on_yes,
                                   on_no_handler=_on_no)

            else:
                app.editor.message('\nInvalid choice.\n ')

        def copy_buffer(self):
            try:
                handle = None
                if self.menu == "sp":
                    handle = self.sp
                elif self.menu == "bs":
                    handle = self.bs

                buf = self._event.current_window.buffer
                buf.prev_lvl = buf.lvl
                buf.prev_index = buf.index
                buf.prev_files = buf._files
                buf.prev_total_books = handle.total_books
                self.prev_menu_lvl = self.menu_lvl
            except Exception as e:
                self._event.app.editor.message(str(e))

        def show_msg(self, msg):
            try:
                if not type(msg) == 'list':
                    msg = [[msg]]
                self._event.current_window.buffer._files = msg
                self._event.app.editor.focus(BOOKLIST_WINDOW)  #BOOKLIST_WINDOW
                self._event.current_window.buffer.reset()
                self._event.current_window.buffer.emit(EventType.TEXT_CHANGED)
            except Exception as e:
                self._event.app.editor.message(str(e))

        def remove_book_index(self, repo):
            tmp_repo = repo
            for i, l in enumerate(repo):
                for j, m in enumerate(l):

                    y = m[::-1].find("(")
                    tmp_repo[i][j] = m[:-y - 1]
            return tmp_repo

        def insert_book_index(self, repo, total_books):

            n = total_books  #len(repo)
            for i, l in enumerate(repo):
                for j in range(len(l)):
                    l[j] = l[j] + " (" + str(i + 1) + "/" + str(n) + ")"
            return repo

        def get_user_input(self, app, lst):
            if self.lvl == 0:
                self.reader_menu_lst = lst
                self.lvl += 1

            app.editor.create_menu(self.window_name, lst)

    except:
        _logger.error('application exited with exception: %r' %
                      traceback.format_exc())
        raise
    finally:
        pass