
    @};dq6                        d dl Z d dlZd dlZd dlZd dlmZmZmZm	Z	 d dlm
Z
 d dlmZmZ d dlZd dlmZ d dlZ ej                   d e
j"                                g dZdd	gZdd	gZd
Zd Zd Zd Zd Zd Z G d de      Z G d de      Z G d dej<                        Z G d dej@                  e	jB                        Z"y)    N)GtkGioGObjectPeas)RB)Gst
GstPbutils)LyricsConfigureDialog	rhythmbox)z\(live[^\)]*\)z\(acoustic[^\)]*\)z\([^\)]*mix\)z\([^\)]*version\)z\([^\)]*edit\)z\(feat[^\)]*\))/-)z & z and zrb:stream-song-titlec                  ~   t        j                         } | j                  t         j                  j                         | j                  d       | j                  d       | j                  dd       t        j                         }|j                  |        |j                  t         j                  j                  t         j                  j                         |j                  t         j                  j                          t        j"                  d      }|j%                  |ddd       || j'                         | fS )NF   r      )spacingT)r   TextViewset_wrap_modeWrapModeWORDset_editableset_left_marginset_size_requestScrolledWindowadd
set_policy
PolicyTypeNEVER	AUTOMATICset_shadow_type
ShadowTypeINVBox
pack_start
get_buffer)tviewswvboxs      </usr/lib/x86_64-linux-gnu/rhythmbox/plugins/lyrics/lyrics.pycreate_lyrics_viewr)   1   s    	S\\&&'EqA	s~~##S^^%=%=>CNN%%&T4#	u!5))    c                    t        | |      \  }}|t        d      k(  rd}|t        d      k(  rd}|j                         }|j                         }t        D ]  }t	        j
                  |d   |d   |      }! t        D ]  }t	        j
                  |d   |d   |      }! t        D ]  }t	        j
                  |d|      } |j                         }|j                         }||fS )NUnknown r      )	get_artist_and_title_lowerLYRIC_ARTIST_REPLACEresubLYRIC_TITLE_REPLACELYRIC_TITLE_STRIPstrip)dbentryartisttitleexps        r(   parse_song_datar=   B   s    'E2&% a	l&	Qy\
% ,,.	 ! *S66#a&#a&&)&* (S
&&QQ
'%(  "S
&&#r5
!%" 

,,.	r*   c                    | j                  |t              }|t        |      \  }}||fS |j                  t        j
                  j                        }|j                  t        j
                  j                        }||fS N)entry_request_extra_metadataSTREAM_SONG_TITLEextract_artist_and_title
get_stringr   RhythmDBPropTypeARTISTTITLE)r8   r9   stream_song_titler:   r;   s        r(   r/   r/   _   s{    44U<MN!,->?/65 
 B//667&


2..44
5%	r*   c                 8   | j                  d      }t        |      dkD  r*|d   j                         }|d   j                         }||fS | j                  d      }t        |      dkD  r+|d   j                         }|d   j                  d      }||fS | }d}||fS )Nr   r.   r   (z) r-   )splitlenr7   )rG   detailsr:   r;   s       r(   rB   rB   h   s    ""3'L11:&
!*


% 
 ##C('\A1:5AJT"6 
 56	r*   c                 \   t         j                  j                  d      }|d   }||dk(  r2t        j                  j                  t        j                         d      }t        j                  j                  |      }t        j                  j                  |      st        j                  |       t        j                  j                  || d d       }t        j                  j                  |      st        j                  |       t        j                  j                  ||d d dz         S )Nz"org.gnome.rhythmbox.plugins.lyricsfolderr-   lyrics   z.lyric)r   Settingsnewospathjoinr   user_cache_dir
expanduserexistsmkdir)r:   r;   settingsrN   lyrics_folderartist_folders         r(   build_cache_pathr]   w   s    LLAB
8

