
    @};dG                        d dl Z  e j                  dd       d dlmZmZmZmZmZmZm	Z	 d dlm
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Zd dlZ ej*                  d e
j,                                d Z G d d	e      Z G d
 de      Z G d dej6                  ej8                        Z G d dej6                  ej<                        Z ej@                  e       y)    NSoupz3.0)GLibGObjectGioPeasPeasGtkr   Gtk)RB	rhythmboxc                      	 t         j                  j                  t         j                  j                  dd ddd      } | j                         S # t        $ r}dd l}|j                         cY d }~S d }~ww xY w)Nr   zorg.freedesktop.Avahi/zorg.freedesktop.Avahi.Server)	r   	DBusProxynew_for_bus_syncBusTypeSYSTEMGetHostNameFqdn	Exceptionsocketgethostname)per   s      B/usr/lib/x86_64-linux-gnu/rhythmbox/plugins/webremote/webremote.pyget_host_namer   -   sj    	,MM223;;3E3E34373J363QS ((** 	,))++	,s   AA 	A5A0*A50A5c                   *    e Zd Zd Zd Zd Zd Zd Zy)ClientSessionc                    t        d       || _        || _        | j                  j                  d| j                         | j                  j                  d| j
                         || _        | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  d| _        y )Nznew connection attachedmessageclosed)statusnextprevious	playpauseseek)printconnidconnconnect
message_cb	closed_cbpluginclient_statusclient_nextclient_previousclient_playpauseclient_seekactions)selfr*   
connectionr%   s       r   __init__zClientSession.__init__?   s    !"$+$)))It/))Hdnn-$+[[&&;;""{{**,,;;""$,    c                 h   |t         j                  j                  k7  rt        d       y |j	                         j                  d      }t        d|z         	 t        j                  |      }|j                  d      }t        d|z         || j                  v r | j                  |   |      }nddi}t        dt        |      z         | j                  j                  t        j                  |             y # t        $ r.}t        j                   t        j"                           Y d }~y d }~ww xY w)	Nzbinary message received?zutf-8zmessage received: %sactionzdoing %sresultwhatzresponding %s)r   WebsocketDataTypeTEXTr$   get_datadecodejsonloadsgetr0   strr&   	send_textdumpsr   sys
excepthookexc_info)	r1   r&   msgtyper   dmr6   rr   s	            r   r(   zClientSession.message_cbN   s    &&+++	#$	(!"##zz!}1EE(O6f	VQA	6A3q6	!"99tzz!}%	 #>>3<<>"#s   B!C: :	D1$D,,D1c                 P    | j                   j                  | | j                         y N)r*   player_websocket_closedr%   )r1   r&   s     r   r)   zClientSession.closed_cbc   s    ++%%dDKK8r4   c                 :    | j                   j                  |       y rK   )r&   rA   )r1   r   s     r   dispatchzClientSession.dispatchf   s    ))gr4   c                 <    | j                   j                  dd       y )Nr    )r&   closer1   s    r   
disconnectzClientSession.disconnecti   s    ))//!Rr4   N)__name__
__module____qualname__r3   r(   r)   rN   rS    r4   r   r   r   =   s    #*9r4   r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TrackStreamerc                    || _         || _        | j                  j                  d| j                         t        j
                  j                  |      | _        || _        d | _	        d| _
        d| _        t        d|z          y )Nzwrote-chunkr   Fz
streaming )serverr   r'   wrote_chunkr   Filenew_for_uri	trackfilecontent_typestreamoffsetdoner$   )r1   r[   r   trackr`   s        r   r3   zTrackStreamer.__init__m   sj    $+$,,,}d&6&6788''.$."$$+$+$)ur4   c                 h    | j                   s&| j                  j                  | j                         y y rK   )rc   r[   pause_messager   )r1   msgs     r   r\   zTrackStreamer.wrote_chunkx   s$    	;;T\\* 
r4   c                     t        d       | j                  j                  t        j                  d | j
                         | j                  j                  | j                         y )Nopening)	r$   r_   
read_asyncr   PRIORITY_DEFAULTopenedr[   rf   r   rR   s    r   openzTrackStreamer.open|   s@    	..D114E++DLL)r4   c                    	 t        d       | j                  j                  j                  }|j	                  | j
                         |j                  t        j                  j                         | j                  j                  j                  }|j                  d       | j                  j                  |      | _        | j                  j                  d       | j!                          y # t"        $ rn}t%        j&                  t%        j(                           | j                  j                  d       | j*                  j-                  | j                         Y d }~y d }~ww xY w)Nztrack openedF     )r$   r   propsresponse_headersset_content_typer`   set_encodingr   EncodingCHUNKEDresponse_bodyset_accumulater_   read_finishra   
