§
   ‡ˆÈ%Váñüã                   óš   — d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ  G d„ d¦  «        Zdd	„Z G d
„ d¦  «        ZeZdS )a  
MediaChannelManager - Unified manager for MyTV and MyCinema channels.

Supports two channel types:
- 'tv': MyTV channels with series (episodes)
- 'cinema': MyCinema channels with movies

For backward compatibility, MyTVChannelManager is aliased to MediaChannelManager.
é    N)Ú	user_data)ÚLibraryManagerc                   ón   — e Zd ZdZd
d„Zed„ ¦   «         Zej        d„ ¦   «         Zd„ Ze	dd	„¦   «         Z
dS )ÚChannela%  
    Represents a media channel (TV or Cinema).
    
    Attributes:
        id: Unique channel identifier
        name: Display name
        icon: Path to channel icon (generated composite)
        media_list: List of media items (series or movies)
        channel_type: 'tv' or 'cinema'
    Nõ   MÅ¯j kanÃ¡lÚtvc                 ó�   — |pt          t          j        ¦   «         ¦  «        | _        || _        || _        |pg | _        || _        d S ©N)ÚstrÚuuidÚuuid4ÚidÚnameÚiconÚ
media_listÚchannel_type)Úselfr   r   r   r   r   s         úh/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/ai/MediaChannelManager.pyÚ__init__zChannel.__init__#   sD   € ØÐ)��DœJ™LœLÑ)Ô)ˆŒØˆŒ	ØˆŒ	Ø$Ð*¨ˆŒØ(ˆÔÐÐó    c                 ó   — | j         S r
   ©r   ©r   s    r   Úseries_listzChannel.series_list+   s
   € àŒÐr   c                 ó   — || _         d S r
   r   )r   Úvalues     r   r   zChannel.series_list/   s   € àˆŒˆˆr   c                 óP   — | j         | j        | j        | j        | j        | j        dœS )N)r   r   r   r   r   r   ©r   r   r   r   r   r   s    r   Úto_dictzChannel.to_dict3   s0   € à”'Ø”IØ”IØœ/àœ?Ø Ô-ð
ð 
ð 	
r   c           
      ó  — |                      d¦  «        p|                      d¦  «        pg } | |                      d¦  «        |                      d¦  «        |                      d¦  «        ||                      d|¦  «        ¬¦  «        S )Nr   r   r   r   r   r   r   )Úget)ÚclsÚdataÚdefault_channel_typer   s       r   Ú	from_dictzChannel.from_dict>   s„   € ð —X’X˜lÑ+Ô+ÐL¨t¯xªx¸Ñ/FÔ/FÐLÈ"ˆ
ØˆsØ�xŠx˜‰~Œ~Ø—’˜&Ñ!Ô!Ø—’˜&Ñ!Ô!Ø!ØŸš .Ð2FÑGÔGð
ñ 
ô 
ð 	
r   )Nr   NNr   ©r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   Úsetterr   Úclassmethodr%   © r   r   r   r      s›   € € € € € ð	ð 	ð)ð )ð )ð )ð ðð ñ „Xðð Ôð ð  ñ Ôð ð	
ð 	
ð 	
ð ð	
ð 	
ð 	
ñ „[ð	
ð 	
ð 	
r   r   r   Tc                 óN  — 	 ddl m} | dk    rdhnddh}| dk    r|r|                     d¦  «         |                     |¦  «         | dk    r|r|                     dhd¬	¦  «         dS dS dS # t
          $ r-}t          j        d
|› �t          j        ¦  «         Y d}~dS d}~ww xY w)zKPublish only dependent rows; keep the last network snapshot during refresh.r   )ÚrefreshÚcinemaÚwidget_mycinema_channelsÚwidget_mytv_channelsÚwidget_mytv_nextÚwidget_mycinema_recommendedT)Úforceu*   [MilionÃ¡Å™ Skin] Channel refresh failed: N)	Úwcs.skinr0   ÚaddÚchangedÚrequestÚ	ExceptionÚxbmcÚlogÚ
LOGWARNING)r   Úcontents_changedr0   ÚrowsÚexcs        r   Ú_invalidate_skin_widgetsrB   K   s  € ð
VØ$Ð$Ð$Ð$Ð$Ð$Ø/;¸xÒ/GÐ/GÐ*Ð+Ð+Ø"Ð$6ðN8ˆà˜8Ò#Ð#Ð(8Ð#Ø�HŠHÐ2Ñ3Ô3Ð3Ø�Š˜ÑÔÐØ˜8Ò#Ð#Ð(8Ð#Ø�OŠOÐ:Ð;À4ˆOÑHÔHÐHÐHÐHð $Ð#Ð#Ð#øåð Vð Vð VÝŒÐC¸cÐCÐCÅTÄ_ÑUÔUÐUÐUÐUÐUÐUÐUÐUøøøøðVøøøs   ‚A%A- Á-
B$Á7"BÂB$c                   óz   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚMediaChannelManagerzµ
    Manages channels for both MyTV (series) and MyCinema (movies).
    
    Args:
        addon: Kodi addon instance
        channel_type: 'tv' for MyTV, 'cinema' for MyCinema
    r   c                 óX   — || _         || _        g | _        |                      ¦   «          d S r
   )Úaddonr   ÚchannelsÚ_load_channels)r   rF   r   s      r   r   zMediaChannelManager.__init__c   s0   € ØˆŒ
