Beispiel #1
0
}, function( gvik, require, Add ) {

    'use strict';

    var options = require( 'options' ),
        dom = require( 'dom' ),
        chrome = require( 'chrome' ),
        vkapi = require( 'vkapi' ),
        events = require( 'events' ),
        core = require( 'core' );


    vkapi.pushPermission( 'groups' );


    events.bind( 'groups', function() {

        var el = dom.byId( 'groups_list_summary' );

        if ( !el )
            return;

        dom.append( el, [

            dom.create( 'span', {
                prop: {
                    className: 'divider',
                    innerText: '|'
                }
            } ),

            dom.create( 'span', {
                append: dom.create( 'a', {
                    prop: {
                        innerText: 'Выйти из всех групп'
                    },

                    events: {
                        click: function() {
                            var key = "gvik";


                            if ( ( prompt( "Введите слово \"" + key + "\", чтобы подтвердить действие." ) || '' ).toLowerCase().trim() === key )
                                vkapi.call( 'execute.allGroupsLeave' );
                        }
                    }
                } )
            } )
        ] );


    }, true );

    dom.setDelegate( document, '.group_list_row:not([data-gvik])', 'mouseover', function( el ) {

        el.setAttribute( 'data-gvik', 'true' );

        var child,
            infRow,
            but;

        if ( !( infRow = el.querySelector( '.group_row_info' ) ) ) {
            return;
        }

        dom.after( infRow, dom.create( 'span', {
            prop: {
                className: 'gvik-exit-group'
            },
            events: {
                click: function() {
                    vkapi.call( 'execute.groupLeave', {
                        gid: ( /\d+/.exec( el.id )[ 0 ] )
                    }, function() {
                        el.parentNode.removeChild( el );
                    } );
                }
            }
        } ) );

    } );


} );
Beispiel #2
0
}, function( gvik, require, Add ) {

	"use strict";

	var core = require( 'core' ),
		chrome = require( 'chrome' ),
		dom = require( 'dom' ),
		options = require( 'options' ),
		events = require( 'events' ),
		global = require( 'global' ),


		CONFS = options.get( 'audio' ),

		FROM_CACHE = CONFS.get( 'download-fromCache' ),
		SAVE_AS = CONFS.get( 'download-saveAs' ),

		rExtTest = /\.(?:\%e|mp3)$/,

		fileNamePattern = CONFS.get( 'format-filename' ),
		methodNameDownload = FROM_CACHE ? 'downloadFromCache' : 'download';


	function __formatFileName( data ) {

		fileNamePattern = fileNamePattern.trim();

		var ext = '.' + data.ext;


		if ( !rExtTest.test( fileNamePattern ) )
			fileNamePattern += ext;

		var fName = core.tmpl2( fileNamePattern, {
			a: data.artist,
			t: data.title,
			e: data.ext,
			d: data.dur,
			i: data.id
		} );

		fName = fName.replace(/[\\\/\:\*\?\"\<\>\|]+/gi, '').trim();

		if ( fName.length === ext.length )
			fName = data.artist + ' - ' + data.title + ext;

 

		return fName;
	}



	dom.setDelegate( document, '.audio:not([id=audio_global]):not([data-gvik-download])', 'mouseover', function( audioEl ) {

		audioEl.setAttribute( 'data-gvik-download', true );

		var infoEl = dom.byClass( 'info', audioEl ).item( 0 ),
			artistEl = dom.byTag( 'b', infoEl ).item( 0 ),

			titleEl = artistEl.nextElementSibling,

			data = global.VARS.PARSE_AUDIO_DATA( audioEl );

		data.artist = artistEl.innerText;
		data.title = titleEl.innerText;
		data.ext = "mp3";

		var butEl = dom.create( 'div', {

			prop: {
				'className': 'gvik-download'
			},

			events: {
				click: function( e ) {

					e.stopPropagation();
					e.preventDefault();

					e._canceled = true;

					chrome.download[ methodNameDownload ]( {
						url: data.url,
						filename: __formatFileName( data ),
						saveAs: SAVE_AS
					}, function( downloadItemId ) {
						chrome.download.search( downloadItemId, function( downloadItem ) {
							events.trigger( 'AUDIO_downloaded', {
								downloadItem: downloadItem,
								data: data
							} );
						} );
					} );
				}
			}
		} );

		data.act.appendChild( butEl );

		return data;

	} );
 

} );
Beispiel #3
0
    function( appData, require, Add ) {

        "use strict";

        var core = require( 'core' ),
            dom = require( 'dom' ),
            events = require( 'events' ),
            global = require( 'global' ),
            options = require( 'options' ),
            cache = require( 'cache' ),
            constants = require( 'constants' ),
            chrome = require( 'chrome' );



        function __calcBitrate( size, dur, needFileSize ) {
            var bitInt = ( ( size * 8 ) / dur / 1000 ) | 0,
                sizeInt = size / ( 1024 * 1024 ) | 0,
                formated = bitInt + 'kbps';

            if ( needFileSize ) {
                formated += ', ' + sizeInt + 'MB';
            }

            return {
                formated: formated,
                bitInt: bitInt,
                size: size,
                sizeInt: sizeInt
            };
        }



        var
            CONFS = options.get( 'audio' ),

            FILE_SIZE_ENABLED = CONFS.get( 'file-size' ),
            LOADER_DISABLED = CONFS.get( 'loader-disable' ),
            MIN_BIT = CONFS.get( 'min-bitrate' ),

            CLASS_BITRATE = [ 'gvik-bitrate', ( LOADER_DISABLED ? '' : ' loader' ) ].join( '' ),
            NAME_ATTR = [ 'data-gvik-bitrate', ( FILE_SIZE_ENABLED ? '-filesize' : '' ) ].join( '' ),

            AUDIO_SELECTOR = '.audio:not([id=audio_global]):not([' + NAME_ATTR + '])',
            SORT_AUDIO_SELECTOR = '.audio:not([id=audio_global])[' + NAME_ATTR + ']',

            SORT_PROP = "bitInt",


            HIDE_SMALL_BIT_FN = CONFS.get( 'auto-hide-bit' ) ? function( audios ) {

                audios = audios || window.cur.sContent.children;

                for ( var i = audios.length; i--; )
                    if ( getCacheInt( audios[ i ].id ) < MIN_BIT )
                        audios[ i ].style.display = "none";

            } : null,


            tId,

            SORT_FN = CONFS.get( 'auto-sort-bit' ) ? function() {


                var audios = [].slice.call( window.cur.sContent.children ).sort( function( a, b ) {
                    return getCacheInt( b.id ) - getCacheInt( a.id );
                } );

                if ( !audios.length )
                    return;


                dom.append( window.cur.sContent, audios );

                return audios;

            } : null,

            AUTO_LOAD_BIT_FN = ( HIDE_SMALL_BIT_FN || SORT_FN ) ? function( timeout ) {


                clearTimeout( tId );


                if ( !window.cur.searchStr ) return;

                if ( !timeout ) {
                    SORT_FN && SORT_FN();
                    HIDE_SMALL_BIT_FN && HIDE_SMALL_BIT_FN();
                    return;
                }

                tId = setTimeout( function() {
                    SORT_FN && SORT_FN();
                    HIDE_SMALL_BIT_FN && HIDE_SMALL_BIT_FN();
                }, constants.get( 'BITRATE_TIMEOUT' ) );

            } : null;


        function getCacheInt( id ) {
            return ( cache.get( global.VARS.CLEAN_ID( id ) ) || {} )[ SORT_PROP ] || -1;
        }

        function __getBitrate( url, dur, callback, needFileSize, id ) {

            if ( cache.has( id ) ) {
                callback( cache.get( id ), true );
                return 'gvik-bitrate';
            }

            global.VARS.GET_FILE_SIZE( url, function( size ) {
                if ( size )
                    return callback( __calcBitrate( size, dur, needFileSize, id ) );
            } );

            return CLASS_BITRATE;
        }


        global.VARS.GET_BITRATE = __getBitrate;


        function setBitrate( audioEl, callback ) {

            audioEl.setAttribute( NAME_ATTR, true );

            var data = global.VARS.PARSE_AUDIO_DATA( audioEl ),
                bitrateEl = document.createElement( 'div' );

            data.act.appendChild( bitrateEl );

            bitrateEl.className = __getBitrate( data.url, data.dur, function( res, fromCache ) {

                if ( fromCache ) {
                    //
                } else if ( !LOADER_DISABLED ) bitrateEl.classList.remove( 'loader' );

                bitrateEl.innerText = res.formated;

                res.url = data.url;
                res.dur = data.dur;
                res.id = data.id;

                if ( !cache.has( data.id ) )
                    cache.set( data.id, res );

                callback && callback( bitrateEl, res, audioEl );

            }, FILE_SIZE_ENABLED, data.id );

        }

        if ( CONFS.get( 'auto-load-bit' ) )
            events.bind( [
                'audio.newRows',
                'audio',
                'padOpen'
            ], function( data, evaname ) {

                var fromPad = data ? !!( data.el || data[ 0 ][ 0 ] ) : false,

                    audios = dom.queryAll( AUDIO_SELECTOR ),
                    l = audios.length;

                if ( !fromPad )
                    if ( !l )
                        AUTO_LOAD_BIT_FN && AUTO_LOAD_BIT_FN( false );

                while ( l-- )
                    setBitrate( audios[ l ], fromPad ? null : AUTO_LOAD_BIT_FN );

            }, true );


        var BIT_SELECTORS = core.map( [
            "",
            ".play_new",
            ".gvik-download"
        ], function( val ) {
            return ( AUDIO_SELECTOR + " " + val ).trim();
        } )

        if ( CONFS.get( 'bitrate-audio' ) )
            var BIT_SELECTOR = BIT_SELECTORS[ 0 ];
        else if ( CONFS.get( 'bitrate-playBtn' ) )
            BIT_SELECTOR = BIT_SELECTORS[ 1 ];

        else if ( CONFS.get( 'bitrate-downloadBtn' ) )
            BIT_SELECTOR = BIT_SELECTORS[ 2 ];



        dom.setDelegate( document, BIT_SELECTOR, 'mouseover', function( el, e ) {

            if ( !dom.is( el, AUDIO_SELECTOR ) )
                el = dom.parent( e, AUDIO_SELECTOR );

            setBitrate( el );
        } );



    } );
