init: tools and commands

Signed-off-by: HeshamTB <hishaminv@gmail.com>
This commit is contained in:
HeshamTB 2024-06-09 14:04:22 +03:00
commit a33b90c5c7
Signed by: Hesham
GPG Key ID: 74876157D199B09E
18 changed files with 2682 additions and 0 deletions

88
bouncer/bounce.go Normal file
View File

@ -0,0 +1,88 @@
package bouncer
import (
"context"
"fmt"
"log"
"net/http"
"os"
"strings"
"time"
"gitea.hbanafa.com/hesham/yttopodcast/ytlinkprov"
"github.com/lrstanley/go-ytdlp"
)
const CTX_LINKPROV = "linkprov"
type Bouncer struct {
http.Server
ytdlpInstall ytdlp.ResolvedInstall
urlProvider ytlinkprov.YtLinkProvider
}
func NewBouncerHTTPServer(
ctx context.Context,
listAddr string,
link_prov ytlinkprov.YtLinkProvider,
) (srv *Bouncer, err error) {
ytInstall, err := ytdlp.Install(
ctx,
&ytdlp.InstallOptions{
AllowVersionMismatch: true,
},
)
if err != nil {
return nil, err
}
mux := http.NewServeMux()
mux.HandleFunc("GET /{$}", handleGETBounce)
var httpHandler http.Handler = mux
httpHandler = UrlCache(mux, link_prov)
return &Bouncer{
urlProvider: link_prov,
Server: http.Server{
WriteTimeout: time.Second * 60,
ReadTimeout: time.Second * 60,
Addr: listAddr,
Handler: httpHandler,
},
ytdlpInstall: *ytInstall,
}, nil
}
func handleGETBounce(w http.ResponseWriter, r *http.Request) {
urlProv, ok := r.Context().Value(CTX_LINKPROV).(ytlinkprov.YtLinkProvider)
if !ok {
fmt.Fprintf(os.Stderr, "Could not get url provider from ctx!\n")
w.WriteHeader(http.StatusInternalServerError)
return
}
id := r.URL.Query().Get("id")
if id == "" {
w.WriteHeader(http.StatusBadRequest)
return
}
log.Printf("request for %s", id)
// vidUrl := fmt.Sprintf("https://youtube.com/watch?v=%s", id)
// ytCmd := ytdlp.New().ExtractAudio().GetURL()
// ytRes, err := ytCmd.Run(r.Context(), vidUrl)
link, err := urlProv.GetLink(id)
if err != nil {
_, ok := err.(*ytdlp.ErrExitCode)
if ok {
w.WriteHeader(http.StatusBadRequest)
return
}
fmt.Fprintln(os.Stderr, err.Error())
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "audio/mp3")
http.Redirect(w, r, strings.Trim(link, "\n"), http.StatusFound)
}

15
bouncer/middle.go Normal file
View File

@ -0,0 +1,15 @@
package bouncer
import (
"context"
"net/http"
"gitea.hbanafa.com/hesham/yttopodcast/ytlinkprov"
)
func UrlCache(next http.Handler, url_prov ytlinkprov.YtLinkProvider) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
rr := r.WithContext(context.WithValue(r.Context(), CTX_LINKPROV, url_prov))
next.ServeHTTP(w, rr)
})
}

1
cmd/genfeed/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
genfeed

43
cmd/genfeed/genfeed.go Normal file
View File

@ -0,0 +1,43 @@
package main
import (
"errors"
"flag"
"fmt"
"os"
"gitea.hbanafa.com/hesham/yttopodcast/feed"
)
const (
EXIT_ERR_BAD_CLI = 64
)
var (
chan_id = flag.String("id", "", "YouTube channel ID")
bounc_url = flag.String("bouncer", "http://localhost:8081/?id=%s", "Bouncer url as format string")
lang = flag.String("lang", "en", "Content Language")
)
func main() {
flag.Parse()
if err := validFlags(); err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(EXIT_ERR_BAD_CLI)
}
fmt.Fprintf(os.Stderr, "id: %s\nbouncer: %s\n", *chan_id, *bounc_url)
err := feed.ConvertYtToRss(os.Stdout, *chan_id, *bounc_url,
feed.RSSMetadata{Languge: "en", Copyright: "N/A", Summary: "YouTube Channel as podcast"})
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(1)
}
}
func validFlags() error {
if *chan_id == "" {
return errors.New("flag: id flag missing")
}
return nil
}

View File

@ -0,0 +1,32 @@
package main
import (
"context"
"flag"
"fmt"
"os"
"time"
"gitea.hbanafa.com/hesham/yttopodcast/bouncer"
"gitea.hbanafa.com/hesham/yttopodcast/ytlinkprov"
)
var listenAddr = flag.String("listen-addr", ":8081", "Address and port to listen on")
func main() {
ctx := context.Background()
flag.Parse()
linkProv, err := ytlinkprov.NewCachedLinkProvider(time.Minute * 30)
bouncer, err := bouncer.NewBouncerHTTPServer(ctx, *listenAddr, linkProv)
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
}
fmt.Printf("Starting server on %s\n", *listenAddr)
err = bouncer.ListenAndServe()
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
}
}

214
feed/feed.go Normal file
View File

