<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C# on Christian Martínez De La Rosa</title><link>https://christt105.github.io/ca/tags/c%23/</link><description>Recent content in C# on Christian Martínez De La Rosa</description><generator>Hugo -- gohugo.io</generator><language>ca</language><lastBuildDate>Fri, 27 Mar 2026 00:00:00 +0100</lastBuildDate><atom:link href="https://christt105.github.io/ca/tags/c%23/index.xml" rel="self" type="application/rss+xml"/><item><title>Pokétch</title><link>https://christt105.github.io/ca/projects/poketch/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://christt105.github.io/ca/projects/poketch/</guid><enclosure url="https://christt105.github.io/projects/poketch/Poketch.webp" length="2768" type="image/webp"/><description>&lt;p&gt;Pokétch Unity és una recreació del dispositiu Pokerellotge de Pokémon Platinum, desenvolupat en Unity amb totes les funcionalitats originals més noves.&lt;/p&gt;</description></item><item><title>mnamer Telegram Bot</title><link>https://christt105.github.io/ca/projects/mnamer-telegram-bot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://christt105.github.io/ca/projects/mnamer-telegram-bot/</guid><enclosure url="https://christt105.github.io/projects/mnamer-telegram-bot/cover.png" length="45421" type="image/png"/><description>&lt;p&gt;&lt;code&gt;mnamer-telegram&lt;/code&gt; és un bot de Telegram per a self-hosting que automatitza el renom dels fitxers i el seu trasllat a la biblioteca Jellyfin amb &lt;code&gt;mnamer&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Característiques principals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vigila fitxers nous amb un watcher i genera propostes de nom amb &lt;code&gt;mnamer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Envia missatges per Telegram amb suggeriments i enllaços a TMDB / TheTVDB.&lt;/li&gt;
&lt;li&gt;Permet acceptar o corregir la proposta mitjançant respostes/ID, i mou el fitxer només quan es confirma.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El flux principal converteix una gestió manual de línia de comandes en una experiència més àgil i accessible des de mòbil.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Exemple" class="gallery-image" data-flex-basis="160px" data-flex-grow="66" height="833" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/projects/mnamer-telegram-bot/example.png" width="556"&gt;&lt;/p&gt;</description></item><item><title>Automatitzant la meva biblioteca de Jellyfin amb mnamer i un bot de Telegram</title><link>https://christt105.github.io/ca/blog/mnamer-telegram-bot/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0100</pubDate><guid>https://christt105.github.io/ca/blog/mnamer-telegram-bot/</guid><enclosure url="https://christt105.github.io/blog/mnamer-telegram-bot/cover.png" length="45421" type="image/png"/><description>&lt;p&gt;Hola de nou!&lt;/p&gt;
&lt;p&gt;Aquesta vegada us porto un projecte que portava mesos aturat. Estic intentant completar la meva llista de projectes pausats per a donar-me una mica de pau. Seguim amb el tema del self-hosting, aquesta vegada amb un bot de Telegram.&lt;/p&gt;
&lt;h2 id="problema"&gt;Problema
&lt;/h2&gt;&lt;p&gt;La idea va sorgir quan vaig començar a utilitzar al mini PC el descarregador P2P vulgarment anomenat &amp;ldquo;la mula&amp;rdquo;. Quan una descàrrega acabava no tenia manera de saber-ho, i havia d&amp;rsquo;anar-hi manualment, crear la carpeta amb el nom correcte a la meva biblioteca de Jellyfin i enganxar-hi l&amp;rsquo;arxiu canviant-li el nom. Com a principiant en això d&amp;rsquo;automatitzar coses, era una cosa que no em podia permetre.&lt;/p&gt;
&lt;h2 id="preludi"&gt;Preludi
&lt;/h2&gt;&lt;p&gt;Al cap de poc temps vaig provar &lt;a class="link" href="https://www.tinymediamanager.org/" target="_blank" rel="noopener"
 &gt;tinyMediaManager&lt;/a&gt; en Docker, però era pràcticament inusable des del telèfon mòbil, que és el meu dispositiu habitual per a gestionar això.&lt;/p&gt;