Ø(ˆÔØˆŒØ×ÒÑÔÐÐÐr   c                 ó    — | j         dk    rdS dS )z.Returns the storage key for this channel type.r1   Úmy_cinema_channelsÚmy_tv_channels)r   r   s    r   Ú_get_storage_keyz$MediaChannelManager._get_storage_keyi   s   € àÔ Ò(Ð(Ø'Ð'ØÐr   c                 óT  ‡ — 	 ‰ j         dk    rt          j        ‰ j        ¦  «        }nt          j        ‰ j        ¦  «        }ˆ fd„|D ¦   «         ‰ _        d S # t          $ rG}‰ j         dk    rdnd}t          j        d|› d|› �t          j	        ¬¦  «         g ‰ _        Y d }~d S d }~ww xY w)Nr1   c                 óP   •— g | ]"}t                                |‰j        ¦  «        ‘Œ#S r.   )r   r%   r   )Ú.0Úitemr   s     €r   ú
<listcomp>z6MediaChannelManager._load_channels.<locals>.<listcomp>u   s,   ø€ Ð]Ð]Ð]ÈD�W×.Ò.¨t°TÔ5FÑGÔGÐ]Ð]Ð]r   ú
[MyCinema]ú[MyTV]ú[plugin.video.milionar] z Error loading channels: ©Úlevel)
r   r   Úload_mycinema_channelsrF   Úload_mytv_channelsrG   r;   r<   r=   ÚLOGERROR)r   Úraw_listÚeÚ
log_prefixs   `   r   rH   z"MediaChannelManager._load_channelso   sÏ   ø€ ð		ØÔ  HÒ,Ð,Ý$Ô;¸D¼JÑGÔG��å$Ô7¸¼
ÑCÔC�Ø]Ð]Ð]Ð]ÐT\Ð]Ñ]Ô]ˆDŒMˆMˆMøÝð 	ð 	ð 	Ø)-Ô):¸hÒ)FÐ)F˜˜ÈHˆJÝŒHÐX°
ÐXÐXÐUVÐXÐXÕ`dÔ`mÐnÑnÔnÐnØˆDŒMˆMˆMˆMˆMˆMˆMøøøøð	øøøs   ƒAA Á
B'Á <B"Â"B'c                 ó¼  ‡ — 	 d„ ‰ j         D ¦   «         }‰ j        dk    rt          j        t          j        }}nt          j        t          j        }}ˆ fd„ |‰ j        ¦  «        D ¦   «         }||k    rd S  |‰ j        |¦  «        du rd S ˆ fd„ |‰ j        ¦  «        D ¦   «         }||k    rb||k    r^d}‰ j        dk    r8t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }||k    }t          ‰ j        |¦  «         d S d S d S # t          $ r@}	‰ j        dk    rdnd	}
t          j        d
|
› d|	› �t          j        ¬¦  «         Y d }	~	d S d }	~	ww xY w)Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS r.   )r   )rO   Úchs     r   rQ   z6MediaChannelManager._save_channels.<locals>.<listcomp>}   s    € Ð=Ð=Ð=¨˜Ÿ
š
™œÐ=Ð=Ð=r   r1   c                 ót   •— g | ]4}t                                |‰j        ¦  «                             ¦   «         ‘Œ5S r.   ©r   r%   r   r   ©rO   r_   r   s     €r   rQ   z6MediaChannelManager._save_channels.<locals>.<listcomp>‚   s8   ø€ ÐdÐdÐdÈR•g×'Ò'¨¨DÔ,=Ñ>Ô>×FÒFÑHÔHÐdÐdÐdr   Fc                 ót   •— g | ]4}t                                |‰j        ¦  «                             ¦   «         ‘Œ5S r.   ra   rb   s     €r   rQ   z6MediaChannelManager._save_channels.<locals>.<listcomp>ˆ   s8   ø€ ÐcÐcÐcÈB•W×&Ò& r¨4Ô+<Ñ=Ô=×EÒEÑGÔGÐcÐcÐcr   c              3   óp   K  — | ]1}|d          D ]&}t          |                     d¦  «        ¦  «        V — Œ'Œ2dS ©r   r   N©r   r!   ©rO   r_   rP   s      r   ú	<genexpr>z5MediaChannelManager._save_channels.<locals>.<genexpr>Œ   sI   è è € Ð*mÐ*mÀ2Ð\^Ð_kÔ\lÐ*mÐ*mÐTX­3¨t¯xªx¸©~¬~Ñ+>Ô+>Ð*mÐ*mÐ*mÐ*mÐ*mÐ*mÐ*mr   c              3   óp   K  — | ]1}|d          D ]&}t          |                     d¦  «        ¦  «        V — Œ'Œ2dS re   rf   rg   s      r   rh   z5MediaChannelManager._save_channels.<locals>.<genexpr>�   sI   è è € Ð)kÐ)kÀ"ÐZ\Ð]iÔZjÐ)kÐ)kÐRV­#¨d¯hªh°t©n¬nÑ*=Ô*=Ð)kÐ)kÐ)kÐ)kÐ)kÐ)kÐ)kr   rR   rS   rT   z Error saving channels: rU   )rG   r   r   rW   Ústore_mycinema_channelsrX   Ústore_mytv_channelsrF   ÚsortedrB   r;   r<   r=   rY   )r   rZ   ÚloadÚstoreÚbeforeÚafterr?   Úbefore_moviesÚafter_moviesr[   r\   s   `          r   Ú_save_channelsz"MediaChannelManager._save_channels{   sÔ  ø€ ð	nØ=Ð=¨t¬}Ð=Ñ=Ô=ˆHØÔ  HÒ,Ð,Ý'Ô>Å	Ô@a�e��å'Ô:½IÔ<Y�e�ØdÐdÐdÐdÐSWÐSWÐX\ÔXbÑScÔScÐdÑdÔdˆFØ˜Ò!Ð!Ø�Øˆu�T”Z Ñ*Ô*¨eÐ3Ð3Ø�àcÐcÐcÐcÐRVÐRVÐW[ÔWaÑRbÔRbÐcÑcÔcˆEØ˜Ò Ð  U¨f¢_ _Ø#(Ð ØÔ$¨Ò0Ð0Ý$*Ð*mÐ*mÈÐ*mÑ*mÔ*mÑ$mÔ$m�MÝ#)Ð)kÐ)kÈÐ)kÑ)kÔ)kÑ#kÔ#k�LØ'4¸Ò'DÐ$Ý(¨Ô):Ð<LÑMÔMÐMÐMÐMð !Ð  _ _øõ ð 	nð 	nð 	nØ)-Ô):¸hÒ)FÐ)F˜˜ÈHˆJÝŒHÐW°
ÐWÐWÐTUÐWÐWÕ_cÔ_lÐmÑmÔmÐmÐmÐmÐmÐmÐmÐmøøøøð	nøøøs%   ƒA/D Á4D Â	BD Ä
EÄ5EÅEc                 ó   — | j         S r
   )rG   r   s    r   Úget_all_channelsz$MediaChannelManager.get_all_channels”   s
   € ØŒ}Ðr   c                 óF   ‡— t          ˆfd„| j        D ¦   «         d ¦  «        S )Nc              3   ó2   •K  — | ]}|j         ‰k    ¯|V — Œd S r
   ©r   ©rO   r_   Ú
