Recherche avancée

Médias (1)

Mot : - Tags -/swfupload

Autres articles (65)

  • MediaSPIP version 0.1 Beta

    16 avril 2011, par

    MediaSPIP 0.1 beta est la première version de MediaSPIP décrétée comme "utilisable".
    Le fichier zip ici présent contient uniquement les sources de MediaSPIP en version standalone.
    Pour avoir une installation fonctionnelle, il est nécessaire d’installer manuellement l’ensemble des dépendances logicielles sur le serveur.
    Si vous souhaitez utiliser cette archive pour une installation en mode ferme, il vous faudra également procéder à d’autres modifications (...)

  • MediaSPIP 0.1 Beta version

    25 avril 2011, par

    MediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
    The zip file provided here only contains the sources of MediaSPIP in its standalone version.
    To get a working installation, you must manually install all-software dependencies on the server.
    If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...)

  • Amélioration de la version de base

    13 septembre 2013

    Jolie sélection multiple
    Le plugin Chosen permet d’améliorer l’ergonomie des champs de sélection multiple. Voir les deux images suivantes pour comparer.
    Il suffit pour cela d’activer le plugin Chosen (Configuration générale du site > Gestion des plugins), puis de configurer le plugin (Les squelettes > Chosen) en activant l’utilisation de Chosen dans le site public et en spécifiant les éléments de formulaires à améliorer, par exemple select[multiple] pour les listes à sélection multiple (...)