&lt;p&gt;Poc després vaig buscar altres opcions i vaig trobar &lt;a class="link" href="https://github.com/jkwill87/mnamer" target="_blank" rel="noopener"
 &gt;mnamer&lt;/a&gt;, un programa per consola capaç de reanomenar pel·lícules i sèries. Era exactament el que buscava. Utilitza &lt;a class="link" href="https://www.themoviedb.org/" target="_blank" rel="noopener"
 &gt;TMDB&lt;/a&gt; per a les pel·lícules i &lt;a class="link" href="https://thetvdb.com/" target="_blank" rel="noopener"
 &gt;TheTVDB&lt;/a&gt; per a les sèries (que ho prefereixo perquè té millors regles per a alguns animes). Amb algunes ordres pots fer que llegeixi tots els arxius de vídeo d&amp;rsquo;una carpeta i els reanomeni i els col·loqui a les carpetes pertinents de la teva biblioteca.&lt;/p&gt;
&lt;p&gt;Vaig estar utilitzant mnamer un temps; quan alguna cosa acabava de descarregar-se, obria la consola de comandaments per SSH i executava un àlies que em vaig crear.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ruta al docker-compose de mnamer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;MNAMER_COMPOSE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/christian/Server/70-79_Media/74_gestion_media/mnamer/docker-compose.yml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Executar mnamer genèric&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;mnamer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;docker compose -f &lt;/span&gt;&lt;span class="nv"&gt;$MNAMER_COMPOSE&lt;/span&gt;&lt;span class="s2"&gt; run --rm mnamer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Executar en mode prova (no mou res, només mostra)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; mnamer-test&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;docker compose -f &lt;/span&gt;&lt;span class="nv"&gt;$MNAMER_COMPOSE&lt;/span&gt;&lt;span class="s2"&gt; run --rm mnamer --test -r /data/Descargas&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Executar en mode real (mou de Descargas a destí)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; mnamer-run&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docker compose -f $MNAMER_COMPOSE run --rm mnamer -r /data/Descargas&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; mnamer-tmdb&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docker compose -f $MNAMER_COMPOSE run --rm mnamer -r /data/Descargas --id-tmdb&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; mnamer-tvdb&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docker compose -f $MNAMER_COMPOSE run --rm mnamer -r /data/Descargas --id-tvdb&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Tenia mnamer en un contenidor Docker i vaig crear alguns comandaments per a fer-lo funcionar sense haver d&amp;rsquo;escriure gaire cosa. Amb &lt;code&gt;mnamer-test&lt;/code&gt; podia comprovar que tot s&amp;rsquo;anava a reanomenar correctament. Si alguna cosa no l&amp;rsquo;agafava bé, executava &lt;code&gt;mnamer-tmdb&lt;/code&gt; o &lt;code&gt;mnamer-tvdb&lt;/code&gt; i li passava l&amp;rsquo;ID que buscava al navegador. Si tot estava bé, simplement executava &lt;code&gt;mnamer-run --batch&lt;/code&gt; perquè ho fes tot d&amp;rsquo;una tirada. Com podeu comprovar, continuava sent bastant manual; hi havia molt de marge de millora.&lt;/p&gt;
&lt;p&gt;Uns mesos abans vaig estar experimentant amb els bots de Telegram. Vaig intentar crear-ne un amb Python, però em vaig acabar atabalant i vaig passar a C# utilitzant &lt;a class="link" href="https://github.com/wiz0u/WTelegramBot" target="_blank" rel="noopener"
 &gt;WTelegramBot&lt;/a&gt;, una API exquisida per a crear bots amb moltíssimes funcionalitats i en un llenguatge amb el qual em sentia més a gust. Aquest bot està en pausa, un altre projecte més a la llista interminable.&lt;/p&gt;
