<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: sium_hossain</title>
    <description>The latest articles on DEV Community by sium_hossain (@siumhossain).</description>
    <link>https://dev.to/siumhossain</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F570131%2F67a93990-2e71-43cf-96f4-026585eef3ae.jpg</url>
      <title>DEV Community: sium_hossain</title>
      <link>https://dev.to/siumhossain</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/siumhossain"/>
    <language>en</language>
    <item>
      <title>How to enable hot reload in your Gin project</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Thu, 22 Aug 2024 11:46:32 +0000</pubDate>
      <link>https://dev.to/siumhossain/how-to-enable-hot-reload-in-your-gin-project-42g4</link>
      <guid>https://dev.to/siumhossain/how-to-enable-hot-reload-in-your-gin-project-42g4</guid>
      <description>&lt;p&gt;Gin is one of the fastest frameworks in the Go world. However, there is one feature missing in &lt;code&gt;Gin&lt;/code&gt; is hot realod. So that in this blog I can show you how can you enable hot reaload feature in your &lt;code&gt;Gin&lt;/code&gt; project.&lt;/p&gt;

&lt;p&gt;Suppose this is your &lt;code&gt;main.go&lt;/code&gt;  fie&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/gin-gonic/gin"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;successResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"data"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;successResponseWithMessageAndCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"data"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}{&lt;/span&gt;
            &lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Hello World"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;successResponseWithMessageAndCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Hello World"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"localhost:8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So we can use &lt;code&gt;Air&lt;/code&gt; (&lt;a href="https://github.com/air-verse/air" rel="noopener noreferrer"&gt;https://github.com/air-verse/air&lt;/a&gt;) - &lt;strong&gt;Live reload for your Go apps&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Install Air by using this command 👇&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/air-verse/air@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add &lt;code&gt;.air.toml&lt;/code&gt; file using this command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;air init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the &lt;code&gt;air&lt;/code&gt; command is not found, it might be because the Go bin directory is not in your PATH&lt;/p&gt;

&lt;p&gt;In that case I’m using fish terminal &lt;/p&gt;

&lt;p&gt;First, let's find out where Go installs binaries. Run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If $GOPATH is not set, the default location is usually &lt;code&gt;~/go/bin&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, let's add this directory to your PATH in Fish. Open your Fish configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.config/fish/config.fish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following line to the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-gx&lt;/span&gt; PATH &lt;span class="nv"&gt;$PATH&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If $GOPATH is not set, use the full path, like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-gx&lt;/span&gt; PATH &lt;span class="nv"&gt;$PATH&lt;/span&gt; ~/go/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file and exit the editor.&lt;br&gt;
Reload your Fish configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; ~/.config/fish/config.fish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now try running air again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;air
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are using bash terminal you have to edit your &lt;code&gt;.~/bashrc&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Now edit &lt;code&gt;.air.toml&lt;/code&gt; file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;root &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"."&lt;/span&gt;
tmp_dir &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tmp"&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;build]
cmd &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"go build -o ./tmp/main ."&lt;/span&gt;
bin &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tmp/main"&lt;/span&gt;
full_bin &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"APP_ENV=dev APP_USER=air ./tmp/main"&lt;/span&gt;
include_ext &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"go"&lt;/span&gt;, &lt;span class="s2"&gt;"tpl"&lt;/span&gt;, &lt;span class="s2"&gt;"tmpl"&lt;/span&gt;, &lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
exclude_dir &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"assets"&lt;/span&gt;, &lt;span class="s2"&gt;"tmp"&lt;/span&gt;, &lt;span class="s2"&gt;"vendor"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
include_dir &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
exclude_file &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
log &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"air.log"&lt;/span&gt;
delay &lt;span class="o"&gt;=&lt;/span&gt; 1000 &lt;span class="c"&gt;# ms&lt;/span&gt;
stop_on_error &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true
&lt;/span&gt;send_interrupt &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false
&lt;/span&gt;kill_delay &lt;span class="o"&gt;=&lt;/span&gt; 500 &lt;span class="c"&gt;# ms&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;log]
&lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;color]
main &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"magenta"&lt;/span&gt;
watcher &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"cyan"&lt;/span&gt;
build &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"yellow"&lt;/span&gt;
runner &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"green"&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;misc]
clean_on_exit &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure your Gin application listens on &lt;code&gt;localhost&lt;/code&gt; instead of just &lt;code&gt;:8080&lt;/code&gt; for better hot-reload behavior&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"localhost:8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now instead of run &lt;code&gt;go run main.go&lt;/code&gt; , just run &lt;code&gt;air&lt;/code&gt; and then see the magic.&lt;/p&gt;

</description>
      <category>go</category>
      <category>gin</category>
      <category>backend</category>
    </item>
    <item>
      <title>This is the first Chrome extension I built as a hobby</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Mon, 06 May 2024 05:46:58 +0000</pubDate>
      <link>https://dev.to/siumhossain/this-is-the-first-chrome-extension-i-built-as-a-hobby-1op1</link>
      <guid>https://dev.to/siumhossain/this-is-the-first-chrome-extension-i-built-as-a-hobby-1op1</guid>
      <description>&lt;p&gt;This is the first Chrome extension I built as a hobby.&lt;br&gt;
check that out 👉 &lt;a href="https://lnkd.in/eXYurFVs" rel="noopener noreferrer"&gt;https://lnkd.in/eXYurFVs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔐 Secure your computer tabs with a password when others use your device&lt;/p&gt;