set_status	read_morer   rC   rD   rE   r[   unpause_message)r1   objr7   headersbodyr   s         r   rl   zTrackStreamer.opened   s    -\\007
D--.
--.
,,


*
*4u++F34;<<3>>	 ->>3<<>"<<3;;t||,,-s   C+C. .	E%7A$E  E%c                 p    | j                   j                  dt        j                  d | j                         y )Ni   )ra   read_bytes_asyncr   rk   	read_donerR   s    r   r{   zTrackStreamer.read_more   s$    ++ud&;&;T4>>Rr4   c                    | j                   j                  j                  }	 | j                  j	                  |      }|j                         dk(  rd| _        |j                          nQ| j                  |j                         z   | _        |j                  |j                                | j                          | j                  j                  | j                          y # t        $ r}t        j                   t        j"                           | j                  dk(  r| j                   j%                  d       n|j                          | j                  j                  | j                          Y d }~y d }~ww xY w)Nr   Trp   )r   rq   rw   ra   read_bytes_finishget_sizerc   completerb   appendr;   r{   r[   r|   r   rC   rD   rE   rz   )r1   r}   r7   r   br   s         r   r   zTrackStreamer.read_done   s    				)	)$-{{$$V,1jjlaDIMMO++

,DKKK

NN;;t||,	 ->>3<<>"{{aLLC MMO;;t||,,-s   B<C 	E6(BE11E6N)	rT   rU   rV   r3   r\   rm   rl   r{   r   rW   r4   r   rY   rY   l   s!    	+*
-$S-r4   rY   c                      e Zd Zd Z ej
                  ej                        ZdZdZe	j                  j                  de	j                  j                  de	j                  j                  de	j                  j                  de	j                  j                  de	j                  j                   d	e	j                  j                  diZe	j                  j$                  d
e	j                  j&                  de	j                  j(                  de	j                  j*                  de	j                  j,                  de	j                  j.                  de	j                  j0                  de	j                  j2                  di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" Z+d# Z,d$ Z-d% Z.d& Z/d' Z0d( Z1d) Z2d* Z3d+ Z4d, Z5d- Z6d. Z7d/ Z8d0 Z9d1 Z:d2 Z;y3)4WebRemotePlugintype<      titleartistalbumzalbum-artistgenrecomposeridyearbitratedurationztrack-numberztrack-totalzdisc-numberz
disc-totalc                 *   t         j                  j                  |        t        j                  j                  d      | _        | j                  j                  d| j                         d | _	        d| _
        i | _        g | _        d | _        d| _        y )N%org.gnome.rhythmbox.plugins.webremotechangedr   F)r   Objectr3   r   Settingsnewsettingsr'   settings_changed_cbr[   next_connidconnectionsreplay
access_keylisten_resetrR   s    r   r3   zWebRemotePlugin.__init__   sr    	..$,,""#JK$---	4#;#;<$+$$$+$/$r4   c                 D   | j                   d   }|j                         }|dz   j                         }g d}d}d}t        j                  d      }|t	        |      k  rB||   |j                  |||dz          d   z   dz  ||<   |dz   }|dz   dz  }|t	        |      k  rB|S )	N
access-keyz    )r   r   r   r   r   z<I   l       )r   encodestructStructlenunpack)	r1   r   aeapakikiuints	            r   get_sign_keyzWebRemotePlugin.get_sign_key   s    
mmL!!xxz"	H"!!"	t	$	CGbEDKK1QqS	*1--;1R51u1	a12 	
CG
 
(r4   c                    	 t        |j                  d      D cg c]  }|j                  d       c}      }|d   }|d   }|j                  dd      }|| j                  v rt	        d|z   dz   |z          y	t        |      d
z  }t        j                         }	| j                  }
t	        d|z   dz   t        |	|
z
        z   dz   t        |	|
z         z          ||	|
z
  k  s||	|
