예제 #1
0
def archive_item(item_id):
    access_token = WF.get_password('pocket_access_token')
    pocket_instance = Pocket(config.CONSUMER_KEY, access_token)
    try:
        pocket_instance.archive(item_id, wait=False)
        return 'Link archived'
    except PocketException:
        return 'Connection error'
예제 #2
0
def archive_item(item_id):
    access_token = wf.get_password('pocket_access_token')
    pocket_instance = Pocket(config.CONSUMER_KEY, access_token)
    try:
        pocket_instance.archive(item_id, wait=False)
        return 'Link archived'
    except Exception:
        return 'Connection error'
예제 #3
0
class PocketApp:
    DEFAULT_WORDS_PER_MINUTE = 180
    REDIRECT_URL = 'http://www.google.com'

    def __init__(self):
        self._configs = Configs()
        self._storage = Storage()

        self._pocket = Pocket(self._configs.get('consumer_key'),
                              self._configs.get('access_token'))

    def configure(self, consumer_key, access_token, words_per_minute,
                  sort_field):
        self._configs.set('consumer_key', consumer_key)
        self._configs.set('access_token', access_token)
        self._configs.set('words_per_minute', words_per_minute)
        self._configs.set('sort_field', sort_field)
        self._configs.set('last_fetch', 0)
        self._configs.write()

        self._storage.clear()

        self._pocket = Pocket(consumer_key, access_token)

    def init_consumer_key(self, consumer_key):
        self._pocket = Pocket(consumer_key)

    def get_request_token(self):
        return self._pocket.get_request_token(self.REDIRECT_URL)

    def get_access_token(self, request_token):
        return self._pocket.get_access_token(request_token)

    def add_article(self, url, title=None, tags=None):
        if isinstance(tags, tuple):
            tags = ','.join(list(tags))

        try:
            return self._pocket.add(url, title, tags)
        except PocketException as e:
            raise_from(self._check_exception(e), e)

    def get_articles(self, limit=None, order=None):
        if self._storage.is_empty():
            self.fetch_articles(True)

        articles = self._storage.read(limit, order)
        sort_field = self._configs.get('sort_field')
        if not sort_field:
            sort_field = 'reading_time'

        articles = sorted(articles, key=itemgetter(sort_field))
        return articles

    def search(self, search, state, tag, sort):
        try:
            # search_state = self._configs.get('search_state')
            # if search_state and not state:
            #     state = search_state
            articles = self._pocket.retrieve(search=search,
                                             state=state,
                                             tag=tag,
                                             sort=sort)
            return self._get_articles_index(articles)
        except PocketException as e:
            raise_from(self._check_exception(e), e)

    def archive_article(self, item_id):
        try:
            self._pocket.archive(int(item_id)).commit()
        except PocketException as e:
            raise_from(self._check_exception(e), e)

    def find_article(self, item_id):
        index = self._storage.read()

        for article in index:
            if str(article['id']) == str(item_id):
                return article

        return None

    def fetch_articles(self, output_progress=False):
        spinner = None
        if output_progress:
            spinner = Spinner('Loading articles ')

        articles_index = []

        last_fetch = self._configs.get('last_fetch')

        offset = 0
        count = 20
        while (True):
            try:
                articles = self._pocket.retrieve(state='unread',
                                                 count=count,
                                                 offset=offset,
                                                 since=last_fetch)
            except PocketException as e:
                spinner.finish()
                raise_from(self._check_exception(e), e)

            if not articles['list']:
                break

            articles_index.extend(self._get_articles_index(articles))

            offset += count
            if spinner:
                spinner.next()

        if spinner:
            spinner.finish()

        sort_field = self._configs.get('sort_field')
        if not sort_field:
            sort_field = 'reading_time'

        articles_index = sorted(articles_index, key=itemgetter(sort_field))
        self._storage.write(articles_index)

        self._configs.set('last_fetch', self._get_timestamp(datetime.now()))
        self._configs.write()

    def _get_articles_index(self, articles):
        wpm = self._configs.get('words_per_minute')
        if not wpm:
            wpm = self.DEFAULT_WORDS_PER_MINUTE
        wpm = int(wpm)

        articles_index = []

        articles_list = articles['list']
        if isinstance(articles_list, list) and len(articles_list) == 0:
            return articles_index

        for article in articles_list.values():
            word_count = int(article.get('word_count', 0))
            if word_count == 0:
                reading_time = -1
            else:
                reading_time = int(math.ceil(word_count / wpm))

            title = article.get('resolved_title', None)
            if not title:
                title = article['given_title']

            url = article.get('resolved_url', None)
            if not url:
                url = article['given_url']

            index = {
                'id': article['item_id'],
                'title': title,
                'url': url,
                'word_count': word_count,
                'reading_time': reading_time
            }

            articles_index.append(index)

        return articles_index

    def _get_timestamp(self, date):
        return int(time.mktime(date.timetuple()))

    def _check_exception(self, e):
        if isinstance(e, PocketAutException):
            raise AppNotConfigured('Application is not configured')

        raise AppException(e.message)