&lt;p&gt;🤔 Have you ever had to share your device with someone and worried they might access websites you want to keep private? Tab Protector is here to help. Set a password for any tab you choose, ensuring that any specific URL under the root domain is secure. Just remember not to pin it to your Chrome extension bar 😅&lt;/p&gt;

</description>
      <category>chrome</category>
      <category>extensions</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Represent a directory tree in a Github README.md</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Sun, 16 Apr 2023 05:47:59 +0000</pubDate>
      <link>https://dev.to/siumhossain/represent-a-directory-tree-in-a-github-readmemd-333f</link>
      <guid>https://dev.to/siumhossain/represent-a-directory-tree-in-a-github-readmemd-333f</guid>
      <description>&lt;p&gt;Do you want to add your project structure tree in your .readme file?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw88u684pryumvpn94gwl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw88u684pryumvpn94gwl.png" alt="directory_tree"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install tree&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;tree


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Just type tree inside of your project directory&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

tree


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If you want to ignore a folder from your &lt;code&gt;tree&lt;/code&gt; like &lt;strong&gt;node_modules&lt;/strong&gt;, you can do this by &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

tree &lt;span class="nt"&gt;-I&lt;/span&gt; node_modules


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;How about you want to ignore multiple folder from your tree, you can do this by&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

tree &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="s2"&gt;"node_modules|venv|lib"&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>github</category>
      <category>tree</category>
      <category>ubuntu</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Scalable &amp; Event Driven simple ticket buying system with Kafka &amp; Python</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Wed, 01 Mar 2023 17:52:28 +0000</pubDate>
      <link>https://dev.to/siumhossain/scalable-event-driven-simple-ticket-buying-system-with-kafka-python-55dm</link>
      <guid>https://dev.to/siumhossain/scalable-event-driven-simple-ticket-buying-system-with-kafka-python-55dm</guid>
      <description>&lt;p&gt;&lt;strong&gt;Apache Kafka&lt;/strong&gt; is a distributed event store and stream-processing platform. It is an open-source system developed by the Apache Software Foundation written in Java and Scala. The project aims to provide a unified, high-throughput, low-latency platform for handling real-time data feeds.&lt;/p&gt;

&lt;p&gt;We are gonna build a simple ticket buying system just to understand basic consumer and producer functionality in &lt;strong&gt;Kafka&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48t2r2sncbm7i1frerwv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48t2r2sncbm7i1frerwv.gif" alt="kafka_output" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First of all we need to setup kafka, zookeeper and python kafka package.&lt;/p&gt;

&lt;p&gt;For kafka and zookeeper I'm using docker for installation. Here is the &lt;code&gt;docker-compose.yml&lt;/code&gt; file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;zookeeper&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;confluentinc/cp-zookeeper:latest&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;ZOOKEEPER_CLIENT_PORT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2181&lt;/span&gt;
      &lt;span class="na"&gt;ZOOKEEPER_TICK_TIME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2000&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;22181:2181&lt;/span&gt;
  &lt;span class="na"&gt;kafka&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;confluentinc/cp-kafka:5.3.1&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;zookeeper&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;29092:29092&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_BROKER_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zookeeper:2181&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_ADVERTISED_LISTENERS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_LISTENER_SECURITY_PROTOCOL_MAP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_INTER_BROKER_LISTENER_NAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PLAINTEXT&lt;/span&gt;
      &lt;span class="na"&gt;KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And also you have to install &lt;a href="https://kafka-python.readthedocs.io/en/master/" rel="noopener noreferrer"&gt;kafka-python-package&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;kafka-python
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All things done! Let's get into coding&lt;/p&gt;

&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;Let's think from frontend, suppose user will request of buying ticket from fronted, behind the scene our &lt;code&gt;kafka&lt;/code&gt; producer will send streams of data to the Kafka cluster with respected data. And one &lt;code&gt;kafka&lt;/code&gt; consumer will allows applications to read streams of data from the cluster. And we can make as producer and consumer API as much as we need for different different task.&lt;/p&gt;

&lt;h4&gt;
  
  
  Code
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;producer.py&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;faker&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Faker&lt;/span&gt;
&lt;span class="c1"&gt;# faker package just use for some random data
&lt;/span&gt;
&lt;span class="n"&gt;fake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Faker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kafka&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;KafkaProducer&lt;/span&gt;