Sur d’autres sites (7805)

  • How (and Why) to Run a Web Accessibility Audit in 2024

    7 mai 2024, par Erin

    When most businesses design their websites, they primarily think about aesthetics, not accessibility. However, not everyone who visits your website has the same abilities or access needs. Eight percent of the US population has visual impairments.

    The last thing you want is to alienate website visitors with a bad experience because your site isn’t up to accessibility standards. (And with growing international regulation, risk fines or lawsuits as a result.)

    A web accessibility audit can help you identify and fix any issues for users with impaired vision, hearing or other physical disabilities. In this article, we’ll cover how to conduct such an audit efficiently for your website in 2024.

    What is a web accessibility audit ?

    A web accessibility audit is a way to evaluate the usability of your website for users with visual, auditory or physical impairments, as well as cognitive disabilities or neurological issues. The goal is to figure out how accessible your website is to each of these affected groups and solve any issues that come up.

    To complete an audit, you use digital tools and various manual accessibility testing processes to ensure your site meets modern web accessibility standards.

    Why is a web accessibility audit a must in 2024 ?

    For far too long, many businesses have not considered the experiences of those with disabilities. The growing frustrations of affected internet users have led to a new focus on web accessibility laws and enforcement.

    Lawsuits related to the ADA (Americans with Disabilities Act) reached all-time highs in 2023 — over 4,500 digital-related lawsuits were filed. The EU has also drawn up the European Accessibility Act (EAC), which goes into effect in June 2025.

    But at the end of the day, it’s not about accessibility legislation. It’s about doing right by people.

    Illustration of a sight-impaired person using text-to-speech to browse a website on a smartphone

    This video by voice actor, YouTuber, and surfer Pete Gustin demonstrates why accessibility measures are so important. If buttons, navigation and content sections aren’t properly labelled, sight-impaired people who rely on speech-to-text to browse the web can’t comfortably interact with your site.

    And you’re worse off for it. You can lose some of your best customers and advocates this way. 

    With stronger enforcement of accessibility regulations in the US and new regulations coming into effect in the EU in 2025, the time to act is now. It’s not enough to “keep accessibility in mind” — you must take concrete steps to improve it.

    Who should lead a web accessibility audit ?

    Ideally, you want to hire a third-party web accessibility expert to lead the audit. They can guide you through multiple stages of manual accessibility testing to ensure your site meets regulations and user needs. 

    Experienced accessibility auditors are familiar with common pitfalls and can help you avoid them. They ensure you meet the legal requirements with proper solutions, not quick fixes.

    If this isn’t an option, find someone with relevant experience within your company. And involve someone with “skin in the game” in the process. Hire someone with visual impairments to usability test your site. Don’t just do automated tests or “put yourself in their shoes.” Make sure the affected users can use your site without issues.

    Automated vs. manual audits and the danger of shortcuts

    While there are automated audits, they only check for the bare minimum :

    • Do your images have alt tags ? (They don’t check if the alt tag is descriptive or just SEO junk text.)
    • Are clickable buttons identified with text for visually impaired users ?
    • Is your text size adjustable ?
    • Are your background and foreground colours accessible for colour-blind users ? Is there a sufficient contrast ratio ?
    Illustration of the results of an automated accessibility test

    They don’t dive into the user journey (and typically can’t access login-locked parts of your site). They can be a good starting point, but it’s a bad idea to rely completely on automated audits.

    They’ll miss more complex issues like :

    • Dynamic content and animated elements or videos that could put people with epilepsy at risk of seizures
    • A navigational flow that is unnecessarily challenging for users with impairments
    • Video elements without proper captions

    So, don’t rely too much on automated tests and audits. Many lawsuits for ADA infractions are against companies that think they’ve already solved the problem. For example, 30% of 2023 lawsuits were against sites that used accessibility overlays.

    Key elements of the Web Content Accessibility Guidelines (WCAG)

    The international standard for web accessibility is the Web Content Accessibility Guidelines (WCAG). In the most recent version, WCAG 2.2, there are new requirements for visual elements and focus and other updates.

    Here’s a quick overview of the key priorities of WCAG :

    Diagram of core WCAG considerations like text scalability, colour choices, accessible navigation, and more

    Perceivable : Any user can read or listen to your site’s content

    The first priority is for any user to be able to perceive the actual content on your site. To be compliant, you need to make these adjustments and more :

    • Use text that scales with browser settings.
    • Avoid relying on colour contrasts to communicate something.
    • Ensure visual elements are explained in text.
    • Offer audio alternatives for things like CAPTCHA.
    • Form fields and interactive elements are properly named.

    Operable : Any user can navigate the site and complete tasks without issue

    The second priority is for users to navigate your website and complete tasks. Here are some of the main considerations for this section :

    • Navigation is possible through keyboard and text-to-speech interfaces.
    • You offer navigation tools to bypass repeated blocks of content.
    • Buttons are properly titled and named.
    • You give impaired users enough time to finish processes without timing out.
    • You allow users to turn off unnecessary animations (and ensure none include three flashes or more within one second).
    • Links have a clear purpose from their alt text (and context).

    Understandable : Any user can read and understand the content

    The third priority is making the content understandable. You need to communicate as simply and as clearly as possible. Here are a few key points :

    • Software can determine the default language of each page.
    • You use a consistent method to explain jargon or difficult terms.
    • You introduce the meaning of unfamiliar abbreviations and acronyms.
    • You offer tools to help users double-check and correct input.
    • The reading grade is not higher than grade 9. If it is, you must offer an alternative text with a lower grade.
    • Use consistent and predictable formatting and navigation.

    This intro to accessibility guidelines should help you see the wide range of potential accessibility issues. Accessibility is not just about screen readers — it’s about ensuring a good user experience for users with a wide range of disabilities.

    Note : If you’re not hiring a third-party expert for the manual accessibility audit, this introduction isn’t enough. You need to familiarise yourself with all 50 success criteria in WCAG 2.2.

    How to do your first web accessibility audit

    Ready to find and fix the accessibility issues across your website ? Follow the steps outlined below to do a successful accessibility audit.

    Start with an automated accessibility test

    To point you in the right direction, start with a digital accessibility checker. There are many free alternatives, including :

    • Accessibility Checker
    • Silktide accessibility checker
    • AAArdvark

    When choosing a tool, check it’s up-to-date with the newest accessibility guidelines. Many accessibility evaluation tools are still based on the WCAG 2.1 version rather than WCAG 2.2.

    The tool will give you a basic evaluation of the accessibility level of your site. A free report can quickly identify common issues with navigation, labelling, colour choices and more. 

    But this is only good as a starting point. Remember that even paid versions of these testing tools are limited and cannot replace a manual audit.

    Look for common issues

    The next step is to manually look for common issues that impact your site’s level of accessibility :

    • Undescriptive alt text
    • Colour combinations (and lack of ability to change background and foreground colours)
    • Unscalable text
    • Different site content sections that are not properly labelled

    The software you use to create your site can lead to many of these issues. Is your content management system (CMS) compliant with ADA or WCAG ? If not, you may want to move to a CMS before continuing the audit.

    Pinpoint customer journeys and test them for accessibility 

    After you’ve fixed common issues, it’s essential to put the actual customer journey to the test. Explore your most important journeys with behavioural analytics tools like session recordings and funnel analysis.

    Analysing funnel reports lets you quickly identify each page that usually contributes to a sale. You will also have an overview of the most popular funnels to evaluate for accessibility.

    If your current web analytics platform doesn’t offer behavioural reports like these, Matomo can help. Our privacy-friendly web analytics solution includes funnel reports, session recordings, A/B testing, form analytics, heatmaps and more.

    Try Matomo for Free

    Get the web insights you need, without compromising data accuracy.

    No credit card required

    If you don’t have the budget to test every page individually, this is the perfect place to start. You want to ensure that users with disabilities have no issues completing the main tasks on your site. 

    Don’t focus solely on your web pages 

    Accessibility barriers can also exist outside of your standard web pages. So ensure that other file formats like PDFs and videos are also accessible. 

    Remember that downloadable materials are also part of your digital experience. Always consider the needs of individuals with disabilities when accessing things like case studies or video tutorials. 

    Highlight high-priority issues in a detailed report

    To complete the audit, you need to summarise and highlight high-priority issues. In a larger company, this will be in the form of a report. W3’s Web Accessibility Initiative offers a free accessibility report template and an online tool to generate a report.

    For smaller teams, it may make sense to input issues directly into the product backlog or a task list. Then, you can tackle the issues, starting with high-priority pages identified earlier in this process.

    Avoid quick fixes and focus on sustainable improvement

    As mentioned, AI-powered overlay solutions aren’t compliant and put you at risk for lawsuits. It’s not enough to install a quick accessibility tool and pat yourself on the back.

    And it’s not just about accessibility compliance. These solutions provide a disjointed experience that alienates potential users. 

    The point of a digital accessibility audit is to identify issues and provide a better experience to all your users. So don’t try to cut corners. Do the work required to implement solutions that work seamlessly for everyone. Invest in a long-term accessibility remediation process.

    Deliver a frictionless experience while gaining insight into your users

    An accessibility audit is crucial to ensure an inclusive experience — that a wide variety of users can read and interact with your site.

    But what about the basic usability of your website ? Are you sure the experience is without friction ? Matomo’s behavioural analytics tools can show how users interact with your website.

    For example, heatmaps can show you where users are clicking — which can help you identify a pattern, like many users mistaking a visual element for a button.

    Plus, our privacy-friendly web analytics are compliant with GDPR, CCPA and other data privacy regulations. That helps protect you against privacy-related lawsuits, just as an accessibility audit protects you against ADA lawsuits.

    And it never hurts that your users know you respect their privacy. Try Matomo free for 21-days. No credit card required.

  • What Is Ethical SEO & Why Does It Matter ?

    7 mai 2024, par Erin

    Do you want to generate more revenue ?

    Then, you need to ensure you have a steady stream of traffic flowing to your site.

    Search engines like Google, Bing and Yahoo are powerful mediums you can use to scale your business.

    Search engine optimisation (SEO) is the process of creating search engine-friendly content to draw in traffic to your website. But, if you aren’t careful, you could be crossing the line of ethical SEO into unethical SEO.

    In this article, we break down what ethical SEO is, why it’s important in business and how you can implement effective SEO into your business while remaining ethical.

    Let’s begin.

    What is ethical SEO ?

    Since the early days of the internet and search engines, business owners and marketers have tried using all kinds of SEO tactics to rank atop the search engines for relevant keywords.

    The problem ?

    Some of these practices are ethical, while others aren’t.

    What exactly is ethical SEO ?

    It’s the practice of optimising your website’s rankings in search engines by following search engine guidelines and prioritising user experience.

    What is ethical SEO?

    Ethical SEO is also referred to as “white hat SEO.”

    On the other hand, businesses that break search engine rules and guidelines to “hack” their way to the top with faulty and questionable practices use unethical SEO, or “black hat SEO.”

    Ethical SEO aims to achieve higher rankings in search engines through sustainable, legitimate and fair methods.

    Black hat, or unethical SEO, aims to manipulate or “game” the system with deceptive strategies to bypass the search engine’s guidelines to rank higher.

    The two core branches of ethical SEO include :

    1. Strategies that align with search engine guidelines.
    2. Accessibility to broad audiences.

    Some examples of ethical SEO principles include :

    • Natural link building
    • Compliance with search engine guidelines
    • Establishing great user experiences
    • Creating reader-focused content

    By sticking to the right guidelines and implementing proper SEO practices, businesses can establish ethical SEO to generate more traffic and grow their brands.

    8 ethical SEO practices to implement

    If you want to grow your organic search traffic, then there’s no doubt you’ll need to have some SEO knowledge.

    While there are dozens of ways to “game” SEO, it’s best to stick to proven, ethical SEO techniques to improve your rankings.

    Stick to these best practices to increase your rankings in the search engine results pages (SERPs), increase organic traffic and improve your website conversions.

    8 Ethical SEO Practices to Implement

    1. Crafting high-quality content

    The most important piece of any ethical SEO strategy is content.

    Forget about rankings, keywords and links for a second.

    Step back and think about why people go to Google, Bing and Yahoo in the first place.

    They’re there looking for information. They have a question they need answered. That’s where you can come in and give them the answer they want. 

    How ? In the form of content.

    The best long-term ethical SEO strategy is to create the highest-quality content possible. Crafting high-quality content should be where you focus 90% of your SEO efforts.

    2. Following search engine guidelines

    Once you’ve got a solid content creation strategy, where you’re producing in-depth, quality content, you need to ensure you’re following the guidelines and rules put in place by the major search engines.

    This means you need to stay compliant with the best practices and guidelines laid out by the top search engines.

    If you fail to follow these rules, you could be penalised, your content could be downgraded or removed from search engines, and you could even have your entire website flagged, impacting your entire organic search traffic from your site.

    You need to ensure you align with the guidelines so you’re set up for long-term success with your SEO.

    3. Conducting keyword research and optimisation

    Now that we’ve covered content and guidelines, let’s talk about the technical stuff, starting with keywords.

    In the early days of SEO (late 90s), just about anyone could rank a web page high by stuffing keywords all over the page.

    While those black hat techniques used to work to “game” the system, it doesn’t work like that anymore. Google and other major search engines have much more advanced algorithms that can detect keyword stuffing and manipulation.

    Keywords are still a major part of a successful SEO strategy. You can ethically incorporate keywords into your content (and you should) if you want to rank higher. 

    Your main goal with your content is to match it with the search intent. So, incorporating keywords should come naturally throughout your content. If you try to stuff in unnecessary keywords or use spammy techniques, you may not even rank at all and could harm your website’s rankings.

    4. Incorporating natural link building

    After you’ve covered content and keywords, it’s time to dive into links. Backlinks are any links that point back to your website from another website.

    These are a crucial part of the SEO pie. Without them, it’s hard to rank high on Google. They work well because they tell Google your web page or website has authority on a subject matter.

    But you could be penalised if you try to manipulate backlinks by purchasing them or spamming them from other websites.

    Instead, you should aim to draw in natural backlinks by creating content that attracts them.

    How ? There are several options :

    • Content marketing
    • Email outreach
    • Brand mentions
    • Public relations
    • Ethical guest posting

    Get involved in other people’s communities. Get on podcasts. Write guest posts. Connect with other brands. Provide value in your niche and create content worth linking to.

    5. Respecting the intellectual property of other brands

    Content creation is moving at lightspeed in the creator economy and social media era. For better or for worse, content is going viral every day. People share content, place their spin on it, revise it, optimise it, and spread it around the internet.

    Unfortunately, this means the content is sometimes shared without the owner’s permission. Content is one form of intellectual property (IP). 

    If you share copyrighted material, you could face legal consequences.

    6. Ensuring transparency

    Transparency is one of the pillars of ethical marketing.

    If you’re running the SEO in your company or an agency, you should always explain the SEO strategies and tactics you’re implementing to your stakeholders.

    It’s best to lean on transparency and honesty to ensure your team knows you’re running operations ethically.

    7. Implementing a great user experience

    The final pillar of ethical SEO practices is offering a great user experience on your website.

    Major search engines like Google are favouring user experience more and more every year. This means knowing how to track and analyse website metrics like page load times, time on page, pageviews, media plays and event tracking.

    8. Use an ethical web analytics solution

    Last but certainly not least. Tracking your website visitors ethically is key to maintaining SEO ethics.

    You can do this by using an ethical web analytics solution like Matomo, Plausible or Fathom. All three are committed to respecting user privacy and offer ethical tracking of visitors.

    We’re a bit biassed towards Matomo, of course, but for good reasons.

    Matomo offers accurate, unsampled data along with advanced features like heatmaps, session recording, and A/B testing. These features enhance user experience and support ethical SEO practices by providing insights into user behaviour, helping optimise content. 

    Try Matomo for Free

    Get the web insights you need, without compromising data accuracy.

    No credit card required

    6 unethical SEO practices to avoid

    Now that we’ve covered the ethical SEO best practices let’s talk about what kind of unethical SEO practices you want to avoid.

    Remember, SEO isn’t as easy to manipulate as it once was 20 years ago.

    Algorithms are much more sophisticated now, and search engines are getting better at detecting fraudulent, scammy or unethical SEO practices every year.

    Avoid these eight unethical SEO practices to ensure you can rank high in the long term :

    6 unethical SEO practices to avoid.

    1. Keyword stuffing

    Keyword stuffing is probably the most common unethical SEO practice. This is where someone deliberately stuffs keywords onto a page to manipulate the search engines to rank a web page higher.

    Where this is unethical isn’t always easy to detect, but in some cases, it is. It comes down to whether it’s relevant and natural or intentionally stuffing.

    2. Cloaking

    Cloaking is another unethical SEO practice where someone manipulates the information search engines see on their website.

    For example, someone may show search engines one web page on their website, but when someone clicks on it in Google, they can direct someone to a completely different page. They do this by detecting the incoming request from the user agent and presenting different content.

    3. Deceiving functionality

    Another way companies are unethically implementing SEO tactics is by deceiving people with misleading information. For example, a website may claim to provide a free resource or directory but may intentionally lead visitors to paid products.

    4. Fraudulent redirects

    Another way to deceive or mislead searchers is by creating fraudulent redirects. A redirect is a way to take someone to a different web page when they click on another one. Redirects can be useful if a page is broken or outdated. However, they can be used to deceptively take someone to a website they didn’t intend to view.

    5. Negative SEO

    Negative SEO is the intentional attempt to harm a competitor’s search engine rankings through unethical tactics.

    These tactics include duplicating their content or generating spammy links by creating low quality or irrelevant backlinks to their site.

    6. Hidden text

    Placing hidden text on a website typically has one purpose : keyword stuffing.

    Instead of making it visible to users reading the content, websites will place invisible text or text that’s hard to read on a website to try to rank the content higher and manipulate the search engines.

    3 reasons you need to implement ethical SEO

    So, why should you ensure you only implement ethical SEO in your organic traffic strategy ?

    It’s not just about what’s morally right or wrong. Implementing ethical SEO is the smartest long-term marketing strategy :

    1. Better long-term SEO

    Search engine optimisation is about implementing the “right” tactics to get your website to rank higher.

    The funny thing is many people are trying to get quick fixes by manipulating search engines to see results now.

    However, the ones who implement shady tactics and “hacks” to game the system almost always end up losing their rankings in the long term. 

    The best long-term SEO strategy is to do things ethically. Create content that helps people. Make higher quality content than your competitors. If you do those two things right, you’ll have better search traffic for years.

    2. Great brand reputation

    Not only is ethical SEO a great way to get long-term results, but it’s also a good way to maintain a solid brand reputation.

    Reputation management is a crucial aspect of SEO. All it takes is one bad incident, and your SEO could be negatively impacted.

    3. Lower chance of penalties

    If you play by the rules, you have a lower risk of being penalised by Google.

    The reality is that Google owns the search engine, not you. While we can benefit from the traffic generation of major search engines, you could lose all your rankings if you break their guidelines.

    Track SEO data ethically with Matomo

    Ethical SEO is all about :

    • Serving your audience
    • Getting better traffic in the long run

    If you fail to follow ethical SEO practices, you could be de-ranked or have your reputation on the line.

    However, if you implement ethical SEO, you could reap the rewards of a sustainable marketing strategy that helps you grow your traffic correctly and increase conversions in the long term.

    If you’re ready to start implementing ethical SEO, you need to ensure you depend on an ethical web analytics solution like Matomo.

    Unlike other web analytics solutions, Matomo prioritises user privacy, maintains transparent, ethical data collection practices, and does not sell user data to advertisers. Matomo provides 100% data ownership, ensuring that your data remains yours to own and control.

    As the leading privacy-friendly web analytics solution globally, trusted by over 1 million websites, Matomo ensures :

    • Accurate data without data sampling for confident insights and better results
    • Privacy-friendly and GDPR-compliant web analytics
    • Open-source access for transparency and creating a custom solution tailored to your needs

    Try Matomo free for 21-days. No credit card required.

  • "FFmpeg : Error not transitioning to the next song in Discord Bot's queue."

    1er avril 2024, par noober

    I have 3 modules, but I'm sure the error occurs within this module, and here is the entire code within that module :

    


    import asyncio
