Recherche avancée

Médias (0)

Mot : - Tags -/images

Aucun média correspondant à vos critères n’est disponible sur le site.

Autres articles (56)

  • List of compatible distributions

    26 avril 2011, par

    The table below is the list of Linux distributions compatible with the automated installation script of MediaSPIP. Distribution nameVersion nameVersion number Debian Squeeze 6.x.x Debian Weezy 7.x.x Debian Jessie 8.x.x Ubuntu The Precise Pangolin 12.04 LTS Ubuntu The Trusty Tahr 14.04
    If you want to help us improve this list, you can provide us access to a machine whose distribution is not mentioned above or send the necessary fixes to add (...)

  • Ajouter notes et légendes aux images

    7 février 2011, par

    Pour pouvoir ajouter notes et légendes aux images, la première étape est d’installer le plugin "Légendes".
    Une fois le plugin activé, vous pouvez le configurer dans l’espace de configuration afin de modifier les droits de création / modification et de suppression des notes. Par défaut seuls les administrateurs du site peuvent ajouter des notes aux images.
    Modification lors de l’ajout d’un média
    Lors de l’ajout d’un média de type "image" un nouveau bouton apparait au dessus de la prévisualisation (...)

  • Le plugin : Podcasts.

    14 juillet 2010, par

    Le problème du podcasting est à nouveau un problème révélateur de la normalisation des transports de données sur Internet.
    Deux formats intéressants existent : Celui développé par Apple, très axé sur l’utilisation d’iTunes dont la SPEC est ici ; Le format "Media RSS Module" qui est plus "libre" notamment soutenu par Yahoo et le logiciel Miro ;
    Types de fichiers supportés dans les flux
    Le format d’Apple n’autorise que les formats suivants dans ses flux : .mp3 audio/mpeg .m4a audio/x-m4a .mp4 (...)