&lt;span class="n"&gt;producer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;KafkaProducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bootstrap_servers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost:29092&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40_000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tiket_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bank_account&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bban&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_details&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# order details: is just an event name in kafka cluster
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done sending ..&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;transaction.py responsible for receiving those data and build another producer in kafka cluster just for calculation total revenue and total amount of sold ticket&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kafka&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;KafkaConsumer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;KafkaProducer&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;KAFKA_TOPIC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_details&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;producer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;KafkaProducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bootstrap_servers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost:29092&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;consumer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;KafkaConsumer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;KAFKA_TOPIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bootstrap_servers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost:29092&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;start listening&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ongoing transaction&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;consumed_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;consumed_message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;#retrieve price data from previous producer which is now in kafka cluster 
&lt;/span&gt;        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analytics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;#then just demo purpose I created another producer for calculation
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Successful transaction..&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;analytics.py&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kafka&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;KafkaConsumer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;KafkaProducer&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;KAFKA_TOPIC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analytics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;consumer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;KafkaConsumer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;KAFKA_TOPIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bootstrap_servers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost:29092&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;start listening&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;total_ticket_sell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;revenue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;consumed_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;total_ticket_sell&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;revenue&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;consumed_message&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;============&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Receiving order&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;----------------&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;total ticket sell so far: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total_ticket_sell&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;total revenue so far: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;revenue&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done, now time for testing. Keep in mind you run your docker compose file and 3 python file in 3 different terminal just to see what happening.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;N:B run 2 consumer file at first, then the producer.py file&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48t2r2sncbm7i1frerwv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48t2r2sncbm7i1frerwv.gif" alt="kafka_output" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hls and Dash packaging simultaneously with Ffmpeg and Shaka packager</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Sat, 28 Jan 2023 11:04:35 +0000</pubDate>
      <link>https://dev.to/siumhossain/hls-and-dash-packaging-simultaneously-with-ffmpeg-and-shaka-packager-2flg</link>
      <guid>https://dev.to/siumhossain/hls-and-dash-packaging-simultaneously-with-ffmpeg-and-shaka-packager-2flg</guid>
      <description>&lt;p&gt;&lt;strong&gt;Dash&lt;/strong&gt; is the open-source equivalent of Apple's HLS technology, used for the same purpose: to deliver live videos or on-demand videos over the web, dynamically changing the quality based on the internet connection of the ﬁnal user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HlS&lt;/strong&gt; it's a standard created by apple in order to deliver audio/video streaming using ordinary web servers.&lt;/p&gt;

&lt;p&gt;Following formula will produce a multi-bit-rate version of our master with h264 constrained encoding&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; input.mp4 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 22 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 5000k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 10000k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 128k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 1080.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 1280x720 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 24 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 2500k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 5000k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 128k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 720.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 854x480 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 30 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 1250k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 2500k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 96k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 480.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 640x360 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 33 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 900k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 1800k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 96k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 360.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 320x24 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 36 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 625k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 1250k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 22050 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 64k &lt;span class="nt"&gt;-ac&lt;/span&gt; 1 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 240.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;All tags described in my previous blog&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Create multi-bitrate DASH and HLS playlist with &lt;strong&gt;Shaka packager&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Shaka packager official documentation, &lt;a href="https://shaka-project.github.io/shaka-packager/html/tutorials/tutorials.html" rel="noopener noreferrer"&gt;check_out&lt;/a&gt; installation and user guide from their official doc&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./packager-linux-x64 &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1080.mp4,stream&lt;span class="o"&gt;=&lt;/span&gt;audio,output&lt;span class="o"&gt;=&lt;/span&gt;audio.mp4,playlist_name&lt;span class="o"&gt;=&lt;/span&gt;audio.m3u8,hls_group_id&lt;span class="o"&gt;=&lt;/span&gt;audio,hls_name&lt;span class="o"&gt;=&lt;/span&gt;ENGLISH &lt;span class="se"&gt;\&lt;/span&gt;
                                          &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1080.mp4,stream&lt;span class="o"&gt;=&lt;/span&gt;video,output&lt;span class="o"&gt;=&lt;/span&gt;h264_1080.mp4,playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_1080p.m3u8,iframe_playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_1080p_iframe.m3u8 &lt;span class="se"&gt;\&lt;/span&gt;
                                          &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;480.mp4,stream&lt;span class="o"&gt;=&lt;/span&gt;video,output&lt;span class="o"&gt;=&lt;/span&gt;h264_480p.mp4,playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_480p.m3u8,iframe_playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_480p_iframe.m3u8 &lt;span class="se"&gt;\&lt;/span&gt;
                                          &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;360.mp4,stream&lt;span class="o"&gt;=&lt;/span&gt;video,output&lt;span class="o"&gt;=&lt;/span&gt;h264_360p.mp4,playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_360p.m3u8,iframe_playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_360p_iframe.m3u8 &lt;span class="se"&gt;\&lt;/span&gt;
                                          &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;240.mp4,stream&lt;span class="o"&gt;=&lt;/span&gt;video,output&lt;span class="o"&gt;=&lt;/span&gt;h264_240p.mp4,playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_240p.m3u8,iframe_playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_240p_iframe.m3u8 &lt;span class="se"&gt;\&lt;/span&gt;
                                          &lt;span class="nt"&gt;--hls_master_playlist_output&lt;/span&gt; h264_master.m3u8 &lt;span class="se"&gt;\&lt;/span&gt;
                                          &lt;span class="nt"&gt;--mpd_output&lt;/span&gt; h264.mpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Explanation
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;in&lt;/code&gt; : &lt;code&gt;in=your_input_video.mp4&lt;/code&gt;, input command&lt;br&gt;
&lt;code&gt;stream&lt;/code&gt; : &lt;code&gt;stream=audio&lt;/code&gt; for extract only audio file from input file and &lt;code&gt;stream=video&lt;/code&gt; for extract only video file from input file&lt;/p&gt;

&lt;p&gt;Previously we got different chunk file for different resolution from &lt;code&gt;FFmpeg&lt;/code&gt; previous command like &lt;code&gt;1080.mp4&lt;/code&gt;,&lt;code&gt;720.mp4&lt;/code&gt;,&lt;code&gt;480.mp4&lt;/code&gt; etc.&lt;/p&gt;