&lt;h2 id="la-travessia-del-bot"&gt;La travessia del bot
&lt;/h2&gt;&lt;p&gt;Amb les idees clares, a finals de l&amp;rsquo;any passat vaig estar treballant uns dies en el bot. La idea principal era que cada vegada que hi hagués un arxiu en una carpeta, el bot enviés un missatge amb la proposta de mnamer i un link a TMDB o TheTVDB per a poder comprovar que era correcte. Una vegada feta la comprovació, prémer un botó i que s&amp;rsquo;enviés a la biblioteca.&lt;/p&gt;
&lt;p&gt;Vaig fer una cosa molt bàsica per a comprovar si hi havia arxius i enviar un missatge amb la proposta de mnamer i un botó per a acceptar-la. Si mnamer s&amp;rsquo;equivocava, havia d&amp;rsquo;anar manualment al disc dur, canviar-li el nom i tornar-ho a provar, cosa que no solia passar, però era realment molest.&lt;/p&gt;
&lt;p&gt;Vaig estar uns mesos així fins que al febrer vaig decidir continuar. Vaig afegir-hi el File Watcher i que poguessis contestar amb un ID per a rectificar l&amp;rsquo;opció. També vaig intentar arreglar el tema dels permisos dels arxius i ara el contenidor s&amp;rsquo;executa amb l&amp;rsquo;usuari 1000:1000 per defecte; encara que a mi em funciona, crec que no està del tot ben implementat.&lt;/p&gt;
&lt;p&gt;Ho vaig tornar a deixar perquè m&amp;rsquo;anava bastant bé, fins fa pocs dies que em vaig posar a arreglar un parell de coses i a crear tota la documentació perquè altra gent ho pogués provar. Vaig configurar que GitHub Actions generés una imatge Docker cada vegada que creés una etiqueta (tag) i vaig fer el repositori públic.&lt;/p&gt;
&lt;p&gt;I així està en l&amp;rsquo;estat actual. Imagino que l&amp;rsquo;aniré millorant a poc a poc si la gent l&amp;rsquo;utilitza, com acaba de passar fa no-res, que un amic m&amp;rsquo;ha enviat una PR arreglant els IDs dels usuaris; és la part més reconfortant de la programació. Crec que és una cosa complexa de configurar, però fins que més gent no ho intenti no sé com fer-ho millor.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Exemple del bot reanomenant" class="gallery-image" data-flex-basis="160px" data-flex-grow="66" height="833" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/mnamer-telegram-bot/example.png" width="556"&gt;&lt;/p&gt;
&lt;p&gt;Si t&amp;rsquo;interessa el codi font del projecte o les instruccions per a instal·lar-lo, el pots trobar al meu compte de GitHub:&lt;/p&gt;
&lt;a class="github-repo-card" href="https://github.com/christt105/mnamer-telegram" target="_blank" rel="noopener"&gt;
 &lt;img src="https://avatars.githubusercontent.com/u/36189169?v=4" alt="christt105 avatar" class="repo-avatar"&gt;
 &lt;h3&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-github" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
 &lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
 &lt;path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /&gt;