channel_ids     €r   rh   z8MediaChannelManager.get_channel_by_id.<locals>.<genexpr>˜   s/   øè è € ÐGÐG˜B°2´5¸JÒ3FÐ3F�RÐ3FÐ3FÐ3FÐ3FÐGÐGr   )ÚnextrG   )r   rz   s    `r   Úget_channel_by_idz%MediaChannelManager.get_channel_by_id—   s*   ø€ ÝÐGÐGÐGÐG $¤-ÐGÑGÔGÈÑNÔNÐNr   c                 ó�   — t          || j        ¬¦  «        }| j                             d|¦  «         |                      ¦   «          |S )N)r   r   r   )r   r   rG   Úinsertrs   )r   r   Únew_channels      r   Úcreate_channelz"MediaChannelManager.create_channelš   sG   € Ý 4°dÔ6GÐHÑHÔHˆØŒ×Ò˜Q Ñ,Ô,Ð,Ø×ÒÑÔÐØÐr   c                 ón   — |                       |¦  «        }|r||_        |                      ¦   «          dS dS )zRename a channel.TF)r|   r   rs   )r   rz   Únew_nameÚchannels       r   Úrename_channelz"MediaChannelManager.rename_channel    s@   € à×(Ò(¨Ñ4Ô4ˆØð 	Ø#ˆGŒLØ×ÒÑ!Ô!Ð!Ø�4Øˆur   c                 ó¼   ‡— t          | j        ¦  «        }ˆfd„| j        D ¦   «         | _        t          | j        ¦  «        |k     r|                      ¦   «          dS dS )zDelete a channel by ID.c                 ó*   •— g | ]}|j         ‰k    ¯|‘ŒS r.   rx   ry   s     €r   rQ   z6MediaChannelManager.delete_channel.<locals>.<listcomp>¬   s%   ø€ ÐKÐKÐK °r´uÀ
Ò7JÐ7J˜Ð7JÐ7JÐ7Jr   TF)ÚlenrG   rs   )r   rz   Úoriginal_counts    ` r   Údelete_channelz"MediaChannelManager.delete_channel©   s`   ø€ å˜Tœ]Ñ+Ô+ˆØKÐKÐKÐK d¤mÐKÑKÔKˆŒÝˆtŒ}ÑÔ Ò.Ð.Ø×ÒÑ!Ô!Ð!Ø�4Øˆur   c           	      ól  — d}t          | j        ¦  «        D ]\  }}|j        |k    r|} nŒ|€dS t          dt	          |t          | j        ¦  «        dz
  ¦  «        ¦  «        }||k    rdS | j                             |¦  «        }| j                             ||¦  «         |                      ¦   «          dS )a  Move a channel to a new position in the list.
        
        Args:
            channel_id: ID of the channel to move
            new_index: Target position (0-based, clamped to valid range)
        
        Returns:
            True if moved successfully, False otherwise
        NFr   é   T)	Ú	enumeraterG   r   ÚmaxÚminr‡   Úpopr~   rs   )r   rz   Ú	new_indexÚ	old_indexÚir_   rƒ   s          r   Úmove_channelz MediaChannelManager.move_channel²   sË   € ð ˆ	Ý˜tœ}Ñ-Ô-ð 	ð 	‰EˆAˆrØŒu˜