@ -0,0 +1,214 @@
package feed
import (
"bytes"
"errors"
"fmt"
"io"
"net/url"
"strings"
"text/template"
"time"
"gitea.hbanafa.com/hesham/yttopodcast/templates"
"github.com/mmcdole/gofeed"
)
const (
YT_FEED_URL = "https://www.youtube.com/feeds/videos.xml?channel_id=%s"
YT_FEED_SAM = "https://www.youtube.com/feeds/videos.xml?channel_id=UC5Uxq95L6K60XVdNPmUxoYA"
YT_VIDEO_URL = "https://youtube.com/watch?v=%s"
__GENERATOR_NAME = "yttopodcast - H.B."
)
type RSSMetadata struct {
Summary string
Languge string
Copyright string
BounceURL string
}
/* bounce_url in the format of http://domain/?id=%s */
func ConvertYtToRss(w io.Writer, channel_id string, bounce_url string, meta RSSMetadata) error {
var podFeed templates.FeedData
channelUrl := fmt.Sprintf(YT_FEED_URL, channel_id)
feed, err := getFeed(channelUrl)
if err != nil {
return FeedErr(err)
}
t_now := time.Now().UTC()
podFeed.Title = feed.Title
podFeed.Summary = meta.Summary
podFeed.BuildDateRfcEmail = t_now.Format(time.RFC1123Z)
podFeed.CopyRight = meta.Copyright
podFeed.PublishDateRfcEmail = t_now.Format(time.RFC1123Z)
podFeed.PodcastPage = feed.Link
podFeed.Lang = meta.Languge
podFeed.GeneratorName = __GENERATOR_NAME
for i, item := range feed.Items {
subStrings := strings.Split(item.GUID, ":")
id := subStrings[2]
bounceURL, err := url.Parse(
fmt.Sprintf(bounce_url, id),
)
if err != nil {
return err
}
// Check this out
g := item.Extensions["media"]["group"]
gg := g[len(g)-1]
thumb := gg.Children["thumbnail"][0]
coverArtUrl, err := url.Parse(thumb.Attrs["url"])
if err != nil {
return errors.Join(err, errors.New(
fmt.Sprintf(
"could not parse item cover art for %s GUID: %s\n",
item.Title,
item.GUID,
)))
}
if i == 0 {
podFeed.PodcastImageURL = coverArtUrl.String()
}
podFeed.Items = append(podFeed.Items,
templates.FeedItem{
Title: item.Title,
CoverImageURL: coverArtUrl.String(),
Id: id,
Duration: "0",
PublishDateRfcEmail: item.PublishedParsed.Format(time.RFC1123Z),
Description: "TBI",
Length: 0,
EnclosureURL: bounceURL.String(),
})
}
rssTemplate, err := template.New("rss").Parse(templates.RSSTemplate)
if err != nil {
return err
}
err = rssTemplate.Execute(w, podFeed)
if err != nil {
return err
}
rssResult := bytes.Buffer{}
rssTemplate.Execute(&rssResult, podFeed)
_, err = gofeed.NewParser().ParseString(rssResult.String())
if err != nil {
return FeedErr(err)
}
return nil
}
func convertAtomToRSS(w io.Writer, r io.Reader, meta RSSMetadata) error {
var podFeed templates.FeedData
feed, err := gofeed.NewParser().Parse(r)
if err != nil {
return FeedErr(err)
}
t_now := time.Now().UTC()
podFeed.Title = feed.Title
podFeed.Summary = meta.Summary
podFeed.BuildDateRfcEmail = t_now.Format(time.RFC1123Z)
podFeed.CopyRight = meta.Copyright
podFeed.PublishDateRfcEmail = t_now.Format(time.RFC1123Z)
podFeed.PodcastPage = feed.Link
podFeed.Lang = meta.Languge
podFeed.GeneratorName = __GENERATOR_NAME
for i, item := range feed.Items {
subStrings := strings.Split(item.GUID, ":")
id := subStrings[2]
bounceURL, err := url.Parse(
fmt.Sprintf(meta.BounceURL, id),
)
if err != nil {
return err
}
// Check this out
g := item.Extensions["media"]["group"]
gg := g[len(g)-1]
thumb := gg.Children["thumbnail"][0]
coverArtUrl, err := url.Parse(thumb.Attrs["url"])
if err != nil {
return errors.Join(err, errors.New(
fmt.Sprintf(
"could not parse item cover art for %s GUID: %s\n",
item.Title,
item.GUID,
)))
}
if i == 0 {
podFeed.PodcastImageURL = coverArtUrl.String()
}
podFeed.Items = append(podFeed.Items,
templates.FeedItem{
Title: item.Title,
CoverImageURL: coverArtUrl.String(),
Id: id,
Duration: "0",
PublishDateRfcEmail: item.PublishedParsed.Format(time.RFC1123Z),
Description: "TBI",
Length: 0,
EnclosureURL: bounceURL.String(),
})
}
rssTemplate, err := template.New("rss").Parse(templates.RSSTemplate)
if err != nil {
return err
}
err = rssTemplate.Execute(w, podFeed)
if err != nil {
return err
}
rssResult := bytes.Buffer{}
rssTemplate.Execute(&rssResult, podFeed)
_, err = gofeed.NewParser().ParseString(rssResult.String())
if err != nil {
return FeedErr(err)
}
return nil
}
func FeedErr(err error) error {
httpErr, ok := err.(gofeed.HTTPError)
if ok {
switch httpErr.StatusCode {
case 404:
return errors.Join(err, errors.New("yt: could not find channel id"))
}
}
return err
}
func getFeed(url string) (*gofeed.Feed, error) {
parser := gofeed.NewParser()
return parser.ParseURL(url)
}

100
feed/feed_test.go Normal file
View File

@ -0,0 +1,100 @@
package feed
import (
"bytes"
"io"
"net/http"
"net/url"
"os"
"strings"
"testing"
"github.com/mmcdole/gofeed"
)
func TestParseYTAtom(t *testing.T) {
fnames := []string{"a.xml", "b.xml", "c.xml"}
for _, n := range fnames {
nn := "testdata/" + n
runTestYTAtom(t, nn)
}
}
func runTestYTAtom(t *testing.T, fname string) {
t.Run(fname, func(t *testing.T) {
f, err := os.Open(fname)
if err != nil {
t.Error(err.Error())
}
feed, err := io.ReadAll(f)
if err != nil {
t.Error(err.Error())
}
parser := gofeed.NewParser()
parser.ParseString(string(feed))
})
}
func TestFetchRemoteYTFeed(t *testing.T) {
f, err := os.Open("testdata/feedlink.txt")
if err != nil {
t.Log(err.Error())
t.FailNow()
}
linkb, err := io.ReadAll(f)
if err != nil {
t.Log(err.Error())
t.FailNow()
}
link := strings.Trim(string(linkb), "\n")
_, err = url.Parse(link)
if err != nil {
t.Log(err.Error())
t.FailNow()
}
resp, err := http.Get(link)
if err != nil {
t.Log(err.Error())
t.FailNow()
}
defer resp.Body.Close()
_, err = gofeed.NewParser().Parse(resp.Body)
if err != nil {
t.Log(err.Error())
t.FailNow()
}
}
func TestAtomToRSS(t *testing.T) {
f, err := os.Open("testdata/a.xml")
if err != nil {
t.Error(err.Error())
t.FailNow()
}
buf := bytes.Buffer{}
err = convertAtomToRSS(&buf, f, RSSMetadata{BounceURL: "http://localhost:8081/q=%s"})
if err != nil {
t.Error(err.Error())
t.FailNow()
}
_, err = gofeed.NewParser().Parse(&buf)
if err != nil {
t.Error(err.Error())
t.FailNow()
}
}

697
feed/testdata/a.xml vendored Normal file
View File