z   kD  ry	|dz   |z   j                         }t        j                  | j                  |      |      j                         }t	        d|z   dz   |j                         z          ||j                         k(  r;| j                  j                  d|       | j                  d | j                    | _        yy	c c}w # t"        $ r.}t%        j&                  t%        j(                           Y d }~y	d }~ww xY w)N&=tssigr   defaultzreplayed signature z in request for F  zrequest timestamp: z, min: z, max: 
zrequest signature: z, expecting: r   T)dictsplitr?   r   r$   inttimesignature_max_ager@   r   siphashSipHash_2_4r   	hexdigestr<   insertreplay_memoryr   rC   rD   rE   )r1   pathqueryr   qargsr   r   keyiditsnowmaxr   checkr   s                 r   check_http_signaturez$WebRemotePlugin.check_http_signature   s   u{{3'78!895d2	u399S)$5	T[[	
#
%(:
:T
AB	R43	3			3		#i	/#cCi.	@9	LsSVY\S\~	]^
cCicS3Y/TkB&&(7t007AKKM5		$	6	GHszz|KKq#++1t112DK
1 94 
 >>3<<>"
s6   F( F#AF( 8A0F( )B8F( #F( (	G1$GGc                 ~    |j                         }| j                  |j                         |j                               S rK   )get_urir   get_path	get_query)r1   rg   us      r   check_http_msg_signaturez(WebRemotePlugin.check_http_msg_signature
  s,    	kkm!		"	"1::<	??r4   c                    |j                  dd      \  }}| j                  ||      du r|j                  dd       y t        | || j                        }|| j
                  | j                  <   | j                  dz   | _        y )N:r   F  whatever)r   r   rQ   r   r   r   )r1   r[   rg   r   r&   upathr   css           r   player_websocket_cbz#WebRemotePlugin.player_websocket_cb  sy    ::c1%.5%	ue,5::c:	T4!1!12"')$4##$%%)$r4   c                 :    | j                   j                  |       y rK   )r   pop)r1   r2   r%   s      r   rL   z'WebRemotePlugin.player_websocket_closed  s    vr4   c                     t        j                  |      }| j                  j                         D ]  }|j	                  |        y rK   )r=   rB   r   valuesrN   )r1   r   rH   cs       r   rN   zWebRemotePlugin.dispatch  s9    
jj!""$ a::a=r4   c                     |y |j                  | j                        du ry |t        | j                        d  j                  d      }t        j
                  j                  |      S )NFr   )
startswithartcacher   lstriposr   normpath)r1   filenamerfns      r   album_art_filenamez"WebRemotePlugin.album_art_filename   s[    
'50
T]]#$%,,S1#			#	r4   c                    i }|| j                   j                         D ]  \  }}|j                  |      ||<    | j                  j                         D ]  \  }}|j	                  |      ||<    |j                  t        j                  j                        }| j                  j                  |      \  }}| j                  |      |d<   |S Nalbumart)string_propsitems
get_stringulong_props	get_ulongcreate_ext_db_keyr
   RhythmDBPropTypeALBUM	art_storelookupr   )r1   entryrH   r   r   keyr   lkeys           r   entry_detailszWebRemotePlugin.entry_details+  s    !
""((* v1AAaD!!'') v1??1AaD 
	 	 !4!4!:!:	;3nn++C0Hd**841Z=	
(r4   c                 |    	 | j                   j                         \  }}|dz  |d<   y # t        $ r
}Y d }~y d }~ww xY w)Nr   position)shell_playerget_playing_timer   )r1   updaterI   posr   s        r   set_playing_positionz$WebRemotePlugin.set_playing_position8  s@    0028Asd
6*	 s   %( 	;;c                     | j                   j                         }|rE| j                  |      }| j                  |       | j                   j	                         }|d   |d<   nddd}t        j                         |d<   |S )Nr   playingFr   )r  r   hostname)r   get_playing_entryr   r  get_playingr   r   )r1   r   r   rH   r   s        r   r+   zWebRemotePlugin.client_status?  sy    



-
-
/%
% 1Q$$&1A$1Y<$1$$&!J-	
(r4   c                     	 | j                   j                          ddiS # t        $ r}dt        |      icY d }~S d }~ww xY wNr7   ok)r   do_nextr   r@   r1   r   r   s      r   r,   zWebRemotePlugin.client_nextL  sC    T
	 SV
     	A ;A A c                     	 | j                   j                          ddiS # t        $ r}dt        |      icY d }~S d }~ww xY wr
  )r   do_previousr   r@   r  s      r   r-   zWebRemotePlugin.client_previousS  sC      "T
	 SV