&lt;/svg&gt;


 christt105/mnamer-telegram&lt;/h3&gt;
 &lt;p&gt;Telegram bot that automates media library organization using mnamer with interactive approval workflows.&lt;/p&gt;
 &lt;div class="repo-stats"&gt;
 &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" class="icon icon-tabler icons-tabler-filled icon-tabler-star"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M8.243 7.34l-6.38 .925l-.113 .023a1 1 0 0 0 -.44 1.684l4.622 4.499l-1.09 6.355l-.013 .11a1 1 0 0 0 1.464 .944l5.706 -3l5.693 3l.1 .046a1 1 0 0 0 1.352 -1.1l-1.091 -6.355l4.624 -4.5l.078 -.085a1 1 0 0 0 -.633 -1.62l-6.38 -.926l-2.852 -5.78a1 1 0 0 0 -1.794 0l-2.853 5.78z" /&gt;&lt;/svg&gt; 2&lt;/span&gt;
 &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-git-fork"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M10 18a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M5 6a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M15 6a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M7 8v2a2 2 0 0 0 2 2h6a2 2 0 0 0 2 -2v-2" /&gt;&lt;path d="M12 12l0 4" /&gt;&lt;/svg&gt; 1&lt;/span&gt;
 &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-calendar-event"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12" /&gt;&lt;path d="M16 3l0 4" /&gt;&lt;path d="M8 3l0 4" /&gt;&lt;path d="M4 11l16 0" /&gt;&lt;path d="M8 15h2v2h-2l0 -2" /&gt;&lt;/svg&gt; 2026-03-28&lt;/span&gt;
 &lt;/div&gt;
 &lt;/a&gt;
&lt;h2 id="conclusió"&gt;Conclusió
&lt;/h2&gt;&lt;p&gt;És la primera vegada que faig un programa amb C# directament; la meva experiència amb C# sol ser gairebé sempre dins de l&amp;rsquo;entorn de Unity. Sé que hi ha moltes coses malament i millorables, però estic gaudint aprenent noves formes de programar.&lt;/p&gt;
&lt;p&gt;Un altre projecte bastant reduït que puc ratllar de la meva llista de pendents i passar a una altra cosa. Si tens una configuració semblant i vols provar el bot, t&amp;rsquo;animo que ho facis i deixis una estrella en &lt;a class="link" href="https://github.com/christt105/mnamer-telegram" target="_blank" rel="noopener"
 &gt;el repositori&lt;/a&gt;. He publicat el meu exemple de com ho tinc muntat aquí: &lt;a class="link" href="https://github.com/christt105/mnamer-telegram/discussions/2" target="_blank" rel="noopener"
 &gt;https://github.com/christt105/mnamer-telegram/discussions/2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ens veiem en el següent post!&lt;/p&gt;</description></item><item><title>Boxing AR</title><link>https://christt105.github.io/ca/projects/boxingar/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://christt105.github.io/ca/projects/boxingar/</guid><enclosure url="https://christt105.github.io/projects/boxingar/roboboxing.webp" length="14842" type="image/webp"/><description>&lt;p&gt;Controla un robot boxejador i aconsegueix la glòria del RoboBoxing!&lt;/p&gt;</description></item><item><title>Empty Universe</title><link>https://christt105.github.io/ca/projects/emptyuniverse/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://christt105.github.io/ca/projects/emptyuniverse/</guid><enclosure url="https://christt105.github.io/projects/emptyuniverse/emptyuniverse.webp" length="42266" type="image/webp"/><description>&lt;p&gt;Empty Universe és una aventura exhaustiva on hauràs de defensar la nau dels enemics. Tindràs tres tipus d&amp;rsquo;astronautes sota el teu control. Cada astronauta té la seva pròpia feina per cobrir totes les necessitats de la nau.&lt;/p&gt;
&lt;p&gt;Sobreviu cinc dies i nits per guanyar. No deixis que els enemics matin els teus astronautes i gestiona bé els teus recursos.&lt;/p&gt;</description></item><item><title>Fishing Trash</title><link>https://christt105.github.io/ca/projects/fishingtrash/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://christt105.github.io/ca/projects/fishingtrash/</guid><enclosure url="https://christt105.github.io/projects/fishingtrash/fishing-trash.webp" length="28690" type="image/webp"/><description>&lt;p&gt;Un GameJam amb &amp;lsquo;mar&amp;rsquo; i &amp;lsquo;brossa&amp;rsquo; com a tema.&lt;/p&gt;</description></item></channel></rss>