def _fetch_gdata(self): """ Extract gdata values, fetch gdata if necessary. """ if self._have_gdata: return item = self._get_video_gdata(self.videoid)['items'][0] snippet = item['snippet'] self._published = uni(snippet['publishedAt']) self._description = uni(snippet["description"]) self._category = get_categoryname(snippet['categoryId']) # TODO: Make sure actual usename is not available through the api self._username = uni(snippet['channelTitle']) statistics = item["statistics"] self._likes = int(statistics["likeCount"]) self._dislikes = int(statistics["dislikeCount"]) self._have_gdata = 1
def generate_songlist_display(song=False, zeromsg=None): """ Generate list of choices from a song list.""" # pylint: disable=R0914 if g.browse_mode == "ytpl": return generate_playlist_display() max_results = getxy().max_results if not g.model: g.message = zeromsg or "Enter /search-term to search or [h]elp" return logo(c.g) + "\n\n" g.rprompt = page_msg(g.current_page) have_meta = all(x.ytid in g.meta for x in g.model) user_columns = _get_user_columns() if have_meta else [] maxlength = max(x.length for x in g.model) lengthsize = 8 if maxlength > 35999 else 7 lengthsize = 6 if maxlength < 6000 else lengthsize reserved = 9 + lengthsize + len(user_columns) cw = getxy().width cw -= 1 title_size = cw - sum(1 + x['size'] for x in user_columns) - reserved before = [{"name": "idx", "size": 3, "heading": "Num"}, {"name": "title", "size": title_size, "heading": "Title"}] after = [{"name": "length", "size": lengthsize, "heading": "Length"}] columns = before + user_columns + after for n, column in enumerate(columns): column['idx'] = n column['sign'] = "-" if not column['name'] == "length" else "" fmt = ["%{}{}s ".format(x['sign'], x['size']) for x in columns] fmtrow = fmt[0:1] + ["%s "] + fmt[2:] fmt, fmtrow = "".join(fmt).strip(), "".join(fmtrow).strip() titles = tuple([x['heading'][:x['size']] for x in columns]) hrow = c.ul + fmt % titles + c.w out = "\n" + hrow + "\n" for n, x in enumerate(g.model[:max_results]): col = (c.r if n % 2 == 0 else c.p) if not song else c.b details = {'title': x.title, "length": fmt_time(x.length)} details = copy.copy(g.meta[x.ytid]) if have_meta else details otitle = details['title'] details['idx'] = "%2d" % (n + 1) details['title'] = uea_pad(columns[1]['size'], otitle) cat = details.get('category') or '-' details['category'] = pafy.get_categoryname(cat) details['ytid'] = x.ytid data = [] for z in columns: fieldsize, field = z['size'], z['name'] if len(details[field]) > fieldsize: details[field] = details[field][:fieldsize] data.append(details[field]) line = fmtrow % tuple(data) col = col if not song or song != g.model[n] else c.p line = col + line + c.w out += line + "\n" return out + "\n" * (5 - len(g.model)) if not song else out
def generate_songlist_display(song=False, zeromsg=None): """ Generate list of choices from a song list.""" # pylint: disable=R0914 if g.browse_mode == "ytpl": return generate_playlist_display() max_results = getxy().max_results if not g.model: g.message = zeromsg or "Enter /search-term to search or [h]elp" return logo(c.g) + "\n\n" g.rprompt = page_msg(g.current_page) have_meta = all(x.ytid in g.meta for x in g.model) user_columns = _get_user_columns() if have_meta else [] maxlength = max(x.length for x in g.model) lengthsize = 8 if maxlength > 35999 else 7 lengthsize = 6 if maxlength < 6000 else lengthsize reserved = 9 + lengthsize + len(user_columns) cw = getxy().width cw -= 1 title_size = cw - sum(1 + x['size'] for x in user_columns) - reserved before = [{"name": "idx", "size": 3, "heading": "Num"}, {"name": "title", "size": title_size, "heading": "Title"}] after = [{"name": "length", "size": lengthsize, "heading": "Length"}] columns = before + user_columns + after for n, column in enumerate(columns): column['idx'] = n column['sign'] = "-" if not column['name'] == "length" else "" fmt = ["%{}{}s ".format(x['sign'], x['size']) for x in columns] fmtrow = fmt[0:1] + ["%s "] + fmt[2:] fmt, fmtrow = "".join(fmt).strip(), "".join(fmtrow).strip() titles = tuple([x['heading'][:x['size']] for x in columns]) hrow = c.ul + fmt % titles + c.w out = "\n" + hrow + "\n" for n, x in enumerate(g.model[:max_results]): col = (c.r if n % 2 == 0 else c.p) if not song else c.b details = {'title': x.title, "length": fmt_time(x.length)} details = copy.copy(g.meta[x.ytid]) if have_meta else details otitle = details['title'] details['idx'] = "%2d" % (n + 1) details['title'] = uea_pad(columns[1]['size'], otitle) if have_meta: if g.meta[x.ytid]['liveBroadcastContent'] == 'live': details['length'] = 'live' cat = details.get('category') or '-' details['category'] = pafy.get_categoryname(cat) details['ytid'] = x.ytid line = '' for z in columns: fieldsize, field, direction = z['size'], z['name'], "<" if z['sign'] == "-" else ">" line += uea_pad(fieldsize, details[field], direction) if not columns[-1] == z: line += " " col = col if not song or song != g.model[n] else c.p line = col + line + c.w out += line + "\n" return out + "\n" * (5 - len(g.model)) if not song else out
def __iter__(self): if self._items is not None: for i in self._items: yield i return items = [] # playlist items specific metadata query = {'part': 'snippet', 'maxResults': 50, 'playlistId': self.plid} while True: playlistitems = call_gdata('playlistItems', query) query2 = { 'part': 'contentDetails,snippet,statistics', 'maxResults': 50, 'id': ','.join(i['snippet']['resourceId']['videoId'] for i in playlistitems['items']) } wdata = call_gdata('videos', query2) for v, vextra in zip(playlistitems['items'], wdata['items']): stats = vextra.get('statistics', {}) vid_data = dict( title=v['snippet']['title'], author=v['snippet']['channelTitle'], thumbnail=v['snippet'].get('thumbnails', {}).get('default', {}).get('url'), description=v['snippet']['description'], length_seconds=parseISO8591( vextra['contentDetails']['duration']), category=get_categoryname(vextra['snippet']['categoryId']), views=stats.get('viewCount', 0), likes=stats.get('likeCount', 0), dislikes=stats.get('dislikeCount', 0), comments=stats.get('commentCount', 0), ) try: pafy_obj = new(v['snippet']['resourceId']['videoId'], basic=self._basic, gdata=self._gdata, size=self._size, callback=self._callback) except IOError as e: if self.callback: self.callback("%s: %s" % (v['title'], e.message)) continue pafy_obj.populate_from_playlist(vid_data) items.append(pafy_obj) if self._callback: self._callback("Added video: %s" % vid_data['title']) yield pafy_obj if not playlistitems.get('nextPageToken'): break query['pageToken'] = playlistitems['nextPageToken'] self._items = items