Fjärrstreaming i Plex får ofta skulden för ”buffring”, men den verkliga boven är oftast dina egna nedladdningar. qBittorrent drar ner en stor fil, din upplänk blir överbelastad och plötsligt ser din stream ut som 2009.
Ägare av hemmamediaservrar märker det först. Men byråteam med en delad kontorsserver och IT-generalister som vaktar en ”community-Plex” hamnar i samma röra. Den här Plex qBittorrent-automationen löser det genom att strypa nedladdningar i samma ögonblick som någon börjar fjärrstreama.
Du får se hur arbetsflödet upptäcker Plex-händelser, bekräftar att det är en fjärrsession och sedan växlar qBittorrents hastighetsbegränsningar automatiskt så att strömmarna flyter utan att du behöver växla manuellt hela tiden.
Så fungerar den här automationen
Hela n8n-arbetsflödet, från trigger till slutligt resultat:
n8n Workflow Template: Plex + qBittorrent: smidig fjärrstreaming
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Incoming Webhook Trigger"]
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route by Event Type", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "Resume Event", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Remote Session", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Play Event", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Ignore Action", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Pause Event", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Stop Event", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch QB Session Cookie"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch QB Session Cookie B"]
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Global Settings", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Query Throttle Mode"]
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Throttle State Check", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "No Action Needed", pos: "b", h: 48 }
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Query Throttle Mode B"]
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Throttle State Check B", pos: "b", h: 48 }
n16@{ icon: "mdi:cog", form: "rounded", label: "No Action Needed B", pos: "b", h: 48 }
n17@{ icon: "mdi:cog", form: "rounded", label: "Apply Bandwidth Limit", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Resume Download Flow", pos: "b", h: 48 }
n19["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Disable Speed Limit"]
n20["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Enable Speed Limit"]
n4 --> n17
n7 --> n18
n6 --> n18
n2 --> n17
n1 --> n2
n1 --> n4
n1 --> n6
n1 --> n7
n0 --> n10
n8 --> n11
n3 --> n5
n3 --> n1
n9 --> n14
n10 --> n3
n18 --> n9
n12 --> n13
n12 --> n20
n15 --> n19
n15 --> n16
n17 --> n8
n11 --> n12
n14 --> n15
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n1,n3,n12,n15 decision
class n0,n8,n9,n11,n14,n19,n20 api
classDef customIcon fill:none,stroke:none
class n0,n8,n9,n11,n14,n19,n20 customIcon
Problemet: fjärrstreamar krossas av nedladdningar
När du fjärrstreamar från Plex gör din server inte bara ”spela upp en video”. Den transkodar (ibland), laddar upp kontinuerligt och försöker hålla en korrekt och jämn bitrate över en vanlig konsumentuppkoppling. Sedan börjar qBittorrent hämta och seeda i full fart. Uppladdningen blir mättad, paket tappas och Plex reagerar genom att sänka kvaliteten eller buffra. Det värsta är tajmingen: det händer bara när någon trycker på Play, vilket är exakt när du inte vill hoppa in i en dashboard och börja växla begränsningar.
Det blir snabbt ett återkommande irritationsmoment. Här är hur det faller isär i verkligheten.
- Någon startar en fjärrstream och du märker det inte förrän det kommer ett sms om att ”det buffrar igen”.
- Du stryper qBittorrent manuellt och glömmer sedan att slå av det, så nedladdningar kryper i tempo resten av dagen.
- Paus och återupptagning förvirrar läget, så du slutar med att växla begränsningar mer än en gång per session.
- En felaktig inställningsändring i qBittorrent WebUI och du är tillbaka i felsökning i stället för att koppla av.
Lösningen: stryp qBittorrent automatiskt när Plex fjärrstreamar
Det här n8n-arbetsflödet lyssnar på Plex webhook-händelser (Play, Pause, Stop och Resume). När en händelse kommer in laddar det först dina sparade inställningar (som qBittorrent-host, port och inloggningsuppgifter) och kontrollerar sedan om Plex-sessionen faktiskt är fjärr. Är det lokal uppspelning ignoreras den, eftersom du inte behöver hastighetsbegränsningar när du sitter i soffan. Är den fjärr förgrenas arbetsflödet efter händelsetyp: Play och Resume aktiverar strypning, medan Pause och Stop tar bort strypningen så att nedladdningar kan fortsätta i full hastighet. Under tiden loggar det in i qBittorrents WebUI, kontrollerar aktuell strypstatus och växlar bara när det behövs.
Arbetsflödet börjar med att en Plex-webhook träffar n8n. Därefter validerar n8n sessionen och routar händelsen. Till sist pratar det med qBittorrent via HTTP-anrop för att automatiskt aktivera eller inaktivera hastighetsbegränsningsläge.
Det här får du: automation vs. resultat
| Vad det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du har cirka 10 fjärrstreamingsessioner i veckan mellan familj och vänner. Manuellt gör du ofta två åtgärder per session (aktivera begränsningar vid Play, avaktivera vid Stop), och varje åtgärd tar kanske 2 minuter när du väl loggat in, hittat inställningen och dubbelkollat den. Det är ungefär 40 minuter i veckan, plus alla ”oj, jag glömde slå av den igen”-tillfällen. Med det här arbetsflödet triggas det direkt och växlingen sker i bakgrunden, så din tidsåtgång är i princip noll efter att det är uppsatt.
Det här behöver du
- n8n-instans (testa n8n Cloud gratis)
- Självhost-alternativ om du föredrar det (Hostinger fungerar bra)
- Plex Media Server (med Plex Pass) för att skicka webhook-händelser.
- qBittorrent med WebUI aktiverat för fjärrväxling.
- Inloggningsuppgifter till qBittorrent WebUI (hämtas i qBittorrent WebUI-inställningar).
Kunskapsnivå: Medel. Du klistrar in ett arbetsflöde i n8n, ändrar några globala variabler och lägger till en Plex-webhook-URL.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Plex-webhook triggar arbetsflödet. Plex skickar en händelse till n8n när uppspelningen ändras (Play, Pause, Stop, Resume). Du lägger in n8n:s webhook-URL i Plex inställningar för Webhooks, vilket finns med Plex Pass.
Validering av fjärrsession sker tidigt. Arbetsflödet kontrollerar webhook-payloaden så att det kan ignorera lokal uppspelning och bara agera när en fjärrstream pågår. Det är skyddet som säger ”sänk mig inte utan anledning”.
qBittorrent frågas av och uppdateras. n8n loggar in i qBittorrent WebUI (sessionscookie), kontrollerar aktuell strypstatus och aktiverar eller inaktiverar sedan hastighetsbegränsningar baserat på händelsetyp. Det undviker att växla inställningen upprepade gånger om den redan är korrekt.
Bandbreddsbegränsningar följer tittarsessionen. Play och Resume slår på strypning. Pause och Stop slår av den igen, så att nedladdningar kan hinna ikapp när streaming inte längre är prio.
Du kan enkelt justera vad som räknas som ”fjärr” eller ändra vilka händelsetyper som ska växla begränsningar utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera webhook-triggern
Det här arbetsflödet startar med en webhook som tar emot mediahändelser och skickar dem vidare till routningslogiken.
- Lägg till noden Incoming Webhook Trigger och ställ in HTTP Method till
POST. - Ställ in Path till
72a05ff6-05f5-4e7a-9eee-54a350bb6a47. - Kopiera den genererade webhook-URL:en som er källa för mediahändelser ska anropa.
Steg 2: anslut qBittorrent-inställningar
Definiera era anslutningsuppgifter för qBittorrent så att HTTP-anropen kan autentisera och kontrollera throttle-status.
- Öppna Assign Global Settings och ställ in qbittorent.username till
[YOUR_ID]. - Ställ in qbittorent.password till
[CONFIGURE_YOUR_TOKEN]. - Ställ in qbittorent.internalIP till
0.0.0.0och qbittorent.port till2020.
⚠️ Vanlig fallgrop: Arbetsflödet refererar till dessa värden via uttryck. Om något fält lämnas tomt blir HTTP-URL:erna i efterföljande noder ogiltiga.
Steg 3: routa inkommande händelser
Arbetsflödet kontrollerar om händelsen är fjärrstyrd och routar sedan efter händelsetyp (resume/play/pause/stop).
- I Validate Remote Session konfigurerar ni strängvillkoret så att det kontrollerar att
{{$json["body"]["payload"]}}innehåller"local":false. - Koppla Validate Remote Session till Ignore Action (false) och Route by Event Type (true), i enlighet med den befintliga routningsstrukturen.
- I Route by Event Type ställer ni Value 1 till
{{$node["Incoming Webhook Trigger"].json["body"]["payload"]}}och lägger till regler förmedia.resume,media.play,media.pauseochmedia.stop. - Säkerställ att Route by Event Type skickar vidare till Resume Event, Play Event, Pause Event och Stop Event som visat i flödet.
Steg 4: konfigurera throttle-frågor och åtgärder
När media återupptas eller spelas kontrollerar arbetsflödet throttle-status och kan aktivera hastighetsbegränsningar; när det pausas eller stoppas kan det inaktivera dem.
- Koppla Resume Event och Play Event till Apply Bandwidth Limit, och vidare till Fetch QB Session Cookie.
- I Fetch QB Session Cookie behåller ni URL som
http://{{$node["Assign Global Settings"].json["qbittorent"]["internalIP"]}}:{{$node["Assign Global Settings"].json["qbittorent"]["port"]}}/api/v2/auth/loginoch query-parametrarna för username och password med{{$node["Assign Global Settings"].json["qbittorent"]["username"]}}respektive{{$node["Assign Global Settings"].json["qbittorent"]["password"]}}. - I Query Throttle Mode behåller ni URL inställd på
http://{{$node["Assign Global Settings"].json["qbittorent"]["internalIP"]}}:{{$node["Assign Global Settings"].json["qbittorent"]["port"]}}/api/v2/transfer/speedLimitsModeoch använder cookie-uttrycket{{$node["Fetch QB Session Cookie"].json["headers"]["set-cookie"][0].match(/[^;]*/).toString()}}i både Query Parameters och Headers. - I Throttle State Check bekräftar ni att talvillkoret jämför
{{$json["body"]}}med1, och routar sedan till No Action Needed eller Enable Speed Limit. - Koppla Pause Event och Stop Event till Resume Download Flow, och vidare till Fetch QB Session Cookie B och Query Throttle Mode B.
- I Throttle State Check B verifierar ni att talvillkoret jämför
{{$json["body"]}}med1, och routar sedan till Disable Speed Limit eller No Action Needed B.
⚠️ Vanlig fallgrop: Säkerställ att cookie-uttrycken refererar till rätt sessionsnod (Fetch QB Session Cookie vs Fetch QB Session Cookie B) så att throttle-kontroller och växlingar inte misslyckas.
Steg 5: konfigurera utdata-/åtgärdsnoder
Dessa HTTP-anrop växlar hastighetsbegränsningar baserat på throttle-kontrollerna.
- I Enable Speed Limit ställer ni URL till
http://{{$node["Assign Global Settings"].json["qbittorent"]["internalIP"]}}:{{$node["Assign Global Settings"].json["qbittorent"]["port"]}}/api/v2/transfer/toggleSpeedLimitsModeoch inkluderar cookie-uttrycket{{$node["Fetch QB Session Cookie"].json["headers"]["set-cookie"][0].match(/[^;]*/).toString()}}i både headers och query parameters. - I Disable Speed Limit använder ni samma URL och inkluderar cookie-uttrycket
{{$node["Fetch QB Session Cookie B"].json["headers"]["set-cookie"][0].match(/[^;]*/).toString()}}i både headers och query parameters. - Lämna no-op-noderna (Apply Bandwidth Limit, Resume Download Flow, No Action Needed, No Action Needed B, Ignore Action) kvar för att bevara logikflödet och skapa expansionspunkter.
Steg 6: testa och aktivera ert arbetsflöde
Validera webhook-indatan och säkerställ att växlingen av throttle fungerar som förväntat innan ni går live.
- Klicka på Execute Workflow och skicka en testpayload till Incoming Webhook Trigger med en exempelhändelse (till exempel en payload som innehåller
media.play). - Bekräfta att körningen följer Assign Global Settings → Validate Remote Session → Route by Event Type → rätt händelsegren.
- Verifiera att HTTP-anropen returnerar lyckade svar och att hastighetsbegränsningar växlas när det förväntas (kontrollera att flödet passerar Enable Speed Limit eller Disable Speed Limit).
- När testerna är godkända växlar ni arbetsflödet till Active för att aktivera användning i produktion.
Vanliga fallgropar
- Plex webhook-leverans beror på att din server är nåbar. Om du använder en lokal n8n-instans, bekräfta att din Plex-server kan nå webhook-URL:en för Production (routerregler eller tunnel) innan du skyller på arbetsflödet.
- Inloggningsuppgifter till qBittorrent WebUI kan upphöra eller blockeras av IP-regler. Om växlingen slutar fungera, kontrollera först qBittorrents WebUI-inloggningsinställningar och eventuella IP-whitelist/banlista.
- Om du redigerar arbetsflödets ”globala variabler” (host, port, användarnamn, lösenord) räcker ett litet skrivfel för att alla HTTP-anrop ska skapa fel. Ärligt talat: kopiera och klistra in värden och testa anropet som hämtar cookie innan du aktiverar.
Vanliga frågor
Cirka 30 minuter om Plex och qBittorrent redan är igång.
Nej. Du klistrar in arbetsflödet, lägger till inloggningsuppgifter och uppdaterar några inställningsvärden.
Ja. n8n har ett gratis självhostat alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på $20/månad för högre volym. Du behöver också räkna in Plex Pass för webhooks (qBittorrent i sig är gratis).
Två alternativ: n8n Cloud (hanterat, enklast att sätta upp) eller självhostning på en VPS. För självhostning är Hostinger VPS prisvärd och kör n8n utan problem. Om du självhostar hemma kan du också behöva ett sätt att exponera webhooken säkert så att Plex kan nå den. Cloud slipper det krånglet.
Ja, men du ändrar det på qBittorrent-sidan, inte i själva arbetsflödet. Det här arbetsflödet växlar ”hastighetsbegränsningsläge” via anropen Enable Speed Limit och Disable Speed Limit. Vanliga anpassningar är att sätta separata upload/download-tak i qBittorrent, bara strypa uppladdning eller hantera Resume annorlunda om du inte vill att begränsningarna slås på igen efter korta pauser.
Oftast når Plex inte din n8n webhook-URL. Kontrollera att Plex Pass är aktiverat, att inställningen Webhooks syns och att du använde webhook-URL:en för Production (inte bara Test). Om n8n kör lokalt behöver din server fortfarande en nåbar adress, vilket kan innebära port forwarding eller en säker tunnel. Kolla också n8n:s exekveringsloggar för att se om några webhook-anrop alls kommer in.
Många. Varje Play/Pause/Stop/Resume är en enskild körning, så i de flesta hushåll påverkar det knappt några gränser.
För det här användningsfallet, ja, eftersom du normalt behöver webhook-hantering, förgreningslogik och ett par HTTP-anrop som fungerar som ett litet inloggningsflöde. Zapier och Make kan hantera webhooks, men en flergrenad logik som ”om fjärr så routa efter händelsetyp, kontrollera aktuellt läge och växla” blir snabbt pillig, och du kan få betala mer när antalet körningar ökar. n8n ger dig också ett självhost-alternativ, vilket spelar roll för allt som är kopplat till en hemmaserver. Om du bara vill ha en enkel notis när Plex börjar spela räcker Zapier. Om du vill ha tillförlitlig strypning: välj n8n, eller prata med en automationsexpert och få det gjort i ett svep.
Sätt upp det en gång, så ser arbetsflödet tyst till att dina fjärrstreamar håller sig tittbara medan nedladdningarna fortsätter rulla. Mindre pill. Mer uppspelning.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.