r  c                     	 | j                   j                          ddiS # t        $ r}dt        |      icY d }~S d }~ww xY wr
  )r   r"   r   r@   r  s      r   r.   z WebRemotePlugin.client_playpauseZ  sC     T
	 SV
r  c                     	 | j                   j                  |d          ddiS # t        $ r}dt        |      icY d }~S d }~ww xY w)Nr   r7   r  )r   set_playing_timer   r@   r  s      r   r/   zWebRemotePlugin.client_seeka  sI    %%gfo6T
	 SV
s   !$ 	A?AAc                 R    d| _         | j                  | j                  |             y )Nr   )elapsedrN   r   )r1   playerr   s      r   playing_song_changed_cbz'WebRemotePlugin.playing_song_changed_cbi  s     $,--""5)*r4   c                 P    d|i}| j                  |       | j                  |       y )Nr  )r  rN   )r1   r  r  r   s       r   playing_changed_cbz"WebRemotePlugin.playing_changed_cbm  s&    7!A--r4   c                     || j                   v r | j                  | j                   |   |i       || j                  v r!| j                  | j                  |   |i       y y rK   )r   rN   r   )r1   r  uripropoldvaluenewvalues         r    playing_song_property_changed_cbz0WebRemotePlugin.playing_song_property_changed_cbr  s[    	T==4$$T*H67	T==4##D)856 r4   c                 t    t        || j                  z
        dkD  r| j                  d|dz  i       || _        y )Ni ʚ;r   i@B )absr  rN   )r1   r  r  s      r   elapsed_nano_changed_cbz'WebRemotePlugin.elapsed_nano_changed_cbx  s4    4<<	 :-==*ggo./$,r4   c                     | j                   j                         }|@| j                  j                  ||      r#| j	                  d| j                  |      i       y y y r   )r   r  dbentry_matches_ext_db_keyrN   r   )r1   storer   r   datar   s         r   art_added_cbzWebRemotePlugin.art_added_cb}  sT    



-
-
/%
477;;E3G==*d55h?@A Hr4   c                 r   	 t        |d      }|j                         }t        |      r ||      }|j                  |t        j
                  j                  |       |j                  d       y # t        $ r?}t        j                  t        j                           |j                  d       Y d }~y d }~ww xY w)Nrbro   rp   )rm   readcallableset_responser   	MemoryUseCOPYrz   r   rC   rD   rE   )r1   rg   r   r`   fprG   r   s          r   send_file_responsez"WebRemotePlugin.send_file_response  s    Xt2	wwy1|?LL$.."5"5q9>>#	 >>3<<>">>#s   A+A. .	B675B11B6c                 :    |dd dk(  ry|dd dk(  ry|dd d	k(  ryy
)Nr   r   s   PNGz	image/pngr      s   <?xmlzimage/svg+xmls   <svgz
image/jpegrW   )r1   r'  s     r   image_content_typez"WebRemotePlugin.image_content_type  s8    	!AY&
AayH
AayG

r4   c                    | j                  |      du r|j                  d       y | j                  j                         }||j                  d       y |j	                  t
        j                  j                        }t        j                  |      }t        |||j                         |      }	 |j                          y # t        $ r?}	t        j                  t        j                           |j                  d       Y d }	~	y d }	~	ww xY w)NFr     rp   )r   rz   r   r  r   r
   r   
MEDIA_TYPEgst_media_type_to_mime_typerY   get_playback_urirm   r   rC   rD   rE   )
r1   r[   rg   r   r   r   mtctsr   s
             r   http_track_cbzWebRemotePlugin.http_track_cb  s    	""3'50>>#	



-
-
/%
]>>#	++667"	%%b)"FC!7!7!92>!668	 >>3<<>">>#s   /C   	D	5DDc                    | j                  |      du r|j                  d       y |j                         dk7  r|j                  d       y t        j                  d|      |j                  d       y t
        j                  j                  | j                  |t        d      d        }t
        j                  j                  |      s|j                  d       y | j                  ||| j                         y )NFr   GETr6  z/art/[^/][a-zA-Z0-9/]+/art/)r   rz   