Sur d’autres sites (7578)

  • New cookie behaviour in browsers may cause regressions

    24 février 2020, par Matomo Core Team — Community, Development

    Last year the Chromium browser team announced they would change their default behaviour for cookies. In particular about a property called samesite. Over the last few months, we have made various changes to our cookie handling to get Matomo ready for this. Depending on your setup and the features you use, some things may not work anymore.

    You can avoid most of the issues by using HTTPS on your Matomo, and ideally also use HTTPS on your website(s).

    If you are not running the latest version of Matomo yet (3.13.3 at the time of writing), then we highly recommend that you upgrade as soon as possible. Previous versions are not compatible with these cookie browser changes.

    Opt out screen

    If you embed the opt out screen on your website running on HTTP, there is a chance the Matomo opt out no longer works. In these cases it may still work over http:

    • when the privacy policy page that embeds the opt out screen (via iframe) also has the Matomo JavaScript tracker embedded,
    • and when both the opt out and the JS tracker point to the same Matomo installation.

    In other cases when HTTP is used, the opt out feature will likely be broken.

    We recommend you test whether the opt out on your site still works by opening your privacy policy page in an incognito browser window. Then test to opt out of tracking, and then reload the page. If the checkbox “You are not opted out. Uncheck this box to opt out.” is still ticked, then your opt out is not working.

    If the opt out is not working anymore, it is most likely due to HTTP being used. In that case you should change the opt out URL to HTTPS. For example change from &lt;iframe src=”<strong>http://</strong>…” to &lt;iframe src=”<strong>https://</strong>...” . If your Matomo doesn’t support HTTPS yet, you will need to contact your webhoster or system administrator to get SSL enabled on your Matomo domain.

    JavaScript tracker

    In most cases, everything related to the JavaScript Tracker will still work as expected.

    But there is an edge case : when you are also reading Matomo’s cookie server side. You may be affected by this edge case issue when :

    • you track part of the user behaviour in the browser (using Matomo JS Tracker),
    • and also track user behavior in your server (for example using one of Matomo SDKs in PHP, Java, Python, C#, etc.).

    In that case, for you to still be able to read the so-called visitorId on your server, we recommend you add this line to your JS tracking code :

    _paq.push([‘setSecureCookie’, location.protocol === 'https:']);

    The cookie can be only retrieved if your website is loaded through HTTPS.

    Should you have any questions, or notice anything isn’t working as expected, please visit our forum.

    Third party cookies

    If you are using third party cookies, using HTTPS on your Matomo is now a requirement to make them work across different domains. Otherwise Chrome and in the near future other browsers would not accept the cookie. If you don’t know if you are using third party cookies or first party cookies, you’re likely using first party cookies and this does not affect you.

  • "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 :

    &#xA;

    import asyncio&#xA;import discord&#xA;from discord import FFmpegOpusAudio, Embed&#xA;import os&#xA;&#xA;async def handle_help(message):&#xA;    embed = discord.Embed(&#xA;        title="Danh s&#xE1;ch lệnh cho B&#xE9; M&#xE8;o",&#xA;        description="Dưới đ&#xE2;y l&#xE0; c&#xE1;c lệnh m&#xE0; chủ nh&#xE2;n c&#xF3; thể bắt B&#xE9; M&#xE8;o phục vụ:",&#xA;        color=discord.Color.blue()&#xA;    )&#xA;    embed.add_field(name="!play", value="Ph&#xE1;t một b&#xE0;i h&#xE1;t từ YouTube.", inline=False)&#xA;    embed.add_field(name="!pause", value="Tạm dừng b&#xE0;i h&#xE1;t đang ph&#xE1;t.", inline=False)&#xA;    embed.add_field(name="!resume", value="Tiếp tục b&#xE0;i h&#xE1;t đang bị tạm dừng.", inline=False)&#xA;    embed.add_field(name="!skip", value="Chuyển đến b&#xE0;i h&#xE1;t tiếp theo trong danh s&#xE1;ch chờ.", inline=False)&#xA;    embed.add_field(name="!stop", value="Dừng ph&#xE1;t nhạc v&#xE0; cho ph&#xE9;p B&#xE9; M&#xE8;o đi ngủ tiếp.", inline=False)&#xA;    # Th&#xEA;m c&#xE1;c lệnh kh&#xE1;c theo c&#xF9;ng mẫu tr&#xEA;n&#xA;    await message.channel.send(embed=embed)&#xA;&#xA;class Song:&#xA;    def __init__(self, title, player):&#xA;        self.title = title  # Lưu trữ ti&#xEA;u đề b&#xE0;i h&#xE1;t ở đ&#xE2;y&#xA;        self.player = player&#xA;&#xA;# Th&#xEA;m đối tượng Song v&#xE0;o h&#xE0;ng đợi&#xA;def add_song_to_queue(guild_id, queues, song):&#xA;    queues.setdefault(guild_id, []).append(song)&#xA;&#xA;async def handle_list(message, queues):&#xA;    log_file_path = "C:\\Bot Music 2\\song_log.txt"&#xA;    if os.path.exists(log_file_path):&#xA;        with open(log_file_path, "r", encoding="utf-8") as f:&#xA;            song_list = f.readlines()&#xA;&#xA;        if song_list:&#xA;            embed = discord.Embed(&#xA;                title="Danh s&#xE1;ch b&#xE0;i h&#xE1;t",&#xA;                description="Danh s&#xE1;ch c&#xE1;c b&#xE0;i h&#xE1;t đ&#xE3; ph&#xE1;t:",&#xA;                color=discord.Color.blue()&#xA;            )&#xA;&#xA;            for i, song in enumerate(song_list, start=1):&#xA;                if i == 1:&#xA;                    song = "- Đang ph&#xE1;t: " &#x2B; song.strip()&#xA;                embed.add_field(name=f"B&#xE0;i h&#xE1;t {i}", value=song, inline=False)&#xA;&#xA;            await message.channel.send(embed=embed)&#xA;        else:&#xA;            await message.channel.send("Hiện kh&#xF4;ng c&#xF3; dữ liệu trong file log.")&#xA;    else:&#xA;        await message.channel.send("File log kh&#xF4;ng tồn tại.")&#xA;&#xA;async def handle_commands(message, client, queues, voice_clients, yt_dl_options, ytdl, ffmpeg_options=None, guild_id=None, data=None):&#xA;    # Nếu kh&#xF4;ng c&#xF3; ffmpeg_options, sử dụng c&#xE1;c thiết lập mặc định&#xA;    if ffmpeg_options is None:&#xA;        ffmpeg_options = {&#xA;            &#x27;before_options&#x27;: &#x27;-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5&#x27;,&#xA;            &#x27;options&#x27;: &#x27;-vn -filter:a "volume=0.25"&#x27;&#xA;        }&#xA;    &#xA;    # Khởi tạo voice_client&#xA;    if guild_id is None:&#xA;        guild_id = message.guild.id&#xA;&#xA;    if guild_id in voice_clients:&#xA;        voice_client = voice_clients[guild_id]&#xA;    else:&#xA;        voice_client = None&#xA;&#xA;    # Xử l&#xFD; lệnh !play&#xA;    if message.content.startswith("!play"):&#xA;        try:&#xA;            # Kiểm tra xem người gửi tin nhắn c&#xF3; đang ở trong k&#xEA;nh voice kh&#xF4;ng&#xA;            voice_channel = message.author.voice.channel&#xA;            # Kiểm tra xem bot c&#xF3; đang ở trong k&#xEA;nh voice của guild kh&#xF4;ng&#xA;            if voice_client and voice_client.is_connected():&#xA;                await voice_client.move_to(voice_channel)&#xA;            else:&#xA;                voice_client = await voice_channel.connect()&#xA;                voice_clients[guild_id] = voice_client&#xA;        except Exception as e:&#xA;            print(e)&#xA;&#xA;        try:&#xA;            query = &#x27; &#x27;.join(message.content.split()[1:])&#xA;            if query.startswith(&#x27;http&#x27;):&#xA;                url = query&#xA;            else:&#xA;                query = &#x27;ytsearch:&#x27; &#x2B; query&#xA;                loop = asyncio.get_event_loop()&#xA;                data = await loop.run_in_executor(None, lambda: ytdl.extract_info(query, download=False))&#xA;                if not data:&#xA;                    raise ValueError("Kh&#xF4;ng c&#xF3; dữ liệu trả về từ YouTube.")&#xA;                url = data[&#x27;entries&#x27;][0][&#x27;url&#x27;]&#xA;&#xA;            player = FFmpegOpusAudio(url, **ffmpeg_options)&#xA;            # Lấy th&#xF4;ng tin của b&#xE0;i h&#xE1;t mới đang được y&#xEA;u cầu&#xA;            title = data[&#x27;entries&#x27;][0][&#x27;title&#x27;]&#xA;            duration = data[&#x27;entries&#x27;][0][&#x27;duration&#x27;]&#xA;            creator = data[&#x27;entries&#x27;][0][&#x27;creator&#x27;] if &#x27;creator&#x27; in data[&#x27;entries&#x27;][0] else "Unknown"&#xA;            requester = message.author.nick if message.author.nick else message.author.name&#xA;                    &#xA;            # Tạo embed để th&#xF4;ng b&#xE1;o th&#xF4;ng tin b&#xE0;i h&#xE1;t mới&#xA;            embed = discord.Embed(&#xA;                title="Th&#xF4;ng tin b&#xE0;i h&#xE1;t mới",&#xA;                description=f"**B&#xE0;i h&#xE1;t:** *{title}*\n**Thời lượng:** *{duration}*\n**T&#xE1;c giả:** *{creator}*\n**Người y&#xEA;u cầu:** *{requester}*",&#xA;                color=discord.Color.green()&#xA;            )&#xA;            await message.channel.send(embed=embed)&#xA;            &#xA;            # Sau khi lấy th&#xF4;ng tin của b&#xE0;i h&#xE1;t diễn ra, gọi h&#xE0;m log_song_title với title của b&#xE0;i h&#xE1;t&#xA;            # V&#xED; dụ:&#xA;            title = data[&#x27;entries&#x27;][0][&#x27;title&#x27;]&#xA;            await log_song_title(title)&#xA;&#xA;            # Th&#xEA;m v&#xE0;o danh s&#xE1;ch chờ nếu c&#xF3; b&#xE0;i h&#xE1;t đang ph&#xE1;t&#xA;            if voice_client.is_playing():&#xA;                queues.setdefault(guild_id, []).append(player)&#xA;            else:&#xA;                voice_client.play(player)&#xA;                &#xA;        except Exception as e:&#xA;            print(e)&#xA;            &#xA;    if message.content.startswith("!link"):&#xA;            try:&#xA;                voice_client = await message.author.voice.channel.connect()&#xA;                voice_clients[voice_client.guild.id] = voice_client&#xA;            except Exception as e:&#xA;                print(e)&#xA;&#xA;            try:&#xA;                url = message.content.split()[1]&#xA;&#xA;                loop = asyncio.get_event_loop()&#xA;                data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=False))&#xA;&#xA;                song = data[&#x27;url&#x27;]&#xA;                player = discord.FFmpegOpusAudio(song, **ffmpeg_options)&#xA;&#xA;                voice_clients[message.guild.id].play(player)&#xA;            except Exception as e:&#xA;                print(e)&#xA;&#xA;    # Xử l&#xFD; lệnh !queue&#xA;    elif message.content.startswith("!queue"):&#xA;        queue = queues.get(guild_id, [])&#xA;        if queue:&#xA;            await message.channel.send("Danh s&#xE1;ch chờ:")&#xA;            for index, item in enumerate(queue, 1):&#xA;                await message.channel.send(f"{index}. {item.title}")&#xA;        else:&#xA;            await message.channel.send("Kh&#xF4;ng c&#xF3; b&#xE0;i h&#xE1;t n&#xE0;o trong danh s&#xE1;ch chờ.")&#xA;&#xA;    # Xử l&#xFD; lệnh !skip&#xA;    elif message.content.startswith("!skip"):&#xA;        try:&#xA;            if voice_client and voice_client.is_playing():&#xA;                voice_client.stop()&#xA;                await play_next_song(guild_id, queues, voice_client, skip=True)&#xA;                await remove_first_line_from_log()&#xA;        except Exception as e:&#xA;            print(e)&#xA;&#xA;    # Xử l&#xFD; c&#xE1;c lệnh như !pause, !resume, !stop&#xA;    elif message.content.startswith("!pause"):&#xA;        try:&#xA;            if voice_client and voice_client.is_playing():&#xA;                voice_client.pause()&#xA;        except Exception as e:&#xA;            print(e)&#xA;&#xA;    elif message.content.startswith("!resume"):&#xA;        try:&#xA;            if voice_client and not voice_client.is_playing():&#xA;                voice_client.resume()&#xA;        except Exception as e:&#xA;            print(e)&#xA;&#xA;    elif message.content.startswith("!stop"):&#xA;        try:&#xA;            if voice_client:&#xA;                voice_client.stop()&#xA;                await voice_client.disconnect()&#xA;                del voice_clients[guild_id]  # X&#xF3;a voice_client sau khi dừng&#xA;        except Exception as e:&#xA;            print(e)&#xA;&#xA;async def log_song_title(title):&#xA;    log_file_path = "C:\\Bot Music 2\\song_log.txt"&#xA;    try:&#xA;        # Kiểm tra xem tệp tin log đ&#xE3; tồn tại chưa&#xA;        if not os.path.exists(log_file_path):&#xA;            # Nếu chưa tồn tại, tạo tệp tin mới v&#xE0; ghi title v&#xE0;o tệp tin đ&#xF3;&#xA;            with open(log_file_path, &#x27;w&#x27;, encoding=&#x27;utf-8&#x27;) as file:&#xA;                file.write(title &#x2B; &#x27;\n&#x27;)&#xA;        else:&#xA;            # Nếu tệp tin log đ&#xE3; tồn tại, mở tệp tin v&#xE0; ch&#xE8;n title v&#xE0;o cuối tệp tin&#xA;            with open(log_file_path, &#x27;a&#x27;, encoding=&#x27;utf-8&#x27;) as file:&#xA;                file.write(title &#x2B; &#x27;\n&#x27;)&#xA;    except Exception as e:&#xA;        print(f"Error logging song title: {e}")&#xA;&#xA;async def remove_first_line_from_log():&#xA;    log_file_path = "C:\\Bot Music 2\\song_log.txt"&#xA;    try:&#xA;        with open(log_file_path, "r", encoding="utf-8") as f:&#xA;            lines = f.readlines()&#xA;        # X&#xF3;a d&#xF2;ng đầu ti&#xEA;n trong list lines&#xA;        lines = lines[1:]&#xA;        with open(log_file_path, "w", encoding="utf-8") as f:&#xA;            for line in lines:&#xA;                f.write(line)&#xA;    except Exception as e:&#xA;        print(f"Error removing first line from log: {e}")&#xA;        &#xA;async def clear_log_file():&#xA;    log_file_path = "C:\\Bot Music 2\\song_log.txt"&#xA;    try:&#xA;        with open(log_file_path, "w", encoding="utf-8") as f:&#xA;            f.truncate(0)&#xA;    except Exception as e:&#xA;        print(f"Error clearing log file: {e}")&#xA;&#xA;&#xA;async def play_next_song(guild_id, queues, voice_client, skip=False):&#xA;    queue = queues.get(guild_id, [])&#xA;    if queue:&#xA;        player = queue.pop(0)&#xA;        voice_client.play(player, after=lambda e: asyncio.run_coroutine_threadsafe(play_next_song(guild_id, queues, voice_client, skip=False), voice_client.loop))&#xA;        if skip:&#xA;            return&#xA;        else:&#xA;            await remove_first_line_from_log()  # X&#xF3;a d&#xF2;ng đầu ti&#xEA;n trong file log&#xA;    elif skip:&#xA;        await remove_first_line_from_log()  # X&#xF3;a d&#xF2;ng đầu ti&#xEA;n trong file log&#xA;        await voice_client.disconnect()&#xA;        del voice_client[guild_id]  # X&#xF3;a voice_client sau khi dừng&#xA;    else:&#xA;        await clear_log_file()  # X&#xF3;a d&#xF2;ng đầu ti&#xEA;n trong file log&#xA;        await voice_client.disconnect()&#xA;        del voice_client[guild_id]  # X&#xF3;a voice_client sau khi dừng&#xA;

    &#xA;

    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

    &#xA;

  • How to write unit tests for your plugin – Introducing the Piwik Platform

    17 novembre 2014, par Thomas Steur — Development

    This is the next post of our blog series where we introduce the capabilities of the Piwik platform (our previous post was How to verify user permissions). This time you’ll learn how to write unit tests in Piwik. For this tutorial you will need to have basic knowledge of PHP, PHPUnit and the Piwik platform.

    When is a test a unit test ?

    There are many different opinions on this and it can be sometimes hard to decide. At Piwik we consider a test as a unit test if only a single method or class is being tested and if a test does not have a dependency to the filesystem, web, config, database or to any other plugin.

    If a test is slow it can be an indicator that it is not a unit test. “Slow” is of course a bit vague. We will cover how to write other type of tests, such as integration tests, in one of our next blog posts.

    Getting started

    In this post, we assume that you have already installed Piwik 2.9.0 or later via git, set up your development environment and created a plugin. If not, visit the Piwik Developer Zone where you’ll find the tutorial Setting up Piwik and other Guides that help you to develop a plugin.

    Let’s create a unit test

    We start by using the Piwik Console to create a new unit test :

    ./console generate:test --testtype unit

    The command will ask you to enter the name of the plugin the created test should belong to. I will use the plugin name “Insights”. Next it will ask you for the name of the test. Here you usually enter the name of the class you want to test. I will use “Widgets” in this example. There should now be a file plugins/Insights/tests/Unit/WidgetsTest.php which contains already an example to get you started easily :

    1. /**
    2.  * @group Insights
    3.  * @group WidgetsTest
    4.  * @group Plugins
    5.  */
    6. class WidgetsTest extends \PHPUnit_Framework_TestCase
    7. {
    8.  
    9.     public function testSimpleAddition()
    10.     {
    11.         $this-&gt;assertEquals(2, 1+1);
    12.     }
    13.  
    14. }

    Télécharger

    We don’t want to cover how you should write your unit test. This is totally up to you. If you have no experience in writing unit tests yet, we recommend to read articles on the topic, or a book, or to watch videos or anything else that will help you learn best.

    Running a test

    To run a test we will use the command tests:run which allows you to execute a test suite, a specific file or a group of tests.

    To verify whether the created test works we will run it as follows :

    ./console tests:run WidgetsTest

    This will run all tests having the group WidgetsTest. As other tests can use the same group you might want to pass the path to your test file instead :

    ./console tests:run plugins/Insights/tests/Unit/Widgets.php

    If you want to run all tests within your plugin pass the name of your plugin as an argument :

    ./console tests:run insights

    Of course you can also define multiple arguments :

    ./console tests:run insights WidgetsTest

    This will execute all tests within the insights plugin having the group WidgetsTest. If you only want to run unit tests within your plugin you can do the following :

    ./console tests:run insights unit

    Advanced features

    Isn’t it easy to create a unit test ? We never even created a file ! You can accomplish even more if you want : You can generate other type of tests, you can run tests on Amazon’s AWS and more. Unfortunately, not everything is documented yet so we recommend to discover more features by executing the commands ./console list tests and ./console help tests:run.

    If you have any feedback regarding our APIs or our guides in the Developer Zone feel free to send it to us.