Source code for hal.internet.services.youtube
# -*- coding: utf-8 -*-
"""Get rss feed for youtube channel"""
from bs4 import BeautifulSoup
from hal.internet.web import Webpage
# last dot to avoid pay/adv wall
YOUTUBE_USER_BASE_URL = "https://www.youtube.com/user/"
YOUTUBE_CHANNEL_BASE_URL = "https://www.youtube.com/c/"
YOUTUBE_FEED_BASE_URL = "https://www.youtube.com/feeds/videos.xml?channel_id="
[docs]class YoutubeChannel:
"""Youtube channel"""
def __init__(self, url):
self.url = url
[docs] def get_channel_page(self):
"""Fetches source page
:return: source page of youtube channel
"""
source_page = Webpage(self.url).get_html_source() # get source page of channel
return source_page
[docs] def get_channel_id(self):
"""Fetches id
:return: id of youtube channel
"""
soup = BeautifulSoup(
self.get_channel_page(), "lxml"
) # parser for source page
return soup.find_all('link', {'rel': 'canonical'})[0]['href'].split('/')[-1]
[docs] def get_feed_url(self):
"""Fetches RSS url
:return: rss url feed of youtube channel
"""
channel_id = self.get_channel_id() # get id
return YoutubeChannel.get_feed_url_from_id(channel_id)
[docs] @staticmethod
def get_feed_url_from_id(channel_id):
"""Fetches feed url
:param channel_id: id of channel
:return: feed url
"""
return YOUTUBE_FEED_BASE_URL + channel_id
[docs] @staticmethod
def get_feed_url_from_video(video_url):
"""Gets channel id and then creates feed url
:param video_url: Url of video
:return: feed url
"""
web_page = Webpage(video_url)
channel_id = YoutubeChannel(video_url).get_channel_id()
return YoutubeChannel.get_feed_url_from_id(channel_id)
[docs] @staticmethod
def get_feed_url_from_channel(channel_name):
url = YOUTUBE_CHANNEL_BASE_URL + channel_name
channel_id = YoutubeChannel(url).get_channel_id()
return YoutubeChannel.get_feed_url_from_id(channel_id)