import discord
from discord import FFmpegOpusAudio, Embed
import os

async def handle_help(message):
    embed = discord.Embed(
        title="Danh sách lệnh cho Bé Mèo",
        description="Dưới đây là các lệnh mà chủ nhân có thể bắt Bé Mèo phục vụ:",
        color=discord.Color.blue()
    )
    embed.add_field(name="!play", value="Phát một bài hát từ YouTube.", inline=False)
    embed.add_field(name="!pause", value="Tạm dừng bài hát đang phát.", inline=False)
    embed.add_field(name="!resume", value="Tiếp tục bài hát đang bị tạm dừng.", inline=False)
    embed.add_field(name="!skip", value="Chuyển đến bài hát tiếp theo trong danh sách chờ.", inline=False)
    embed.add_field(name="!stop", value="Dừng phát nhạc và cho phép Bé Mèo đi ngủ tiếp.", inline=False)
    # Thêm các lệnh khác theo cùng mẫu trên
    await message.channel.send(embed=embed)

class Song:
    def __init__(self, title, player):
        self.title = title  # Lưu trữ tiêu đề bài hát ở đây
        self.player = player

# Thêm đối tượng Song vào hàng đợi
def add_song_to_queue(guild_id, queues, song):
    queues.setdefault(guild_id, []).append(song)

