<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AI &#8211; Jakub Bajzath | Senior Frontend Developer</title>
	<atom:link href="https://hello.bajzath.cloud/category/ai/feed" rel="self" type="application/rss+xml" />
	<link>https://hello.bajzath.cloud</link>
	<description></description>
	<lastBuildDate>Mon, 04 May 2026 20:38:26 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://hello.bajzath.cloud/wp-content/uploads/2026/04/icon-150x150.png</url>
	<title>AI &#8211; Jakub Bajzath | Senior Frontend Developer</title>
	<link>https://hello.bajzath.cloud</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How I Created the Couchly IPTV App (and How I Use It)</title>
		<link>https://hello.bajzath.cloud/how-i-created-the-couchly-iptv-app-and-how-i-use-it</link>
					<comments>https://hello.bajzath.cloud/how-i-created-the-couchly-iptv-app-and-how-i-use-it#respond</comments>
		
		<dc:creator><![CDATA[jakub.bajzath]]></dc:creator>
		<pubDate>Mon, 04 May 2026 10:46:12 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[applications]]></category>
		<category><![CDATA[avp]]></category>
		<category><![CDATA[ionic]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iptv]]></category>
		<category><![CDATA[stream]]></category>
		<category><![CDATA[vlc]]></category>
		<guid isPermaLink="false">https://hello.bajzath.cloud/?p=244</guid>

					<description><![CDATA[Sometimes, when I want to watch something on TV, even though I have Orange TV, I can’t. The reason is that these channels aren’t available in the app, even though they are available on the TV. That’s fine, and I understand why. That’s why I chose to use IPTV streams a while back. The problem, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Sometimes, when I want to watch something on TV, even though I have Orange TV, I can’t. The reason is that these channels aren’t available in the app, even though they are available on the TV. That’s fine, and I understand why. That’s why I chose to use IPTV streams a while back. The problem, however, is that a good iOS app that would cover all my use cases (categories, PIP, favorites, or content encoding) in the free version—as far as I’m concerned—doesn’t exist.</p>



<p class="wp-block-paragraph">That said, I do recognize that some of these apps don’t require expensive subscriptions or a one-time payment for lifetime access. But my issue is that, as a programmer, I don’t want to pay for something I think I can build myself. That’s why I decided to write the app myself.</p>



<p class="wp-block-paragraph">Since I already had experience with Ionic (a framework for hybrid apps), I decided to go this route. The tech stack was pretty standard for me—that is, <code>Ionic combined with Vue 3 and TypeScript support.</code> Bootstrapping the app was straightforward; I set up all the necessary views in the default UX scope. I moved on and started figuring out how the whole thing actually works. Parsing was relatively simple; m3u files have a well-defined structure, so all the necessary information was easily accessible. So I had the data, and I needed to create a player. Apple itself has very good support for video players, so I used <code>AVPlayer</code>.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="1181" height="2560" data-id="253" src="https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7020-scaled.png" alt="" class="wp-image-253" style="aspect-ratio:1" srcset="https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7020-scaled.png 1181w, https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7020-138x300.png 138w, https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7020-472x1024.png 472w, https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7020-768x1665.png 768w, https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7020-709x1536.png 709w, https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7020-945x2048.png 945w" sizes="(max-width: 1181px) 100vw, 1181px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="1181" height="2560" data-id="254" src="https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7019-scaled.png" alt="" class="wp-image-254" style="aspect-ratio:1" srcset="https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7019-scaled.png 1181w, https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7019-138x300.png 138w, https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7019-472x1024.png 472w, https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7019-768x1665.png 768w, https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7019-709x1536.png 709w, https://hello.bajzath.cloud/wp-content/uploads/2026/05/IMG_7019-945x2048.png 945w" sizes="(max-width: 1181px) 100vw, 1181px" /></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">Screenshots from the Couchly app</figcaption></figure>



<p class="wp-block-paragraph">Everything worked without a hitch, but after a while (I was only testing one channel), I noticed that some streams were having issues with the browser. I found out that AVPlayer doesn’t fully support all formats, so decoding some of them can cause problems. I started looking into it and concluded that it’s probably better to use a <code>VLC-based</code> player, which, as we know from PC experience, has excellent support and plays “practically everything.” And that’s exactly what happened. Even the streams that hadn’t worked before started working. As I was testing the entire app and was happy that the player was working, I minimized the app only to find out that PIP (Picture in Picture) had stopped working.</p>



<p class="wp-block-paragraph">This was a logical step. PIP support exists in AVPlayer as a native way to play content, but VLC does not support it. I thought about how I could solve this problem, even consulted AI, and found that there was simply no way around it. I therefore decided to go with dual support. AVPlayer as the main player, and a fallback to VLC in case of problems. However, this required systematic thinking and the creation of a plugin for Swift, since solving this natively through Ionic alone is quite a challenge. So I brought in Claude Code (everything was handled through <code>Claude Opus 4.6 Thinking</code>, and it did the job I expected). He created a dual-support plugin, which I simply integrated into XCode after building the wrapper for iOS, and everything worked. I still had to resolve a few issues with app minimization, pre-rendering, and similar minor details, but the core of the app worked.</p>



<p class="wp-block-paragraph">At this point, I set the AI aside again and continued with the integration of the features. I added the ability to save stations to favorites, a list of recently viewed stations, and horizontal scrolling for categories, since not everyone wants to scroll through them manually. I tested it in a real-world environment using a production build in Xcode, and everything worked exactly as I needed it to.</p>



<p class="wp-block-paragraph">It took me about two days to build the app, even with the help of AI. I don’t know how long it would have taken me to write a Swift plugin that handles dual support for two video players, so I’m grateful for that part.</p>



<p class="wp-block-paragraph">One of the issues I ran into was trying to sharpen the video. Some streams are low quality, so I liked the idea of sharpening the image using an <code>SVG filter</code> or a <code>WebGL shader</code>. But I ran into several problems here. Mainly, there was a lack of support for both players, or the inability to use them in full-screen mode. I also tried <code>CSS filtering</code> and <code>canvas</code>, but both had issues and tended to make the app unnecessarily unstable, in some cases putting a huge strain on the device’s battery.</p>



<p class="wp-block-paragraph">I’ve come to terms with that, though, and I’m glad I can use a full-featured app on iOS and watch streams with all the features I need—for free. If you’re interested, I can provide the build 🙃</p>



<p class="wp-block-paragraph">And here&#8217;s a quick demo.</p>



<figure class="wp-block-video aligncenter"><video height="2616" style="aspect-ratio: 1290 / 2616;" width="1290" controls muted src="https://hello.bajzath.cloud/wp-content/uploads/2026/05/ScreenRecording_05-04-2026-12-02-58_1.mov"></video></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://hello.bajzath.cloud/how-i-created-the-couchly-iptv-app-and-how-i-use-it/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://hello.bajzath.cloud/wp-content/uploads/2026/05/ScreenRecording_05-04-2026-12-02-58_1.mov" length="75392950" type="video/quicktime" />

			</item>
	</channel>
</rss>