&lt;p&gt;For making playlist we have to put respected file one by one&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1080.mp4,stream&lt;span class="o"&gt;=&lt;/span&gt;video,output&lt;span class="o"&gt;=&lt;/span&gt;h264_1080.mp4,playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_1080p.m3u8,iframe_playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_1080p_iframe.m3u8 &lt;span class="se"&gt;\&lt;/span&gt;
                                          &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;480.mp4,stream&lt;span class="o"&gt;=&lt;/span&gt;video,output&lt;span class="o"&gt;=&lt;/span&gt;h264_480p.mp4,playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_480p.m3u8,iframe_playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_480p_iframe.m3u8 &lt;span class="se"&gt;\&lt;/span&gt;
                                          &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;360.mp4,stream&lt;span class="o"&gt;=&lt;/span&gt;video,output&lt;span class="o"&gt;=&lt;/span&gt;h264_360p.mp4,playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_360p.m3u8,iframe_playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_360p_iframe.m3u8 &lt;span class="se"&gt;\&lt;/span&gt;
                                          &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;240.mp4,stream&lt;span class="o"&gt;=&lt;/span&gt;video,output&lt;span class="o"&gt;=&lt;/span&gt;h264_240p.mp4,playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_240p.m3u8,iframe_playlist_name&lt;span class="o"&gt;=&lt;/span&gt;h264_240p_iframe.m3u8 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--hls_master_playlist_output&lt;/code&gt;: Generator master playlist for hls streaming &lt;br&gt;
&lt;code&gt;--mpd_output h264.mpd&lt;/code&gt;: Generator master playlist for dash streaming&lt;/p&gt;

</description>
      <category>video</category>
      <category>stream</category>
      <category>ffmpeg</category>
      <category>shaka</category>
    </item>
    <item>
      <title>Producing dash streming using ffmpeg and bento4</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Thu, 26 Jan 2023 05:21:04 +0000</pubDate>
      <link>https://dev.to/siumhossain/producing-dash-streming-using-ffmpeg-and-bento4-316n</link>
      <guid>https://dev.to/siumhossain/producing-dash-streming-using-ffmpeg-and-bento4-316n</guid>
      <description>&lt;p&gt;Dash is the open-source equivalent of Apple's HLS technology, used for the same purpose: to deliver live videos or on-demand videos over the web, dynamically changing the quality based on the internet connection of the ﬁnal user.&lt;/p&gt;

&lt;p&gt;Following formula will produce a multi-bit-rate version of our master with h264 constrained encoding&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; input.mp4 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 22 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 5000k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 10000k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 128k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 1080.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 1280x720 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 24 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 2500k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 5000k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 128k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 720.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 854x480 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 30 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 1250k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 2500k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 96k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 480.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 640x360 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 33 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 900k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 1800k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 96k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 360.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 320x24 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 36 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 625k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 1250k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 22050 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 64k &lt;span class="nt"&gt;-ac&lt;/span&gt; 1 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 240.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;All tags described in my previous blog&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Create multi-bitrate DASH playlist with Bento4
&lt;/h4&gt;

&lt;p&gt;In order to create a multi-bitrate &lt;code&gt;DASH&lt;/code&gt; playlist with &lt;code&gt;Bent04&lt;/code&gt;, we need to perform 2 separate action. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First one dedicated at the fragmentation of each file(version) of our master video, &lt;code&gt;mp4fragment&lt;/code&gt; command will responsible for this task&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Sample command:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;mp4fragment 1080.mp4 1080-f.mp4
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;code&gt;mp4fragment&lt;/code&gt;: this will launch Bento4's Mp4 Fragment tool&lt;br&gt;
&lt;code&gt;1080.mp4&lt;/code&gt;: this is the input ﬁle to be fragmented&lt;br&gt;
&lt;code&gt;1080-f.mp4&lt;/code&gt;: this is an example output's ﬁlename&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now we have to repeat this command for each version of our master video&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mp4fragment 1080.mp4 1080-f.mp4&amp;amp;&amp;amp;mp4fragment 720.mp4 720-f.mp4&amp;amp;&amp;amp;mp4fragment 480.mp4 480-f-.mp4&amp;amp;&amp;amp;mp4fragment 360.mp4 360-f.mp4&amp;amp;&amp;amp;mp4fragment 240.mp4 240-f.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Generate DASH playlist
&lt;/h4&gt;

&lt;p&gt;In order to generate a DASH playlist with our segmented mp4s, we will use another tool from Bento4 called &lt;code&gt;mp4dash&lt;/code&gt; using following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mp4dash 240-f.mp4 360-f.mp4 480-f.mp4 720-f.mp4 1080-f.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will generate a folder titled "output" which will&lt;br&gt;
contain 2 separate folders: one called "audio" dedicated for the audio streaming and another called "video" containing the segments of each of the 5 variations of our master video. And finally we will find the "stream.mpd" file which is the DASH playlist itself.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>producing HLS Packaging using FFmpeg &amp; Bento4</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Sat, 21 Jan 2023 05:43:33 +0000</pubDate>
      <link>https://dev.to/siumhossain/all-about-fmped-18hc</link>
      <guid>https://dev.to/siumhossain/all-about-fmped-18hc</guid>
      <description>&lt;h4&gt;
  
  
  HlS it's a standard created by apple in order to deliver audio/video streaming using ordinary web servers.