Beispiel #4
0
    function( appData, require, Add ) {


        "use strict";

        var

            core = require( 'core' ),
            dom = require( 'dom' ),
            cache = require( 'cache' ),
            events = require( 'events' ),
            chrome = require( 'chrome' ),
            lastfmAPI = require( 'lastfmapi' ),
            constants = require( 'constants' ),
            global = require( 'global' ),
            options = require( 'options' ),
            sidebar = require( 'sidebar' ),


            nameArtist,
            nameTrack,
            nameAlbum,

            trackId,

            albumTrackList = [],

            wrap,
            tabCont,
            topTab,
            albumTab,

            showCurTab,

            cnfg = options.get( 'sidebar' );



        var label = 'Last.fm',

            labelEl = dom.create( 'div', {
                prop: {
                    className: 'label',
                    innerText: label
                }
            } ),

            imgEl = dom.create( 'img' ),

            cover = dom.create( 'div', {
                append: imgEl,
                prop: {
                    className: 'cover'
                }
            } ),

            tagsCont = dom.create( 'div', {
                prop: {
                    className: 'tags'
                }
            } ),

            artistInfoCont = dom.create( 'div', {
                prop: {
                    className: 'artistInfo'
                },
                append: [ labelEl, cover, tagsCont ]
            } ),

            tracksCont = dom.create( 'div', {
                prop: {
                    className: 'tracks'
                }
            } ),

            albTracksCont = dom.create( 'div', {
                prop: {
                    className: 'tracks gvik-none'
                }
            } ),

            tabs = dom.create( 'div', {
                prop: {
                    className: 'tabs gvik-none'
                },
                append: [
                    ( topTab = dom.create( 'input', {
                        prop: {
                            className: 'tab',
                            type: 'radio',
                            checked: true,
                            name: 'gvik_lastfm_tabs'
                        },
                        data: {
                            label: 'Top'
                        },
                        events: {
                            change: function() {
                                albTracksCont.classList.add( 'gvik-none' );
                                tracksCont.classList.remove( 'gvik-none' );
                            }
                        }
                    } ) ),



                    ( albumTab = dom.create( 'input', {
                        prop: {
                            className: 'tab',
                            type: 'radio',
                            name: 'gvik_lastfm_tabs'
                        },
                        data: {
                            label: 'Album'
                        },
                        events: {
                            change: function() {
                                tracksCont.classList.add( 'gvik-none' );
                                albTracksCont.classList.remove( 'gvik-none' );
                            }
                        }
                    } ) )
                ]
            } ),

            trackInfoCont = dom.create( 'div', {
                append: [ tabs, tracksCont, albTracksCont ]
            } ),

            TMPL = {
                item: '<div class="item gvikLastfm <%=isCurTrack>" data-duration="<%=duration>" data-trackName="<%=name>">\
            <div class="item-cont">\
                <div class="img-cont">\
                    <div class="img" style="background-image: url(\'<%=img>\');"></div>\
                </div>\
                <div class="label-cont">\
                    <a class="label"><%=name></a>\
                    <span class="duration" ><%=dur></span>\
                </div>\
            </div>\
        </div>',

                tag: '<span class="tag">\
                <a target="_blank" href="<%=url>"><%=tag></a>\
                </span>',

                renderTrack: function( curTrack ) {
                    return {
                        url: curTrack.url,
                        name: curTrack.name,
                        isCurTrack: ( ( curTrack.name === nameTrack ) ? 'cur-track' : '' ),

                        dur: global.VARS.FORMAT_TIME( curTrack.duration ),
                        duration: curTrack.duration,
                        img: ( curTrack.image ? curTrack.image[ 1 ][ '#text' ] : ( appData.APP_PATH + 'img/album.png' ) )
                    };
                },

                renderTag: function( curTag ) {
                    return {
                        url: curTag.url,
                        tag: curTag.name
                    };
                },


                renderAlbumTrack: function( album, curTrack ) {
                    return {
                        url: curTrack.url,
                        name: curTrack.name,
                        isCurTrack: ( ( curTrack.name === nameTrack ) ? 'cur-track' : '' ),
                        duration: curTrack.duration,
                        dur: global.VARS.FORMAT_TIME( curTrack.duration ),
                        img: album.image[ 1 ][ '#text' ]
                    };
                }
            };


        function resetAlbum() {

            dom.empty( albTracksCont );
            albumTab.setAttribute( 'data-label', 'Album' );

            selectTopTab();

            nameAlbum = '';

            tabs.classList.add( 'gvik-none' );
        }


        function selectTab( el ) {
            el.dispatchEvent( new Event( 'change' ) );
            el.checked = true;
        }

        function selectAlbumTab() {
            selectTab( albumTab );
        }

        function selectTopTab() {
            selectTab( topTab );
        }


        function resetArtist() {

            dom.empty( np );
            dom.empty( tracksCont );
            dom.empty( tagsCont );

            trackId = '';

            labelEl.innerText = '';
            imgEl.src = '';

            nameArtist = nameTrack = '';


            cover.style.backgroundImage = 'none';

            resetAlbum();

        }

        function getCacheKey() {
            return core.toArray( arguments ).join( '-' );
        }

        function checkCache( method, prop, cacheArr, clb ) {

            cacheArr.push( method );

            var cacheVal = cache.get( getCacheKey.apply( this, cacheArr ) );


            clb && clb( !!cacheVal );

            if ( cacheVal )
                events.trigger( method, cacheVal );
            else {
                lfapiCall( method, prop );
            }
        }

        var __xhr;


        function lfapiCall( method, prop ) {


            __xhr = lastfmAPI.call( method, {
                artist: nameArtist || '',
                album: nameAlbum || '',
                track: nameTrack || '',
                correction: 1,
                user: lastfmAPI.name
            }, function( res, isError ) {
                if ( isError )
                    return events.trigger( method + '.error', res );
                events.trigger( method, res[ prop ] );
            }, function( err ) {
                events.trigger( method + '.error', err );

            }, true );
        }

        function render( tmpl, arr, fn ) {


            if ( arr ) {

                if ( !Array.isArray( arr ) )
                    arr = [ arr ];

                return arr.map( function( val ) {
                    return core.tmpl( tmpl, fn( val ) );
                } ).join( '' );

            } else {
                return '';
            }
        }


        events
 

        .bind( 'track.getInfo', function( track, evname ) {

            nameTrack = track.name;


            cache.set( getCacheKey( nameArtist, nameTrack, evname ), track );

            if ( !track.album )
                return resetAlbum();

            if ( track.album.title === nameAlbum )
                return selectAlbumTab();


            nameAlbum = track.album.title;

            checkCache( 'album.getInfo', 'album', [ nameArtist, nameAlbum ] );

        } )

        .bind( 'artist.getInfo', function( artist, evname ) {


            cache.set( getCacheKey( nameArtist, evname ), artist );
            nameArtist = dom.unes( artist.name );
            labelEl.innerText = nameArtist;

            imgEl.src = artist.image[ 2 ][ '#text' ];

            cover.style.backgroundImage = 'url(' + artist.image[ 2 ][ '#text' ] + ')';


            var tag = ( artist.tags || {} )
                .tag || [];

            if ( !Array.isArray( tag ) ) {
                tag = [ tag ];
            }

            tagsCont.innerHTML = render( TMPL.tag, tag.sort( function( a, b ) {
                return a.name.length < b.name.length ? 1 : 0;
            } ), TMPL.renderTag );

            dom.addClass( tabCont, 'loaded' );

            checkCache( 'artist.getTopTracks', 'toptracks', [ nameArtist ] );

        } )

        .bind( 'artist.getTopTracks', function( responseTracks, evname ) {


            cache.set( getCacheKey( nameArtist, evname ), responseTracks );

            var html = [],
                track = responseTracks.track || [];


            if ( cnfg.get( 'lastfm-groupbyalbum' ) ) {

                var groups = {};

                core.each( track, function( curTrack ) {
                    if ( curTrack.image ) {
                        var img = curTrack.image[ 1 ][ "#text" ];
                        ( groups[ img ] = groups[ img ] || [] ).push( curTrack );
                    } else
                        ( groups.noimage = groups.noimage || [] ).push( curTrack );
                } );


                core.each( groups, function( val, key ) {
                    if ( key !== "noimage" )
                        html.push( render( TMPL.item, val, TMPL.renderTrack ) );
                } );

                html.push( render( TMPL.item, groups.noimage || [], TMPL.renderTrack ) );


            } else
                html.push( render( TMPL.item, track || [], TMPL.renderTrack ) );


            tracksCont.innerHTML = html.join( '' );

            checkCache( 'track.getInfo', 'track', [ nameArtist, nameTrack ] )

        } )

        .bind( 'artist.getInfo.error', function( err ) {


            dom.addClass( tabCont, 'loaded' );

        } )

        .bind( 'album.getInfo', function( album, evname ) {

            cache.set( getCacheKey( nameArtist, nameAlbum, evname ), album );

            var albName = [ album.name ];

            if ( album.releasedate ) {
                var res = album.releasedate.trim().match( /\d{4}/ );
                if ( res ) albName.push( res[ 0 ] );
            }

            albumTab.setAttribute( 'data-label', albName.join( ', ' ) );

            if ( !album.tracks || !album.tracks.track )
                return;

            albTracksCont.innerHTML = render( TMPL.item, album.tracks.track, TMPL.renderAlbumTrack.pbind( album ) );

            selectAlbumTab();

            tabs.classList.remove( 'gvik-none' );

        } )

        .bind( 'lastfm.newtrack', function( data ) {


            if ( cnfg.get( 'lastfm-autoshow' ) ) {
                if ( !sidebar.shown )
                    sidebar.show();

                showCurTab();
            }


            if ( __xhr )
                __xhr.abort();
            __xhr = null;



            dom.removeClass( tabCont, 'loaded' );

            trackId = data.trackId;
            nameTrack = data.title;
            nameArtist = data.artist;

            checkCache( 'artist.getInfo', 'artist', [ nameArtist ], function( fromCache ) {

                if ( !fromCache )
                    resetArtist();

                trackId = data.trackId;
                nameTrack = data.title;
                nameArtist = data.artist;

            } );

        } );


        sidebar.addPage( function( _switcher, _tabCont, _wrap, countPage, _showCurTab ) {

            _tabCont.classList.add( 'loaded' );

            wrap = _wrap;
            tabCont = _tabCont;
            showCurTab = _showCurTab;

            _tabCont.id = 'gvik-lastfm';

            dom.append( _tabCont, [ artistInfoCont, trackInfoCont ] );


        } );


        var np = dom.create( 'div', {
            prop: {
                className: 'audio_list'
            },

            style: {
                display: 'none'
            }
        } );

        tabCont.appendChild( np );



        if ( cnfg.get( 'lastfm-searchAndPlay' ) ) {

            tabCont.classList.add( 'searchandplay' );


            dom.setDelegate( tabCont, '.gvikLastfm .img-cont', 'click', function( el, e ) {

                e.stopPropagation();
                e.preventDefault();

                e._canceled = true;

                var _audioEl = dom.parent( e, '.gvikLastfm' );

                require( 'searchandplay' )( {
                    artist: nameArtist,
                    title: _audioEl.getAttribute( 'data-trackname' ),
                    dur: _audioEl.getAttribute( 'data-duration' )
                }, function() {}, {
                    maxbit: cnfg.get( 'lastfm-maxbit' )
                } );
            } );
        }

        dom.setDelegate( tabCont, '.gvikLastfm', 'click', function( el, e ) {

            e.stopPropagation();
            e.preventDefault();

            var searchName = nameArtist + ' – ' + this.getAttribute( 'data-trackname' ),
                from_pad = window._pads.shown == 'mus',
                __cur = window._pads && _pads.cur || window.cur;

            if ( window.cur.aSearch || from_pad ) {

                __cur.searchTypeChanged( {
                    target: {
                        index: 0
                    }
                }, true );

                __cur.searchTypeMenu.value = 0;

                Audio.selectPerformer( {
                    from_pad: from_pad,
                    event: 0,
                    name: searchName
                } );
            } else {
                window.nav.go( 'audio?q=' + searchName );
            }
        } );

 

    } );