get_methodrematchr   r   joinr   r   existsr1  r4  )r1   r[   rg   r   r   artpaths         r   http_art_cbzWebRemotePlugin.http_art_cb  s    	""3'50>>#	^^>>#	XX&-5>>#	GGLLS\](;<'		 >>#	#w(?(?@r4   c                    |j                         dk7  r|j                  d       y t        j                  d|      |j                  d       y |j	                  d      }|d   }t        |d         }t        j                  j                         j                  ||t        j                  j                        }||j                  d       y |j                         }		 t        j                  |	d      }
|
j                         }| j!                  |      }|j#                  |t$        j&                  j(                  |       |j                  d       y # t*        j,                  j.                  j0                  $ r5}| j3                  ||j                         | j                          Y d }~y d }~wt4        $ r?}t7        j8                  t7        j:                           |j                  d	       Y d }~y d }~ww xY w)
Nr?  r6  z/icon/[a-zA-Z0-9.-]+/[0-9]+r         r   ro   rp   )rA  rz   rB  rC  r   r   r	   	IconThemeget_defaultlookup_iconIconLookupFlags	FORCE_SVGget_filenamer   resources_lookup_datar;   r4  r-  r   r.  r/  gi
repositoryr   GErrorr1  r   rC   rD   rE   )r1   r[   rg   r   r   bitsiconnameiconsizeiconiconfileresr'  r`   ger   s                  r   http_icon_cbzWebRemotePlugin.http_icon_cb  s|   ^^>>#	XX+T2:>>#		C$!W(a\(		"	"	$	0	08SEXEXEbEb	c$	\>>#	 (		"	"8Q	/3
,,.4))$/<L$.."5"5t<>>#				"	" N3 1 1 3T5L5LMM	 >>3<<>">>#s%   A3E 'G49+F))G455G//G4c                    |dk(  rd}nd|z   dz   }|j                  |      s|j                  d       y |t        |      d  }|j                         dk7  s|j	                  d      dk7  r|j                  d       y t        j                  | t        j                  j                  ||            }||j                  d       y | j                  |||       y )NrP   r   r   r?  )r   rz   r   rA  findr*  find_plugin_filer   r   rD  r1  )r1   rg   r   subdirr`   ssubdirrelpathfs           r   serve_staticzWebRemotePlugin.serve_static  s    r\76\C7		!>>#	W'^^',,s"3r"9>>#	$VW =>!Y>>#	#q,/r4   c                 ,    | j                  ||dd       y )Ncssztext/cssre  r1   r[   rg   r   r   s        r   http_static_css_cbz"WebRemotePlugin.http_static_css_cb  s    Cuj1r4   c                 ,    | j                  ||dd       y )Njsztext/javascriptrh  ri  s        r   http_static_js_cbz!WebRemotePlugin.http_static_js_cb  s    Ct%67r4   c                 ,    | j                  |ddd       y )Nz/webremote.htmlrP   z	text/htmlrh  ri  s        r   http_root_cbzWebRemotePlugin.http_root_cb  s    C*B<r4   c                    |dk(  rG| j                   :| j                  du r+| j                   j                          | j                          y y y |dk(  r0| j                  j                         D ]  }|j                           y y )Nlisten-portFr   )http_serverr   rS   http_listenr   r   )r1   r   r   r   s       r   r   z#WebRemotePlugin.settings_changed_cb  s    M
"t'8'8E'A! (B" l##% qLLN r4   c                    t        d       | j                  d   }|dk7  r	 | j                  j                  |d       |dk(  r~t        d       d| _        | j                  j                  dd       | j                  j                         }t        |      dkD  r |d   j                         | j                  d<   d| _        y y # t        $ r}d}Y d }~d }~ww xY w)Nrelisteningrq  r   ztrying againTF)	r$   r   rr  
listen_allr   r   get_urisr   get_port)r1   portr   uriss       r   rs  zWebRemotePlugin.http_listen  s    	}	%$	QYa( 
QY4q!$



#
#
%4	$i!m#'7#3#3#5DMM- 4   Ds   C 	C
CCc                    | j                   }|j                  j                  | _        t        j                  j                  t        j                         dd      | _        t        j                  d      | _
        | j                  j                  d| j                         |j                  j                  | _        | j                  j                  d| j                         | j                  j                  d| j                         | j                  j                  d| j                          | j                  j                  d| j"                         | j                  | j                  | j                  j%                                t'        j(                         | _        | j*                  j-                  d	| j.                  
       | j*                  j-                  d| j0                  
       | j*                  j-                  d| j2                  
       | j*                  j-                  d| j4                  
       | j*                  j-                  d| j6                  
       | j*                  j9                  dd d | j:                         | j*                  j-                  d| j<                  
       | j?                          y )Nz	album-artrP   )nameaddedzplaying-song-changedzplaying-song-property-changedzplaying-changedzelapsed-nano-changedr@  )r   callbackz/icon/z/entry/current/streamz/css/z/js/z