Ò"Ð"Ø�	Ø�ð #ð ÐØ�5å˜�3˜y­#¨d¬mÑ*<Ô*<¸qÑ*@ÑAÔAÑBÔBˆ	Ø˜	Ò!Ð!Ø�5à”-×#Ò# IÑ.Ô.ˆØŒ×Ò˜Y¨Ñ0Ô0Ð0Ø×ÒÑÔÐØˆtr   c                 ó�  — |                       |¦  «        }|sdS t          |                     d¦  «        ¦  «        }d}t          |j        ¦  «        D ]/\  }}t          |                     d¦  «        ¦  «        |k    r|} nŒ0|dk    r|j                             |¦  «         d}�nî|                     d¦  «        |                     d¦  «        p|                     d¦  «        |                     d¦  «        p|                     d	¦  «        |                     d
¦  «        pg |                     d¦  «        pg dœ}	| j        dk    rË|                     dd¦  «        |	d<   |                     d¦  «        p4|                     d¦  «        r|                     dd¦  «        dd…         nd|	d<   |                     dd¦  «        |	d<   |                     dd¦  «        |	d<   |                     dd¦  «        |	d<   |                     dd¦  «        |	d<   nf|                     dd¦  «        |	d<   |                     d¦  «        p4|                     d¦  «        r|                     dd¦  «        dd…         nd|	d<   |j                             d|	¦  «         d}|                      ¦   «          |  	                    |j
        ¦  «         |dk    S )z¢
        Adds or removes a media item (series or movie) from the channel.
        media_data should contain 'id', 'name'/'title', 'poster_path'/'poster'.
        Fr   éÿÿÿÿr   Úremovedr   ÚtitleÚposter_pathÚposterÚ	genre_idsÚgenres)r   r   r˜   rš   r›   r1   Úrelease_dateÚ ÚyearNé   ÚruntimeÚoverviewÚbackdrop_pathÚtaglineÚfirst_air_dateÚadded)r|   r   r!   rŒ   r   r�   r   r~   rs   Úgenerate_channel_compositer   )