async def handle_list(message, queues):
    log_file_path = "C:\\Bot Music 2\\song_log.txt"
    if os.path.exists(log_file_path):
        with open(log_file_path, "r", encoding="utf-8") as f:
            song_list = f.readlines()

        if song_list:
            embed = discord.Embed(
                title="Danh sách bài hát",
                description="Danh sách các bài hát đã phát:",
                color=discord.Color.blue()
            )

            for i, song in enumerate(song_list, start=1):
                if i == 1:
                    song = "- Đang phát: " + song.strip()
                embed.add_field(name=f"Bài hát {i}", value=song, inline=False)

            await message.channel.send(embed=embed)
        else:
            await message.channel.send("Hiện không có dữ liệu trong file log.")
    else:
        await message.channel.send("File log không tồn tại.")

async def handle_commands(message, client, queues, voice_clients, yt_dl_options, ytdl, ffmpeg_options=None, guild_id=None, data=None):
    # Nếu không có ffmpeg_options, sử dụng các thiết lập mặc định
    if ffmpeg_options is None:
        ffmpeg_options = {
            'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5',
            'options': '-vn -filter:a "volume=0.25"'
        }
    
    # Khởi tạo voice_client
    if guild_id is None:
        guild_id = message.guild.id

    if guild_id in voice_clients:
        voice_client = voice_clients[guild_id]
    else:
        voice_client = None

    # Xử lý lệnh !play
    if message.content.startswith("!play"):
        try:
            # Kiểm tra xem người gửi tin nhắn có đang ở trong kênh voice không
            voice_channel = message.author.voice.channel
            # Kiểm tra xem bot có đang ở trong kênh voice của guild không
            if voice_client and voice_client.is_connected():
                await voice_client.move_to(voice_channel)
            else:
                voice_client = await voice_channel.connect()
                voice_clients[guild_id] = voice_client
        except Exception as e:
            print(e)

        try:
            query = ' '.join(message.content.split()[1:])
            if query.startswith('http'):
                url = query
            else:
                query = 'ytsearch:' + query
                loop = asyncio.get_event_loop()
                data = await loop.run_in_executor(None, lambda: ytdl.extract_info(query, download=False))
                if not data:
                    raise ValueError("Không có dữ liệu trả về từ YouTube.")
                url = data['entries'][0]['url']

            player = FFmpegOpusAudio(url, **ffmpeg_options)
            # Lấy thông tin của bài hát mới đang được yêu cầu
            title = data['entries'][0]['title']
            duration = data['entries'][0]['duration']
            creator = data['entries'][0]['creator'] if 'creator' in data['entries'][0] else "Unknown"
            requester = message.author.nick if message.author.nick else message.author.name
                    
            # Tạo embed để thông báo thông tin bài hát mới
            embed = discord.Embed(
                title="Thông tin bài hát mới",
                description=f"**Bài hát:** *{title}*\n**Thời lượng:** *{duration}*\n**Tác giả:** *{creator}*\n**Người yêu cầu:** *{requester}*",
                color=discord.Color.green()
            )
            await message.channel.send(embed=embed)
            
            # Sau khi lấy thông tin của bài hát diễn ra, gọi hàm log_song_title với title của bài hát
            # Ví dụ:
            title = data['entries'][0]['title']
            await log_song_title(title)

            # Thêm vào danh sách chờ nếu có bài hát đang phát
            if voice_client.is_playing():
                queues.setdefault(guild_id, []).append(player)
            else:
                voice_client.play(player)
                
        except Exception as e:
            print(e)
            
    if message.content.startswith("!link"):
            try:
                voice_client = await message.author.voice.channel.connect()
                voice_clients[voice_client.guild.id] = voice_client
            except Exception as e:
                print(e)

            try:
                url = message.content.split()[1]

                loop = asyncio.get_event_loop()
                data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=False))

                song = data['url']
                player = discord.FFmpegOpusAudio(song, **ffmpeg_options)

                voice_clients[message.guild.id].play(player)
            except Exception as e:
                print(e)

    # Xử lý lệnh !queue
    elif message.content.startswith("!queue"):
        queue = queues.get(guild_id, [])
        if queue:
            await message.channel.send("Danh sách chờ:")
            for index, item in enumerate(queue, 1):
                await message.channel.send(f"{index}. {item.title}")
        else:
            await message.channel.send("Không có bài hát nào trong danh sách chờ.")

    # Xử lý lệnh !skip
    elif message.content.startswith("!skip"):
        try:
            if voice_client and voice_client.is_playing():
                voice_client.stop()
                await play_next_song(guild_id, queues, voice_client, skip=True)
                await remove_first_line_from_log()
        except Exception as e:
            print(e)

    # Xử lý các lệnh như !pause, !resume, !stop
    elif message.content.startswith("!pause"):
        try:
            if voice_client and voice_client.is_playing():
                voice_client.pause()
        except Exception as e:
            print(e)

    elif message.content.startswith("!resume"):
        try:
            if voice_client and not voice_client.is_playing():
                voice_client.resume()
        except Exception as e:
            print(e)

    elif message.content.startswith("!stop"):
        try:
            if voice_client:
                voice_client.stop()
                await voice_client.disconnect()
                del voice_clients[guild_id]  # Xóa voice_client sau khi dừng
        except Exception as e:
            print(e)