@ -0,0 +1,697 @@
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns:yt="http://www.youtube.com/xml/schemas/2015" xmlns:media="http://search.yahoo.com/mrss/" xmlns="http://www.w3.org/2005/Atom">
<link rel="self" href="http://www.youtube.com/feeds/videos.xml?channel_id=UC5Uxq95L6K60XVdNPmUxoYA"/>
<id>yt:channel:5Uxq95L6K60XVdNPmUxoYA</id>
<yt:channelId>5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>Samito</title>
<link rel="alternate" href="https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2016-07-10T17:00:53+00:00</published>
<entry>
<id>yt:video:yUiFPNeCWKw</id>
<yt:videoId>yUiFPNeCWKw</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 6V6 RESPONSE VIDEO TODAY! TOP 500 RANKED - COACHING !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=yUiFPNeCWKw"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-06-05T15:59:03+00:00</published>
<updated>2024-06-05T16:00:22+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 6V6 RESPONSE VIDEO TODAY! TOP 500 RANKED - COACHING !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/yUiFPNeCWKw?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/yUiFPNeCWKw/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="69" average="5.00" min="1" max="5"/>
<media:statistics views="12"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:2Pi2sVwa8Sc</id>
<yt:videoId>2Pi2sVwa8Sc</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 NEW TIER LIST TODAY TOP 500 RANKED - COACHING !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=2Pi2sVwa8Sc"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-06-04T21:21:11+00:00</published>
<updated>2024-06-05T07:54:54+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 NEW TIER LIST TODAY TOP 500 RANKED - COACHING !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/2Pi2sVwa8Sc?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/2Pi2sVwa8Sc/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="239" average="5.00" min="1" max="5"/>
<media:statistics views="10926"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:80sv9fU3_wo</id>
<yt:videoId>80sv9fU3_wo</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 TOP 500 COACHING &amp; RANKED - !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=80sv9fU3_wo"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-06-03T18:09:28+00:00</published>
<updated>2024-06-04T18:27:58+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 TOP 500 COACHING &amp; RANKED - !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/80sv9fU3_wo?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i1.ytimg.com/vi/80sv9fU3_wo/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="210" average="5.00" min="1" max="5"/>
<media:statistics views="9099"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:8UwTveGCrOQ</id>
<yt:videoId>8UwTveGCrOQ</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>The DEVS Have DELETED Hanzo in Overwatch 2 (I'm pissed)</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=8UwTveGCrOQ"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-06-01T16:40:13+00:00</published>
<updated>2024-06-03T05:04:21+00:00</updated>
<media:group>
<media:title>The DEVS Have DELETED Hanzo in Overwatch 2 (I'm pissed)</media:title>
<media:content url="https://www.youtube.com/v/8UwTveGCrOQ?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i1.ytimg.com/vi/8UwTveGCrOQ/hqdefault.jpg" width="480" height="360"/>
<media:description>Check out Patreon for coaching and community!!! https://www.patreon.com/samito27/membership
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="2123" average="5.00" min="1" max="5"/>
<media:statistics views="35899"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:jiD_futRl7M</id>
<yt:videoId>jiD_futRl7M</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 LEARNING NEW PHARAH DAY 3 OP HERO !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=jiD_futRl7M"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-31T20:14:37+00:00</published>
<updated>2024-06-02T09:35:50+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 LEARNING NEW PHARAH DAY 3 OP HERO !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/jiD_futRl7M?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/jiD_futRl7M/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="205" average="5.00" min="1" max="5"/>
<media:statistics views="11751"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:Grr3dX1NX8U</id>
<yt:videoId>Grr3dX1NX8U</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>Actual Solutions to 5v5 and 6v6 in Overwatch 2 - (with Spilo)</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=Grr3dX1NX8U"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-30T21:16:25+00:00</published>
<updated>2024-06-05T01:56:26+00:00</updated>
<media:group>
<media:title>Actual Solutions to 5v5 and 6v6 in Overwatch 2 - (with Spilo)</media:title>
<media:content url="https://www.youtube.com/v/Grr3dX1NX8U?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i4.ytimg.com/vi/Grr3dX1NX8U/hqdefault.jpg" width="480" height="360"/>
<media:description>Check out @StormcrowProductions
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
#Overwatch</media:description>
<media:community>
<media:starRating count="1860" average="5.00" min="1" max="5"/>
<media:statistics views="38301"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:NAT9jggf1Q8</id>
<yt:videoId>NAT9jggf1Q8</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 LEARNING NEW PHARAH DAY 2 !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=NAT9jggf1Q8"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-30T19:29:02+00:00</published>
<updated>2024-06-04T22:08:58+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 LEARNING NEW PHARAH DAY 2 !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/NAT9jggf1Q8?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/NAT9jggf1Q8/hqdefault.jpg" width="480" height="360"/>
<media:description>🚀 Install Star Trek Fleet Command for FREE now https://t2m.io/STFC_Samito and enter the promo code WARPSPEED to unlock 10 Epic Shards of Kirk, enhancing your command instantly!&#13;
&#13;
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="175" average="5.00" min="1" max="5"/>
<media:statistics views="9848"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:l7X8x8Ec8tE</id>
<yt:videoId>l7X8x8Ec8tE</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 LEARNING NEW PHARAH DAY 1 !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=l7X8x8Ec8tE"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-29T19:19:48+00:00</published>
<updated>2024-06-01T04:51:56+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 LEARNING NEW PHARAH DAY 1 !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/l7X8x8Ec8tE?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i1.ytimg.com/vi/l7X8x8Ec8tE/hqdefault.jpg" width="480" height="360"/>
<media:description>🚀 Install Star Trek Fleet Command for FREE now https://t2m.io/STFC_Samito and enter the promo code WARPSPEED to unlock 10 Epic Shards of Kirk, enhancing your command instantly!&#13;
&#13;
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="198" average="5.00" min="1" max="5"/>
<media:statistics views="9976"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:ksze1pinp78</id>
<yt:videoId>ksze1pinp78</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>PLAT Support Needs a Reality Check - COACH ROASTS STUDENT | Overwatch 2</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=ksze1pinp78"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-29T14:40:08+00:00</published>
<updated>2024-06-01T02:19:56+00:00</updated>
<media:group>
<media:title>PLAT Support Needs a Reality Check - COACH ROASTS STUDENT | Overwatch 2</media:title>
<media:content url="https://www.youtube.com/v/ksze1pinp78?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i4.ytimg.com/vi/ksze1pinp78/hqdefault.jpg" width="480" height="360"/>
<media:description>Check out Patreon for coaching and community!!! https://www.patreon.com/samito27/membership
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="754" average="5.00" min="1" max="5"/>
<media:statistics views="17366"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:uqkGZpJpCq8</id>
<yt:videoId>uqkGZpJpCq8</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>When you need to convince the homie to download a new game</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=uqkGZpJpCq8"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-29T13:45:04+00:00</published>
<updated>2024-06-01T21:42:26+00:00</updated>
<media:group>
<media:title>When you need to convince the homie to download a new game</media:title>
<media:content url="https://www.youtube.com/v/uqkGZpJpCq8?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/uqkGZpJpCq8/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="276" average="5.00" min="1" max="5"/>
<media:statistics views="4617"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:vmq1ZpCKoCg</id>
<yt:videoId>vmq1ZpCKoCg</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>Here's Why Marvel Rivals Changes Everything</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=vmq1ZpCKoCg"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-28T16:29:53+00:00</published>
<updated>2024-06-01T21:47:38+00:00</updated>
<media:group>
<media:title>Here's Why Marvel Rivals Changes Everything</media:title>
<media:content url="https://www.youtube.com/v/vmq1ZpCKoCg?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/vmq1ZpCKoCg/hqdefault.jpg" width="480" height="360"/>
<media:description>For PRIVATE 6v6 Scrim Server Access - https://www.patreon.com/samito27/membership
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Check out! Sprixy
https://youtu.be/GQHS9bD_IvQ?si=rsIYq5QjHnC4VywJ
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
Shadin
#Overwatch</media:description>
<media:community>
<media:starRating count="1139" average="5.00" min="1" max="5"/>
<media:statistics views="18967"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:23Fj9HaXqEA</id>
<yt:videoId>23Fj9HaXqEA</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>Support Mains are BOOSTED</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=23Fj9HaXqEA"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-28T13:45:00+00:00</published>
<updated>2024-06-03T01:36:39+00:00</updated>
<media:group>
<media:title>Support Mains are BOOSTED</media:title>
<media:content url="https://www.youtube.com/v/23Fj9HaXqEA?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/23Fj9HaXqEA/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="437" average="5.00" min="1" max="5"/>
<media:statistics views="9305"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:IYGs54YQw9s</id>
<yt:videoId>IYGs54YQw9s</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>Samito Might be a Little Mad</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=IYGs54YQw9s"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-27T13:00:13+00:00</published>
<updated>2024-05-29T11:02:38+00:00</updated>
<media:group>
<media:title>Samito Might be a Little Mad</media:title>
<media:content url="https://www.youtube.com/v/IYGs54YQw9s?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/IYGs54YQw9s/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="740" average="5.00" min="1" max="5"/>
<media:statistics views="10119"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:KF6FDX8ju9U</id>
<yt:videoId>KF6FDX8ju9U</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>It's Time to STOP the Overwatch Shill Accusations (kinda)</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=KF6FDX8ju9U"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-26T17:46:29+00:00</published>
<updated>2024-05-29T15:10:12+00:00</updated>
<media:group>
<media:title>It's Time to STOP the Overwatch Shill Accusations (kinda)</media:title>
<media:content url="https://www.youtube.com/v/KF6FDX8ju9U?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i4.ytimg.com/vi/KF6FDX8ju9U/hqdefault.jpg" width="480" height="360"/>
<media:description>Check out @GSRaider
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="2559" average="5.00" min="1" max="5"/>
<media:statistics views="46451"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:eWpanQXLPTY</id>
<yt:videoId>eWpanQXLPTY</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 NEW TANK CHANGES FUN ROLE!! Star Trek Fleet Command Later !AD !PATREON</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=eWpanQXLPTY"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-25T21:00:39+00:00</published>
<updated>2024-05-31T22:17:49+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 NEW TANK CHANGES FUN ROLE!! Star Trek Fleet Command Later !AD !PATREON</media:title>
<media:content url="https://www.youtube.com/v/eWpanQXLPTY?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/eWpanQXLPTY/hqdefault.jpg" width="480" height="360"/>
<media:description>🚀 Install Star Trek Fleet Command for FREE now https://t2m.io/STFC_Samito and enter the promo code WARPSPEED to unlock 10 Epic Shards of Kirk, enhancing your command instantly!&#13;
&#13;
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="213" average="5.00" min="1" max="5"/>
<media:statistics views="9783"/>
</media:community>
</media:group>
</entry>
</feed>

697
feed/testdata/b.xml vendored Normal file
View File

@ -0,0 +1,697 @@
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns:yt="http://www.youtube.com/xml/schemas/2015" xmlns:media="http://search.yahoo.com/mrss/" xmlns="http://www.w3.org/2005/Atom">
<link rel="self" href="http://www.youtube.com/feeds/videos.xml?channel_id=UC5Uxq95L6K60XVdNPmUxoYA"/>
<id>yt:channel:5Uxq95L6K60XVdNPmUxoYA</id>
<yt:channelId>5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>Samito</title>
<link rel="alternate" href="https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2016-07-10T17:00:53+00:00</published>
<entry>
<id>yt:video:yUiFPNeCWKw</id>
<yt:videoId>yUiFPNeCWKw</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 6V6 RESPONSE VIDEO TODAY! TOP 500 RANKED - COACHING !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=yUiFPNeCWKw"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-06-05T15:59:03+00:00</published>
<updated>2024-06-05T16:00:22+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 6V6 RESPONSE VIDEO TODAY! TOP 500 RANKED - COACHING !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/yUiFPNeCWKw?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/yUiFPNeCWKw/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="69" average="5.00" min="1" max="5"/>
<media:statistics views="12"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:2Pi2sVwa8Sc</id>
<yt:videoId>2Pi2sVwa8Sc</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 NEW TIER LIST TODAY TOP 500 RANKED - COACHING !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=2Pi2sVwa8Sc"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-06-04T21:21:11+00:00</published>
<updated>2024-06-05T07:54:54+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 NEW TIER LIST TODAY TOP 500 RANKED - COACHING !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/2Pi2sVwa8Sc?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/2Pi2sVwa8Sc/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="239" average="5.00" min="1" max="5"/>
<media:statistics views="10926"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:80sv9fU3_wo</id>
<yt:videoId>80sv9fU3_wo</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 TOP 500 COACHING &amp; RANKED - !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=80sv9fU3_wo"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-06-03T18:09:28+00:00</published>
<updated>2024-06-04T18:27:58+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 TOP 500 COACHING &amp; RANKED - !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/80sv9fU3_wo?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i1.ytimg.com/vi/80sv9fU3_wo/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="210" average="5.00" min="1" max="5"/>
<media:statistics views="9099"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:8UwTveGCrOQ</id>
<yt:videoId>8UwTveGCrOQ</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>The DEVS Have DELETED Hanzo in Overwatch 2 (I'm pissed)</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=8UwTveGCrOQ"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-06-01T16:40:13+00:00</published>
<updated>2024-06-03T05:04:21+00:00</updated>
<media:group>
<media:title>The DEVS Have DELETED Hanzo in Overwatch 2 (I'm pissed)</media:title>
<media:content url="https://www.youtube.com/v/8UwTveGCrOQ?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i1.ytimg.com/vi/8UwTveGCrOQ/hqdefault.jpg" width="480" height="360"/>
<media:description>Check out Patreon for coaching and community!!! https://www.patreon.com/samito27/membership
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="2123" average="5.00" min="1" max="5"/>
<media:statistics views="35899"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:jiD_futRl7M</id>
<yt:videoId>jiD_futRl7M</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 LEARNING NEW PHARAH DAY 3 OP HERO !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=jiD_futRl7M"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-31T20:14:37+00:00</published>
<updated>2024-06-02T09:35:50+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 LEARNING NEW PHARAH DAY 3 OP HERO !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/jiD_futRl7M?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/jiD_futRl7M/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="205" average="5.00" min="1" max="5"/>
<media:statistics views="11751"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:Grr3dX1NX8U</id>
<yt:videoId>Grr3dX1NX8U</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>Actual Solutions to 5v5 and 6v6 in Overwatch 2 - (with Spilo)</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=Grr3dX1NX8U"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-30T21:16:25+00:00</published>
<updated>2024-06-05T01:56:26+00:00</updated>
<media:group>
<media:title>Actual Solutions to 5v5 and 6v6 in Overwatch 2 - (with Spilo)</media:title>
<media:content url="https://www.youtube.com/v/Grr3dX1NX8U?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i4.ytimg.com/vi/Grr3dX1NX8U/hqdefault.jpg" width="480" height="360"/>
<media:description>Check out @StormcrowProductions
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
#Overwatch</media:description>
<media:community>
<media:starRating count="1860" average="5.00" min="1" max="5"/>
<media:statistics views="38301"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:NAT9jggf1Q8</id>
<yt:videoId>NAT9jggf1Q8</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 LEARNING NEW PHARAH DAY 2 !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=NAT9jggf1Q8"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-30T19:29:02+00:00</published>
<updated>2024-06-04T22:08:58+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 LEARNING NEW PHARAH DAY 2 !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/NAT9jggf1Q8?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/NAT9jggf1Q8/hqdefault.jpg" width="480" height="360"/>
<media:description>🚀 Install Star Trek Fleet Command for FREE now https://t2m.io/STFC_Samito and enter the promo code WARPSPEED to unlock 10 Epic Shards of Kirk, enhancing your command instantly!&#13;
&#13;
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="175" average="5.00" min="1" max="5"/>
<media:statistics views="9848"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:l7X8x8Ec8tE</id>
<yt:videoId>l7X8x8Ec8tE</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 LEARNING NEW PHARAH DAY 1 !PATREON !AD</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=l7X8x8Ec8tE"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-29T19:19:48+00:00</published>
<updated>2024-06-01T04:51:56+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 LEARNING NEW PHARAH DAY 1 !PATREON !AD</media:title>
<media:content url="https://www.youtube.com/v/l7X8x8Ec8tE?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i1.ytimg.com/vi/l7X8x8Ec8tE/hqdefault.jpg" width="480" height="360"/>
<media:description>🚀 Install Star Trek Fleet Command for FREE now https://t2m.io/STFC_Samito and enter the promo code WARPSPEED to unlock 10 Epic Shards of Kirk, enhancing your command instantly!&#13;
&#13;
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="198" average="5.00" min="1" max="5"/>
<media:statistics views="9976"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:ksze1pinp78</id>
<yt:videoId>ksze1pinp78</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>PLAT Support Needs a Reality Check - COACH ROASTS STUDENT | Overwatch 2</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=ksze1pinp78"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-29T14:40:08+00:00</published>
<updated>2024-06-01T02:19:56+00:00</updated>
<media:group>
<media:title>PLAT Support Needs a Reality Check - COACH ROASTS STUDENT | Overwatch 2</media:title>
<media:content url="https://www.youtube.com/v/ksze1pinp78?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i4.ytimg.com/vi/ksze1pinp78/hqdefault.jpg" width="480" height="360"/>
<media:description>Check out Patreon for coaching and community!!! https://www.patreon.com/samito27/membership
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="754" average="5.00" min="1" max="5"/>
<media:statistics views="17366"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:uqkGZpJpCq8</id>
<yt:videoId>uqkGZpJpCq8</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>When you need to convince the homie to download a new game</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=uqkGZpJpCq8"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-29T13:45:04+00:00</published>
<updated>2024-06-01T21:42:26+00:00</updated>
<media:group>
<media:title>When you need to convince the homie to download a new game</media:title>
<media:content url="https://www.youtube.com/v/uqkGZpJpCq8?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/uqkGZpJpCq8/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="276" average="5.00" min="1" max="5"/>
<media:statistics views="4617"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:vmq1ZpCKoCg</id>
<yt:videoId>vmq1ZpCKoCg</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>Here's Why Marvel Rivals Changes Everything</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=vmq1ZpCKoCg"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-28T16:29:53+00:00</published>
<updated>2024-06-01T21:47:38+00:00</updated>
<media:group>
<media:title>Here's Why Marvel Rivals Changes Everything</media:title>
<media:content url="https://www.youtube.com/v/vmq1ZpCKoCg?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/vmq1ZpCKoCg/hqdefault.jpg" width="480" height="360"/>
<media:description>For PRIVATE 6v6 Scrim Server Access - https://www.patreon.com/samito27/membership
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Check out! Sprixy
https://youtu.be/GQHS9bD_IvQ?si=rsIYq5QjHnC4VywJ
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
Shadin
#Overwatch</media:description>
<media:community>
<media:starRating count="1139" average="5.00" min="1" max="5"/>
<media:statistics views="18967"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:23Fj9HaXqEA</id>
<yt:videoId>23Fj9HaXqEA</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>Support Mains are BOOSTED</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=23Fj9HaXqEA"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-28T13:45:00+00:00</published>
<updated>2024-06-03T01:36:39+00:00</updated>
<media:group>
<media:title>Support Mains are BOOSTED</media:title>
<media:content url="https://www.youtube.com/v/23Fj9HaXqEA?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/23Fj9HaXqEA/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="437" average="5.00" min="1" max="5"/>
<media:statistics views="9305"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:IYGs54YQw9s</id>
<yt:videoId>IYGs54YQw9s</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>Samito Might be a Little Mad</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=IYGs54YQw9s"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-27T13:00:13+00:00</published>
<updated>2024-05-29T11:02:38+00:00</updated>
<media:group>
<media:title>Samito Might be a Little Mad</media:title>
<media:content url="https://www.youtube.com/v/IYGs54YQw9s?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/IYGs54YQw9s/hqdefault.jpg" width="480" height="360"/>
<media:description>Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="740" average="5.00" min="1" max="5"/>
<media:statistics views="10119"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:KF6FDX8ju9U</id>
<yt:videoId>KF6FDX8ju9U</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>It's Time to STOP the Overwatch Shill Accusations (kinda)</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=KF6FDX8ju9U"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-26T17:46:29+00:00</published>
<updated>2024-05-29T15:10:12+00:00</updated>
<media:group>
<media:title>It's Time to STOP the Overwatch Shill Accusations (kinda)</media:title>
<media:content url="https://www.youtube.com/v/KF6FDX8ju9U?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i4.ytimg.com/vi/KF6FDX8ju9U/hqdefault.jpg" width="480" height="360"/>
<media:description>Check out @GSRaider
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0
Business inquiries ONLY (Private coaching is not a business inquiry!):
samito@loadscreen.gg
Stream Schedule:
Mon-Friday @ 11 AM EST ON THIS CHANNEL!
Follow me on Twitter:
https://www.twitter.com/SamitoFPS
Join my discord!
https://discord.gg/f6spsMA
Twitch:
https://twitch.tv/SamitoFPS
Edited by:
https://twitter.com/senzeehpai
#Overwatch</media:description>
<media:community>
<media:starRating count="2559" average="5.00" min="1" max="5"/>
<media:statistics views="46451"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:eWpanQXLPTY</id>
<yt:videoId>eWpanQXLPTY</yt:videoId>
<yt:channelId>UC5Uxq95L6K60XVdNPmUxoYA</yt:channelId>
<title>OVERWATCH 2 NEW TANK CHANGES FUN ROLE!! Star Trek Fleet Command Later !AD !PATREON</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=eWpanQXLPTY"/>
<author>
<name>Samito</name>
<uri>https://www.youtube.com/channel/UC5Uxq95L6K60XVdNPmUxoYA</uri>
</author>
<published>2024-05-25T21:00:39+00:00</published>
<updated>2024-05-31T22:17:49+00:00</updated>
<media:group>
<media:title>OVERWATCH 2 NEW TANK CHANGES FUN ROLE!! Star Trek Fleet Command Later !AD !PATREON</media:title>
<media:content url="https://www.youtube.com/v/eWpanQXLPTY?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/eWpanQXLPTY/hqdefault.jpg" width="480" height="360"/>
<media:description>🚀 Install Star Trek Fleet Command for FREE now https://t2m.io/STFC_Samito and enter the promo code WARPSPEED to unlock 10 Epic Shards of Kirk, enhancing your command instantly!&#13;
&#13;
Leave a like if you enjoyed &amp; subscribe for more: http://bit.ly/2ttxnC0&#13;
&#13;
Business inquiries ONLY (Private coaching is not a business inquiry!):&#13;
samito@loadscreen.gg&#13;
&#13;
Stream Schedule:&#13;
Mon-Friday @ 11 AM EST ON THIS CHANNEL!&#13;
&#13;
Follow me on Twitter:&#13;
https://www.twitter.com/SamitoFPS&#13;
&#13;
&#13;
Join my discord!&#13;
https://discord.gg/f6spsMA&#13;
&#13;
&#13;
Twitch:&#13;
https://twitch.tv/SamitoFPS&#13;
&#13;
&#13;
#Overwatch2 #LiveStream #ad</media:description>
<media:community>
<media:starRating count="213" average="5.00" min="1" max="5"/>
<media:statistics views="9783"/>
</media:community>
</media:group>
</entry>
</feed>

491
feed/testdata/c.xml vendored Normal file
View File

@ -0,0 +1,491 @@
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns:yt="http://www.youtube.com/xml/schemas/2015" xmlns:media="http://search.yahoo.com/mrss/" xmlns="http://www.w3.org/2005/Atom">
<link rel="self" href="http://www.youtube.com/feeds/videos.xml?channel_id=UCX6OQ3DkcsbYNE6H8uQQuVA"/>
<id>yt:channel:X6OQ3DkcsbYNE6H8uQQuVA</id>
<yt:channelId>X6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>MrBeast</title>
<link rel="alternate" href="https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2012-02-20T00:43:50+00:00</published>
<entry>
<id>yt:video:U_LlX4t0A9I</id>
<yt:videoId>U_LlX4t0A9I</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>$10,000 Every Day You Survive In The Wilderness</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=U_LlX4t0A9I"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-06-01T16:00:00+00:00</published>
<updated>2024-06-05T16:22:24+00:00</updated>
<media:group>
<media:title>$10,000 Every Day You Survive In The Wilderness</media:title>
<media:content url="https://www.youtube.com/v/U_LlX4t0A9I?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/U_LlX4t0A9I/hqdefault.jpg" width="480" height="360"/>
<media:description>They survived longer than I expected lol
Feast like a Beast with Zaxbys new MrBeast Box, served with 4 Chicken Fingerz™, cheddar bites, fries, double Texas toast, two signature sauces, small drink…and a milk chocolate FEASTABLES BAR! Now available at Zaxby's for a limited time. Order today: https://www.zaxbys.com/mrbeast
Want to check out the Galaxy S24? Head over to Samsung https://smsng.us/MrBS24
Please make sure you have an email address on your profile!
We will be reaching out from giveaway@mrbeastbusiness.com if you are selected as a winner!
New Merch - https://mrbeast.store
Check out Viewstats! - https://www.viewstats.com/
SUBSCRIBE OR I TAKE YOUR DOG
╔═╦╗╔╦╗╔═╦═╦╦╦╦╗╔═╗
║╚╣║║║╚╣╚╣╔╣╔╣║╚╣═╣
╠╗║╚╝║║╠╗║╚╣║║║║║═╣
╚═╩══╩═╩═╩═╩╝╚╩═╩═╝
For any questions or inquiries regarding this video, please reach out to chucky@mrbeastbusiness.com
Music Provided by https://www.extrememusic.com
----------------------------------------------------------------
follow all of these or i will kick you
• Facebook - https://www.facebook.com/MrBeast6000/
• Twitter - https://twitter.com/MrBeast
• Instagram - https://www.instagram.com/mrbeast
• Im Hiring! - https://www.mrbeastjobs.com/
--------------------------------------------------------------------</media:description>
<media:community>
<media:starRating count="4734837" average="5.00" min="1" max="5"/>
<media:statistics views="80244665"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:T8I165Qxeo8</id>
<yt:videoId>T8I165Qxeo8</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>Sprinting with More and More Money</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=T8I165Qxeo8"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-05-30T16:00:01+00:00</published>
<updated>2024-06-05T16:20:45+00:00</updated>
<media:group>
<media:title>Sprinting with More and More Money</media:title>
<media:content url="https://www.youtube.com/v/T8I165Qxeo8?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i1.ytimg.com/vi/T8I165Qxeo8/hqdefault.jpg" width="480" height="360"/>
<media:description></media:description>
<media:community>
<media:starRating count="6128945" average="5.00" min="1" max="5"/>
<media:statistics views="129130378"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:i-9V21MqlhY</id>
<yt:videoId>i-9V21MqlhY</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>Giving 1000 Phones Away</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=i-9V21MqlhY"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-05-28T16:00:00+00:00</published>
<updated>2024-06-04T10:10:03+00:00</updated>
<media:group>
<media:title>Giving 1000 Phones Away</media:title>
<media:content url="https://www.youtube.com/v/i-9V21MqlhY?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/i-9V21MqlhY/hqdefault.jpg" width="480" height="360"/>
<media:description></media:description>
<media:community>
<media:starRating count="6171546" average="5.00" min="1" max="5"/>
<media:statistics views="75948504"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:f0cXJ6mJxGc</id>
<yt:videoId>f0cXJ6mJxGc</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>Bottle Head Smashing World Record Attempt!</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=f0cXJ6mJxGc"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-05-14T16:00:00+00:00</published>
<updated>2024-05-31T18:41:15+00:00</updated>
<media:group>
<media:title>Bottle Head Smashing World Record Attempt!</media:title>
<media:content url="https://www.youtube.com/v/f0cXJ6mJxGc?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/f0cXJ6mJxGc/hqdefault.jpg" width="480" height="360"/>
<media:description></media:description>
<media:community>
<media:starRating count="5355465" average="5.00" min="1" max="5"/>
<media:statistics views="136052940"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:F6PqxbvOCUI</id>
<yt:videoId>F6PqxbvOCUI</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>Protect The Yacht, Keep It!</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=F6PqxbvOCUI"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-05-11T16:00:00+00:00</published>
<updated>2024-05-17T01:09:30+00:00</updated>
<media:group>
<media:title>Protect The Yacht, Keep It!</media:title>
<media:content url="https://www.youtube.com/v/F6PqxbvOCUI?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/F6PqxbvOCUI/hqdefault.jpg" width="480" height="360"/>
<media:description>This video did not go how I expected it to
Craft your perfect defense from a combination of powerful Monkey Towers and awesome Heroes, then pop every last invading Bloon! Grab your copy of Bloons TD 6 now - https://ninja.kiwi/mrbeast
Play the Official Fortnite Creative Map For This Video Here:
MrBeast Bed Wars 🛌 - 5948-5884-5269
https://www.fortnite.com/@mrbeast/5948-5884-5269
New Merch - https://mrbeast.store
Check out Viewstats! - https://www.viewstats.com/
SUBSCRIBE OR I TAKE YOUR DOG
╔═╦╗╔╦╗╔═╦═╦╦╦╦╗╔═╗
║╚╣║║║╚╣╚╣╔╣╔╣║╚╣═╣
╠╗║╚╝║║╠╗║╚╣║║║║║═╣
╚═╩══╩═╩═╩═╩╝╚╩═╩═╝
For any questions or inquiries regarding this video, please reach out to chucky@mrbeastbusiness.com
Music Provided by https://www.extrememusic.com
----------------------------------------------------------------
follow all of these or i will kick you
• Facebook - https://www.facebook.com/MrBeast6000/
• Twitter - https://twitter.com/MrBeast
• Instagram - https://www.instagram.com/mrbeast
• Im Hiring! - https://www.mrbeastjobs.com/
--------------------------------------------------------------------</media:description>
<media:community>
<media:starRating count="3486893" average="5.00" min="1" max="5"/>
<media:statistics views="99467812"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:oA4LSZvX4iE</id>
<yt:videoId>oA4LSZvX4iE</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>Ages 1-100 Try My Chocolate</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=oA4LSZvX4iE"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-05-09T16:00:00+00:00</published>
<updated>2024-05-18T22:48:01+00:00</updated>
<media:group>
<media:title>Ages 1-100 Try My Chocolate</media:title>
<media:content url="https://www.youtube.com/v/oA4LSZvX4iE?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i4.ytimg.com/vi/oA4LSZvX4iE/hqdefault.jpg" width="480" height="360"/>
<media:description></media:description>
<media:community>
<media:starRating count="4291634" average="5.00" min="1" max="5"/>
<media:statistics views="77466474"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:ZKxnjszkZto</id>
<yt:videoId>ZKxnjszkZto</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>Spot The Hidden People For $10,000</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=ZKxnjszkZto"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-05-08T16:00:01+00:00</published>
<updated>2024-05-25T01:59:55+00:00</updated>
<media:group>
<media:title>Spot The Hidden People For $10,000</media:title>
<media:content url="https://www.youtube.com/v/ZKxnjszkZto?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/ZKxnjszkZto/hqdefault.jpg" width="480" height="360"/>
<media:description></media:description>
<media:community>
<media:starRating count="3311833" average="5.00" min="1" max="5"/>
<media:statistics views="85863073"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:8_gdcaX9Xqk</id>
<yt:videoId>8_gdcaX9Xqk</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>Would You Split Or Steal $250,000?</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=8_gdcaX9Xqk"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-05-03T16:00:00+00:00</published>
<updated>2024-05-08T21:04:20+00:00</updated>
<media:group>
<media:title>Would You Split Or Steal $250,000?</media:title>
<media:content url="https://www.youtube.com/v/8_gdcaX9Xqk?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i1.ytimg.com/vi/8_gdcaX9Xqk/hqdefault.jpg" width="480" height="360"/>
<media:description></media:description>
<media:community>
<media:starRating count="4952485" average="5.00" min="1" max="5"/>
<media:statistics views="60912629"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:Pv0iVoSZzN8</id>
<yt:videoId>Pv0iVoSZzN8</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>In 10 Minutes This Room Will Explode!</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=Pv0iVoSZzN8"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-04-27T16:00:00+00:00</published>
<updated>2024-05-22T15:56:00+00:00</updated>
<media:group>
<media:title>In 10 Minutes This Room Will Explode!</media:title>
<media:content url="https://www.youtube.com/v/Pv0iVoSZzN8?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i1.ytimg.com/vi/Pv0iVoSZzN8/hqdefault.jpg" width="480" height="360"/>
<media:description>I didnt expect that to happen…
Theres no jumping through hoops (or plate glass windows) with T-Mobile. Customers can get Magenta Status from day one, including hotel discounts on select brands, deals on rental cars, discounts on select concert tickets nationwide, and so much more. See how at https://t-mobile.com/status
New Merch - https://mrbeast.store
Check out Viewstats! - https://www.viewstats.com/
SUBSCRIBE OR I TAKE YOUR DOG
╔═╦╗╔╦╗╔═╦═╦╦╦╦╗╔═╗
║╚╣║║║╚╣╚╣╔╣╔╣║╚╣═╣
╠╗║╚╝║║╠╗║╚╣║║║║║═╣
╚═╩══╩═╩═╩═╩╝╚╩═╩═╝
For any questions or inquiries regarding this video, please reach out to chucky@mrbeastbusiness.com
Music Provided by https://www.extrememusic.com
----------------------------------------------------------------
follow all of these or i will kick you
• Facebook - https://www.facebook.com/MrBeast6000/
• Twitter - https://twitter.com/MrBeast
• Instagram - https://www.instagram.com/mrbeast
• Im Hiring! - https://www.mrbeastjobs.com/
--------------------------------------------------------------------</media:description>
<media:community>
<media:starRating count="3673894" average="5.00" min="1" max="5"/>
<media:statistics views="99751852"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:CWbV3NItSdY</id>
<yt:videoId>CWbV3NItSdY</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>The World's Fastest Cleaners</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=CWbV3NItSdY"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-04-25T16:00:03+00:00</published>
<updated>2024-05-30T02:48:16+00:00</updated>
<media:group>
<media:title>The World's Fastest Cleaners</media:title>
<media:content url="https://www.youtube.com/v/CWbV3NItSdY?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i4.ytimg.com/vi/CWbV3NItSdY/hqdefault.jpg" width="480" height="360"/>
<media:description></media:description>
<media:community>
<media:starRating count="12469917" average="5.00" min="1" max="5"/>
<media:statistics views="243873329"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:l-nMKJ5J3Uc</id>
<yt:videoId>l-nMKJ5J3Uc</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>Ages 1 - 100 Decide Who Wins $250,000</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=l-nMKJ5J3Uc"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-04-20T15:59:59+00:00</published>
<updated>2024-05-21T18:41:00+00:00</updated>
<media:group>
<media:title>Ages 1 - 100 Decide Who Wins $250,000</media:title>
<media:content url="https://www.youtube.com/v/l-nMKJ5J3Uc?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i1.ytimg.com/vi/l-nMKJ5J3Uc/hqdefault.jpg" width="480" height="360"/>
<media:description>I cant believe who they picked
Thanks Top Troops for sponsoring this video. Download Top Troops at https://toptroops.onelink.me/JHnC/mrbeast or scan the QR code to get a FREE special Starter Pack for a limited time
Thanks Samsung for the Tab S9s - the Galaxy AI features are cool too: https://smsng.us/MrBTabS9
New Merch - https://mrbeast.store
Check out Viewstats! - https://www.viewstats.com/
SUBSCRIBE OR I TAKE YOUR DOG
╔═╦╗╔╦╗╔═╦═╦╦╦╦╗╔═╗
║╚╣║║║╚╣╚╣╔╣╔╣║╚╣═╣
╠╗║╚╝║║╠╗║╚╣║║║║║═╣
╚═╩══╩═╩═╩═╩╝╚╩═╩═╝
For any questions or inquiries regarding this video, please reach out to chucky@mrbeastbusiness.com
Also thank you Concept Pixel for the LED Walls,it looked great!
 www.conceptpixels.com
Music Provided by https://www.extrememusic.com
----------------------------------------------------------------
follow all of these or i will kick you
• Facebook - https://www.facebook.com/MrBeast6000/
• Twitter - https://twitter.com/MrBeast
• Instagram - https://www.instagram.com/mrbeast
• Im Hiring! - https://www.mrbeastjobs.com/
--------------------------------------------------------------------</media:description>
<media:community>
<media:starRating count="5089170" average="5.00" min="1" max="5"/>
<media:statistics views="157333414"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:XE1Qyss8GIY</id>
<yt:videoId>XE1Qyss8GIY</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>Guess The Gift, Keep It</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=XE1Qyss8GIY"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-04-09T17:00:00+00:00</published>
<updated>2024-05-20T17:49:32+00:00</updated>
<media:group>
<media:title>Guess The Gift, Keep It</media:title>
<media:content url="https://www.youtube.com/v/XE1Qyss8GIY?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i1.ytimg.com/vi/XE1Qyss8GIY/hqdefault.jpg" width="480" height="360"/>
<media:description></media:description>
<media:community>
<media:starRating count="9990095" average="5.00" min="1" max="5"/>
<media:statistics views="193541791"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:6GzHPS0rEgc</id>
<yt:videoId>6GzHPS0rEgc</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>Im Giving My 250M Subscriber $25,000</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=6GzHPS0rEgc"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-04-06T19:45:00+00:00</published>
<updated>2024-05-25T21:32:48+00:00</updated>
<media:group>
<media:title>Im Giving My 250M Subscriber $25,000</media:title>
<media:content url="https://www.youtube.com/v/6GzHPS0rEgc?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i3.ytimg.com/vi/6GzHPS0rEgc/hqdefault.jpg" width="480" height="360"/>
<media:description></media:description>
<media:community>
<media:starRating count="4194421" average="5.00" min="1" max="5"/>
<media:statistics views="52704231"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:imhY0pe-Sd8</id>
<yt:videoId>imhY0pe-Sd8</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>Anything You Touch, You Keep!</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=imhY0pe-Sd8"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-04-02T16:00:03+00:00</published>
<updated>2024-05-12T21:41:57+00:00</updated>
<media:group>
<media:title>Anything You Touch, You Keep!</media:title>
<media:content url="https://www.youtube.com/v/imhY0pe-Sd8?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/imhY0pe-Sd8/hqdefault.jpg" width="480" height="360"/>
<media:description></media:description>
<media:community>
<media:starRating count="5585596" average="5.00" min="1" max="5"/>
<media:statistics views="98750199"/>
</media:community>
</media:group>
</entry>
<entry>
<id>yt:video:erLbbextvlY</id>
<yt:videoId>erLbbextvlY</yt:videoId>
<yt:channelId>UCX6OQ3DkcsbYNE6H8uQQuVA</yt:channelId>
<title>7 Days Stranded On An Island</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=erLbbextvlY"/>
<author>
<name>MrBeast</name>
<uri>https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA</uri>
</author>
<published>2024-03-30T16:00:01+00:00</published>
<updated>2024-05-25T23:02:55+00:00</updated>
<media:group>
<media:title>7 Days Stranded On An Island</media:title>
<media:content url="https://www.youtube.com/v/erLbbextvlY?version=3" type="application/x-shockwave-flash" width="640" height="390"/>
<media:thumbnail url="https://i2.ytimg.com/vi/erLbbextvlY/hqdefault.jpg" width="480" height="360"/>
<media:description>I cant believe we actually did this
Send money around the world with Western Union. New customers get their first online transaction fee free. https://www.westernunion.com/mrbeast . Restrictions and FX gains apply.
Play the Official Fortnite Creative Map For This Video Here:
MrBeast Zombie Island 🏝️ - 4231-6172-1988
https://www.fortnite.com/@mrbeast/4231-6172-1988
New Merch - https://mrbeast.store
Check out Viewstats! - https://www.viewstats.com/
SUBSCRIBE OR I TAKE YOUR DOG
╔═╦╗╔╦╗╔═╦═╦╦╦╦╗╔═╗
║╚╣║║║╚╣╚╣╔╣╔╣║╚╣═╣
╠╗║╚╝║║╠╗║╚╣║║║║║═╣
╚═╩══╩═╩═╩═╩╝╚╩═╩═╝
For any questions or inquiries regarding this video, please reach out to chucky@mrbeastbusiness.com
Music Provided by https://www.extrememusic.com
----------------------------------------------------------------
follow all of these or i will kick you
• Facebook - https://www.facebook.com/MrBeast6000/
• Twitter - https://twitter.com/MrBeast
• Instagram - https://www.instagram.com/mrbeast
• Im Hiring! - https://www.mrbeastjobs.com/
--------------------------------------------------------------------</media:description>
<media:community>
<media:starRating count="5502975" average="5.00" min="1" max="5"/>
<media:statistics views="164861211"/>
</media:community>
</media:group>
</entry>
</feed>

1
feed/testdata/feedlink.txt vendored Normal file
View File

@ -0,0 +1 @@
http://www.youtube.com/feeds/videos.xml?channel_id=UCX6OQ3DkcsbYNE6H8uQQuVA

23
go.mod Normal file
View File

@ -0,0 +1,23 @@
module gitea.hbanafa.com/hesham/yttopodcast
go 1.22.2
require (
github.com/lrstanley/go-ytdlp v0.0.0-20240504025846-c0493251b060
github.com/mmcdole/gofeed v1.3.0
)
require (
github.com/ProtonMail/go-crypto v1.0.0 // indirect
github.com/PuerkitoBio/goquery v1.8.0 // indirect
github.com/andybalholm/cascadia v1.3.1 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/mmcdole/goxpp v1.1.1-0.20240225020742-a0c311522b23 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
golang.org/x/crypto v0.21.0 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
)

87
go.sum Normal file
View File

@ -0,0 +1,87 @@
github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/lrstanley/go-ytdlp v0.0.0-20240504025846-c0493251b060 h1:UOZcZVKXvw5ZcQ/shW/7xonMJYib9n9FKyNs/TAYAKc=
github.com/lrstanley/go-ytdlp v0.0.0-20240504025846-c0493251b060/go.mod h1:75ujbafjqiJugIGw4K6o52/p8C0m/kt+DrYwgClXYT4=
github.com/mmcdole/gofeed v1.3.0 h1:5yn+HeqlcvjMeAI4gu6T+crm7d0anY85+M+v6fIFNG4=
github.com/mmcdole/gofeed v1.3.0/go.mod h1:9TGv2LcJhdXePDzxiuMnukhV2/zb6VtnZt1mS+SjkLE=
github.com/mmcdole/goxpp v1.1.1-0.20240225020742-a0c311522b23 h1:Zr92CAlFhy2gL+V1F+EyIuzbQNbSgP4xhTODZtrXUtk=
github.com/mmcdole/goxpp v1.1.1-0.20240225020742-a0c311522b23/go.mod h1:v+25+lT2ViuQ7mVxcncQ8ch1URund48oH+jhjiwEgS8=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

54
templates/base.rss.templ Normal file
View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:cc="http://web.resource.org/cc/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:podcast="https://podcastindex.org/namespace/1.0" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<channel>
<atom:link href="{{ .FeedURL }}" rel="self" type="application/rss+xml"/>
<title>{{ .Title }}</title>
<pubDate>{{ .PublishDateRfcEmail }}</pubDate>
<lastBuildDate>{{ .BuildDateRfcEmail }}</lastBuildDate>
<generator>{{ .GeneratorName }}</generator>
<link>{{ .PodcastPage }}</link>
<language>{{ .Lang }}</language>
<copyright>
<![CDATA[{{ .CopyRight }}]]>
</copyright>
<docs>{{ .PodcastPage }}</docs>
<itunes:summary><![CDATA[{{ .Summary }}]]></itunes:summary>
<image>
<url>{{ .PodcastImageURL }}</url>
<title>{{ .Title }}</title>
<link><![CDATA[{{ .PodcastImageURL }}]]></link>
</image>
<itunes:author>{{ .Title }}</itunes:author>
<itunes:keywords>Youtube,{{ .Title }}</itunes:keywords>
<itunes:category text="Arts">
<itunes:category text="Performing Arts"/>
</itunes:category>
<itunes:category text="Comedy">
</itunes:category>
<itunes:image href="{{ .PodcastImageURL }}" />
<itunes:explicit>false</itunes:explicit>
<itunes:owner>
<itunes:name><![CDATA[{{ .Title }}]]></itunes:name>
<itunes:email>mail@mail.none</itunes:email>
</itunes:owner>
<description><![CDATA[{{ .Summary }}]]></description>
<itunes:type>episodic</itunes:type>
<podcast:locked owner="{{ .Title }}">no</podcast:locked>{{ range .Items }}
<item>
<title><![CDATA[{{ .Title }}]]></title>
<itunes:title><![CDATA[{{ .Title }}]]></itunes:title>
<pubDate>{{ .PublishDateRfcEmail }}</pubDate>
<guid isPermaLink="false"><![CDATA[{{ .Id }}]]></guid>
<link><![CDATA[https://youtube.com/watch?v={{ .Id }}]]></link>
<itunes:image href="{{ .CoverImageURL }}" />
<description><![CDATA[ {{ .Description }}]]></description>
<content:encoded><![CDATA[{{ .Description }}]]></content:encoded>
<enclosure length="{{ .Length }}" type="audio/mpeg" url="{{ .EnclosureURL }}" />
<itunes:duration>{{ .Duration }}</itunes:duration>
<itunes:explicit>false</itunes:explicit>
<itunes:keywords />
<itunes:subtitle><![CDATA[The itunes subtitle]]></itunes:subtitle>
<itunes:episodeType>full</itunes:episodeType>
</item>{{ end }}
</channel>
</rss>

17
templates/item.rss.templ Normal file
View File

@ -0,0 +1,17 @@
<item>
<title>{{ .Title }}</title>
<itunes:title>{{ .Title }}</itunes:title>
<pubDate>{{ .PublishDateRfcEmail }}</pubDate>
<guid isPermaLink="false"><![CDATA[d598cacb-25dd-4659-8839-2829707208da]]></guid>
<link><![CDATA[https://youtube.com/watch?v={{ .Id }}]]></link>
<itunes:image href="{{ .CoverImageURL }}" />
<description><![CDATA[ {{ .Description }}]]></description>
<content:encoded><![CDATA[{{ .Description }}]]></content:encoded>
<enclosure length="{{ .Length }}" type="audio/mpeg" url="{{ .JumpUrl }}" />
<itunes:duration>{{ .Duration }}</itunes:duration>
<itunes:explicit>false</itunes:explicit>
<itunes:keywords />
<itunes:subtitle><![CDATA[In a bipartisan fashion the United States House of Representatives has passed the “Antisemitism Awareness Act,” a transparent evisceration of the first amendments free speech protections. If the bill passes the Senate and is signed by President...]]></itunes:subtitle>
<itunes:episodeType>full</itunes:episodeType>
</item>

36
templates/types.go Normal file
View File

@ -0,0 +1,36 @@
package templates
import (
"embed"
)
//go:embed *.templ
var TemplatesFS embed.FS
//go:embed base.rss.templ
var RSSTemplate string
type FeedData struct {
Title string
PublishDateRfcEmail string
BuildDateRfcEmail string
GeneratorName string
PodcastPage string
Lang string
CopyRight string
Summary string
PodcastImageURL string
FeedURL string
Items []FeedItem
}
type FeedItem struct {
Title string
PublishDateRfcEmail string
Id string
CoverImageURL string
Description string
Length int
EnclosureURL string
Duration string
}

View File

@ -0,0 +1,80 @@
package ytlinkprov
import (
"context"
"fmt"
"time"
"github.com/lrstanley/go-ytdlp"
)
type CacheLinkProv struct {
cache map[string]TimedLink
cacheWindow time.Duration
ytInstall ytdlp.ResolvedInstall
}
type TimedLink struct {
Link string
Time time.Time
}
func NewCachedLinkProvider(expiration time.Duration) (*CacheLinkProv, error) {
p := new(CacheLinkProv)
p.cache = make(map[string]TimedLink)
p.cacheWindow = expiration
ctx := context.Background()
ytInstall, err := ytdlp.Install(
ctx,
&ytdlp.InstallOptions{
AllowVersionMismatch: true,
},
)
if err != nil {
return p, err
}
p.ytInstall = *ytInstall
return p, nil
}
func (c *CacheLinkProv) GetLink(id string) (link string, err error) {
cc, ok := c.cache[id]
if ok && c.validCache(cc) {
return cc.Link, nil
}
link, err = getRemoteLink(id)
if err != nil {
return "", err
}
t_now := time.Now().UTC()
c.cache[id] = TimedLink{
Link: link,
Time: t_now,
}
// INFO: This is a vary, vary slow leak
return link, nil
}
func (c *CacheLinkProv) validCache(l TimedLink) bool {
t_exp := time.Now().UTC().Add(c.cacheWindow)
if t_exp.Before(l.Time) {
// expired
return false
}
return true
}
func getRemoteLink(id string) (string, error) {
vidUrl := fmt.Sprintf("https://youtube.com/watch?v=%s", id)
ytCmd := ytdlp.New().ExtractAudio().GetURL()
ytRes, err := ytCmd.Run(context.Background(), vidUrl)
if err != nil {
return "", err
}
return ytRes.Stdout, nil
}

6
ytlinkprov/common.go Normal file
View File

@ -0,0 +1,6 @@
package ytlinkprov
type YtLinkProvider interface {
GetLink(id string) (link string, err error)
}