r   rz   Ú
media_datarƒ   Ú	target_idÚ
exists_idxÚidxrP   ÚactionÚ
clean_datas
             r   Útoggle_media_in_channelz+MediaChannelManager.toggle_media_in_channelÍ   s
  € ð
 ×(Ò(¨Ñ4Ô4ˆØð 	Ø�5õ ˜
Ÿš tÑ,Ô,Ñ-Ô-ˆ	ð ˆ
Ý" 7Ô#5Ñ6Ô6ð 	ð 	‰IˆC�Ý�4—8’8˜D‘>”>Ñ"Ô" iÒ/Ð/Ø �
Ø�ð 0ð ˜Š?ˆ?àÔ×"Ò" :Ñ.Ô.Ð.ØˆF‰Fð
 !—n’n TÑ*Ô*Ø"Ÿš vÑ.Ô.ÐI°*·.².ÀÑ2IÔ2IØ)Ÿ~š~¨mÑ<Ô<ÐXÀ
ÇÂÈxÑ@XÔ@XØ'Ÿ^š^¨KÑ8Ô8Ð>¸BØ$Ÿ.š.¨Ñ2Ô2Ð8°bðð ˆJð Ô  HÒ,Ð,à-7¯^ª^¸NÈBÑ-OÔ-O�
˜>Ñ*Ø%/§^¢^°FÑ%;Ô%;ð  &RÐjt×jxÒjxð  zHñ  kIô  kIð  AQÀ
ÇÂÈ~Ð_aÑ@bÔ@bÐceÐdeÐceÔ@fÐ@fð  OQ�
˜6Ñ"Ø(2¯ª°yÀ!Ñ(DÔ(D�
˜9Ñ%Ø)3¯ª¸
ÀBÑ)GÔ)G�
˜:Ñ&Ø.8¯nªn¸_ÈbÑ.QÔ.Q�
˜?Ñ+Ø(2¯ª°yÀ"Ñ(EÔ(E�
˜9Ñ%Ð%ð 0:¯~ª~Ð>NÐPRÑ/SÔ/S�
Ð+Ñ,Ø%/§^¢^°FÑ%;Ô%;ð  &VÐlv×lzÒlzð  |Lñ  mMô  mMð  AUÀ
ÇÂÐO_ÐacÑ@dÔ@dÐegÐfgÐegÔ@hÐ@hð  SU�
˜6Ñ"àÔ×%Ò% a¨Ñ4Ô4Ð4ØˆFà×ÒÑÔÐð 	×'Ò'¨¬
Ñ3Ô3Ð3à˜Ò Ð r   c                 ó.   — |                       ||¦  «        S )z.Legacy method - calls toggle_media_in_channel.)r­   )r   rz   Úseries_datas      r   Útoggle_series_in_channelz,MediaChannelManager.toggle_series_in_channel  s   € à×+Ò+¨J¸ÑDÔDÐDr   c                 ó|
  — 	 ddl m} ddl}nS# t          $ rF}t	          j        d|› �t          j        ¬¦  «         ddl}|                     ¦   «          Y d}~dS d}~ww xY wd}d}	 t          |d¦  «        r|j
        j        }d}n=t          |d	¦  «        r
|j        }d
}n#t          |d¦  «        r
|j        }d}n	|j        }d}n# t          $ r |j        }d}Y nw xY w| j        dk    rdnd}t	          j        d|› d|› �t          j        ¬¦  «         |                      |¦  «        }	|	sdS d}
d}t%          j        | j                             d¦  «        ¦  «        }| j        dk    r!t,          j                             |d¦  «        }n t,          j                             |d¦  «        }t,          j                             |¦  «        st%          j        |¦  «         ddl}|                     t,          j                             ||› d�¦  «        ¦  «        }|D ]}	 t-          j        |¦  «         Œ#  Y ŒxY wddl}t=          |                     ¦   «         ¦  «        }t,          j                             ||› d|› d�¦  «        }g }|	j        dd…         D ]Z}|                      d¦  «        p|                      d¦  «        }|r,|  !                    |¦  «        }|r| "                    |¦  «         Œ[|sd|	_#        |  $                    ¦   «          dS | %                    d|
|fd ¬!¦  «        }	 tM          |¦  «        d"k    rL|  '                    |d         ¦  «        }|r.| (                    |
|f|¦  «        }| )                    |d#¦  «         n‘tM          |¦  «        d$k    r~|
d$z  }|d$z  }d#|dfd|f||fg}tU          |¦  «        D ]X\  }}|dk    r nL|  '                    |¦  «        }|r4| (                    ||f|¦  «        }| )                    |||         ¦  «         ŒY| +                    ¦   «         }| ,                    |d%d&¬'¦  «         | -                    d¦  «         t%          j.        |d(¦  «        }| /                    | 0                    ¦   «         ¦  «         | 1                    ¦   «          ||	_#        |  $                    ¦   «          t	          j        d|› d)|› �t          j        ¬¦  «         dS # t          $ rI}t	          j        d|› d*|› �t          j        ¬¦  «         ddl}|                     ¦   «          Y d}~dS d}~ww xY w)+z‚
        Generates a composite icon for the channel based on its media.
        Uses PIL to create a 2x2 grid of posters.
        r   ©ÚImageNz+[plugin.video.milionar] PIL import failed: rU   ÚUnknownÚ