&lt;/h4&gt;

&lt;p&gt;If we want to prepare a video into a standard HLS stream, we will need both FFMPEG and Bento4.&lt;/p&gt;

&lt;p&gt;Install &lt;code&gt;Bento4&lt;/code&gt; by &lt;code&gt;docker&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker file&lt;/code&gt; and &lt;code&gt;compose.yml&lt;/code&gt; file location: &lt;a href="https://github.com/alfg/docker-bento4" rel="noopener noreferrer"&gt;https://github.com/alfg/docker-bento4&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull alfg/bento4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;run your command by&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; alfg/bento4 mp4info 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Convert your master into multi-bit rate with FFMPEG&lt;br&gt;
To begin, we will have 1 master file that will need to be converted in different bit rates &lt;/p&gt;

&lt;p&gt;Let's say our master file is in 1080p(1920x1080). For our streaming needs, we need convert that file into multi bit rate for smoothing user experience&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; input.mp4 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 22 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 5000k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 10000k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 128k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 1080.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 1280x720 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 24 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 2500k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 5000k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 128k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 720.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 854x480 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 30 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 1250k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 2500k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 96k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 480.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 640x360 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 33 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 900k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 1800k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 96k &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 360.mp4 &lt;span class="nt"&gt;-s&lt;/span&gt; 320x24 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-crf&lt;/span&gt; 36 &lt;span class="nt"&gt;-tune&lt;/span&gt; film &lt;span class="nt"&gt;-profile&lt;/span&gt;:v main &lt;span class="nt"&gt;-level&lt;/span&gt;:v 4.0 &lt;span class="nt"&gt;-maxrate&lt;/span&gt; 625k &lt;span class="nt"&gt;-bufsize&lt;/span&gt; 1250k &lt;span class="nt"&gt;-r&lt;/span&gt; 25 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt; 25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-ar&lt;/span&gt; 22050 &lt;span class="nt"&gt;-b&lt;/span&gt;:a 64k &lt;span class="nt"&gt;-ac&lt;/span&gt; 1 &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuv420p &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart 240.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-i input.mp4&lt;/code&gt;: Master file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-c:v h264&lt;/code&gt;: Convert master file into h164 codec&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-crf 22&lt;/code&gt;: Constant Rate Factor(CRF). Value can be anything from 0(lossless) up to 50(lowest)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-tune flim&lt;/code&gt;: especially suitable for ﬁlm content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-profile:v main -level 4.0&lt;/code&gt;: Compress frames for compatibility reasons &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-maxrate 5000k -bufsize 10000k&lt;/code&gt;: Along with the -crf option enabled this will instruct FFMPEG to encode our video with a speciﬁc constrained mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r 25 -keyint_min 25 -g 50&lt;/code&gt;: Instruction for produce a 25 FPS file with the recommended distance between key frames every 2 seconds&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-sc_threshold 0&lt;/code&gt;: Instruction no to insert key frame at scene changes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-c:a aac -ar 44100 -b:a 128k -ac 2&lt;/code&gt;: This will produce a standard AAC audio file at 44.100 KHz, at 128 Kbps, in stereo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-pix_fmt yuv420p&lt;/code&gt;: option for produce a video compatible with major video players, including Apple's QuickTime&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-movflags +faststart&lt;/code&gt;: The -movflags
+faststart instruction is advised whenever there is a streaming case-scenario. This particular instruction tells FFMPEG to move a speciﬁc part of an Mp4 File, called "atom"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1080.mp4&lt;/code&gt;: outfile name &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\&lt;/code&gt;: Backslash symbol means &lt;code&gt;Escape&lt;/code&gt;. It is used also as a new line delimiter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-s 1280x720&lt;/code&gt;: Instruction for resize the input file into desire resolution&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;1080.mp4 - For the 1920x1080 resolution&lt;br&gt;
720.mp4 - For the 1280x720 resolution&lt;br&gt;
480.mp4 - For the 854x480 resolution&lt;br&gt;
360.mp4 - For the 640x360 resolution&lt;br&gt;
240.mp4 - For the 426x240 resolution&lt;/p&gt;