async def log_song_title(title):
    log_file_path = "C:\\Bot Music 2\\song_log.txt"
    try:
        # Kiểm tra xem tệp tin log đã tồn tại chưa
        if not os.path.exists(log_file_path):
            # Nếu chưa tồn tại, tạo tệp tin mới và ghi title vào tệp tin đó
            with open(log_file_path, 'w', encoding='utf-8') as file:
                file.write(title + '\n')
        else:
            # Nếu tệp tin log đã tồn tại, mở tệp tin và chèn title vào cuối tệp tin
            with open(log_file_path, 'a', encoding='utf-8') as file:
                file.write(title + '\n')
    except Exception as e:
        print(f"Error logging song title: {e}")

async def remove_first_line_from_log():
    log_file_path = "C:\\Bot Music 2\\song_log.txt"
    try:
        with open(log_file_path, "r", encoding="utf-8") as f:
            lines = f.readlines()
        # Xóa dòng đầu tiên trong list lines
        lines = lines[1:]
        with open(log_file_path, "w", encoding="utf-8") as f:
            for line in lines:
                f.write(line)
    except Exception as e:
        print(f"Error removing first line from log: {e}")
        
async def clear_log_file():
    log_file_path = "C:\\Bot Music 2\\song_log.txt"
    try:
        with open(log_file_path, "w", encoding="utf-8") as f:
            f.truncate(0)
    except Exception as e:
        print(f"Error clearing log file: {e}")


async def play_next_song(guild_id, queues, voice_client, skip=False):
    queue = queues.get(guild_id, [])
    if queue:
        player = queue.pop(0)
        voice_client.play(player, after=lambda e: asyncio.run_coroutine_threadsafe(play_next_song(guild_id, queues, voice_client, skip=False), voice_client.loop))
        if skip:
            return
        else:
            await remove_first_line_from_log()  # Xóa dòng đầu tiên trong file log
    elif skip:
        await remove_first_line_from_log()  # Xóa dòng đầu tiên trong file log
        await voice_client.disconnect()
        del voice_client[guild_id]  # Xóa voice_client sau khi dừng
    else:
        await clear_log_file()  # Xóa dòng đầu tiên trong file log
        await voice_client.disconnect()
        del voice_client[guild_id]  # Xóa voice_client sau khi dừng


    


    I have tried asking ChatGPT, Gemini, or Bing, and they always lead me into a loop of errors that cannot be resolved. This error only occurs when the song naturally finishes playing due to its duration. If the song is playing and I use the command !skip, the next song in the queue will play and function normally. I noticed that it seems like if a song ends naturally, the song queue is also cleared immediately. I hope someone can help me with this