ResamplingzImage.Resampling.LANCZOSÚLANCZOSzImage.LANCZOSÚ	ANTIALIASzImage.ANTIALIASzImage.BICUBIC (Fallback)z"Image.BICUBIC (Exception Fallback)r1   rR   rS   rT   z& PIL loaded. Using resampling filter: iô  iî  ÚprofileÚcinema_iconsÚchannel_iconsz_*.jpgÚ_ú.jpgrŸ   r˜   r™   ÚRGB)é   r¾   é   )Úcolorr‹   )r   r   é   ÚJPEGéZ   )ÚqualityÚwz Generated channel icon: z Error generating composite: )2ÚPILr³   ÚioÚImportErrorr<   r=   rY   Ú	tracebackÚ	print_excÚhasattrrµ   r¶   r·   ÚBICUBICr;   r   ÚLOGINFOr|   ÚxbmcvfsÚtranslatePathrF   ÚgetAddonInfoÚosÚpathÚjoinÚexistsÚmkdirÚglobÚremoveÚtimeÚintr   r!   Ú_get_cached_posterÚappendr   rs   Únewr‡   Ú_open_image_safelyÚresizeÚpasterŒ   ÚBytesIOÚsaveÚseekÚFileÚwriteÚreadÚclose) r   rz   r³   rÇ   r[   rÉ   Úresample_filterÚfilter_namer\   rƒ   ÚCANVAS_WIDTHÚCANVAS_HEIGHTÚprofile_pathÚ	icons_dirrÖ   Ú	old_iconsÚold_iconrØ   Ú	timestampÚtarget_fileÚpostersrP   Úp_pathÚ
local_pathÚcanvasÚimgÚcell_wÚcell_hÚ	positionsr’   ÚbufferÚfs                                    r   r¦   z.MediaChannelManager.generate_channel_composite  sô  € ð
	Ø!Ð!Ð!Ð!Ð!Ð!ØˆIˆIˆIˆIøÝð 	ð 	ð 	ÝŒHÐFÀ1ÐFÐFÍdÌmÐ\Ñ\Ô\Ð\ØÐÐÐØ×ÒÑ!Ô!Ð!ØˆFˆFˆFˆFˆFøøøøð		øøøð ˆØˆð	?Ý�u˜lÑ+Ô+ð 9Ø"'Ô"2Ô":�Ø8��Ý˜ 	Ñ*Ô*ð 9Ø"'¤-�Ø-��Ý˜ Ñ,Ô,ð 9Ø"'¤/�Ø/��à"'¤-�Ø8�øøÝð 	?ð 	?ð 	?Ø#œmˆOØ>ˆKˆKˆKð	?øøøð &*Ô%6¸(Ò%BÐ%B�\�\Èˆ