&lt;p&gt;1080.mp4 - AAC Audio at 128 Kbps, 44.100 kHz, Stereo&lt;br&gt;
720.mp4 - same as 1080.mp4&lt;br&gt;
480.mp4 - AAC Audio at 96 Kbps, 44.100 kHz, Stereo&lt;br&gt;
360.mp4 - same as 480.mp4&lt;br&gt;
240.mp4 - AAC Audio at 64 Kbpx, 22.050 kHz, Mono&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Create multi-bitrate HLS playlist with Bento4
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mp4hls 240.mp4 360.mp4 480.mp4 720.mp4 1080.mp4 &lt;span class="nt"&gt;--verbose&lt;/span&gt; &lt;span class="nt"&gt;--segment-duration&lt;/span&gt; 6 &lt;span class="nt"&gt;--output-single-file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mp4hls&lt;/code&gt;: this will launch Bento4's Mp4HLS tool&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;240.mp4 360.mp4 480.mp4 720.mp4 1080.mp4&lt;/code&gt;: Five input file &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--verbose&lt;/code&gt;: Enable verbose mode. This will print progress in terminal. If any error happens in processing, it will show that error&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--segment-duration 6&lt;/code&gt;: This will produce standard 6 second segment, as per Apple's technical requirements &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--output-single-file&lt;/code&gt;: This will store segment data in a single output file per input file. In working directory, it will create a output directory containing all the &lt;code&gt;HLS&lt;/code&gt; playlist and media files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This whole directory can be then uploaded onto our web server, so to stream and deliver our desired HLS playlists.&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>claude</category>
      <category>ai</category>
      <category>help</category>
    </item>
    <item>
      <title>All about FFMPEG, Bento4, Shaka packager (a very fast video and audio converter)</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Thu, 19 Jan 2023 09:34:17 +0000</pubDate>
      <link>https://dev.to/siumhossain/all-about-ffmpeg-a-very-fast-video-and-audio-converter-51pk</link>
      <guid>https://dev.to/siumhossain/all-about-ffmpeg-a-very-fast-video-and-audio-converter-51pk</guid>
      <description>&lt;h3&gt;
  
  
  Convert audio or video one format to another
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; example.wav example.mp3 &lt;span class="c"&gt;#for audio&lt;/span&gt;
ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; master.mov master.mp4 &lt;span class="c"&gt;#for video mov to mp4 format&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-i&lt;/code&gt;: stands for input&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  More complex command
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; mysong.wav &lt;span class="nt"&gt;-af&lt;/span&gt; loudnorm &lt;span class="nt"&gt;-c&lt;/span&gt;:a mp3
&lt;span class="nt"&gt;-b&lt;/span&gt;:a 256k &lt;span class="nt"&gt;-ar&lt;/span&gt; 48000 mysong.mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-af&lt;/code&gt;: Apply audio filter, &lt;a href="http://ffmpeg.org/ffmpeg-filters.html#loudnorm" rel="noopener noreferrer"&gt;Audio Filter Loudnorm&lt;/a&gt;: EBU R128 loudness normalization. Includes both dynamic and linear normalization modes. Support for both single pass (livestreams, files) and double pass (files) modes. This algorithm can target IL, LRA, and maximum true peak. In dynamic mode, to accurately detect true peaks, the audio stream will be upsampled to 192 kHz&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-c:a&lt;/code&gt;: Option for which format we want to export&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-b:a&lt;/code&gt;: Bitrate of audio&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-ar&lt;/code&gt;: Audio rate - create an output ﬁle
with a speciﬁc audio sampling rate&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  If we want to cut a portion from a long video with other option we can do that by
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; https://long_video_link
&lt;span class="nt"&gt;-t&lt;/span&gt; 00:02:30 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-b&lt;/span&gt;:v 3M &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-b&lt;/span&gt;:a
128k &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 example.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-i&lt;/code&gt;: stands for input&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: process only for specific duration &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-c:v&lt;/code&gt;: video codec &lt;code&gt;h265 --&amp;gt; mp4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-b:v&lt;/code&gt;: video bitrate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-c:a&lt;/code&gt;: audio codec&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-ar&lt;/code&gt;: Audio rate or sampling rate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-ac&lt;/code&gt;: Number audio channels - 2 channels left and right&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Basic concept about frame
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;I-frame&lt;/code&gt;: Frame stores the whole picture, standard format of FFMPEG&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;P-frame&lt;/code&gt;: Frame stores changes between the current picture and previous ones&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;B-frame&lt;/code&gt;: Frame stores differences with previous or future pictures&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Convert a video into specific frame rate
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; YOUR_INPUT &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-keyint_min&lt;/span&gt;
25 &lt;span class="nt"&gt;-g&lt;/span&gt; 50 &lt;span class="nt"&gt;-sc_threshold&lt;/span&gt; 0 OUTPUT.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-i&lt;/code&gt;: stands for input&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-c:v&lt;/code&gt;: video coder&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-keyint_min&lt;/code&gt;: minimum interval to set a keyframe&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-g&lt;/code&gt;: Group of pictures, the maximum keyframe interval. In this example- every 50 frames, or 2 seconds, assuming that your input runs at 25 FPS&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-sc_threshold&lt;/code&gt;: This option will make sure not to
add any new keyframe at scene changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Extract audio from video by Ffmpeg
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; example.mov &lt;span class="nt"&gt;-vn&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;:a mp3 &lt;span class="nt"&gt;-b&lt;/span&gt;:a
128k &lt;span class="nt"&gt;-ar&lt;/span&gt; 44100 &lt;span class="nt"&gt;-ac&lt;/span&gt; 2 example.mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-vn&lt;/code&gt;: no video &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Extract only video by Ffmpeg
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; example.mp4 &lt;span class="nt"&gt;-an&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;:v copy example.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-an&lt;/code&gt;: no audio &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Different &lt;code&gt;h264&lt;/code&gt; encoding approaches
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Constant Rate Factor&lt;/strong&gt;: which keeps the best quality and care less about the ﬁle size.&lt;br&gt;
&lt;code&gt;CRF&lt;/code&gt; scale is &lt;code&gt;0-51&lt;/code&gt;, where 0 is lossless, &lt;code&gt;23&lt;/code&gt; is default and 51 is worst quality possible. Lower value leads to higher quality. Consider &lt;code&gt;17 or 18&lt;/code&gt; to be visually lossless or nearly so; it should look the same or nearly the same as the input but it isn't technically lossless&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Presets&lt;/strong&gt;: A preset is a collection of options that will provide a certain encoding speed to compression ratio&lt;br&gt;
Available option -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ultrafast&lt;/li&gt;
&lt;li&gt;superfast&lt;/li&gt;
&lt;li&gt;veryfast&lt;/li&gt;
&lt;li&gt;faster&lt;/li&gt;
&lt;li&gt;fast&lt;/li&gt;
&lt;li&gt;medium &lt;/li&gt;
&lt;li&gt;slow &lt;/li&gt;
&lt;li&gt;slower&lt;/li&gt;
&lt;li&gt;veryslow &lt;/li&gt;
&lt;li&gt;placebo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using fast saves about 10% encoding time, faster 25%. ultrafast will save 55% at the expense of much lower quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The tune option&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;film – use for high quality movie content&lt;/li&gt;
&lt;li&gt;animation – good for cartoons&lt;/li&gt;
&lt;li&gt;grain – preserves the grain structure in old, grainy film material&lt;/li&gt;
&lt;li&gt;stillimage – good for slideshow-like content&lt;/li&gt;
&lt;li&gt;fastdecode – allows faster decoding by disabling certain filters&lt;/li&gt;
&lt;li&gt;zerolatency – good for fast encoding and low-latency streaming&lt;/li&gt;
&lt;li&gt;psnr – only used for codec development&lt;/li&gt;
&lt;li&gt;ssim – only used for codec development
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; example.mp4 &lt;span class="nt"&gt;-c&lt;/span&gt;:v h264 &lt;span class="nt"&gt;-preset&lt;/span&gt; ultrafast &lt;span class="nt"&gt;-crf&lt;/span&gt; 0 output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;================== Stay tuned for next part =================&lt;/p&gt;