Nfl77<<))+X6&##V,
&((MmVDS\:
&((M
]E$3K($:;;r*   c                   B    e Zd ZdZd Zd ZddZd Zd Zd Z	d Z
d	 Zy
)LyricGrabberzq
	Fetch lyrics from several sources.

	1. Local cache file
	2. Lyric tags in file meta data
	3. Online services
	c                     || _         || _        t        | j                   | j                        \  | _        | _        t        | j                  | j                        | _        y r?   )r8   r9   r=   r:   r;   r]   
cache_path)selfr8   r9   s      r(   __init__zLyricGrabber.__init__   sC    $'$*-dggtzzB4;
$T[[$**=$/r*   c                 T    t         j                  j                  | j                        S r?   )rS   rT   rX   ra   rb   s    r(   verify_lyriczLyricGrabber.verify_lyric   s    		((r*   c                     || _         | j                         }|rHt        | j                  d      }|j	                         }|j                          | j                  |       y|r| j                  t        d             y| j                          y)zW
		Fetch lyrics from cache.

		If no cache file exist, tag extraction is tried next.
		rtNo lyrics foundN)callbackrf   openra   readcloser0   search_tags)rb   rj   
cache_onlystatusftexts         r(   search_lyricszLyricGrabber.search_lyrics   sm     $-&DOOT"1
&&(4779====$%&r*   c                 F   | j                   j                         }t        j                  t        j
                  dz        | _        | j                  j                  d| j                         | j                  j                          | j                  j                  |       y)zR
		Initiate fetching meta tags.

		Result will be handled in search_tags_result
		   )timeout
discoveredN)r9   get_playback_urir	   
Discovererr   SECOND
discovererconnectsearch_tags_resultstartdiscover_uri_async)rb   locations     r(   rn   zLyricGrabber.search_tags   sl     ZZ((*())#**Q,?$///,(?(?@////$$X.r*   c                    |j                         }|| j                          yt        |j                  d            D ]  }|j	                  d|      \  }}|r6|j                  d      r%|j                  dd      }| j                  |        y|sS|j                  d      se|j                  dd      }| j                  |        y | j                          y)z
		Extract lyrics from the file meta data (tags).

		If no lyrics tags are found, online services are tried next.

		Supported file formats and lyrics tags:
		- ogg/vorbis files with "LYRICS" and "SYNCLYRICS" tag
		Nzextended-commentLYRICSzLYRICS=r-   
SYNCLYRICSzSYNCLYRICS=)get_tagssearch_onlinerangeget_tag_sizeget_string_index
startswithreplacelyrics_found)	rb   r{   infoerrortagsirX   valuerr   s	            r(   r}   zLyricGrabber.search_tags_result   s     
$	\	""#567 a**+=qA?FE!!(+==B'Dd
5##L1==+Dd
 r*   c                     | j                   dk(  r*| j                  dk(  r| j                  t        d             yt	        j
                  | j                   | j                        }|j                  | j                         y)z-Initiate searching the online lyrics servicesr-   ri   N)r:   r;   rj   r0   LyricsParseParser