ÝŒÐk¨JÐkÐkÐ^iÐkÐkÕswÔsð  	Añ  	Aô  	Að  	Aà×(Ò(¨Ñ4Ô4ˆØÐ˜˜ð ˆØˆõ Ô,¨T¬Z×-DÒ-DÀYÑ-OÔ-OÑPÔPˆØÔ Ò(Ð(ÝœŸš \°>ÑBÔBˆIˆIåœŸš \°?ÑCÔCˆIÝŒw�~Š~˜iÑ(Ô(ð 	%ÝŒM˜)Ñ$Ô$Ð$ð 	ˆˆˆØ—I’I�bœgŸlšl¨9¸Ð6KÐ6KÐ6KÑLÔLÑMÔMˆ	Ø!ð 	ð 	ˆHðÝ”	˜(Ñ#Ô#Ð#Ð#øðØ�øøøð 	ˆˆˆÝ˜Ÿ	š	™œÑ$Ô$ˆ	Ý”g—l’l 9°Ð.MÐ.M¸iÐ.MÐ.MÐ.MÑNÔNˆð ˆØÔ& r¨ rÔ*ð 	/ð 	/ˆDØ—X’X˜mÑ,Ô,ÐB°·²¸Ñ0BÔ0BˆFØð /Ø!×4Ò4°VÑ<Ô<�
Øð /Ø—N’N :Ñ.Ô.Ð.øàð 	ØˆGŒLØ×ÒÑ!Ô!Ð!ØˆFð —’˜5 <°Ð"?À|�ÑTÔTˆð)	"Ý�7‰|Œ|˜qÒ Ð Ø×-Ò-¨g°a¬jÑ9Ô9�Øð .ØŸ*š* l°MÐ%BÀOÑTÔT�CØ—L’L  fÑ-Ô-Ð-øå�W‘” Ò"Ð"à%¨Ñ*�Ø&¨!Ñ+�ð ˜V Q˜KØ˜�K &¨&Ð!1ð�	õ
 "+¨7Ñ!3Ô!3ð 8ð 8‘I�A�vØ˜A’v�v˜u˜uØ×1Ò1°&Ñ9Ô9�CØð 8Ø!Ÿjšj¨&°&Ð)9¸?ÑKÔK˜ØŸš S¨)°A¬,Ñ7Ô7Ð7øð —Z’Z‘\”\ˆFØ�KŠK˜ °ˆKÑ3Ô3Ð3Ø�KŠK˜‰NŒNˆNå”˜[¨#Ñ.Ô.ˆAØ�GŠG�F—K’K‘M”MÑ"Ô"Ð"Ø�GŠG‰IŒIˆIð 'ˆGŒLØ×ÒÑ!Ô!Ð!ÝŒHÐb°
ÐbÐbÐU`ÐbÐbÕjnÔjvÐwÑwÔwÐwÐwÐwøåð 	"ð 	"ð 	"ÝŒHÐ\°
Ð\Ð\ÐYZÐ\Ð\ÕdhÔdqÐrÑrÔrÐrØÐÐÐØ×ÒÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!øøøøð	"øøøsL   ‚
 �
A—;AÁAÁ%AC ÃCÃCÈH,È,H0Ì$GS( Ó(
T;Ó2>T6Ô6T;c                 ó¬  — ddl m} ddl}	 |                     |¦  «        S # t          $ r¨ 	 t          j        |d¦  «        }|                     ¦   «         }|                     ¦   «          |                     | 	                    |¦  «        ¦  «        cY S # t          $ r2}t          j        d|› d|› �t          j        ¬¦  «         Y d}~Y dS d}~ww xY ww xY w)z4Helper to open image compatible with Android xbmcvfsr   r²   NÚrbz4[plugin.video.milionar] Failed to open image safely ú: rU   )rÆ   r³   rÇ   Úopenr;   rÎ   rã   rå   ræ   rà   r<   r=   rY   )r   rÒ   r³   rÇ   rú   r#   r[   s          r   rÝ   z&MediaChannelManager._open_image_safely‹  sý   € àÐÐÐÐÐØˆ	ˆ	ˆ	ð	à—:’:˜dÑ#Ô#Ð#øÝð 		ð 		ð 		ðå”L  tÑ,Ô,�Ø—v’v‘x”x�Ø—’‘	”	�	Ø—z’z "§*¢*¨TÑ"2Ô"2Ñ3Ô3Ð3Ð3Ð3øÝð ð ð Ý”Ð[ÐPTÐ[Ð[ÐXYÐ[Ð[ÕcgÔcpÐqÑqÔqÐqØ�t�t�t�t�t�tøøøøðøøøð		øøøs3   Œ! ¡
C¬A$BÂCÂ
CÂ&C
ÃCÃ
CÃCc                 óþ  — |sdS |                      d¦  «        r|}nd|› �}ddl}|                     |                     d¦  «        ¦  «                             ¦   «         }t          j        | j                             d¦  «        ¦  «        }t          j
                             |d¦  «        }t          j
                             |¦  «        st          j        |¦  «         t          j
                             ||› d�¦  «        }t          j        |¦  «        r|S 	 ddl}|j                             |d	d
i¬¦  «        }	|j                             |	¦  «        5 }
|
                     ¦   «         }t          j        |d¦  «        }|                     |¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   |S # t,          $ r1}t/          j        d|› d|› �t.          j        ¬¦  «         Y d}~dS d}~ww xY w)z~
        Downloads poster if needed and returns local path.
        poster_path can be full URL or TMDB partial path.
        NÚhttpzhttps://image.tmdb.org/t/p/w500r   zutf-8r¸   Ú	img_cacher¼   z
User-AgentzKodi-Milionar/1.0)ÚheadersrÅ   z+[plugin.video.milionar] Download error for rý   rU   )Ú
startswithÚhashlibÚmd5ÚencodeÚ	hexdigestrÎ   rÏ   rF   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   Úurllib.requestr:   ÚRequestÚurlopenrå   rã   rä   ræ   r;   r<   r=   rY   )r   r˜   Úurlr  Ú	name_hashrë   Ú	cache_dirÚ
local_fileÚurllibÚreqÚresponser#   rú   r[   s                 r   rÚ   z&MediaChannelManager._get_cached_poster�  s1  € ð
 Ð' 4 4ð ×!Ò! &Ñ)Ô)ð 	BØˆCˆCàA°KÐAÐAˆCð 	ˆˆˆØ—K’K §
¢
¨7Ñ 3Ô 3Ñ4Ô4×>Ò>Ñ@Ô@ˆ	ÝÔ,¨T¬Z×-DÒ-DÀYÑ-OÔ-OÑPÔPˆÝ”G—L’L ¨{Ñ;Ô;ˆ	ÝŒw�~Š~˜iÑ(Ô(ð 	%ÝŒM˜)Ñ$Ô$Ð$å”W—\’\ )°	Ð-?Ð-?Ð-?Ñ@Ô@ˆ
åŒ>˜*Ñ%Ô%ð 	ØÐð	Ø!Ð!Ð!Ð!Ø”.×(Ò(¨°|ÐEXÐ6YÐ(ÑZÔZˆCØ”×'Ò'¨Ñ,Ô,ð °Ø—}’}‘”�Ý”L ¨SÑ1Ô1�Ø—’˜‘”�Ø—’‘	”	�	ð	ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð
 ÐøÝð 	ð 	ð 	ÝŒHÐMÀ3ÐMÐMÈ!ÐMÐMÕUYÔUbÐcÑcÔcÐcØ�4�4�4�4�4øøøøð	øøøs=   Ä<G ÅAF4Æ(G Æ4F8Æ8G Æ;F8Æ<G Ç
G<Ç&G7Ç7G<c                 óÀ  — | j         dk    r|                      |¦  «        S |                      |¦  «        }|r|j        sdS t	          |j        ¦  «        }t          j        |¦  «         t          j        | j	        ¦  «        }|D ]Ù}| 
                    d¦  «        }t          | 
                    d¦  «        ¦  «        }d}d}	|D ]x}
t          |
 
                    dd¦  «        ¦  «        }||k    s|
 
                    d	¦  «        |k    r4d
|
v r0d|
v r,t          |
d
         ¦  «        }t          |
d         ¦  «        }	 nŒyt          j        |||	¦  «        }|r	||d<   |c S ŒÚdS )z¡
        Returns info about a random 'Next Up' episode from the channel.
        Only applicable for TV channels (series).
        Returns dict or None.
        r1   Nr   r   r‹   r   Útmdb_idr�   r—   ÚseasonÚepisode)r   Úget_random_movie_for_channelr|   r   ÚlistÚrandomÚshuffler   Úload_recently_playedrF   r!   r   rÙ   r   Ú&get_next_episode_metadata_from_library)r   rz   rƒ   Úseries_candidatesÚrecently_playedÚseriesÚseries_nameÚ	series_idÚlast_seasonÚlast_episoderP   Úrp_idÚnext_metadatas                r   Úget_random_episode_for_channelz2MediaChannelManager.get_random_episode_for_channelÅ  sš  € ð Ô Ò(Ð(à×4Ò4°ZÑ@Ô@Ð@à×(Ò(¨Ñ4Ô4ˆØð 	˜gÔ0ð 	Ø�4õ ! Ô!3Ñ4Ô4ÐÝŒÐ(Ñ)Ô)Ð)å#Ô8¸¼ÑDÔDˆà'ð 	%ð 	%ˆFØ Ÿ*š* VÑ,Ô,ˆKÝ˜FŸJšJ tÑ,Ô,Ñ-Ô-ˆIð ˆKØˆLà'ð ð �Ý˜DŸHšH Y°Ñ3Ô3Ñ4Ô4�Ø˜IÒ%Ð%¨¯ª°'Ñ):Ô):¸kÒ)IÐ)IØ 4Ð'Ð'¨I¸Ð,=Ð,=Ý&)¨$¨x¬.Ñ&9Ô&9˜Ý'*¨4°	¬?Ñ';Ô';˜Ø˜øõ +ÔQØ˜[¨,ñô ˆMð ð %Ø+4�˜iÑ(Ø$Ð$Ð$Ð$ð%ð ˆtr   c                 ó6  — ddl m} |                      |¦  «        }|r|j        sdS t	          |j        ¦  «        }t          j        |¦  «         |D ]1}|                     d¦  «        }|                     ||¦  «        s|c S Œ2|rt          j	        |¦  «        S dS )zt
        Returns info about a random unwatched movie from the cinema channel.
        Returns dict or None.
        r   )ÚChannelHistoryNr   )
Úwcs.air'  r|   r   r  r  r  r!   Úis_movie_watchedÚchoice)r   rz   r'  rƒ   Úmovie_candidatesÚmovieÚmovie_ids          r   r  z0MediaChannelManager.get_random_movie_for_channelô  sÊ   € ð
 	*Ð)Ð)Ð)Ð)Ð)à×(Ò(¨Ñ4Ô4ˆØð 	˜gÔ0ð 	Ø�4õ   Ô 2Ñ3Ô3ÐÝŒÐ'Ñ(Ô(Ð(ð &ð 	ð 	ˆEØ—y’y ‘”ˆHØ!×2Ò2°:¸xÑHÔHð Ø���ðð ð 	3Ý”=Ð!1Ñ2Ô2Ð2àˆtr   Nr&   )r'   r(   r)   r*   r   rL   rH   rs   ru   r|   r€   r„   r‰   r“   r­   r°   r¦   rÝ   rÚ   r%  r  r.   r   r   rD   rD   Z   s2  € € € € € ðð ðð ð ð ð ð  ð  ð
ð 
ð 
ðnð nð nð2ð ð ðOð Oð Oðð ð ðð ð ðð ð ðð ð ð68!ð 8!ð 8!ðvEð Eð Eð}"ð }"ð }"ð~ð ð ð$&ð &ð &ðP-ð -ð -ð^ð ð ð ð r   rD   )r   T)r*   Újsonr  r   r<   Ú	xbmcaddonrÑ   rÎ   Úwcsr   Úwcs.libraryr   r   rB   rD   ÚMyTVChannelManagerr.   r   r   ú<module>r3     s÷   ððð ð €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &ð1
ð 1
ð 1
ð 1
ð 1
ñ 1
ô 1
ð 1
ðhVð Vð Vð Vðsð sð sð sð sñ sô sð sðn )Ð Ð Ð r   