</description>
      <category>ffmpeg</category>
      <category>video</category>
      <category>encoder</category>
      <category>decoder</category>
    </item>
    <item>
      <title>Creating a desktop shortcut for a shell script (Ex:How to add Android Studio to the launcher)</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Sat, 14 Jan 2023 18:47:01 +0000</pubDate>
      <link>https://dev.to/siumhossain/creating-a-desktop-shortcut-for-a-shell-script-exhow-to-add-android-studio-to-the-launcher-1549</link>
      <guid>https://dev.to/siumhossain/creating-a-desktop-shortcut-for-a-shell-script-exhow-to-add-android-studio-to-the-launcher-1549</guid>
      <description>&lt;p&gt;You can set desktop icon in your machine of any kind of &lt;code&gt;.sh&lt;/code&gt; executable file. Here we can use android studio &lt;code&gt;studio.sh&lt;/code&gt; file to set it as desktop app icon.&lt;br&gt;
When you download android studio from &lt;a href="https://developer.android.com/studio" rel="noopener noreferrer"&gt;Android studio official site&lt;/a&gt; and after extract you will get &lt;code&gt;studio.sh&lt;/code&gt; executable file. And you can run android studio from terminal by &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

./studio.sh


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fss9ykrxwa25oafaepjnx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fss9ykrxwa25oafaepjnx.png" alt="Install android studio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But who used terminal to run a application, let's set a desktop icon&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;studio.desktop&lt;/code&gt; file in desktop location or you can set name as your wish like - &lt;code&gt;name.desktop&lt;/code&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="o"&gt;[&lt;/span&gt;Desktop Entry]
&lt;span class="nv"&gt;Version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.0
&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Application
&lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Android Studio
&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; sh /path/to/studio.sh &lt;span class="c"&gt;#path to your studio.sh file mine is /usr/local/android-studio/bin/studio.sh&lt;/span&gt;
&lt;span class="nv"&gt;Icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/android-studio/bin/studio.png &lt;span class="c"&gt;#path to your application icon &lt;/span&gt;
&lt;span class="nv"&gt;Categories&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Development&lt;span class="p"&gt;;&lt;/span&gt;IDE&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false
&lt;/span&gt;&lt;span class="nv"&gt;StartupNotify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;&lt;span class="nv"&gt;StartupWMClass&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;jetbrains-android-studio
Name[en_GB]&lt;span class="o"&gt;=&lt;/span&gt;android-studio.desktop


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Paste that piece of code into &lt;code&gt;studio.desktop&lt;/code&gt; file &lt;/p&gt;

&lt;p&gt;Save it...&lt;/p&gt;

&lt;p&gt;Then go to your desktop, and you will see the icon of your application. But you will see an error something like launch your application. So you have to give permission to launch that application. Right-click your mouse on that icon, and you will get an option&lt;/p&gt;

&lt;p&gt;Voila... now we can run our script as a desktop icon 😎&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>android</category>
      <category>java</category>
      <category>tricks</category>
    </item>
    <item>
      <title>legacy-install-failure Encountered error while trying to install package:psycopg2-binary</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Tue, 08 Nov 2022 12:10:10 +0000</pubDate>
      <link>https://dev.to/siumhossain/legacy-install-failure-encountered-error-while-trying-to-install-packagepsycopg2-binary-ll2</link>
      <guid>https://dev.to/siumhossain/legacy-install-failure-encountered-error-while-trying-to-install-packagepsycopg2-binary-ll2</guid>
      <description>&lt;h1&gt;
  
  
  Shortnote
&lt;/h1&gt;