예제 #4
0
class PocketHelper:
    
    __metaclass__ = Singleton
    
    def __init__(self):
        self.p = Pocket(consumer_key=Config.POCKET_CONSUMER_KEY,access_token=Config.POCKET_ACCESS_TOKEN)
        
    def run_spotify(self,item,url,function_to_run, key):
        if 'spotify' in url.lower():
            logger.info(u'Getting url for {} from Pocket'.format(item['resolved_title']))
            flag = False
            strict = False
            collect_skipped = False
            delete = False
            if 'tags' in item:
                if 'sort' in item['tags']:
                    flag = True
                if 'strict' in item['tags']:
                    strict = True
                if 'collect' in item['tags']:
                    collect_skipped = True
                if 'delete' in item['tags']:
                    delete = True
            logger.info('url: {}, sort: {}, strict: {}, collect: {}, delete: {}'.format(url,flag, strict, collect_skipped, delete))
            if delete:
                self.delete_playlist_mark_read(playlist_url=url,key=key)
            else:
                function_to_run(url,flag,strict, collect_skipped)
    
    def run_youtube(self,item,url,function_to_run, key):
        if 'youtube' in url.lower():
            logger.info(u'Getting url for {} from Pocket'.format(item['resolved_title']))
            limit = None
            strict = False
            collect_skipped = False
            delete = False
            if 'tags' in item:
                if any(key.startswith('recent') for key in item['tags']):
                    for key in item['tags'].keys():
                        if key.startswith('recent'):
                            limit = int(key.split('recent')[-1])
                        if key.startswith('strict'):
                            strict = True
                        if key.startswith('collect'):
                            collect_skipped = True
                        if key.startswith('delete'):
                            delete = True
                        
            logger.debug('url: {}, limit: {}, strict: {}, collect: {}, delete: {}'.format(url,limit, strict, collect_skipped, delete))
            if delete:
                self.delete_playlist_mark_read(playlist_url=url,limit=limit,key=key)
            else:
                function_to_run(url,limit,strict, collect_skipped)
    
    def delete_playlist_mark_read(self, playlist_url,key,limit=None):
        if 'youtube' in playlist_url:
            youtube=Youtube()
            playlist_name, playlist_desc, playlist_id = youtube.get_playlist_id_name_description(playlist_url, limit)
        elif 'spotify' in playlist_url:
            spotify = Spotify()
            playlist_name, playlist_desc, tracks = spotify.get_playlist_name_desc_tracks(playlist_url)
        gmusic = GoogleMusic()    
        gmusic.delete_playlist_if_exists(playlist_name)
        self.p.archive(key)
        self.p.commit()

    def scan_items(self,function_to_run, youtube=False, spotify=False):
        if (youtube is None) and (spotify is None):
            raise ValueError('Either Youtube flag or Spotify Flag should be given')
        logger.info('Scanning Pocket........')
        items=self.p.retrieve(state='unread', detailType='complete')
        for key in items['list'].keys():
            item = items['list'][key]
            url = item['given_url']
            if spotify:
                self.run_spotify(function_to_run=function_to_run, item=item, url=url, key=key)
            if youtube:
                self.run_youtube(function_to_run=function_to_run, item=item, url=url,key=key)
        logger.info('Scanning Pocket completed')
