diff --git a/src/Channel/SVT/__init__.py b/src/Channel/SVT/__init__.py index fa2bef2..62c40ea 100644 --- a/src/Channel/SVT/__init__.py +++ b/src/Channel/SVT/__init__.py @@ -26,7 +26,9 @@ class SVT(Channel): def __init__(self, svt_id: str) -> None: chan_dict = resolve_svt_channel(svt_id) - super().__init__('SVT', default_rss_url, chan_dict['thumbnail_url']) + logo = chan_dict['thumbnail'] + name = chan_dict['name'] + super().__init__('SVT', default_rss_url,logo,name) if os.path.exists(self.m_cachefile): with open(self.m_cachefile, 'rb') as cachehandle: @@ -97,7 +99,7 @@ class SVT(Channel): title = chan_dict['name'] published_parsed = datetime.now() description = "Live channel stream" - thumbnail = make_bitmap_from_url(chan_dict['thumbnail_url']) + thumbnail = chan_dict['thumbnail'] if resolved_link: item = Item(description, resolved_link, self.m_provider_name, published_parsed, thumbnail, title) diff --git a/src/Channel/YouTube/__init__.py b/src/Channel/YouTube/__init__.py index 0c266ad..74603d1 100644 --- a/src/Channel/YouTube/__init__.py +++ b/src/Channel/YouTube/__init__.py @@ -13,7 +13,7 @@ from youtube_dl import YoutubeDL as yt from Channel import Channel from Items import Item -from Utils import get_default_log_url, make_bitmap_from_url +from Utils import get_default_logo, make_bitmap_from_url class YouTube(Channel): @@ -22,11 +22,11 @@ class YouTube(Channel): def __init__(self, channel_id) -> None: self.m_channel_id = channel_id + self.m_info = get_info(channel_id) rss_url = 'https://www.youtube.com/feeds/videos.xml?channel_id={}'.format( channel_id) - logo_url = get_default_log_url('YouTube') - super().__init__(channel_id, rss_url, logo_url) - self.set_avatar() + self.m_logo = get_default_logo('YouTube') + super().__init__(channel_id, rss_url, self.m_logo, self.m_info['title']) self.m_items: Union[list[Item], None] = None if os.path.exists(self.m_cachefile): @@ -37,22 +37,6 @@ class YouTube(Channel): kwargs={}) self.m_thr.start() - def set_avatar(self) -> None: - info = get_info(self.m_channel_id) - bmap = self.get_logo_as_bitmap() - title = info['title'] - dc = wx.MemoryDC(bmap) - cblack = wx.Colour(0, 0, 0) - cwhite = wx.Colour(255, 255, 255) - dc.SetTextForeground(cwhite) - dc.SetTextBackground(cblack) - dc.SetFont(wx.Font().Bold()) - dc.SetBackgroundMode(wx.BRUSHSTYLE_SOLID) - w, h = dc.GetSize() - tw, th = dc.GetTextExtent(title) - dc.DrawText(title, (w - tw) / 2, (h - th) / 2) #display text in center - del dc - self.m_logo = bmap def wait(self) -> bool: return self.m_thr.is_alive() @@ -112,7 +96,8 @@ class YouTube(Channel): pickle.dump(self.m_cache, cachehandle) -def get_info(channel_id: str) -> str: +def get_info(channel_id: str) -> dict: + info: dict = {'title': 'unknown'} link = 'https://www.youtube.com/channel/{}'.format(channel_id) ydl_opts = {'extract_flat': True, 'skip_download': True} with yt(ydl_opts) as ydl: diff --git a/src/Channel/__init__.py b/src/Channel/__init__.py index 4bf793c..96d86e3 100644 --- a/src/Channel/__init__.py +++ b/src/Channel/__init__.py @@ -1,25 +1,21 @@ #!/usr/bin/env python3 -import io from typing import Union -import requests import wx from Items import Item -from Utils import get_default_log_url, make_bitmap_from_url class Channel: def __init__(self, provider_name: str, feed: str, - logo_url: str = '') -> None: - if not logo_url: - logo_url = get_default_logo_url() - self.m_logo_url = logo_url - self.m_logo = make_bitmap_from_url(self.m_logo_url) + logo: wx.Bitmap, + name: str) -> None: + self.m_logo = logo self.m_provider_name = provider_name + self.m_name = name self.m_feed = feed self.m_items: Union[list[Item], None] = None @@ -32,6 +28,9 @@ class Channel: def get_items(self) -> Union[list[Item], None]: return self.m_items + def get_name(self) -> str: + return self.m_name + def get_provider_name(self) -> str: return self.m_provider_name @@ -42,7 +41,7 @@ class Channel: return False def get_latest_item(self) -> Item: - return self.m_items[0] + return self.m_items[0] # type: ignore def set_items(self, items: list[Item]) -> None: self.m_items = items diff --git a/src/ChannelProvider/__init__.py b/src/ChannelProvider/__init__.py index a2df2fe..6d1a1cd 100644 --- a/src/ChannelProvider/__init__.py +++ b/src/ChannelProvider/__init__.py @@ -1,20 +1,19 @@ #/usr/bin/env python3 -import io import threading import time +from os import path -import requests import wx from Channel import Channel -from Utils import get_default_log_url, make_bitmap_from_url, write_on_bitmap +from Utils import get_default_logo +MYPATH = path.dirname(path.abspath(__file__)) class ChannelProvider: def __init__(self, providerid: str, channels=list()): self.m_id = providerid - self.m_logo_url = get_default_log_url(providerid) - self.m_logo: wx.Bitmap = make_bitmap_from_url(self.m_logo_url) + self.m_logo: wx.Bitmap = get_default_logo(providerid) self.m_channels: list[Channel] = channels if len(self.m_channels) > 0: self.m_thr = threading.Thread(target=self.make_latest, @@ -38,9 +37,6 @@ class ChannelProvider: def get_name(self) -> str: return self.m_id - def get_logo_url(self) -> str: - links: dict = {'ch-svt1'} - def make_latest(self) -> None: items = list() for chan in self.m_channels: @@ -48,8 +44,6 @@ class ChannelProvider: time.sleep(1) items.append(chan.get_latest_item()) - channel = Channel(self.get_name, None, self.m_logo_url) + channel = Channel(self.get_name, None, self.m_logo, "Latest videos") channel.set_items(items) - temp = self.get_logo_as_bitmap() - channel.set_logo(write_on_bitmap("Latest videos from all channels",temp)) self.append_channel(channel) diff --git a/src/Utils/__init__.py b/src/Utils/__init__.py index ee8366f..8f8ab6e 100644 --- a/src/Utils/__init__.py +++ b/src/Utils/__init__.py @@ -1,27 +1,54 @@ #!/usr/bin/env python3 import io +from os import path import requests import wx -from copy import copy +from typing import Union, Callable +SIZE = wx.Size(200,135) +MYPATH = path.dirname(path.abspath(__file__)) -def get_default_log_url(providerid: str = 'default') -> str: +def get_default_logo(providerid: str = 'default') -> wx.Bitmap: if providerid == 'SVT': - return 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Logotyp_SVT_Play.png/480px-Logotyp_SVT_Play.jpg' + return wx.Bitmap('{}/assets/SVT.png'.format(MYPATH)) if providerid == 'YouTube': - return 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Youtube.png/480px-Youtube.jpg' - + return wx.Bitmap('{}/assets/YouTube.png'.format(MYPATH)) else: - return 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Cartoon_Hand_Playing_Multiple_Online_Videos.svg/480px-Cartoon_Hand_Playing_Multiple_Online_Videos.svg.jpg' + return wx.Bitmap('{}/assets/Default.png'.format(MYPATH)) + +def make_sized_button(parent_pnl: wx.Panel, bitmap_or_str: Union[wx.Bitmap,str], text: str, callback: Callable) -> wx.BoxSizer: + btn_sizer = wx.BoxSizer(wx.HORIZONTAL) + if type(bitmap_or_str) == type(str): + if bitmap_or_str.startswith('http'): # type: ignore + bitmap = make_bitmap_from_url(bitmap_or_str) # type: ignore + else: + bitmap = wx.Bitmap(bitmap_or_str, wx.BITMAP_TYPE_ANY) + else: + bitmap = bitmap_or_str + btn_style = wx.BORDER_NONE | wx.BU_AUTODRAW | wx.BU_EXACTFIT | wx.BU_NOTEXT + btn_logo = wx.BitmapButton(parent_pnl, wx.ID_ANY, bitmap , style=btn_style) + btn_logo.SetMinSize(SIZE) + btn_logo.SetToolTip(text) + btn_sizer.Add(btn_logo, 0, wx.BOTTOM | wx.EXPAND | wx.LEFT | wx.TOP, 1) + + btn_text = wx.Button(parent_pnl, wx.ID_ANY, text, style=wx.BORDER_NONE | wx.BU_AUTODRAW) + btn_text.SetMinSize(SIZE) + btn_text.SetToolTip(text) + btn_sizer.Add(btn_text, 0, wx.BOTTOM | wx.RIGHT | wx.TOP, 1) + parent_pnl.Bind(wx.EVT_BUTTON, callback, btn_logo) + parent_pnl.Bind(wx.EVT_BUTTON, callback, btn_text) + + return btn_sizer -def make_bitmap_from_url(logo_url: str = get_default_log_url()) -> wx.Bitmap: +def make_bitmap_from_url(logo_url: str ) -> wx.Bitmap: res = requests.get(logo_url) content = res.content content_bytes = io.BytesIO(content) - logo = wx.Image(content_bytes, type=wx.BITMAP_TYPE_ANY, index=-1) - return wx.Bitmap(logo) + image = wx.Image(content_bytes, type=wx.BITMAP_TYPE_ANY, index=-1) + image = image.Resize(SIZE, (0,0)) + return wx.Bitmap(image) def resolve_svt_channel(svt_id: str) -> dict: @@ -29,36 +56,31 @@ def resolve_svt_channel(svt_id: str) -> dict: "ch-barnkanalen": { "name": "Barnkanalen", - "thumbnail_url": - "https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/SVT_Barnkanalen_logo_2008%E2%80%932012.svg/480px-SVT_Barnkanalen_logo_2008%E2%80%932012.svg.jpg" + "thumbnail": wx.Bitmap('{}/assets/Barnkanalen.png'.format(MYPATH)) }, "ch-svt1": { "name": "SVT 1", - "thumbnail_url": - "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/SVT1_logo_2012.svg/480px-SVT1_logo_2012.svg.jpg" + "thumbnail": wx.Bitmap('{}/assets/SVT1.png'.format(MYPATH)) }, "ch-svt2": { "name": "SVT 2", - "thumbnail_url": - "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/SVT2_logo_2012.svg/480px-SVT2_logo_2012.svg.jpg" + "thumbnail": wx.Bitmap('{}/assets/SVT2.png'.format(MYPATH)) }, "ch-svt24": { "name": "SVT 24", - "thumbnail_url": - "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/SVT24_logo.svg/480px-SVT24_logo.svg.jpg" + "thumbnail": wx.Bitmap('{}/assets/SVT24.png'.format(MYPATH)) }, "kunskapskanalen": { "name": "Kunskapskanalen", - "thumbnail_url": - "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Kunskapskanalen_logo.png/480px-Kunskapskanalen_logo.jpg" + "thumbnail": wx.Bitmap('{}/assets/Kunskapskanalen.png'.format(MYPATH)) }, "feed": { "name": "Senaste program", - "thumbnail_url": get_default_log_url('SVT') + "thumbnail": wx.Bitmap('{}/assets/SVT.png'.format(MYPATH)) }, } diff --git a/src/Utils/assets/Barnkanalen.png b/src/Utils/assets/Barnkanalen.png new file mode 100644 index 0000000..676dc96 Binary files /dev/null and b/src/Utils/assets/Barnkanalen.png differ diff --git a/src/Utils/assets/Default.png b/src/Utils/assets/Default.png new file mode 100644 index 0000000..44a4c6f Binary files /dev/null and b/src/Utils/assets/Default.png differ diff --git a/src/Utils/assets/Kunskapskanalen.png b/src/Utils/assets/Kunskapskanalen.png new file mode 100644 index 0000000..0f89634 Binary files /dev/null and b/src/Utils/assets/Kunskapskanalen.png differ diff --git a/src/Utils/assets/SVT.png b/src/Utils/assets/SVT.png new file mode 100644 index 0000000..ab6f49b Binary files /dev/null and b/src/Utils/assets/SVT.png differ diff --git a/src/Utils/assets/SVT1.png b/src/Utils/assets/SVT1.png new file mode 100644 index 0000000..87de532 Binary files /dev/null and b/src/Utils/assets/SVT1.png differ diff --git a/src/Utils/assets/SVT2.png b/src/Utils/assets/SVT2.png new file mode 100644 index 0000000..ba68e1b Binary files /dev/null and b/src/Utils/assets/SVT2.png differ diff --git a/src/Utils/assets/SVT24.png b/src/Utils/assets/SVT24.png new file mode 100644 index 0000000..1931519 Binary files /dev/null and b/src/Utils/assets/SVT24.png differ diff --git a/src/Utils/assets/YouTube.png b/src/Utils/assets/YouTube.png new file mode 100644 index 0000000..49dfa6e Binary files /dev/null and b/src/Utils/assets/YouTube.png differ diff --git a/src/main.py b/src/main.py index 2d16902..daeddda 100644 --- a/src/main.py +++ b/src/main.py @@ -10,7 +10,7 @@ import wx.media from Channel import SVT, Channel, YouTube from ChannelProvider import ChannelProvider - +from Utils import make_sized_button class Cast(wx.Frame): def __init__(self, *args, **kw): @@ -71,14 +71,9 @@ class Cast(wx.Frame): provider_index = 0 for provider in self.m_providers: bitmap = provider.get_logo_as_bitmap() - btn = wx.BitmapButton(self.m_panel, id=provider_index, bitmap=bitmap) - btn.Bind( - wx.EVT_BUTTON, - lambda event, index=provider_index: self.show_channel_list( - event, index - ), - ) - self.m_sizer.Add(btn) + callback = lambda event, index=provider_index: self.show_channel_list(event, index) + btn_sizer: wx.BoxSizer = make_sized_button(self.m_panel,bitmap,provider.get_name(),callback) + self.m_sizer.Add(btn_sizer) provider_index += 1 self.m_panel.SetSizer(self.m_sizer) @@ -97,12 +92,9 @@ class Cast(wx.Frame): channel_index = 0 for channel in self.m_selected_provider.get_channels(): bitmap = channel.get_logo_as_bitmap() - btn = wx.BitmapButton(self.m_panel, id=channel_index, bitmap=bitmap) - btn.Bind( - wx.EVT_BUTTON, - lambda event, index=channel_index: self.show_video_list(event, index), - ) - self.m_sizer.Add(btn) + callback = lambda event, index=channel_index: self.show_video_list(event, index) + btn_sizer: wx.BoxSizer = make_sized_button(self.m_panel,bitmap,channel.get_name(),callback) + self.m_sizer.Add(btn_sizer) channel_index += 1 self.m_panel.SetSizer(self.m_sizer)