get_lyricssearch_online_result)rb   parsers     r(   r   zLyricGrabber.search_online   sY    	[[B4::+==$%&t{{DJJ76	T../r*   c                 `    || j                  |       y| j                  t        d             y)z5Handle the result of searching online lyrics servicesNri   )r   rj   r0   rb   rr   s     r(   r   z!LyricGrabber.search_online_result   s(    	T==$%&r*   c                     t        | j                  d      }|j                  |       |j                          | j	                  |       y Nwt)rk   ra   writerm   rj   )rb   rr   rq   s      r(   r   zLyricGrabber.lyrics_found   s2    
4??D!!''$-'')--r*   N)F)__name__
__module____qualname____doc__rc   rf   rs   rn   r}   r   r   r    r*   r(   r_   r_      s/    >)&
/:0'r*   r_   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)	LyricPanec                    	 | _         | _         j                  j                  j                   _         j                          d 	d 	 fd fd} fd} fd}t        j                  t        d      d	       _	         j                  j                  d
|       t        j                  t        d      d	       _         j                  j                  d|       t        j                  j                  t        j                         _         j                  j                  d|       t        j                   t        j"                  j$                         _         j&                  j)                  d        j&                  j+                  t        j,                  j.                          j&                  j1                   j                          j&                  j1                   j                          j&                  j1                   j                          j&                  j3                   j                  d       t5               \   _         _         _         j6                  j=                   j&                  ddd        j6                  j)                  d       d j6                  j                  _         j6                  jA                          |jC                  t        d       j6                         _"        d _#        d _$        |j                  d jJ                         _&         j6                  jO                         }|j                  d jP                         _)        y )Nc                 ^    t        | d      }|j                  |       |j                          y r   rk   r   rm   )ra   rr   rq   s      r(   save_lyricsz'LyricPane.__init__.<locals>.save_lyrics   s"    J1774=779r*   c                 ^    t        | d      }|j                  d       |j                          y )Nwr-   r   )ra   rq   s     r(   erase_lyricsz(LyricPane.__init__.<locals>.erase_lyrics   s"    J1772;779r*   c                      j                   } | j                         }| j                         }| j                  ||d      } j                  |       j                          y )NT)bufferget_start_iterget_end_iterget_textra   r   )buf	startiterenditerrr   r   rb   s       r(   save_callbackz)LyricPane.__init__.<locals>.save_callback   sR    	3!!#97
,,y'4
04t%??r*   c                 d   j                   j                         dk(  r@j                  j                  d       j                   j	                  t        d             y j                           j                  j                  d       j                   j	                  t        d             y )Nr.   T_SaveF_Edit)edit
get_activer%   r   	set_labelr0   ra   )widgetr   rb   s    r(   edit_callbackz)LyricPane.__init__.<locals>.edit_callback  sw    
ii!JJD!II'
#"_JJE"II'
#r*   c                     j                   Ht        j                  j                  j                         rt        j                  j                          j                          y r?   )ra   rS   rT   rX   remover   )r   rb   s    r(   discard_callbackz,LyricPane.__init__.<locals>.discard_callback  s:    
oo!bggnnT__&EIIdoo??r*   c                     j                   ;t        j                  j                  j                         r j                          j	                          y r?   )ra   rS   rT   rX   r   )r   r   rb   s    r(   clear_callbackz*LyricPane.__init__.<locals>.clear_callback  s6    
oo!bggnndoo&F!??r*   r   T)labeluse_underlinetoggledz_Search againclicked)orientationr   Fr   Lyricsznotify::current-entryzswitch-page)*r8   	song_infopropscurrent_entryr9   
build_pathr   ToggleButtonr0   r   r|   Buttondiscardnew_from_stockSTOCK_CLEARclear	ButtonBoxOrientation
HORIZONTALhboxset_spacing
set_layoutButtonBoxStyleENDr   set_child_secondaryr)   viewr   r%   r#   marginshow_allappend_pagepage_numhave_lyricsvisibleentry_changedentry_change_id
get_parentswitch_page_cbswitch_page_id)
rb   r8   r   r   r   r   nbr   r   r   s
   `      @@@r(   rc   zLyricPane.__init__   sK   $'$.~~##11$*//

$
 QwZtD$)))I}-!O"4DI$,,,y"23zz((9$***Y/mm(B(BC$)))))s))--.))--		))--

))--))T2);)=&49dk4:))tyy%2))$))//))''(TYY?$-$$,"**+BDDVDVW$yy"