&lt;p&gt;Install When you're using Ubuntu 22.04/ubuntu 22.10&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;&lt;span class="nv"&gt;libpq5&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;14.5-0ubuntu0.22.04.1 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;libpq-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bonus&lt;/strong&gt; &lt;br&gt;
Django old version doesn't work well with psycopg2-binary latest or &lt;code&gt;version &amp;gt; 8&lt;/code&gt;&lt;br&gt;
You can resolve this issue by installing&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;psycopg2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hope it will save you some time &lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>errors</category>
      <category>django</category>
      <category>postgres</category>
    </item>
    <item>
      <title>How can ignore a files that have already been committed to the repo?</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Sun, 30 Oct 2022 08:03:55 +0000</pubDate>
      <link>https://dev.to/siumhossain/how-can-ignore-a-files-that-have-already-been-committed-to-the-repo-5c6p</link>
      <guid>https://dev.to/siumhossain/how-can-ignore-a-files-that-have-already-been-committed-to-the-repo-5c6p</guid>
      <description>&lt;p&gt;If a file already committed and pushed into your github repo. And you forgot to add in .gitignore and make your push. Then you can ignore that file by ( make sure you add that file name in &lt;code&gt;.gitignore&lt;/code&gt; ) - &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Remove the files from the index (not the actual files in the working copy)&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;--cached&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Add these removals to the Staging Area&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"your commit message"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voila 🐌&lt;/p&gt;

</description>
      <category>tips</category>
      <category>github</category>
      <category>git</category>
      <category>commit</category>
    </item>
    <item>
      <title>Integrate Fastapi websocket connection with vue 3 (Composition APi)</title>
      <dc:creator>sium_hossain</dc:creator>
      <pubDate>Tue, 18 Oct 2022 05:53:18 +0000</pubDate>
      <link>https://dev.to/siumhossain/basic-fastapi-websocket-and-vue-3-composition-api-1dhb</link>
      <guid>https://dev.to/siumhossain/basic-fastapi-websocket-and-vue-3-composition-api-1dhb</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fngku8zg9ca7sstjtvutf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fngku8zg9ca7sstjtvutf.gif" alt="demo:fastapi vue websocket"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Part1: FastAPI
&lt;/h3&gt;

&lt;p&gt;Create virtualenv (optional)&lt;br&gt;
Install FastAPI and all necessary things by-&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="n"&gt;uvicorn&lt;/span&gt; &lt;span class="n"&gt;websockets&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Create &lt;code&gt;main.py&lt;/code&gt; file&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;msg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;welcome&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;and Run by -&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt; 


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Open this link in your browser &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vf49ll61l8130b2ydhf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vf49ll61l8130b2ydhf.png" alt="fastAPI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you see something like this you are ready to go.&lt;/p&gt;

&lt;p&gt;Now let's create websocket endpoint - &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;


&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WebSocket&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="c1"&gt;# @app.get("/")
# def root():
#     return {"msg":"welcome"}
&lt;/span&gt;
&lt;span class="nd"&gt;@app.websocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/ws&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;websocket_endpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;receive_text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This &lt;code&gt;async&lt;/code&gt; function will await until accept connection from frontend via &lt;code&gt;await websocket.accept()&lt;/code&gt;. And then when connection is created, our websocket will ready to communicate with frontend until connection closed.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

 &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;receive_text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;By this line of code we will receive data from frontend.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And by this line of code we are able to send data to frontend. And that's how we create two way communication.&lt;/p&gt;



&lt;h3&gt;
  
  
  Part2: Vue3 (Frontend)
&lt;/h3&gt;

&lt;p&gt;let's create vue3 applicaion- &lt;a href="https://vuejs.org/guide/quick-start.html" rel="noopener noreferrer"&gt;Vue3 installation guide&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npm init vue@latest


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc837jz4o9yash20qdqvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc837jz4o9yash20qdqvj.png" alt="vue"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl3gkme8robdeqkr6xv8m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl3gkme8robdeqkr6xv8m.png" alt="vue"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Delete all of the boilerplate code. And let's code in &lt;code&gt;app.vue&lt;/code&gt; file just for make things easier.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;onMounted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inputData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ws://localhost:8000/ws&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;onMounted&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;

    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;hello &lt;span class="si"&gt;{{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"inputData"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;keyup.enter=&lt;/span&gt;&lt;span class="s"&gt;"submit()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"submit()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;RouterView&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Start building connection with fastAPI websocket by-&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ws://localhost:8000/ws&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In mounted hook we start listen what message is send by backend. Abd whatever data comes from backend we can store those data and can render it in tamplate by-  &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="nf"&gt;onMounted&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;

    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;})&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;

&lt;span class="c"&gt;&amp;lt;!-- in template --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;hello &lt;span class="si"&gt;{{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Let's create a input field and send data from frontend and again receive those data in frontend via backend.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;hello &lt;span class="si"&gt;{{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"inputData"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;keyup.enter=&lt;/span&gt;&lt;span class="s"&gt;"submit()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"submit()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;RouterView&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And In &lt;code&gt;submit()&lt;/code&gt; function we will send data to the backend &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;


&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Voila.... We are done 😎. Now you can do more experiment. Retrieve data from database and send it to frontend something like that. Or whatever you may wish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code: &lt;a href="https://github.com/siumhossain/fastApi-Vue3-webSocket" rel="noopener noreferrer"&gt;https://github.com/siumhossain/fastApi-Vue3-webSocket&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>fastapi</category>
      <category>vue</category>
      <category>javascript</category>
      <category>python</category>
    </item>
  </channel>
</rss>