예제 #5
0
파일: app.py 프로젝트: jean/pocket-cli
class PocketApp:
    DEFAULT_WORDS_PER_MINUTE = 180
    REDIRECT_URL = 'http://www.google.com'

    def __init__(self):
        self._configs = Configs()
        self._storage = Storage()

        self._pocket = Pocket(
            self._configs.get('consumer_key'),
            self._configs.get('access_token')
        )

    def configure(self, consumer_key, access_token,
                  words_per_minute, sort_field):
        self._configs.set('consumer_key', consumer_key)
        self._configs.set('access_token', access_token)
        self._configs.set('words_per_minute', words_per_minute)
        self._configs.set('sort_field', sort_field)
        self._configs.set('last_fetch', 0)
        self._configs.write()

        self._storage.clear()

    def get_request_token(self, consumer_key):
        return self._pocket.get_request_token(
            consumer_key, self.REDIRECT_URL
        )

    def get_access_token(self, consumer_key, request_token):
        return self._pocket.get_access_token(
            consumer_key, request_token
        )

    def add_article(self, url, title=None, tags=None):
        if isinstance(tags, tuple):
            tags = ','.join(list(tags))

        try:
            return self._pocket.add(url, title, tags)
        except PocketException as e:
            raise_from(self._check_exception(e), e)

    def get_articles(self, limit=None, order=None):
        if self._storage.is_empty():
            self.fetch_articles(True)

        articles = self._storage.read(limit, order)
        sort_field = self._configs.get('sort_field')
        if not sort_field:
            sort_field = 'reading_time'

        articles = sorted(articles,
                          key=itemgetter(sort_field))
        return articles

    def search(self, search, state, tag, sort):
        try:
            articles = self._pocket.retrieve(search=search,
                                             state=state,
                                             tag=tag,
                                             sort=sort)
            return self._get_articles_index(articles)
        except PocketException as e:
            raise_from(self._check_exception(e), e)

    def archive_article(self, item_id):
        try:
            self._pocket.archive(int(item_id)).commit()
        except PocketException as e:
            raise_from(self._check_exception(e), e)

    def find_article(self, item_id):
        index = self._storage.read()

        for article in index:
            if str(article['id']) == str(item_id):
                return article

        return None

    def fetch_articles(self, output_progress=False):
        spinner = None
        if output_progress:
            spinner = Spinner('Loading articles ')

        articles_index = []

        last_fetch = self._configs.get('last_fetch')

        offset = 0
        count = 20
        while(True):
            try:
                articles = self._pocket.retrieve(
                    state='unread',
                    count=count,
                    offset=offset,
                    since=last_fetch
                )
            except PocketException as e:
                spinner.finish()
                raise_from(self._check_exception(e), e)

            if not articles['list']:
                break

            articles_index.extend(self._get_articles_index(articles))

            offset += count
            if spinner:
                spinner.next()

        if spinner:
            spinner.finish()

        sort_field = self._configs.get('sort_field')
        if not sort_field:
            sort_field = 'reading_time'

        articles_index = sorted(articles_index,
                                key=itemgetter(sort_field))
        self._storage.write(articles_index)

        self._configs.set('last_fetch', self._get_timestamp(datetime.now()))
        self._configs.write()

    def _get_articles_index(self, articles):
        wpm = self._configs.get('words_per_minute')
        if not wpm:
            wpm = self.DEFAULT_WORDS_PER_MINUTE
        wpm = int(wpm)

        articles_index = []

        articles_list = articles['list']
        if isinstance(articles_list, list) and len(articles_list) == 0:
            return articles_index

        for article in articles_list.values():
            word_count = int(article['word_count'])
            if word_count == 0:
                reading_time = -1
            else:
                reading_time = math.ceil(word_count / wpm)

            title = article['resolved_title']
            if not title:
                title = article['given_title']

            url = article['resolved_url']
            if not url:
                url = article['given_url']

            index = {
                'id': article['item_id'],
                'title': title,
                'url': url,
                'word_count': article['word_count'],
                'reading_time': reading_time
            }

            articles_index.append(index)

        return articles_index

    def _get_timestamp(self, date):
        return int(time.mktime(date.timetuple()))

    def _check_exception(self, e):
        if isinstance(e, PocketAutException):
            raise AppNotConfigured('Application is not configured')

        raise AppException(e.message)