=$2E2EF$r*   c                 p    t        | j                  | j                        \  }}t        ||      }|| _        y r?   )r=   r8   r9   r]   ra   )rb   r:   r;   ra   s       r(   r   zLyricPane.build_path<  s-    #DGGTZZ8/65.*$/r*   c                     | j                   j                  j                  | _        d| _        | j
                  dk7  r!| j                          | j                          y y )Nr   )r   r   r   r9   r   r   r   r   )rb   pspecduhs      r(   r   zLyricPane.entry_changedA  sF    ~~##11$*$	\\Q???? r*   c                     | j                   dk7  ry || j                  k7  rd| _        y d| _        | j                          y )Nr   r.   )r   r   r   r   )rb   notebookpager   s       r(   r   zLyricPane.switch_page_cbH  s:    		4<	$,//r*   c                 <    | j                   j                  |d       y Nr   set_textr   s     r(   __got_lyricszLyricPane.__got_lyricsS  s    ++tR r*   c                     | j                   y | j                  j                  t        d      d       t	        | j
                  | j                         }|j                  | j                         y )NzSearching for lyrics...r   )r9   r   r   r0   r_   r8   rs   _LyricPane__got_lyrics)rb   lyrics_grabbers     r(   r   zLyricPane.get_lyricsV  sQ    	ZZ	++q23R84.t001r*   N)	r   r   r   rc   r   r   r   r   r   r   r*   r(   r   r      s#    IGZ
	!2r*   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)LyricWindowc                     t         j                  j                          | _         j	                  d       t         j
                  j                  t         j                        }|j                  d fd       t               \  }}}| _
        t        j                         }|j                  t         j                  j                         |j                  |ddd       |j                  |ddd       |j                   j"                  }|j                  d j$                         _         j)                  |        j+                  dd	        j-                          y )
Nr   r   c                 $    j                         S r?   )destroy)r   rb   s    r(   <lambda>z&LyricWindow.__init__.<locals>.<lambda>g  s    T\\^ r*   Tr   Fzplaying-song-property-changedi  i,  )r   Windowrc   shellset_border_widthr   r   STOCK_CLOSEr|   r)   r   
HButtonBoxr   r   r   r#   r   shell_playerplaying_property_changedppc_idr   set_default_sizer   )rb   r   rm   lyrics_viewr   r%   bboxsps   `       r(   rc   zLyricWindow.__init__a  s    **d$*
**
#
#COO
4%--	34!3!5;$+		$//#$$(()//%tQ'ueQ/{{"

:D<Y<YZ$+((;S!--/r*   c                     | j                   j                  j                  }|j                  | j                         t
        j                  j                  |        y r?   )r   r   r  
disconnectr  r   r   r   )rb   r  s     r(   r   zLyricWindow.destroyw  s9    zz$$"--**Tr*   c                 V    |t         k(  r | j                  |j                                y y r?   )rA   update_song_lyricsget_playing_entry)rb   playeruripropold_valnew_vals         r(   r  z$LyricWindow.playing_property_changed|  s'    
63356  r*   c                 <    | j                   j                  |d       y r   r   r   s     r(   r   zLyricWindow.__got_lyrics  s    ++b!r*   c                     | j                   j                  j                  }t        ||      \  }}| j	                  |dz   |z   dz   t        d      z          t        ||      }|j                  | j                         y )Nz - r   )	r   r   r8   r/   	set_titler0   r_   rs   _LyricWindow__got_lyrics)rb   r9   r8   r:   r;   r   s         r(   r  zLyricWindow.update_song_lyrics  sj    zz"(U3/65..'%/!H+=>E*.t001r*   N)r   r   r   rc   r   r  r  r  r   r*   r(   r   r   _  s    ,
7
"2r*   r   c                   z    e Zd Zd Z ej
                  ej                        Zd Zd Z	d Z
d Zd Zd Zd Zd	 Zy
)LyricsDisplayPlugin)typec                 P    t         j                  j                  |        d | _        y r?   )r   Objectrc   windowre   s    r(   rc   zLyricsDisplayPlugin.__init__  s    	..4 $+r*   c                    | j                   }t        j                  j                  dd       | _        | j                  j                  d| j                  |       |j                  j                  }|j                  | j                         |j                  j                  }t        j                  j                  t        d      d      }|j                  dd|       |j                  j                  }|j                  d| j                        | _        | j                  ||j#                                |j                  d| j$                        | _        |j                  j(                  }|j+                  d	| j,                        | _        y )
Nview-lyricsactivatezSong Lyricszwin.view-lyrics)r   detailed_actionr   zplaying-song-changedcreate_song_infoz'entry-extra-metadata-request::rb:lyrics)objectr   SimpleActionrR   actionr|   show_song_lyricsr   r  
add_actionapplicationMenuItemr0   add_plugin_menu_itemr  playing_entry_changedpec_idr  r!  csi_idr8   connect_afterlyrics_requestlyric_req_id)rb   r   r  appitemr  r8   s          r(   do_activatezLyricsDisplayPlugin.do_activate  s&   
++%  $$]D9$+++j$"7"7?;;&DKK #			- 0BS		T$6=$7{{"

