1. Приветствуем Вас на нашем закрытом форуме для складчиков сайта cmsheaven.org. Если Вы частный вебмастер, фрилансер, владелец малого или среднего бизнеса, представитель студии по разработке сайтов - будем рады видеть Вас в наших рядах экономных людей.
    Регистрация на форуме возможна только после вступления в складчину

VTEM youtube

Тема в разделе "Вопросы по расширениям Joomla [тех. поддержка]", создана пользователем dimix, 12 июл 2015.

Статус темы:
Закрыта.
  1. dimix

    dimix Cкладчик

    Регистрация:
    5 янв 2015
    Сообщения:
    28
    Симпатии:
    3
    Ребята, помогите восстановить работу модуля VTEM youtube. Знаю, что youtube, что то там поменяли, из-за этого раньше вместо видео отображалось youtube.com/devicesupport. Теперь вообще модуль не работает.
    #1
  2. Modi34

    Modi34 Свой человек

    Регистрация:
    31 окт 2014
    Сообщения:
    2.033
    Симпатии:
    720
    пока не напишите топик по правилам раздела помощь оказываться не будет.
    #2
  3. мореман5

    мореман5 Опытный складчик

    Регистрация:
    25 апр 2015
    Сообщения:
    41
    Симпатии:
    8
    Сегодня все утро ломал голову над аналогичной проблемой!
    Началось все с того, что установил RSFirewall. Этот суперкомпонент отрубил все мои Youtube видеовставки на сайте (исправил теги iframe на i-frame). В принципе, я нашел кнопочку в настройках RSFirewall, ответственную за эту подлость, но потом решил не ослаблять броню, а использовать для вставки роликов Youtube стороннее приложение. Сначала установил Allvideos, но кое-что в этом плагине лично меня не устроило. После тщательного отбора установил VTEM Youtube v1.1. Установка прошла гладко, но при вставке модуля на страницы отображается только черный экран.

    Прежде VTEM Youtube ни разу не пользовался. Версия Joomla! 3.4.3. Хостинг Макхост.
    Ссылка на проблемное видео вот.
    Может быть, кто-нибудь сталкивался с такой же проблемой и нашел ее решение?
    #3
  4. red

    red Матерый складчик Команда форума

    Регистрация:
    15 апр 2015
    Сообщения:
    116
    Симпатии:
    88
    мореман5
    Отдельная проблема, отдельный правильно оформленный топик.
    На вашем сайте при хорошем качестве видео можно использовать
    JUX Background Video
    #4
  5. мореман5

    мореман5 Опытный складчик

    Регистрация:
    25 апр 2015
    Сообщения:
    41
    Симпатии:
    8
    Каюсь. Хотел схитрить . Старшие братья выставили лимит на четыре вопроса за полгода. Вот я и попытался сбоку пристроиться, чтобы сэкономить свой траффик. Пороюсь в инете еще денек, если не найду ответа, буду оформлять отдельный топик.
    JUX мне не подходит, вот если бы Вы аналог VTEM Youtube посоветовали...
    #5
  6. red

    red Матерый складчик Команда форума

    Регистрация:
    15 апр 2015
    Сообщения:
    116
    Симпатии:
    88
    Создайте свой канал на ютубе. Залейте туда ролики и дайте доступ только по ссылки. Эту ссылку и вставляйте.
    #6
  7. red

    red Матерый складчик Команда форума

    Регистрация:
    15 апр 2015
    Сообщения:
    116
    Симпатии:
    88
    JUX Background Video может работать не только на весь экран, но и в позиции модуля любого размера. Как вариант полоса видео над текстом. Из плюсов он даёт возможность убрать все рюшечки ютуба.... Смотрится это солидней)
    #7
    Prometey и Modi34 нравится это.
  8. мореман5

    мореман5 Опытный складчик

    Регистрация:
    25 апр 2015
    Сообщения:
    41
    Симпатии:
    8
    Спасибо, red. Сейчас кино досмотрю, а потом обязательно установлю и протестирую на локалке JUX Background Video.
    #8
  9. Modi34

    Modi34 Свой человек

    Регистрация:
    31 окт 2014
    Сообщения:
    2.033
    Симпатии:
    720
    вам правильно посоветовали - лучше использовать другой модуль - я его поставил и посмотрел
    [​IMG]
    он на старой версии апи работает - там теперь почти все выдается только с апи ключем...

    на сайте разраба модуль работает, но там не тот js видимо тк плеер со стандартным оформлением...
    #9
  10. мореман5

    мореман5 Опытный складчик

    Регистрация:
    25 апр 2015
    Сообщения:
    41
    Симпатии:
    8
    Modi34, понял-понял. Спасибо. Как раз с JUX Background Video сижу разбираюсь.
    #10
  11. Modi34

    Modi34 Свой человек

    Регистрация:
    31 окт 2014
    Сообщения:
    2.033
    Симпатии:
    720
    а не все ок - я починил модуль...

    нужно на 111-й строчке data.data.id заменить на opts.feedid
    [​IMG]

    результат
    [​IMG]
    #11
    Prometey нравится это.
  12. мореман5

    мореман5 Опытный складчик

    Регистрация:
    25 апр 2015
    Сообщения:
    41
    Симпатии:
    8
    Modi34, Аллилуйя!!! Аллилуйя!!! да-да-да-да-да!!! Все заработало!!! Спасибище!!!!
    Ура!)))
    #12
  13. мореман5

    мореман5 Опытный складчик

    Регистрация:
    25 апр 2015
    Сообщения:
    41
    Симпатии:
    8
    Огромное спасибо за положительный заряд с самого утра!)
    #13
  14. dimix

    dimix Cкладчик

    Регистрация:
    5 янв 2015
    Сообщения:
    28
    Симпатии:
    3
    Это помогает, если выбран тип отображения "single", а как быть с "user"? Может быть поможете, убил несколько часов на эксперименты, но так и не смог разобраться...
    joomla 2.5 Хостинг Бегет
    [​IMG]
    Последнее редактирование: 23 июл 2015
    #14
  15. Modi34

    Modi34 Свой человек

    Регистрация:
    31 окт 2014
    Сообщения:
    2.033
    Симпатии:
    720
    напишите топик по правилам раздела - вот мореман5 написал и у него все хорошо...
    #15
  16. dimix

    dimix Cкладчик

    Регистрация:
    5 янв 2015
    Сообщения:
    28
    Симпатии:
    3
    Исправил
    #16
  17. Modi34

    Modi34 Свой человек

    Регистрация:
    31 окт 2014
    Сообщения:
    2.033
    Симпатии:
    720
    еще название темы сменить нужно, но ок, хотя бы прочитали и на том спасибо...
    HTML:
    // oTube v1.0 - a very lightweight youtube displaying extension - based on jQuery 1.4.3+
    // http://openaddon.com/ OR http://vtem.net/
    // Copyright (c) 2012 Nguyen Van Tuyen - [email protected]
    // Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
    (function($) {
        'use strict';
        $.fn.oTube = function(options){ //define the defaults for the plugin and how to call it
            var defaults = { //set default options
                width: '100%',
                height: '50%',
                displaytype: 'user', // playlist, single, user
                feedid: 'machinima',
                maxresults: 10, // number of results to show, max-number <=50
                activeclass: 'active',
                showThumbnail: true,
                showDescription: false,
                controls: true,
                annotations: true,
                autoplay: true,
                chainVideos: true,
                related: false,
                autohide: false,
                theme: 'light',  // dark, light
                minHeight:'',
                viewText: ' Views',
                events: {
                        videoReady: function(){},
                        stateChange: function(){}
                    }
            };
            var opts = $.extend(defaults, options); //call in the default otions
            var Obj = this;
            return Obj.each(function() {
                //CREAT MAIN ELEMENTS
                var modHeight = opts.height,
                    strFeed,
                    objVideo = $(Obj).addClass('oTube').append('<div class="video-player clearfix '+(opts.showDescription ? '' : 'no-desc')+'"><div class="videoholder"><div id="videooutput'+Obj.attr('id')+'">&nbsp;</div></div>'+(((opts.showThumbnail || opts.showDescription) && opts.displaytype != 'single') ? '<div class="otubeList"><div class="otubeListInner"></div></div>': '')+'</div>').wrap('<div class="oVideo-wrapper '+((opts.displaytype == 'user' || opts.displaytype == 'playlist') ? 'oTubePlaylist' : 'oTubeSingle')+'"/>');
                //SET WIDTH FOR MODULE
                if(opts.width.indexOf('%')!=-1 || opts.width=='auto')
                    opts.width = opts.width;
                else
                    opts.width = parseFloat(opts.width);
                //SET HEIGHT FOR MODULE
                if(opts.height.indexOf('%')!=-1) {
                    var startH = Math.round(parseFloat($(Obj).parent().width()) / (100/parseFloat(opts.height)));
                    if(opts.minHeight != '' && startH < parseFloat(opts.minHeight))
                        opts.height = parseFloat(opts.minHeight);
                    else
                        opts.height = parseFloat(startH);
                }else if (opts.height=='auto')
                    opts.height = $(Obj).parent().height();
                else
                    opts.height = parseFloat(opts.height);
                $(Obj).height(opts.height).parent().width(opts.width);
                switch(opts.displaytype) {
                    case 'playlist':
                        strFeed = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId='+opts.feedid+'&key=API_KEY';
                        break;
                    case 'single':
                        strFeed = 'http://gdata.youtube.com/feeds/api/videos/'+opts.feedid+'?v=2&alt=jsonc';
                        break;
                    case 'user':
                        strFeed = 'http://gdata.youtube.com/feeds/api/users/'+opts.feedid+'/uploads?v=2&alt=jsonc&format=5&max-results=50'
                        break;
                }
                strFeed = (opts.related) ? strFeed + '&rel=1' : strFeed + '&rel=0';
                $.ajax({
                    url: strFeed,
                    dataType: 'jsonp',
                    success: function(data) {
                        if (opts.displaytype === 'playlist' || opts.displaytype === 'user') {
                            var entries = data.items || [];
                            var intDefault = 0;
                            if (opts.showThumbnail || opts.showDescription) {
                                var objVideoList = $('.otubeListInner', Obj);
                                if ((opts.maxresults !== 0) && (opts.maxresults <= entries.length))
                                    var intResultsLength = opts.maxresults;
                                else
                                    var intResultsLength = entries.length;
                                for (var i=0; i<intResultsLength; i++) {
                                    objVideoList.append('<div class="otubeListItem"><a href="#" data-otube="'+(opts.displaytype === 'playlist' ? entries[i].snippet.resourceId.videoId : entries[i].id)+'" class="otbue-clear clearfix">'+
                                        (opts.showThumbnail ? '<img src="'+(opts.displaytype == 'playlist' ? entries[i].snippet.thumbnails.default.url : entries[i].snippet.thumbnails.default.url)+'" />' : '')+
                                        (opts.showDescription ? '<h4 class="item-title">'+(opts.displaytype === 'playlist' ? entries[i].snippet.title : entries[i].snippet.title)+'</h4><i>'+(opts.displaytype === 'playlist' ? entries[i].viewCount : entries[i].viewCount)+opts.viewText+'</i>' : '')+
                                    '</a></div>');
                                    if (opts.displaytype === 'playlist')
                                        if(opts.defaultvideo === entries[i].snippet.resourceId.videoId) intDefault = i;
                                    else
                                        if(opts.defaultvideo === entries[i].snippet.resourceId.videoId) intDefault = i;
                                }
                                objVideoList.children().click(function(e) {
                                    e.preventDefault();
                                    objVideoList.children().removeClass(opts.activeclass);
                                    if (window.attachEvent && !window.addEventListener)
                                        loadVideoIdByFlash($(this).addClass(opts.activeclass).children().attr('data-otube'), true);
                                    else
                                        loadVideoId($(this).addClass(opts.activeclass).children().attr('data-otube'), true);
                                });
                                objVideoList.children(':first').addClass(opts.activeclass);
                            } else {
                                objVideo.addClass('no-thumbs');
                            }
                            if (window.attachEvent && !window.addEventListener)
                                loadVideoIdByFlash(opts.displaytype === 'playlist' ? entries[intDefault].snippet.resourceId.videoId : entries[intDefault].snippet.resourceId.videoId,  opts.autoplay);
                            else
                                loadVideoId(opts.displaytype === 'playlist' ? entries[intDefault].snippet.resourceId.videoId : entries[intDefault].snippet.resourceId.videoId, opts.autoplay);
                        } else {
                            objVideo.addClass('single-video');
                            if (window.attachEvent && !window.addEventListener)
                                loadVideoIdByFlash(data.data.id, opts.autoplay);
                            else
                                loadVideoId(data.data.id, opts.autoplay);
                        }
                    }
                });
                function loadVideoId(strID, autoplay) {
                     $('.videoholder',Obj).empty().append('<div id="videooutput'+Obj.attr('id')+'">&nbsp;</div>');
                     var player = new YT.Player('videooutput'+Obj.attr('id'), {
                            height: opts.height,
                            width: opts.width,
                            videoId: strID,
                            events: {
                                'onReady': opts.events.videoReady,
                                'onStateChange': function(e){
                                        if( (e.target.getPlayerState()===0) && opts.chainVideos ){
                                            var playVideo = $('.otubeListInner', Obj);
                                            var playVideoActive = playVideo.children('.'+opts.activeclass);
                                            if(playVideo.length && playVideoActive.length){
                                                if(playVideoActive.next().length){
                                                    playVideoActive.removeClass(opts.activeclass).next().addClass(opts.activeclass);
                                                    loadVideoId(playVideo.find('.'+opts.activeclass).children().attr('data-otube'), true);
                                                }
                                            }else
                                                player.stopVideo();
                                        }
                                    }
                            },
                            playerVars: {
                                enablejsapi: 1,
                                controls: opts.controls ? 1 : 0,
                                rel: 0,
                                showinfo: 0,
                                theme: opts.theme,
                                autohide: opts.autohide ? 1 : 0,
                                iv_load_policy: opts.annotations ? '' : 3,
                                autoplay: autoplay ? 1 : 0
                            }
                        });
                }
                function loadVideoIdByFlash(strID, autoplay){
                    $('.videoholder',Obj).empty().append('<div id="videooutput'+Obj.attr('id')+'">&nbsp;</div>');
                    var url = 'http://ajax.googleapis.com/ajax/libs/swfobject/2/swfobject.js';
                    var playerVars = (opts.controls ? '&controls=1' : '&controls=0')
                                    + (opts.related ? '&rel=1' : '&rel=0')
                                    + '&showinfo=0'
                                    + '&theme='+opts.theme
                                    + (opts.autohide ? '&autohide=1' : '&autohide=0')
                                    + (opts.annotations ? '&iv_load_policy=""' : '&iv_load_policy=3')
                                    + (autoplay ? '&autoplay=1' : '&autoplay=0');
                    $.getScript( url, function() {
                        strSWFURL = 'http://www.youtube.com/v/'+ strID +'?enablejsapi=1&playerapiid=ytplayer&version=3'+playerVars;
                        var params = {allowScriptAccess: "always", allowFullScreen: "true"};
                        swfobject.embedSWF(strSWFURL, 'videooutput'+Obj.attr('id'), opts.width, opts.height, '8', null, null, params);
                    });
                }
                $(window).resize(function(e) {
                    var resizeHeight;
                    if(modHeight.indexOf('%')!=-1) {
                        var startRH = Math.round(parseFloat($(Obj).parent().width()) / (100/parseFloat(modHeight)));
                        if(opts.minHeight != '' && startRH < parseFloat(opts.minHeight))
                            resizeHeight = parseFloat(opts.minHeight);
                        else
                            resizeHeight = parseFloat(startRH);
                    }
                    $(Obj).height(resizeHeight);
                });
            });
        }
    })(jQuery);
    вот подправленный код - у ютуба апи новый 3-й и методы второго без апи ключа не работают - вам нужно для плейлистов зарегать апи ключ... я бы вам свой дал, но вы не заполнили сразу заявку по правилам раздела и еще упрашивать вас их прочитать пришлось.... - сами как хотите регайте...

    вот пруф что все работает
    [​IMG]
    единственное чего нету это кол-во просмотров - для получения этой инфы в новом апи нужно отдельный запрос посылать... я бы сделал конечно, но вам лучше обратиться к фрилансеру за доработкой расширения... - я и так сделл то чего по идее не должен был ʕ •́؈•̀ ₎
    #17
    dimix нравится это.
  18. dimix

    dimix Cкладчик

    Регистрация:
    5 янв 2015
    Сообщения:
    28
    Симпатии:
    3
    Спасибо большое за помощь. Плейлист действительно заработал, но тип отображения "user" по прежнему не работает, а мне нужен именно "user".
    Ключ API ввел в 57-ой строке, я так понимаю она отвечает за отображение плейлиста, а 63 строка за user, но там некуда вписывать ключ.
    Код:
    switch(opts.displaytype) {
                    case 'playlist':
                        strFeed = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId='+opts.feedid+'&key=xxxxxD4i_nJCV7ukCyAhgMSgrVegsbBX8-l-po';
                        break;
                    case 'single':
                        strFeed = 'http://gdata.youtube.com/feeds/api/videos/'+opts.feedid+'?v=2&alt=jsonc';
                        break;
                    case 'user':
                        strFeed = 'http://gdata.youtube.com/feeds/api/users/'+opts.feedid+'/uploads?v=2&alt=jsonc&format=5&max-results=50'
                        break;
                }
    ps: Сменить название темы не смог. Не могу найти как это сделать
    Последнее редактирование: 23 июл 2015
    #18
  19. Modi34

    Modi34 Свой человек

    Регистрация:
    31 окт 2014
    Сообщения:
    2.033
    Симпатии:
    720
    надо получить id для playlists https://www.googleapis.com/youtube/...tails&forUsername=OneDirectionVEVO&key=apikey
    вручную и вбить его в playlist

    если нужно чтобы было автоматом - обращайтесь к фрилансеру... я переписывать модуль не буду....
    #19
  20. Modi34

    Modi34 Свой человек

    Регистрация:
    31 окт 2014
    Сообщения:
    2.033
    Симпатии:
    720
    нужно не id а uploads
    вот гиф изображение
    [​IMG]
    #20
Статус темы:
Закрыта.