/ws/playerr   ) objectrq   r$  r   r   rD  r
   user_cache_dirr   ExtDBr   r'   r(  r   r  r  r  r"  r  r   Serverrr  add_handlerrG  r\  r=  rj  rm  add_websocket_handlerr   ro  rs  )r1   shells     r   do_activatezWebRemotePlugin.do_activate#  s   
++%KKNN$''',,r002KD$-88-$...$"3"34kk..$2D4P4PQ;T=b=bc-t/F/FG2D4P4PQt00$2C2C2U2U2WX[[]$Gd6F6FGHt7H7HI$;dFXFXYGd6M6MNFT5K5KL((tT4C[C[\C$2C2CDr4   c                 F    | j                  ddi       d | _        i | _        y )NshutdownT)rN   r[   r   rR   s    r   do_deactivatezWebRemotePlugin.do_deactivate>  s"    --T#$$+$r4   N)<rT   rU   rV   _WebRemotePlugin__gtype_namer   propertyr  r   r   r
   r   TITLEARTISTr   ALBUM_ARTISTGENRECOMPOSERr   ENTRY_IDYEARBITRATEDURATIONTRACK_NUMBERTRACK_TOTALDISC_NUMBER
DISC_TOTALr   r3   r   r   r   r   rL   rN   r   r   r  r+   r,   r-   r.   r/   r  r  r  r"  r(  r1  r4  r=  rG  r\  re  rj  rm  ro  r   rs  r  r  rW   r4   r   r   r      s   !
'


0  WhW""NW
W Fy
""N!!=!!=  ,

$@@*
+
7
B
	*A(@0028=*6r4   r   c                   b    e Zd Zd Z ej
                  ej                        Zd Zd Z	d Z
d Zy)WebRemoteConfigr   c                     |j                         }|| j                  k7  r$t        d|z         || _        || j                  d<   y)Nzchanging access key to %sr   F)get_textr   r$   r   )r1   widgeteventr   s       r   accesskey_focus_out_cbz&WebRemoteConfig.accesskey_focus_out_cbG  s@    oo!$//	$q	()4?!"4==	r4   c                     t               }| j                  d   }d||fz  }t        d      }| j                  j	                  d|d|d       | j
                  j                  d|z         y )Nrq  zhttp://%s:%d/zLaunch web remote controlz	<a href="z">z</a>z%d)r   r   _launch_link
set_markup
portnumberset_text)r1   r  ry  urllabels        r   update_portzWebRemoteConfig.update_portP  s`    _(	}	%$8T**#
'
(%sEBC//4$;'r4   c                 0    |dk(  r| j                          y y )Nrq  )r  )r1   r   r   s      r   r   z#WebRemoteConfig.settings_changed_cbY  s    M r4   c                    t         j                  j                  d      | _        | j                  j	                  d| j
                         t        j                  | d      }t        j                         | _
        | j                  j                  |       | j                  j                  d      }| j                  j                  d      | _        | j                  j                  d      | _        | j                          | j                  j                  d      | _        | j                  d   | _        | j"                  r%| j                   j%                  | j"                         | j                   j	                  d	| j&                         |S )
Nr   r   zwebremote-config.uizwebremote-configr  zlaunch-link	accesskeyr   zfocus-out-event)r   r   r   r   r'   r   r*  r`  r	   Builderbuilderadd_from_file
get_objectr  r  r  	key_entryr   r  r  )r1   ui_filecontents      r   do_create_configure_widgetz*WebRemoteConfig.do_create_configure_widget]  s   ,,""#JK$---	4#;#;<&;<'$,,,W%LL##$67'LL++L9$/\\,,];$<<**;7$.MM,/$/	__>>4??+..*D,G,GH	.r4   N)rT   rU   rV   __gtype_name__r   r  r   r  r  r  r   r  rW   r4   r   r  r  C  s1    #
'


/(r4   r  )!rR  require_versiongi.repositoryr   r   r   r   r   r   r	   r
   r*  rC   os.pathr   r=   rB  r   r   r   gettextinstall
locale_dirr   r  r   rY   r   Activatabler   Configurabler  type_registerrW   r4   r   <module>r     s   6 
   65 ! F F F  	 
   	     ]R]]_ -, -F -^=-F =-BTgnnd&6&6 Tl.gnng&:&: .b   o &r4   