143M3MN$+b""6"6"9:0$2G2GH$+{{~~"&&(QSWSfSfg$r*   c                    | j                   }|j                  j                  }|j                  dd       |j	                  d       d | _        |j                  j                  }|j                  | j                         |j                  | j                         |j                  j                  j                  | j                         | j                  "| j                  j                          d | _        y y )Nr   r  )r"  r   r'  remove_plugin_menu_itemremove_actionr$  r  r
  r+  r,  r8   r/  r  r   )rb   r   r0  r  s       r(   do_deactivatez!LyricsDisplayPlugin.do_deactivate  s    
++%#fm4M"$+{{"--DKK ++..T../	[[;;4; r*   c                 R   | j                   !| j                   j                          d | _         |j                  j                  }|j	                         }|Rt        |      | _         | j                   j                  d| j                         | j                   j                  |       y y )Nr   )	r  r   r   r  r  r   r|   window_deletedr  )rb   r$  	parameterr   r  r9   s         r(   r%  z$LyricsDisplayPlugin.show_song_lyrics  s    	[[;;4;{{"



!%
U#4;;;y$"5"56;;!!%( r*   c                     |D| j                   j                  d       | j                  | j                  j                  |       y y | j                   j                  d       y )NTF)r$  set_enabledr  r  )rb   r  r9   s      r(   r*  z)LyricsDisplayPlugin.playing_entry_changed  sO    
;;D!
kkKK""5)  ;;E"r*   c                 (    t        d       d | _        y )Nzlyrics window destroyed)printr  )rb   r  s     r(   r8  z"LyricsDisplayPlugin.window_deleted  s    !"$+r*   c                 N    |du r!t        |j                  j                  |      }y y )NF)r   r   r8   )rb   r   r   is_multiplexs        r(   r!  z$LyricsDisplayPlugin.create_song_info  s#    E+1 r*   c                 N    fd}t              }|j                  |       y )Nc                 2    | rj                  d|        y y )Nz	rb:lyrics) emit_entry_extra_metadata_notify)rr   r8   r9   s    r(   lyrics_resultsz:LyricsDisplayPlugin.lyrics_request.<locals>.lyrics_results  s    
''TB r*   )r_   rs   )rb   r8   r9   rD  r   s    ``  r(   r.  z"LyricsDisplayPlugin.lyrics_request  s%    C  E*.~.r*   N)r   r   r   __gtype_name__r   propertyr  r"  rc   r2  r6  r%  r*  r8  r!  r.  r   r*   r(   r  r    sF    '
'


/h,()#,/r*   r  )#rS   r3   urllib.requesturllibrbgi.repositoryr   r   r   r   r   r   r	   r   r
   gettextinstall
locale_dirr6   r5   r2   rA   r)   r=   r/   rB   r]   r"  r_   r   r   r   r  Activatabler  r   r*   r(   <module>rO     s   :   	 1 1  )  7  ]R]]_ - E !12  "23 ( *":< d6 dNn2 n2b*23:: *2ZV/'..$*:*: V/r*   