MediaWiki:Common.js: Difference between revisions

From Doc-Wiki
Jump to navigation Jump to search
Fix thumbnails using noembed.com proxy
Added support for Simple Nursing Videos category gallery
 
(5 intermediate revisions by the same user not shown)
Line 6: Line 6:




/* Level Up RN - Fixed Thumbnails and Embeds */
 
 
 
 
 
 
/* Level Up RN, Nursing.com & Simple Nursing - Video Galleries and Embeds */
(function() {
(function() {
     'use strict';
     'use strict';
Line 13: Line 19:
         $(document).ready(function() {
         $(document).ready(function() {


             // Fix 1: Create working iframe embeds for playlist pages
             // Create working iframe embeds for individual video pages
             $('.youtube-playlist-embed[data-playlist-id]').each(function() {
             $('.youtube-video-embed[data-video-id]').each(function() {
                 var $container = $(this);
                 var $container = $(this);
                 var playlistId = $container.attr('data-playlist-id');
                 var videoId = $container.attr('data-video-id');


                 if (playlistId) {
                 if (videoId) {
                     var iframe = $('<iframe>')
                     var iframe = $('<iframe>')
                         .attr({
                         .attr({
                             'src': 'https://www.youtube.com/embed/videoseries?list=' + playlistId,
                             'src': 'https://www.youtube.com/embed/' + videoId,
                             'frameborder': '0',
                             'frameborder': '0',
                             'allow': 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share',
                             'allow': 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share',
Line 36: Line 42:


                     $container.empty().append(iframe);
                     $container.empty().append(iframe);
                    console.log('Created iframe for playlist:', playlistId);
                 }
                 }
             });
             });


             // Fix 2: Transform gallery table with DIRECT YouTube thumbnails
             // Transform playlist videos container into gallery
            $('.playlist-videos-container').each(function() {
                var $container = $(this);
                var $gallery = $('<div class="video-cards-gallery"></div>');
 
                $container.find('.video-item').each(function() {
                    var $item = $(this);
                    var videoId = $item.attr('data-video-id');
                    var pageUrl = $item.attr('data-page-url');
                    var videoTitle = $item.attr('data-title');
 
                    if (!videoId || !pageUrl || !videoTitle) return;
 
                    var $card = $('<div class="video-card"></div>');
 
                    var $thumb = $('<div class="video-card-thumb"></div>');
                    var $thumbLink = $('<a></a>').attr('href', pageUrl);
 
                    var $thumbImg = $('<img>')
                        .attr('src', 'https://i.ytimg.com/vi/' + videoId + '/hqdefault.jpg')
                        .attr('alt', videoTitle)
                        .css({
                            'width': '100%',
                            'height': '100%',
                            'object-fit': 'cover'
                        });
 
                    var $playButton = $('<div class="video-card-play">▶</div>');
 
                    $thumbLink.append($thumbImg).append($playButton);
                    $thumb.append($thumbLink);
 
                    var $info = $('<div class="video-card-info"></div>');
                    var $titleLink = $('<a></a>')
                        .attr('href', pageUrl)
                        .text(videoTitle);
                    $info.append($titleLink);
 
                    $card.append($thumb).append($info);
                    $gallery.append($card);
                });
 
                if ($gallery.children().length > 0) {
                    $container.replaceWith($gallery);
                }
            });
 
            // Transform category page playlist gallery (works for all nursing categories)
             var pageName = mw.config.get('wgPageName');
             var pageName = mw.config.get('wgPageName');
             if (pageName === 'Category:Level_Up_RN_Videos' || pageName === 'Category:Level_Up_RN') {
             if (pageName === 'Category:Level_Up_RN_Videos' ||
                pageName === 'Category:Level_Up_RN' ||
                pageName === 'Category:Nursing.com_Videos' ||
                pageName === 'Category:Simple_Nursing_Videos') {
 
                 var $table = $('.wikitable.sortable').first();
                 var $table = $('.wikitable.sortable').first();
                 if (!$table.length) return;
                 if (!$table.length) return;
Line 49: Line 105:


                 $table.find('tr').each(function(index) {
                 $table.find('tr').each(function(index) {
                     if (index === 0) return; // Skip header
                     if (index === 0) return;


                     var $row = $(this);
                     var $row = $(this);
                     var $cells = $row.find('td');
                     var $cells = $row.find('td');
                     if ($cells.length < 3) return;
                     if ($cells.length < 3) return;


Line 67: Line 122:
                     if (!playlistId || !wikiPageUrl) return;
                     if (!playlistId || !wikiPageUrl) return;


                    // Create card
                     var $box = $('<div class="playlist-box"></div>');
                     var $box = $('<div class="playlist-box"></div>');
                    // Make the entire box clickable
                    $box.css('cursor', 'pointer').on('click', function(e) {
                        if (!$(e.target).is('a')) {
                            window.location.href = wikiPageUrl;
                        }
                    });
                     var $thumb = $('<div class="playlist-box-thumb"></div>');
                     var $thumb = $('<div class="playlist-box-thumb"></div>');
                    var $thumbLink = $('<a></a>').attr('href', wikiPageUrl);


                     // Use YouTube Data API to get first video thumbnail
                     // Use YouTube iframe for thumbnail with pointer-events: none
                    // Format: https://img.youtube.com/vi/{VIDEO_ID}/hqdefault.jpg
                     var $thumbFrame = $('<iframe>')
                    // For playlists, we need to fetch the first video
                         .attr({
 
                            'src': 'https://www.youtube.com/embed/videoseries?list=' + playlistId + '&controls=0&showinfo=0&rel=0&modestbranding=1',
                    // Try using noembed.com as a proxy
                            'frameborder': '0',
                     var $img = $('<img>')
                            'loading': 'lazy'
                         .attr('alt', title)
                        })
                        .attr('src', 'https://via.placeholder.com/480x360/E52D27/FFFFFF?text=Loading...')
                         .css({
                         .css({
                            'position': 'absolute',
                            'top': '0',
                            'left': '0',
                             'width': '100%',
                             'width': '100%',
                             'height': '100%',
                             'height': '100%',
                             'object-fit': 'cover',
                             'pointer-events': 'none'
                            'position': 'absolute',
                            'top': '0',
                            'left': '0'
                         });
                         });


                    // Fetch playlist info using CORS proxy
                     $thumb.append($thumbFrame);
                     $.ajax({
                     $thumb.append('<div class="playlist-box-overlay">▶ Playlist</div>');
                        url: 'https://noembed.com/embed?url=https://www.youtube.com/playlist?list=' + playlistId,
                        dataType: 'json',
                        success: function(data) {
                            if (data && data.thumbnail_url) {
                                $img.attr('src', data.thumbnail_url.replace('hqdefault', 'maxresdefault'));
                            }
                        },
                        error: function() {
                            // Fallback: Use YouTube thumbnail
                            $img.attr('src', 'https://i.ytimg.com/vi/' + playlistId + '/hqdefault.jpg');
                        }
                    });
 
                    $thumbLink.append($img);
                     $thumbLink.append('<div class="playlist-box-overlay">▶ Playlist</div>');
                    $thumb.append($thumbLink);


                     var $info = $('<div class="playlist-box-info"></div>');
                     var $info = $('<div class="playlist-box-info"></div>');
Line 113: Line 157:
                         $info.append('<div style="margin: 8px 0; font-size: 13px; color: #666;">' + description + '</div>');
                         $info.append('<div style="margin: 8px 0; font-size: 13px; color: #666;">' + description + '</div>');
                     }
                     }
                     $info.append('<a href="' + wikiPageUrl + '" class="playlist-box-link">Watch Playlist →</a>');
                     $info.append('<a href="' + wikiPageUrl + '" class="playlist-box-link" onclick="event.stopPropagation();">Watch Playlist →</a>');


                     $box.append($thumb).append($info);
                     $box.append($thumb).append($info);

Latest revision as of 21:54, 17 January 2026

/* Any JavaScript here will be loaded for all users on every page load. */












/* Level Up RN, Nursing.com & Simple Nursing - Video Galleries and Embeds */
(function() {
    'use strict';

    mw.loader.using(['jquery'], function() {
        $(document).ready(function() {

            // Create working iframe embeds for individual video pages
            $('.youtube-video-embed[data-video-id]').each(function() {
                var $container = $(this);
                var videoId = $container.attr('data-video-id');

                if (videoId) {
                    var iframe = $('<iframe>')
                        .attr({
                            'src': 'https://www.youtube.com/embed/' + videoId,
                            'frameborder': '0',
                            'allow': 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share',
                            'allowfullscreen': '',
                            'referrerpolicy': 'strict-origin-when-cross-origin'
                        })
                        .css({
                            'position': 'absolute',
                            'top': '0',
                            'left': '0',
                            'width': '100%',
                            'height': '100%'
                        });

                    $container.empty().append(iframe);
                }
            });

            // Transform playlist videos container into gallery
            $('.playlist-videos-container').each(function() {
                var $container = $(this);
                var $gallery = $('<div class="video-cards-gallery"></div>');

                $container.find('.video-item').each(function() {
                    var $item = $(this);
                    var videoId = $item.attr('data-video-id');
                    var pageUrl = $item.attr('data-page-url');
                    var videoTitle = $item.attr('data-title');

                    if (!videoId || !pageUrl || !videoTitle) return;

                    var $card = $('<div class="video-card"></div>');

                    var $thumb = $('<div class="video-card-thumb"></div>');
                    var $thumbLink = $('<a></a>').attr('href', pageUrl);

                    var $thumbImg = $('<img>')
                        .attr('src', 'https://i.ytimg.com/vi/' + videoId + '/hqdefault.jpg')
                        .attr('alt', videoTitle)
                        .css({
                            'width': '100%',
                            'height': '100%',
                            'object-fit': 'cover'
                        });

                    var $playButton = $('<div class="video-card-play">▶</div>');

                    $thumbLink.append($thumbImg).append($playButton);
                    $thumb.append($thumbLink);

                    var $info = $('<div class="video-card-info"></div>');
                    var $titleLink = $('<a></a>')
                        .attr('href', pageUrl)
                        .text(videoTitle);
                    $info.append($titleLink);

                    $card.append($thumb).append($info);
                    $gallery.append($card);
                });

                if ($gallery.children().length > 0) {
                    $container.replaceWith($gallery);
                }
            });

            // Transform category page playlist gallery (works for all nursing categories)
            var pageName = mw.config.get('wgPageName');
            if (pageName === 'Category:Level_Up_RN_Videos' ||
                pageName === 'Category:Level_Up_RN' ||
                pageName === 'Category:Nursing.com_Videos' ||
                pageName === 'Category:Simple_Nursing_Videos') {

                var $table = $('.wikitable.sortable').first();
                if (!$table.length) return;

                var $gallery = $('<div class="playlists-gallery"></div>');

                $table.find('tr').each(function(index) {
                    if (index === 0) return;

                    var $row = $(this);
                    var $cells = $row.find('td');
                    if ($cells.length < 3) return;

                    var $titleCell = $cells.eq(0);
                    var $descCell = $cells.eq(1);

                    var playlistId = $titleCell.attr('data-playlist-id');
                    var $titleLink = $titleCell.find('a').first();
                    var wikiPageUrl = $titleLink.attr('href');
                    var title = $titleLink.text();
                    var description = $descCell.text().trim();

                    if (!playlistId || !wikiPageUrl) return;

                    var $box = $('<div class="playlist-box"></div>');

                    // Make the entire box clickable
                    $box.css('cursor', 'pointer').on('click', function(e) {
                        if (!$(e.target).is('a')) {
                            window.location.href = wikiPageUrl;
                        }
                    });

                    var $thumb = $('<div class="playlist-box-thumb"></div>');

                    // Use YouTube iframe for thumbnail with pointer-events: none
                    var $thumbFrame = $('<iframe>')
                        .attr({
                            'src': 'https://www.youtube.com/embed/videoseries?list=' + playlistId + '&controls=0&showinfo=0&rel=0&modestbranding=1',
                            'frameborder': '0',
                            'loading': 'lazy'
                        })
                        .css({
                            'position': 'absolute',
                            'top': '0',
                            'left': '0',
                            'width': '100%',
                            'height': '100%',
                            'pointer-events': 'none'
                        });

                    $thumb.append($thumbFrame);
                    $thumb.append('<div class="playlist-box-overlay">▶ Playlist</div>');

                    var $info = $('<div class="playlist-box-info"></div>');
                    $info.append('<div class="playlist-box-title">' + title + '</div>');
                    if (description) {
                        $info.append('<div style="margin: 8px 0; font-size: 13px; color: #666;">' + description + '</div>');
                    }
                    $info.append('<a href="' + wikiPageUrl + '" class="playlist-box-link" onclick="event.stopPropagation();">Watch Playlist →</a>');

                    $box.append($thumb).append($info);
                    $gallery.append($box);
                });

                if ($gallery.children().length > 0) {
                    $table.replaceWith($gallery);
                }
            }
        });
    });
})();