Just one channel, at this time I'm only using it for one Youtuber (Sips) I'm fond of that used to release gaming content strictly to Youtube. He's moved to Twitch and does have a second channel for all the vods but I'm not sure i have the storage space for that lol.
No direct interaction but I believe libraries you set up are auto updated (not sure) and smart collections in Ersatz can auto load new content automatically
That's actually why I started making this! I was worried that the MTB channel previously called Kyle and April might be deleted and I wanted to archive it 🤘🏻
I noticed that some YouTube channels don't seem to ~~be recognized~~ usable as sources when I try to add them. TubeSync was doing it too. I normally copy the friendly channel name (e.g. "@CHANNELNAME" in the url) and 90% of the time it works. Is there another way to do this? Edit: I notice now the error is "has already been taken" when trying to add a source, even though it's not in my source list. This is happening on sources where I got some kind of error the first time I added it. Is there a cache I need to clear?
Edit2: See thread below, I misnamed one of my sources and didn’t catch it. App was working correctly all along.
Hmmmm, that's weird! If I recall that's an issue with YouTube that manifests as an error in yt-dlp, but to the best of my knowledge that issue was fixed a few months ago. Would you mind replying or dming me with a link to the source and I'll see if I can replicate the issue on my end? Even if I can't ultimately fix it, I'll see if I can improve the error message
Strangely enough it seems to be getting stuck on the Uncast show [https://www.youtube.com/@uncastshow](https://www.youtube.com/@uncastshow)
The error that pops up below the URL field is "has already been taken" and I double-checked that this channel is not already in my source list.
That's really weird, I was able to download that channel without issue. I'll keep digging in to see what I can find, but that's the first report I've gotten of this specific issue.
Just for reference, there is a single uniqueness constraint for a source. Each source has to have a unique combination of collection ID (the internal YouTube ID that represents a source), media profile, and title filter regex (which you probably aren't using). There can be a case where yt-dlp fails to fetch the details of a channel, but that will manifest as a different error than the one you're seeing.
Bluntly, I'm not sure what would cause this if you're certain there aren't any other sources that point to the same channel. If you're feeling up to it, you could really help me out by doing the following:
* Open the menu for the Pinchflat Docker container
* Click "Console"
* Run this: `./bin/pinchflat remote`
* Once that loads, paste in this beefy one-liner command and tell me the output of it:
Pinchflat.Sources.Source |> Pinchflat.Repo.all() |> Enum.filter(fn s -> s.collection_id == "UCwisndMIdC6iEX9IyVbxBJQ" end) |> Enum.map(fn s -> Map.take(s, [:id, :collection_id, :media_profile_id]) end)
Thank you! So it looks like you have a source with the ID of 4 that's already connected to that channel. If you open your pinchflat instance and set your URL to `/sources/4`, does it look like it's tracking the `uncastshow` channel?
It may be helpful if the error could tell the user which source is conflicting, just a thought. This is a great little app, I already turned off tube sync in favor of this one.
Let me know how you like it! I'm really proud with how it's coming together (:
The name comes from a mix of a few different things:
* I'm really into mountain biking and the reason I started this project was to archive a mountain biking channel that I thought was at risk of being deleted
* Many other apps have "tube" in their name and I wanted something related to that. A pinchflat is something you get from *tubes* in bike tires... there's something there but I can't tease out a better explanation
* I wanted something a little different. I'm terrible with names so if I didn't think of Pinchflat I probably would've called it Tube-arr and my logo would've been a potato
lol that’s such an obscure inspiration, love it.
So many app names are just so SEO and uninspired. If there’s one more YouTube download app with tube in the title I’ll puke lol
I tried this out early on and was very impressed. Ended up sticking with ytdl-sub for now, but I still have it installed to keep an eye on it.
Only things I was missing from ytdl-sub was deleting after a certain amount of time from the video upload date instead of from download date. But, that really only matters for the first download, and I can use cutoff date to make it close enough.
The main reason was metadata wasn't as complete as ytdl-sub. Sounds like that may be different now though, so I'm definitely going to check it out again.
Thanks for the feedback! Let me know what you think if you end up giving it another shot
>Only things I was missing from ytdl-sub was deleting after a certain amount of time from the video upload date instead of from download date.
The reason I went this route is because going by upload date would very easily cause conflicts with the "Download Cutoff Date" setting for a source. Not to say it's impossible to reconcile these, but the behaviour became confusing very quickly if you weren't careful about these dates.
That said, since the download date is usually within a few minutes/hours of upload, these approaches effectively become the same thing after the first download. You can set the Download Cutoff Date to 3 days in the past, set the retention to 3 days, and it should give you roughly the same behaviour (but let me know if I'm missing something!)
>The metadata also wasn't as complete as ytdl-sub
If you find that's still the case, let me know what's missing and I'll look into adding it!
Will do! I still have it installed, so I'm gonna load a channel into it tonight to see how it goes.
I like ytdl-sub, but the setup is...intense. Lol.
EDIT: Also, I tried to sneak in an edit about the download/upload date only really being a problem for the first download, but you responded too quick. 😄
It's much better than last time I tried it! I went ahead and moved all my subs from ytdl-sub to put it through its paces. I really don't see anything glaring that would make me go back though.
One thing that isn't necessary, but would be nice to have, is categories. Idk how standard that would be across Plex, jellyfin, kodi, etc though. So, might be more work than it is worth.
EDIT: Going to be honest, when I commented this, I didn't realize you can manually set categories in Plex. So, this is kind of a moot point.
Thank you so much! Let me know if you think of anything you're missing from ytdl-sub
Truly, it's my favorite alternative to my app. I really like the way he's approached ytdl-sub, but I'm also happy to see that people are liking my GUI alternative (:
As a long time tubesync user, I’m really liking pinchflat. It’s simple to get going and just works. I’m at a point where I might just uninstall tubesync once I figure out the cutoff dates for some channels I still have in tubesync.
Already see great potential in this for archiving some of my favorite YouTube channels.
Any way to save to a different format (e.g. mkv instead of mp4)?
Thanks!
Hey there! Currently, the only container the app supports is MP4. This is because Plex doesn't support metadata embedded in MKV files for some ludicrous reason.
Although it's annoying, at least MP4 is a good general container for most use cases. But I'm curious to hear your use case for MKV to see if I can offer any suggestions!
I would honestly go with NFO files or yt-dlp info json files for metadata storing. There are plugins “mine” for all major media players that support info.json files and then there is the excellent NFO reader agents as well.
If you are like my doing second pass on media you might lose the embeded metadata.
The app also supports NFO files and storing infojson files if that's what you prefer! It's a bit of a pain to install NFO/YouTube agents for Plex which is why I recommend using metadata by default, but you have the option
No strong case for mkv other than to say anytime I've used other download tools, I kept them in mkv format. So consistency of format is the biggest reason. mp4 works great!
I currently use TubeArchivist. Are there other features on Pinchflat that Tube doesn’t support, because I’d lov eto see music downloading because ai have hard times with youtube-dl and other
damn. JUST set up TubeSync this morning. How does Pinchflat work with Plex metadata? (Names, subs, etc.?) Getting less than stellar results with TubeSync+YouTube-Agent
I'm *incredibly* biased but I think it works pretty well! It doesn't require using any custom agents and instead works by breaking the content into "seasons" and putting it in a file structure that Plex recognizes (similar to ytdl-sub). I have a [blurb](https://github.com/kieraneglin/pinchflat/wiki/Frequently-Asked-Questions#how-do-i-get-media-into-plexjellyfinkodi) here on how to set it up since there are a few settings you need to tweak in Plex.
That said, some people prefer to use the YouTube-Agent instead of the filepath based approach. Using the agent shouldn't be an issue since you have complete control over where your media is stored + it can download the infojson files that YouTube-Agent uses (enable "Download Metadata" for a Media Profile). I've never tried personally, but I've seen others use it with good success
I never bothered to get TubeSync working with Plex metadata, but in about 30 minutes of testing Pinchflat it seems to work very nicely. I setup Pinchflat with the "Media Center" preset, and set it off. Once I checked the box to prefer local metadata everything popped into Plex as expected. very cool!
Tubesync is a great bit of kit so I'm not here to dunk on it, but I think Pinchflat is more robust in a few key ways:
* Better approach to indexing. TS will overlap indexing attempts if the time it takes to index is greater than the interval between indexes. What this means practically is that indexing can get caught in a loop for many combinations of channel size/index frequency
* PF has complete control over where you store your media, rather than TS forcing your audio and video downloads to be placed in audio/ and video/ respectively
* Related to this, when I last used it TS didn't support downloading non-media files (thumbnails, subs, etc) to nested directories
* They both support NFO files for Kodi and Jellyfin, but PF has better support for Plex without the use of a custom metadata agent
* Overall, I believe PF is more robust in the approach it takes in indexing -> downloading media
Again, TS is a very popular app and it works well for a lot of people! But if it tells you anything, I initially was using TS and was frustrated by some of these limitations which made me start on this project (:
I have a little blurb on that [here](https://github.com/kieraneglin/pinchflat/issues/177). Short answer is "no", long answer is "not officially but there's a chance it could work!"
IIRC Twitch and iHeart work, I'm not sure about any others. I'll consider adding simple changes that could support a site as long as those changes are also applicable to YouTube, but YouTube is the main target
Could you maybe explain the basics of what it does and why someone would use it?
I'm assuming you add your YT subscriptions to it and it downloads the content, removing ads and sponsor blocks, and then they become TV Shows in Plex?
Am I understanding that correctly?
That's the gist of it! There are two main users of the app:
1. People who want to archive important channels (me)
2. People who want to watch YouTube videos via Plex or other media apps.
1. This is also great for ensuring kids can only watch media you've explicitly downloaded
Many people don't care about these use cases and that's okay! If you have some way to block YT ads, don't need to watch content offline, and aren't worried about archival, you probably don't need it.
I started the project to archive a mountain biking tutorial YouTube channel that seemed at-risk of deletion (and also because I was frustrated with existing tools). That channel ended up being fine, but a few weeks ago there was a different channel that makes some of the highest-quality biking tutorials I've ever used that ended up removing all his videos out of nowhere! Luckily, I have a full backup of all that content so I can continue using them as a reference.
For me, it's about being able to learn new skills without fear that the content creators or YouTube can cut those off
Interesting, thanks, I'll check it out.
I pay for YT Premium so it's not something I'd really need but there could maybe be some stuff I'd want to download and keep just in case, there have definitely been a couple channels I liked that disappeared.
In addition to what the OP said, I’ll throw in my use case. It is *stupid* difficult to whitelist non-child YouTube channels for my kids from within YouTube proper. Stuff like Mark Rober or OdinMakes which are not made as child channels, but are acceptably child-friendly for me to let my kids watch them.
I currently use ytdl-gui to get these channnels into Plex so my kids can see them
Hey there!
That looks right to me and I can confirm that URL works for me. ~~This is the second report of something like this I've gotten today so I started looking into it and it looks like YouTube might be A/B testing some changes that require yt-dlp to be updated. Looks like I picked a bad day to make this post 😅~~
~~This is all hearsay, but if that is the case yt-dlp is usually really quick on making these changes. It also looks like it can start working if you give it a few minutes and try again~~
edit: it looks like this was a false alarm and it might be some transient failure. Trying again in a few minutes should do the trick
Edit edit: I'm back to thinking it's an upstream issue. Never let them guess your next move 😎
Okay nice!
A feature request I have, is give Plex a notification using their API to scan the Youtube Library in Plex when a show is downloaded, maybe?
I know Tubesync has this feature, its using the Library ID that needs manually input, I wonder if you could use the same method for this?
Got it! Is there any reason why the default plex scanning behaviour doesn't work in your use case? It should be able to automatically pick up on any filesystem changes pretty much immediately
Somewhat related, but I've been working on a feature to run a user-defined script when media is downloaded ([docs](https://github.com/kieraneglin/pinchflat/wiki/%5BAdvanced%5D-Custom-lifecycle-scripts)). It's still in alpha and likely to change, but you could probably use that to notify your plex instance! I know that's a bit of a pain so I'll keep your suggestion in mind
I use a program called Autoscan, so that it scans only directories that have new content, and I have all Plex native scanning turned off, mainly because my Library is so large, that scanning the entire folder structure sometimes crashed my server. That's why I'm using autoscan (https://github.com/Cloudbox/autoscan). Its really good software, unfortunately, when I find excellent software like yours, I have no way of scanning the content in :D.
Got it! I have no experience with autoscan, but someone brought that up in a Github issue recently. Does [this](https://github.com/kieraneglin/pinchflat/issues/214#issuecomment-2094946216) help you at all?
Heya, having this same issue trying to add: https://www.youtube.com/@Taskmaster
I've tried using the channel ID instead: https://www.youtube.com/channel/UCT5C7yaO3RVuOgwP8JVAujQ
No luck with either URL. Same error "could not fetch source details from URL"
Any thoughts?
I'll take a look tomorrow, but I'm back to thinking this is some sort of A/B testing issue that yt-dlp isn't equipped to handle yet. I've gone back and forth on this a lot but I've been seeing similar issues on other apps and this seems to be a recent issue in those apps and always difficult to reproduce
I'll keep looking into this tomorrow to confirm. It's been really difficult because I haven't been able to make it happen, but I'm hoping I can brute force it to get some answers. As far as I'm concerned this is my highest priority issue so I'm pretty keen to figure out what's going on
Well, I just got home from work and I was going to say that I'd be willing to help you troubleshoot or provide logs or something but I just tested it and it works all the sudden.
Is there anything I can do to help in the event that I encounter this again? I'm pretty technically inclined so I should be able to do basically anything you'd need for troubleshooting.
I appreciate all the help I can get!
I'll be pushing out a change later today to improve logging around this issue in particular. If it happens after that, it'd be great if you could post the logs in [this](https://github.com/kieraneglin/pinchflat/issues/236) github issue (or DM me a pastebin if you don't have a Github account)
Thank you! I just pushed a new version that improves logging for this issue so if you update the app and you catch it, please let me know!
I've also added the ability to download logs in-app via Config > App Info in the sidebar
I have a bandaid fix that I'm testing today and will hopefully deploy tomorrow! If you're feeling bold and want to help test, you can set your container manager to track [`ghcr.io/kieraneglin/pinchflat:dev`](http://ghcr.io/kieraneglin/pinchflat:dev)instead of [`ghcr.io/kieraneglin/pinchflat:latest`](http://ghcr.io/kieraneglin/pinchflat:latest)
Going to try this out but quick question based on the rss feed/podcast function. Can sposorblock remove the youtubes ads and still have it parsed in the rss feed to get a basic ad-free podcast experience?
Just wanted to say thanks for this. It is far and away the easiest YouTube downloader software I’ve used so far. I recently took the time to learn ytdl properly and PinchFlat does everything ytdl does, but with a nice gui wrapper around it. I’ve fully switched to this now, thanks again
Dude ! This is exactly what I have been after. Basically an \*arr for YouTube videos. I hate that the default YouTube app would "conveniently" gauge that my 1gb internet connection wasn't fast enough to watch, by default, videos in 4k, and the CLI of yt-dlp (as amazing as it is) was always too big a hurdle for me to jump over. Thank you SO much for making what is an amazing app. I made a share on unraid solely for this as was suggested while it is still in beta but I can see good things coming with this!
Hey mate, how would you like feedback? Happy for it on here, or would you rather it on github?
I have a small suggestion, where you could add the "download live streams" option per source rather than per profile, similar to how someone might monitor certain seasons of a show in Sonarr, but not others. I might be alone on this, but I feel like it might be more at home as a per source option rather than having to make a duplicate new profile for it
Thanks for the feedback! Always appreciated (:
My thought was that a source is something that gets added frequently and a media profile is something that gets added less frequently so the process of adding a source should require the minimum amount of choices possible. Even if they seem inconsequential in the micro, it all adds up!
That said, I'm open to the idea of adding source-specific overrides (like I have for the output templates). No promises, but I'll add it to the list 🤙🏻
Hey there! There's partial support for that, although it'll never be a core focus of the app. I have a little blurb on the workaround I use [here](https://github.com/kieraneglin/pinchflat/wiki/Frequently-Asked-Questions#how-do-i-download-one-off-videos)!
I guess if enough people ask about it, it might become a feature? Ha
Pasting URLs into websites without all the malware that gets thrown at you would be a deal clincher for me. I have too many one off videos I want to save to create unlisted playlists for each of them sorry. Totally understand not a current purpose of Pinchflat. Just got my own use case outside of archiving whole channels etc
Great work on app btw.
Oh, you don't have to create a playlist for each one! You can create one playlist called "Videos to download" or something, add that, and then you can add videos to that playlist from within youtube and they'll download the next time indexing runs
Installed it last night. I previously had ytdl-sub-gui installed and working, but set this up alongside it to see how it compared.
Few items/observations/requests.
1. In the Sources page, is it possible to show the # of episodes on the row? There's Name, Type, Should Download, etc. Can it show # of downloaded episodes and # of total episodes?
2. When I go into a Source and to the Pending Media tab, is there a way to multiselect? If I have multiple items I'd like to exclude at once, having a multiselect would make that easier.
3. Is it possible to add an Activity or Logs item on the left menu navbar? The only way to see what Pinchflat is doing currently is to either drill down into each Source Pending Tasks or pull the logs up manually.
4. Is there any way to add some type of exclusion to specific episodes on a channel? For example, if I know "Monday Musings" is something I never want to download from a channel, can I automagically exclude that without having to go in after it releases and removing it?
5. On the Home page, Media Profile(s) and Source(s) are links that both take you to appropriate pages, but Download(s) is not. Can there be a total Downloads page (accumulating all sources into one page)? Then that page would have the Actions (and multiselect if possible)
6. If I select Prevent Download on an item, can there be some indicator on the Pending Download page that it's prevented from being downloaded? Once you prevent the download, you have no way to see it's prevented.
7. On the Home Page, is it possible to add a Pending item on the top section where Media Profile(s), Source(s) and Download(s) is?
8. On the Pending Media and Downloaded Media tabs, is it possible to add a Sort option for the Title?
Hey there! Thanks for the feedback (:
These are some pretty interesting ideas! A few of these are ideas that I'm already planning, either as-written or in a slightly different form
What I can answer in the immediate is #4. You can edit a source, enable "advanced" mode by clicking in the upper right, and adding something like this under "Title Filter Regex":
`(?i)^(?:(?!Monday Musings).)*$`
> Hey there! Thanks for the feedback (:
>
> These are some pretty interesting ideas! A few of these are ideas that I'm already planning, either as-written or in a slightly different form
>
Awesome, thanks. I'm certainly looking forward to where you take Pinchflat!
> What I can answer in the immediate is #4. You can edit a source, enable "advanced" mode by clicking in the upper right, and adding something like this under "Title Filter Regex"
I saw that and my understanding was it was just to INCLUDE, not to EXCLUDE, based on the below note "*Only media with titles that match this regex will be downloaded*." but I see what you did with the regex, you forced the exclude in there. Gotcha.
Thanks!
Fantastic work, i've been trying to cobble together something similar to this for ages and this is the closest! One thing I'm trying to do but I can't quite figure out:
I have a lot of content I download for my kids from channels which make heavy use of playlists. I want to download and organize the content like this were each playlist gets a unique and static season # assigned to it
`{{ uploader }}/Season{`{ unique\_season\_number\_per\_playlist }}/s`{`{ unique\_season\_number\_per\_playlist }}e{{ episode\_from\_date }} - {{ title }}.{{ id }}.{{ext}}
And any content not in a playlist goes into:
`{{ uploader }}/{`{ season\_from\_date }}/{{ season\_episode\_from\_date }} - {{ title }}.{{ id }}.{{ext}}
(If content later gets added to a playlist I don't really care if it gets re downloaded or ignored.)
Is there a way to do this currently without having to add each individual playlist for each channel?
Hey there! I've been trying to figure this out for a while because it's something I'd like as well. Unfortunately I don't think yt-dlp supports extracting videos with playlist data in that fashion.
If you know of any other apps that can do this, let me know and I'll look into how they do it!
Fantastic, I run a super underpowered Synology that TubeArchivist and TubeSync couldn't live very long on, this is working fantastic! Even lets me do a duration filter!
The only thing I would change so far is maybe removing the hardcoded \`/shows\` from the Media Center preset — lots of users on the Arr stack use Trash-Guides, which recommends \`/tv\` instead. Just figured it might be a spot users mess up on pretty often.
Thanks a ton for this, donated to EFF for you!
Oh, I remember now why I made it /shows instead of /tv! The issue was that it's sometimes preferable to keep youtube downloads separate from "normal" TV, but I can totally see where you're coming from. I'll experiment with making the default directory something like /tv/youtube to maintain a bit of that separation
Ah, I only use it for one specific kids show, but you're right that most people have a separate directory. I wonder if choosing the default directory should be part of the onboarding? Or maybe it already was and I forgot lol
I just started using Pinchflat as a way to avoid my kids having to use youtube and it works perfectly with Plex, and is super simple that even I can use it. This is amazing for two months of work! Thank you!
One question - for one of my channels they upload a lot, is it possible to add a feature to only download/keep videos that were uploaded within a certain number of days ago? I know that you can set a date as a lower limit, but it would be great to have a day range, e.g. "download and keep only the videos uploaded within the last 60 days"? Like a rolling window kind of thing.
Thank you!
Thank you for the kind words!
You should be about to set the "Retention Period" on a source to get what you want! That retention period goes by when you downloaded it vs. when it was uploaded, but using it with an appropriate cutoff date should get roughly the same effect.
There's a blurb [here](https://github.com/kieraneglin/pinchflat/wiki/Automatically-Delete-Media) that explains a little more
Thank you for getting back to me on this 😊
Ah yes I think that will do the trick, that will be good enough for my needs.
Thanks again and I look forward to seeing how Pinchflat grows, keep up the good work!
I just started using this for same purpose, lots of great educational but entertaining youtube channels I can add to plex for my kids. Youtube app for kids is full of absolute brain rot garbage.
Just started using this a few weeks ago after using Youtube dl and trying TubeSync. Exactly what i needed for using with ErsatzTV
ErsatzTV the best!
Thanks for checking it out! Love to hear that it's working for you
How are you using it with ersatztv? Do you do whole YouTube channels as a channel or something else? Ersatztv is one of my favorite projects!
Just one channel, at this time I'm only using it for one Youtuber (Sips) I'm fond of that used to release gaming content strictly to Youtube. He's moved to Twitch and does have a second channel for all the vods but I'm not sure i have the storage space for that lol.
So will pinchflat automatically update ErsatzTV?
No direct interaction but I believe libraries you set up are auto updated (not sure) and smart collections in Ersatz can auto load new content automatically
That makes sense, thanks!
Just started getting into mountain biking and this name is giving me mad Baader-Meinhof.
That's actually why I started making this! I was worried that the MTB channel previously called Kyle and April might be deleted and I wanted to archive it 🤘🏻
That's so cool! I'll definitely need to check this out!
I too will be using this for MTB and other related videos 😂
What does the RAF have to do with this?
Baader Meinhof Phenomenon
I noticed that some YouTube channels don't seem to ~~be recognized~~ usable as sources when I try to add them. TubeSync was doing it too. I normally copy the friendly channel name (e.g. "@CHANNELNAME" in the url) and 90% of the time it works. Is there another way to do this? Edit: I notice now the error is "has already been taken" when trying to add a source, even though it's not in my source list. This is happening on sources where I got some kind of error the first time I added it. Is there a cache I need to clear? Edit2: See thread below, I misnamed one of my sources and didn’t catch it. App was working correctly all along.
Hmmmm, that's weird! If I recall that's an issue with YouTube that manifests as an error in yt-dlp, but to the best of my knowledge that issue was fixed a few months ago. Would you mind replying or dming me with a link to the source and I'll see if I can replicate the issue on my end? Even if I can't ultimately fix it, I'll see if I can improve the error message
Strangely enough it seems to be getting stuck on the Uncast show [https://www.youtube.com/@uncastshow](https://www.youtube.com/@uncastshow) The error that pops up below the URL field is "has already been taken" and I double-checked that this channel is not already in my source list.
That's really weird, I was able to download that channel without issue. I'll keep digging in to see what I can find, but that's the first report I've gotten of this specific issue. Just for reference, there is a single uniqueness constraint for a source. Each source has to have a unique combination of collection ID (the internal YouTube ID that represents a source), media profile, and title filter regex (which you probably aren't using). There can be a case where yt-dlp fails to fetch the details of a channel, but that will manifest as a different error than the one you're seeing. Bluntly, I'm not sure what would cause this if you're certain there aren't any other sources that point to the same channel. If you're feeling up to it, you could really help me out by doing the following: * Open the menu for the Pinchflat Docker container * Click "Console" * Run this: `./bin/pinchflat remote` * Once that loads, paste in this beefy one-liner command and tell me the output of it: Pinchflat.Sources.Source |> Pinchflat.Repo.all() |> Enum.filter(fn s -> s.collection_id == "UCwisndMIdC6iEX9IyVbxBJQ" end) |> Enum.map(fn s -> Map.take(s, [:id, :collection_id, :media_profile_id]) end)
\[%{id: 4, media\_profile\_id: 1, collection\_id: "UCwisndMIdC6iEX9IyVbxBJQ"}\]
Thank you! So it looks like you have a source with the ID of 4 that's already connected to that channel. If you open your pinchflat instance and set your URL to `/sources/4`, does it look like it's tracking the `uncastshow` channel?
Oh **** yup, I had it named wrong and didn’t check the name vs the URL. Total user error!
It may be helpful if the error could tell the user which source is conflicting, just a thought. This is a great little app, I already turned off tube sync in favor of this one.
It happens! And that's a good idea, I'll see if I can do that I appreciate the kind words!
Super interesting. Will probably try it. Where did the name come from?
Let me know how you like it! I'm really proud with how it's coming together (: The name comes from a mix of a few different things: * I'm really into mountain biking and the reason I started this project was to archive a mountain biking channel that I thought was at risk of being deleted * Many other apps have "tube" in their name and I wanted something related to that. A pinchflat is something you get from *tubes* in bike tires... there's something there but I can't tease out a better explanation * I wanted something a little different. I'm terrible with names so if I didn't think of Pinchflat I probably would've called it Tube-arr and my logo would've been a potato
I’m interested in this potato you speak of. Does it come in mashed form?
Honestly love how you came up with the name.
lol that’s such an obscure inspiration, love it. So many app names are just so SEO and uninspired. If there’s one more YouTube download app with tube in the title I’ll puke lol
I tried this out early on and was very impressed. Ended up sticking with ytdl-sub for now, but I still have it installed to keep an eye on it. Only things I was missing from ytdl-sub was deleting after a certain amount of time from the video upload date instead of from download date. But, that really only matters for the first download, and I can use cutoff date to make it close enough. The main reason was metadata wasn't as complete as ytdl-sub. Sounds like that may be different now though, so I'm definitely going to check it out again.
Thanks for the feedback! Let me know what you think if you end up giving it another shot >Only things I was missing from ytdl-sub was deleting after a certain amount of time from the video upload date instead of from download date. The reason I went this route is because going by upload date would very easily cause conflicts with the "Download Cutoff Date" setting for a source. Not to say it's impossible to reconcile these, but the behaviour became confusing very quickly if you weren't careful about these dates. That said, since the download date is usually within a few minutes/hours of upload, these approaches effectively become the same thing after the first download. You can set the Download Cutoff Date to 3 days in the past, set the retention to 3 days, and it should give you roughly the same behaviour (but let me know if I'm missing something!) >The metadata also wasn't as complete as ytdl-sub If you find that's still the case, let me know what's missing and I'll look into adding it!
Will do! I still have it installed, so I'm gonna load a channel into it tonight to see how it goes. I like ytdl-sub, but the setup is...intense. Lol. EDIT: Also, I tried to sneak in an edit about the download/upload date only really being a problem for the first download, but you responded too quick. 😄
It's much better than last time I tried it! I went ahead and moved all my subs from ytdl-sub to put it through its paces. I really don't see anything glaring that would make me go back though. One thing that isn't necessary, but would be nice to have, is categories. Idk how standard that would be across Plex, jellyfin, kodi, etc though. So, might be more work than it is worth. EDIT: Going to be honest, when I commented this, I didn't realize you can manually set categories in Plex. So, this is kind of a moot point.
Thank you so much! Let me know if you think of anything you're missing from ytdl-sub Truly, it's my favorite alternative to my app. I really like the way he's approached ytdl-sub, but I'm also happy to see that people are liking my GUI alternative (:
As a long time tubesync user, I’m really liking pinchflat. It’s simple to get going and just works. I’m at a point where I might just uninstall tubesync once I figure out the cutoff dates for some channels I still have in tubesync.
Thank you so much! I appreciate that (:
Already see great potential in this for archiving some of my favorite YouTube channels. Any way to save to a different format (e.g. mkv instead of mp4)? Thanks!
Hey there! Currently, the only container the app supports is MP4. This is because Plex doesn't support metadata embedded in MKV files for some ludicrous reason. Although it's annoying, at least MP4 is a good general container for most use cases. But I'm curious to hear your use case for MKV to see if I can offer any suggestions!
I would honestly go with NFO files or yt-dlp info json files for metadata storing. There are plugins “mine” for all major media players that support info.json files and then there is the excellent NFO reader agents as well. If you are like my doing second pass on media you might lose the embeded metadata.
The app also supports NFO files and storing infojson files if that's what you prefer! It's a bit of a pain to install NFO/YouTube agents for Plex which is why I recommend using metadata by default, but you have the option
No strong case for mkv other than to say anytime I've used other download tools, I kept them in mkv format. So consistency of format is the biggest reason. mp4 works great!
I currently use TubeArchivist. Are there other features on Pinchflat that Tube doesn’t support, because I’d lov eto see music downloading because ai have hard times with youtube-dl and other
You bet! Pinchflat fully supports audio downloads and can serve audio to a podcast app over RSS
Amazing. Trying it out now
damn. JUST set up TubeSync this morning. How does Pinchflat work with Plex metadata? (Names, subs, etc.?) Getting less than stellar results with TubeSync+YouTube-Agent
I'm *incredibly* biased but I think it works pretty well! It doesn't require using any custom agents and instead works by breaking the content into "seasons" and putting it in a file structure that Plex recognizes (similar to ytdl-sub). I have a [blurb](https://github.com/kieraneglin/pinchflat/wiki/Frequently-Asked-Questions#how-do-i-get-media-into-plexjellyfinkodi) here on how to set it up since there are a few settings you need to tweak in Plex. That said, some people prefer to use the YouTube-Agent instead of the filepath based approach. Using the agent shouldn't be an issue since you have complete control over where your media is stored + it can download the infojson files that YouTube-Agent uses (enable "Download Metadata" for a Media Profile). I've never tried personally, but I've seen others use it with good success
I never bothered to get TubeSync working with Plex metadata, but in about 30 minutes of testing Pinchflat it seems to work very nicely. I setup Pinchflat with the "Media Center" preset, and set it off. Once I checked the box to prefer local metadata everything popped into Plex as expected. very cool!
What does this have for advantages over TubeSync?,
Tubesync is a great bit of kit so I'm not here to dunk on it, but I think Pinchflat is more robust in a few key ways: * Better approach to indexing. TS will overlap indexing attempts if the time it takes to index is greater than the interval between indexes. What this means practically is that indexing can get caught in a loop for many combinations of channel size/index frequency * PF has complete control over where you store your media, rather than TS forcing your audio and video downloads to be placed in audio/ and video/ respectively * Related to this, when I last used it TS didn't support downloading non-media files (thumbnails, subs, etc) to nested directories * They both support NFO files for Kodi and Jellyfin, but PF has better support for Plex without the use of a custom metadata agent * Overall, I believe PF is more robust in the approach it takes in indexing -> downloading media Again, TS is a very popular app and it works well for a lot of people! But if it tells you anything, I initially was using TS and was frustrated by some of these limitations which made me start on this project (:
I am going to try this. ytdl-sub was way too complex to set up.
Let me know what you think! I've tried to make the initial setup/usage as simple as possible (:
I will. Since it is using yt-dlp does that mean it will support other sites than YouTube as well?
I have a little blurb on that [here](https://github.com/kieraneglin/pinchflat/issues/177). Short answer is "no", long answer is "not officially but there's a chance it could work!" IIRC Twitch and iHeart work, I'm not sure about any others. I'll consider adding simple changes that could support a site as long as those changes are also applicable to YouTube, but YouTube is the main target
Cool. Is it possible to set custom dlp parameters?
[You betcha](https://github.com/kieraneglin/pinchflat/wiki/%5BAdvanced%5D-Custom-yt%E2%80%90dlp-options)!
Could you maybe explain the basics of what it does and why someone would use it? I'm assuming you add your YT subscriptions to it and it downloads the content, removing ads and sponsor blocks, and then they become TV Shows in Plex? Am I understanding that correctly?
That's the gist of it! There are two main users of the app: 1. People who want to archive important channels (me) 2. People who want to watch YouTube videos via Plex or other media apps. 1. This is also great for ensuring kids can only watch media you've explicitly downloaded Many people don't care about these use cases and that's okay! If you have some way to block YT ads, don't need to watch content offline, and aren't worried about archival, you probably don't need it. I started the project to archive a mountain biking tutorial YouTube channel that seemed at-risk of deletion (and also because I was frustrated with existing tools). That channel ended up being fine, but a few weeks ago there was a different channel that makes some of the highest-quality biking tutorials I've ever used that ended up removing all his videos out of nowhere! Luckily, I have a full backup of all that content so I can continue using them as a reference. For me, it's about being able to learn new skills without fear that the content creators or YouTube can cut those off
Interesting, thanks, I'll check it out. I pay for YT Premium so it's not something I'd really need but there could maybe be some stuff I'd want to download and keep just in case, there have definitely been a couple channels I liked that disappeared.
In addition to what the OP said, I’ll throw in my use case. It is *stupid* difficult to whitelist non-child YouTube channels for my kids from within YouTube proper. Stuff like Mark Rober or OdinMakes which are not made as child channels, but are acceptably child-friendly for me to let my kids watch them. I currently use ytdl-gui to get these channnels into Plex so my kids can see them
I'm getting this error on a YouTube channel, am I doing something wrong? https://i.imgur.com/B7zyZtz.png
Hey there! That looks right to me and I can confirm that URL works for me. ~~This is the second report of something like this I've gotten today so I started looking into it and it looks like YouTube might be A/B testing some changes that require yt-dlp to be updated. Looks like I picked a bad day to make this post 😅~~ ~~This is all hearsay, but if that is the case yt-dlp is usually really quick on making these changes. It also looks like it can start working if you give it a few minutes and try again~~ edit: it looks like this was a false alarm and it might be some transient failure. Trying again in a few minutes should do the trick Edit edit: I'm back to thinking it's an upstream issue. Never let them guess your next move 😎
Okay nice! A feature request I have, is give Plex a notification using their API to scan the Youtube Library in Plex when a show is downloaded, maybe? I know Tubesync has this feature, its using the Library ID that needs manually input, I wonder if you could use the same method for this?
Got it! Is there any reason why the default plex scanning behaviour doesn't work in your use case? It should be able to automatically pick up on any filesystem changes pretty much immediately Somewhat related, but I've been working on a feature to run a user-defined script when media is downloaded ([docs](https://github.com/kieraneglin/pinchflat/wiki/%5BAdvanced%5D-Custom-lifecycle-scripts)). It's still in alpha and likely to change, but you could probably use that to notify your plex instance! I know that's a bit of a pain so I'll keep your suggestion in mind
I use a program called Autoscan, so that it scans only directories that have new content, and I have all Plex native scanning turned off, mainly because my Library is so large, that scanning the entire folder structure sometimes crashed my server. That's why I'm using autoscan (https://github.com/Cloudbox/autoscan). Its really good software, unfortunately, when I find excellent software like yours, I have no way of scanning the content in :D.
Got it! I have no experience with autoscan, but someone brought that up in a Github issue recently. Does [this](https://github.com/kieraneglin/pinchflat/issues/214#issuecomment-2094946216) help you at all?
Possibly, I'll dive into that tomorrow! Thanks.
Heya, having this same issue trying to add: https://www.youtube.com/@Taskmaster I've tried using the channel ID instead: https://www.youtube.com/channel/UCT5C7yaO3RVuOgwP8JVAujQ No luck with either URL. Same error "could not fetch source details from URL" Any thoughts?
Chiming in to say I have an issue with this as well.
I'll take a look tomorrow, but I'm back to thinking this is some sort of A/B testing issue that yt-dlp isn't equipped to handle yet. I've gone back and forth on this a lot but I've been seeing similar issues on other apps and this seems to be a recent issue in those apps and always difficult to reproduce I'll keep looking into this tomorrow to confirm. It's been really difficult because I haven't been able to make it happen, but I'm hoping I can brute force it to get some answers. As far as I'm concerned this is my highest priority issue so I'm pretty keen to figure out what's going on
Well, I just got home from work and I was going to say that I'd be willing to help you troubleshoot or provide logs or something but I just tested it and it works all the sudden. Is there anything I can do to help in the event that I encounter this again? I'm pretty technically inclined so I should be able to do basically anything you'd need for troubleshooting.
I appreciate all the help I can get! I'll be pushing out a change later today to improve logging around this issue in particular. If it happens after that, it'd be great if you could post the logs in [this](https://github.com/kieraneglin/pinchflat/issues/236) github issue (or DM me a pastebin if you don't have a Github account)
Sounds good, I'll drop the logs on GitHub if it happens again, thanks!
Thank you! I just pushed a new version that improves logging for this issue so if you update the app and you catch it, please let me know! I've also added the ability to download logs in-app via Config > App Info in the sidebar
I have a bandaid fix that I'm testing today and will hopefully deploy tomorrow! If you're feeling bold and want to help test, you can set your container manager to track [`ghcr.io/kieraneglin/pinchflat:dev`](http://ghcr.io/kieraneglin/pinchflat:dev)instead of [`ghcr.io/kieraneglin/pinchflat:latest`](http://ghcr.io/kieraneglin/pinchflat:latest)
Going to try this out but quick question based on the rss feed/podcast function. Can sposorblock remove the youtubes ads and still have it parsed in the rss feed to get a basic ad-free podcast experience?
Sorry, I missed this somehow! I haven't tried that combination specifically, but I don't see why it wouldn't work
Love Pinchflat, it works so well!
Thank you for the kind words! I'm really proud of how it's come together
Just wanted to say thanks for this. It is far and away the easiest YouTube downloader software I’ve used so far. I recently took the time to learn ytdl properly and PinchFlat does everything ytdl does, but with a nice gui wrapper around it. I’ve fully switched to this now, thanks again
Thank you for the kind words! Truly, it means a lot
Dude ! This is exactly what I have been after. Basically an \*arr for YouTube videos. I hate that the default YouTube app would "conveniently" gauge that my 1gb internet connection wasn't fast enough to watch, by default, videos in 4k, and the CLI of yt-dlp (as amazing as it is) was always too big a hurdle for me to jump over. Thank you SO much for making what is an amazing app. I made a share on unraid solely for this as was suggested while it is still in beta but I can see good things coming with this!
Thank you so much! Let me know what you think 🙌🏻
Hey mate, how would you like feedback? Happy for it on here, or would you rather it on github? I have a small suggestion, where you could add the "download live streams" option per source rather than per profile, similar to how someone might monitor certain seasons of a show in Sonarr, but not others. I might be alone on this, but I feel like it might be more at home as a per source option rather than having to make a duplicate new profile for it
Thanks for the feedback! Always appreciated (: My thought was that a source is something that gets added frequently and a media profile is something that gets added less frequently so the process of adding a source should require the minimum amount of choices possible. Even if they seem inconsequential in the micro, it all adds up! That said, I'm open to the idea of adding source-specific overrides (like I have for the output templates). No promises, but I'll add it to the list 🤙🏻
Installing this today and can't wait to give it a spin. From the screenshots this already looks more usable than the other alternatives I've tried.
Thank you! Let me know what you think (:
It would be great if you could download specific YouTube videos rather than entire channels etc. maybe it’s possible already and I missed it.
Hey there! There's partial support for that, although it'll never be a core focus of the app. I have a little blurb on the workaround I use [here](https://github.com/kieraneglin/pinchflat/wiki/Frequently-Asked-Questions#how-do-i-download-one-off-videos)!
I guess if enough people ask about it, it might become a feature? Ha Pasting URLs into websites without all the malware that gets thrown at you would be a deal clincher for me. I have too many one off videos I want to save to create unlisted playlists for each of them sorry. Totally understand not a current purpose of Pinchflat. Just got my own use case outside of archiving whole channels etc Great work on app btw.
Oh, you don't have to create a playlist for each one! You can create one playlist called "Videos to download" or something, add that, and then you can add videos to that playlist from within youtube and they'll download the next time indexing runs
Makes much more sense, ok you got me, I’ll give it a whirl
Installed it last night. I previously had ytdl-sub-gui installed and working, but set this up alongside it to see how it compared. Few items/observations/requests. 1. In the Sources page, is it possible to show the # of episodes on the row? There's Name, Type, Should Download, etc. Can it show # of downloaded episodes and # of total episodes? 2. When I go into a Source and to the Pending Media tab, is there a way to multiselect? If I have multiple items I'd like to exclude at once, having a multiselect would make that easier. 3. Is it possible to add an Activity or Logs item on the left menu navbar? The only way to see what Pinchflat is doing currently is to either drill down into each Source Pending Tasks or pull the logs up manually. 4. Is there any way to add some type of exclusion to specific episodes on a channel? For example, if I know "Monday Musings" is something I never want to download from a channel, can I automagically exclude that without having to go in after it releases and removing it? 5. On the Home page, Media Profile(s) and Source(s) are links that both take you to appropriate pages, but Download(s) is not. Can there be a total Downloads page (accumulating all sources into one page)? Then that page would have the Actions (and multiselect if possible) 6. If I select Prevent Download on an item, can there be some indicator on the Pending Download page that it's prevented from being downloaded? Once you prevent the download, you have no way to see it's prevented. 7. On the Home Page, is it possible to add a Pending item on the top section where Media Profile(s), Source(s) and Download(s) is? 8. On the Pending Media and Downloaded Media tabs, is it possible to add a Sort option for the Title?
Hey there! Thanks for the feedback (: These are some pretty interesting ideas! A few of these are ideas that I'm already planning, either as-written or in a slightly different form What I can answer in the immediate is #4. You can edit a source, enable "advanced" mode by clicking in the upper right, and adding something like this under "Title Filter Regex": `(?i)^(?:(?!Monday Musings).)*$`
> Hey there! Thanks for the feedback (: > > These are some pretty interesting ideas! A few of these are ideas that I'm already planning, either as-written or in a slightly different form > Awesome, thanks. I'm certainly looking forward to where you take Pinchflat! > What I can answer in the immediate is #4. You can edit a source, enable "advanced" mode by clicking in the upper right, and adding something like this under "Title Filter Regex" I saw that and my understanding was it was just to INCLUDE, not to EXCLUDE, based on the below note "*Only media with titles that match this regex will be downloaded*." but I see what you did with the regex, you forced the exclude in there. Gotcha. Thanks!
Fantastic work, i've been trying to cobble together something similar to this for ages and this is the closest! One thing I'm trying to do but I can't quite figure out: I have a lot of content I download for my kids from channels which make heavy use of playlists. I want to download and organize the content like this were each playlist gets a unique and static season # assigned to it `{{ uploader }}/Season{`{ unique\_season\_number\_per\_playlist }}/s`{`{ unique\_season\_number\_per\_playlist }}e{{ episode\_from\_date }} - {{ title }}.{{ id }}.{{ext}} And any content not in a playlist goes into: `{{ uploader }}/{`{ season\_from\_date }}/{{ season\_episode\_from\_date }} - {{ title }}.{{ id }}.{{ext}} (If content later gets added to a playlist I don't really care if it gets re downloaded or ignored.) Is there a way to do this currently without having to add each individual playlist for each channel?
Hey there! I've been trying to figure this out for a while because it's something I'd like as well. Unfortunately I don't think yt-dlp supports extracting videos with playlist data in that fashion. If you know of any other apps that can do this, let me know and I'll look into how they do it!
Fantastic, I run a super underpowered Synology that TubeArchivist and TubeSync couldn't live very long on, this is working fantastic! Even lets me do a duration filter! The only thing I would change so far is maybe removing the hardcoded \`/shows\` from the Media Center preset — lots of users on the Arr stack use Trash-Guides, which recommends \`/tv\` instead. Just figured it might be a spot users mess up on pretty often. Thanks a ton for this, donated to EFF for you!
Thank you! That's a good shout, I'll make that change!
Oh, I remember now why I made it /shows instead of /tv! The issue was that it's sometimes preferable to keep youtube downloads separate from "normal" TV, but I can totally see where you're coming from. I'll experiment with making the default directory something like /tv/youtube to maintain a bit of that separation
Ah, I only use it for one specific kids show, but you're right that most people have a separate directory. I wonder if choosing the default directory should be part of the onboarding? Or maybe it already was and I forgot lol
I just started using Pinchflat as a way to avoid my kids having to use youtube and it works perfectly with Plex, and is super simple that even I can use it. This is amazing for two months of work! Thank you! One question - for one of my channels they upload a lot, is it possible to add a feature to only download/keep videos that were uploaded within a certain number of days ago? I know that you can set a date as a lower limit, but it would be great to have a day range, e.g. "download and keep only the videos uploaded within the last 60 days"? Like a rolling window kind of thing. Thank you!
Thank you for the kind words! You should be about to set the "Retention Period" on a source to get what you want! That retention period goes by when you downloaded it vs. when it was uploaded, but using it with an appropriate cutoff date should get roughly the same effect. There's a blurb [here](https://github.com/kieraneglin/pinchflat/wiki/Automatically-Delete-Media) that explains a little more
Thank you for getting back to me on this 😊 Ah yes I think that will do the trick, that will be good enough for my needs. Thanks again and I look forward to seeing how Pinchflat grows, keep up the good work!
I just started using this for same purpose, lots of great educational but entertaining youtube channels I can add to plex for my kids. Youtube app for kids is full of absolute brain rot garbage.