{"id":1840,"date":"2011-04-02T12:43:18","date_gmt":"2011-04-02T09:43:18","guid":{"rendered":"http:\/\/firefang.net\/blog\/?p=1840"},"modified":"2011-04-03T14:44:03","modified_gmt":"2011-04-03T11:44:03","slug":"%d7%a1%d7%a7%d7%9c%d7%94","status":"publish","type":"post","link":"https:\/\/firefang.net\/blog\/1840","title":{"rendered":"\u05e1\u05e7\u05dc\u05d4"},"content":{"rendered":"<p><a href=\"http:\/\/firefang.net\/blog\/1829\">\u05d1\u05e4\u05d5\u05e1\u05d8<\/a> \u05d4\u05e7\u05d5\u05d3\u05dd \u05d3\u05d9\u05d1\u05e8\u05ea\u05d9 \u05e2\u05dc \u05d4\u05e6\u05d5\u05e8\u05da \u05e9\u05dc\u05d9 \u05d1\u05e6\u05e4\u05d9\u05d4 \u05e9\u05dc \u05e1\u05e8\u05d8\u05d5\u05e0\u05d9 \u05d9\u05d5\u05d8\u05d9\u05d5\u05d1 \u05e2\u05dc \u05d4\u05d0\u05d9\u05d9\u05e4\u05d3 \u05db\u05e9\u05d0\u05e0\u05d9 \u05dc\u05d0 \u05de\u05d7\u05d5\u05d1\u05e8, \u05d5\u05e2\u05dc \u05d4\u05e4\u05ea\u05e8\u05d5\u05df \u05e9\u05dc\u05d9 &#8211; \u05e9\u05de\u05d1\u05d5\u05e1\u05e1 \u05e2\u05dc \u05db\u05de\u05d4 \u05e1\u05e7\u05e8\u05d9\u05e4\u05d8\u05d9\u05dd \u05e9\u05e7\u05d5\u05e9\u05e8\u05d9\u05dd \u05d1\u05d9\u05d7\u05d3 \u05d0\u05ea \u05d4\u05dc\u05d5\u05d2\u05d9\u05e7\u05d4 \u05d4\u05d1\u05d0\u05d4:<\/p>\n<ol>\n<li>\u05d4\u05d1\u05d0 \u05de\u05d4API \u05e9\u05dc \u05d9\u05d5\u05d8\u05d9\u05d5\u05d1 \u05e4\u05d9\u05d3 RSS \u05e8\u05dc\u05d5\u05d5\u05e0\u05d8\u05d9<\/li>\n<li>\u05d7\u05dc\u05e5 \u05de\u05de\u05e0\u05d5 URL\u05d9\u05dd \u05e9\u05dc \u05e1\u05e8\u05d8\u05d5\u05e0\u05d9\u05dd<\/li>\n<li>\u05d4\u05d5\u05e8\u05d3 \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05e0\u05d9\u05dd \u05e2\u05e6\u05de\u05dd \u05de\u05d9\u05d5\u05d8\u05d9\u05d5\u05d1 \u05e2\u05dd <a href=\"http:\/\/rg3.github.com\/youtube-dl\/\">youtube-dl<\/a><\/li>\n<li>\u05e7\u05d5\u05d3\u05d3 \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05e0\u05d9\u05dd \u05dc\u05e4\u05d5\u05e8\u05de\u05d8 \u05e9\u05dc \u05d0\u05d9\u05d9\u05e4\u05d3 \u05e2\u05dd <a href=\"http:\/\/handbrake.fr\/\">HandBreak<\/a><\/li>\n<li>\u05e6\u05d5\u05e8 \u05e4\u05d9\u05d3 RSS \u05e9\u05de\u05d0\u05e4\u05e9\u05e8 \u05dc\u05d4\u05d5\u05e8\u05d9\u05d3 \u05d0\u05ea \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05d4\u05de\u05e7\u05d5\u05d3\u05d3\u05d9\u05dd<\/li>\n<\/ol>\n<p>\u05d1\u05e8\u05d2\u05e2 \u05e9\u05d4\u05ea\u05d4\u05dc\u05d9\u05da \u05d4\u05d6\u05d4 \u05e7\u05d9\u05d9\u05dd, \u05de\u05d4 \u05e9\u05e0\u05e9\u05d0\u05e8 \u05d6\u05d4 \u05dc\u05e8\u05e9\u05d5\u05dd \u05d0\u05ea \u05d4\u05e4\u05d9\u05d3 \u05d4\u05d7\u05d3\u05e9 \u05d1ITunes, \u05d5\u05de\u05d0\u05d5\u05ea\u05d5 \u05e8\u05d2\u05e2 \u05d4\u05d5\u05d0 \u05de\u05d5\u05e8\u05d9\u05d3 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05e0\u05d9\u05dd \u05dc\u05e6\u05e4\u05d9\u05d9\u05d4 \u05d0\u05d5\u05e3 \u05dc\u05d9\u05d9\u05df.<\/p>\n<p>\u05dc\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05e9\u05de\u05e2\u05ea\u05d9 \u05d9\u05d5\u05ea\u05e8 \u05d5\u05d9\u05d5\u05ea\u05e8 \u05e2\u05dc <a href=\"http:\/\/www.scala-lang.org\/\">\u05e1\u05e7\u05dc\u05d4<\/a>, \u05e1\u05e7\u05dc\u05d4 \u05d4\u05d9\u05d0 \u05e9\u05e4\u05d4 \u05d9\u05d7\u05e1\u05d9\u05ea \u05d7\u05d3\u05e9\u05d4 (\u05d4\u05d5\u05e4\u05d9\u05e2\u05d4 \u05d12003).<br \/>\n\u05d0\u05d6 \u05de\u05d4 \u05d4\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05e9\u05dc \u05e1\u05e7\u05dc\u05d4?<\/p>\n<ul>\n<li>\u05e9\u05e4\u05d4 \u05e1\u05d8\u05d8\u05d9\u05ea, \u05d4\u05e7\u05d5\u05de\u05e4\u05d9\u05d9\u05dc\u05e8 \u05d9\u05d2\u05d9\u05d3 \u05dc\u05db\u05dd \u05db\u05e9\u05d9\u05e9 \u05dc\u05db\u05dd \u05e9\u05d2\u05d9\u05d0\u05d5\u05ea \u05d8\u05d9\u05e4\u05d5\u05e1 (\u05d1\u05e0\u05d9\u05d2\u05d5\u05d3 \u05dc\u05e9\u05e4\u05d5\u05ea \u05d3\u05d9\u05e0\u05de\u05d9\u05d5\u05ea \u05db\u05de\u05d5 PHP, \u05e4\u05d9\u05d9\u05ea\u05d5\u05df \u05d5\u05db\u05d5')<\/li>\n<li>\u05de\u05d1\u05d5\u05e1\u05e1\u05ea \u05e2\u05dc \u05d4JVM, \u05e1\u05e7\u05dc\u05d4 \u05de\u05ea\u05e7\u05de\u05e4\u05dc\u05ea \u05dc\u05d1\u05d9\u05d9\u05d8-\u05e7\u05d5\u05d3<\/li>\n<li>\u05de\u05d0\u05e4\u05e9\u05e8\u05ea \u05d2\u05d9\u05e9\u05d4 \u05de\u05dc\u05d0\u05d4 \u05d5\u05e0\u05d5\u05d7\u05d4 \u05dc\u05ea\u05e9\u05ea\u05d9\u05d5\u05ea \u05d5\u05e1\u05e4\u05e8\u05d9\u05d5\u05ea \u05e9\u05dc \u05d2'\u05d0\u05d5\u05d5\u05d4. \u05d0\u05dd \u05d9\u05e9 \u05dc\u05db\u05dd \u05e7\u05d5\u05d3 \u05d2'\u05d0\u05d5\u05d5\u05d4 \u05ea\u05d5\u05db\u05dc\u05d5 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d5 \u05d1\u05e7\u05dc\u05d5\u05ea \u05de\u05e1\u05e7\u05dc\u05d4<\/li>\n<li>\u05d4\u05e7\u05d5\u05d3 \u05d1\u05e1\u05e7\u05dc\u05d4 \u05d4\u05d5\u05d0 \u05d4\u05e8\u05d1\u05d4 \u05d9\u05d5\u05ea\u05e8 \u05e7\u05d5\u05de\u05e4\u05e7\u05d8\u05d9 \u05de\u05d2'\u05d0\u05d5\u05d5\u05d4<\/li>\n<li>\u05ea\u05d5\u05de\u05db\u05ea \u05d1\u05ea\u05db\u05e0\u05d5\u05ea \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9, \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05d4\u05df \u05d0\u05d6\u05e8\u05d7\u05d9\u05d5\u05ea \u05de\u05d4\u05e9\u05d5\u05e8\u05d4 \u05d4\u05e8\u05d0\u05e9\u05d5\u05e0\u05d4, \u05d0\u05e4\u05e9\u05e8 \u05dc\u05d4\u05e2\u05d1\u05d9\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05db\u05e4\u05e8\u05de\u05d8\u05e8 \u05d5\u05dc\u05d9\u05e6\u05d5\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05d0\u05e0\u05d5\u05e0\u05d9\u05de\u05d5\u05ea \u05d1\u05e6\u05d5\u05e8\u05d4 \u05de\u05d0\u05d5\u05d3 \u05d0\u05dc\u05d2\u05e0\u05d8\u05d9\u05ea.<\/li>\n<li>\u05ea\u05d5\u05de\u05db\u05ea \u05d1\u05de\u05d5\u05d3\u05dc \u05d4Actors, \u05e9\u05d4\u05d5\u05d0 \u05de\u05d5\u05d3\u05dc \u05e9\u05d1\u05d5 &quot;\u05e9\u05d7\u05e7\u05e0\u05d9\u05dd&quot; \u05e9\u05d5\u05e0\u05d9\u05dd \u05de\u05ea\u05e7\u05e9\u05e8\u05d9\u05dd \u05d0\u05d7\u05d3 \u05e2\u05dd \u05d4\u05e9\u05e0\u05d9 \u05e2\u05dc \u05d9\u05d3\u05d9 \u05e9\u05dc\u05d9\u05d7\u05ea \u05d4\u05d5\u05d3\u05e2\u05d5\u05ea, \u05d5\u05dc\u05d0 \u05d7\u05d5\u05dc\u05e7\u05d9\u05dd \u05e9\u05d5\u05dd State. \u05d4\u05de\u05d5\u05d3\u05dc \u05d4\u05d6\u05d4 \u05d7\u05d5\u05e1\u05da \u05dc\u05d0 \u05de\u05e2\u05d8 \u05d1\u05e2\u05d9\u05d5\u05ea \u05e9\u05e0\u05d5\u05d1\u05e2\u05d5\u05ea \u05de\u05de\u05d9\u05e7\u05d1\u05d5\u05dc \u05d2\u05d1\u05d5\u05d4<\/li>\n<li>\u05ea\u05de\u05d9\u05db\u05d4 \u05d1\u05e1\u05e7\u05e8\u05d9\u05e4\u05d8\u05d9\u05dd, \u05d0\u05e4\u05e9\u05e8 \u05dc\u05d4\u05e8\u05d9\u05e5 \u05e7\u05d5\u05d3 \u05db\u05e1\u05e7\u05e8\u05d9\u05e4\u05d8 \u05d1\u05dc\u05d9 \u05dc\u05e7\u05de\u05e4\u05dc \u05d0\u05d5\u05ea\u05d5 \u05de\u05e8\u05d0\u05e9 (\u05dc\u05de\u05e8\u05d5\u05ea \u05e9\u05db\u05de\u05d5\u05d1\u05df \u05d0\u05e4\u05e9\u05e8 \u05dc\u05e7\u05de\u05e4\u05dc).<\/li>\n<\/ul>\n<p>\u05d9\u05e9 \u05e2\u05d5\u05d3 \u05db\u05de\u05d4 \u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05de\u05e2\u05e0\u05d9\u05d9\u05e0\u05d5\u05ea \u05dc\u05e1\u05e7\u05dc\u05d4, \u05d0\u05d1\u05dc \u05d0\u05e0\u05d9 \u05dc\u05d0 \u05d1\u05d0\u05de\u05ea \u05de\u05db\u05d9\u05e8 \u05d0\u05ea \u05d4\u05e9\u05e4\u05d4 \u05dc\u05e2\u05d5\u05de\u05e7 \u05e2\u05d3\u05d9\u05d9\u05df.<\/p>\n<p>\u05d4\u05d7\u05dc\u05d8\u05ea\u05d9 \u05dc\u05dc\u05de\u05d5\u05d3 \u05e1\u05e7\u05dc\u05d4, \u05d5\u05db\u05d3\u05d9 \u05dc\u05e2\u05e9\u05d5\u05ea \u05d0\u05ea \u05d6\u05d4 \u05db\u05ea\u05d1\u05ea\u05d9 \u05de\u05d7\u05d3\u05e9 \u05d0\u05ea \u05d4\u05e1\u05e7\u05e8\u05d9\u05e4\u05d8\u05d9\u05dd \u05d4\u05e7\u05d5\u05d3\u05de\u05d9\u05dd \u05db\u05ea\u05d5\u05db\u05e0\u05d9\u05ea \u05e1\u05e7\u05dc\u05d4 \u05d0\u05d7\u05ea\u00a0 \u05d5\u05d2\u05dd \u05e9\u05d9\u05e4\u05e8\u05ea\u05d9 \u05d0\u05d5\u05ea\u05dd \u05e2\u05dc \u05d4\u05d3\u05e8\u05da \u05dc\u05ea\u05de\u05d5\u05da \u05d1\u05db\u05de\u05d4 \u05e2\u05e8\u05d5\u05e6\u05d9 \u05d9\u05d5\u05d8\u05d9\u05d5\u05d1.<br \/>\n\u05e2\u05e9\u05d9\u05ea\u05d9 \u05d0\u05ea \u05d6\u05d4 \u05e2\u05dd vim, \u05d9\u05e9\u05d9\u05e8\u05d5\u05ea \u05e2\u05dc \u05d4\u05e9\u05e8\u05ea &#8211; \u05d5\u05d1\u05dc\u05d9 \u05dc\u05e7\u05de\u05e4\u05dc, \u05de\u05de\u05e9 \u05db\u05de\u05d5 \u05db\u05ea\u05d9\u05d1\u05d4 \u05e9\u05dc \u05e1\u05e7\u05e8\u05d9\u05e4\u05d8.<br \/>\n\u05d0\u05e0\u05d9 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d3\u05d5\u05d2\u05de\u05d0\u05d5\u05ea \u05d4\u05e7\u05d5\u05d3 \u05e9\u05dc\u05d9 \u05d9\u05db\u05d5\u05dc\u05d5\u05ea \u05dc\u05d4\u05d9\u05d5\u05ea \u05d9\u05d5\u05ea\u05e8 \u05d0\u05dc\u05d2\u05e0\u05d8\u05d9\u05d5\u05ea, \u05d0\u05d1\u05dc \u05d6\u05d4 \u05de\u05d4 \u05e9\u05d9\u05e9 \u05dc\u05d1\u05d9\u05e0\u05ea\u05d9\u05d9\u05dd \ud83d\ude42<br \/>\n\u05d0\u05d6 \u05d6\u05d4 \u05d4main \u05e9\u05dc \u05d4\u05e1\u05e7\u05e8\u05d9\u05e4\u05d8:<\/p>\n<p><code lang=\"scala\"><br \/>\nobject YoutubeRSS<br \/>\n{<br \/>\n    val downloader = new Downloader<br \/>\n    def main(args: Array[String])<br \/>\n    {<br \/>\n        deleteOldFiles<br \/>\n        regenerateFeeds<br \/>\n        Source.fromFile(\"channels\").getLines.foreach(x =>; process(x trim) )<br \/>\n        downloader ! Stop<br \/>\n    }<br \/>\n    \/\/...<br \/>\n}<br \/>\n<\/code><\/p>\n<p>\u05d4\u05ea\u05d5\u05db\u05e0\u05d9\u05ea \u05de\u05e4\u05e2\u05d9\u05dc\u05d4 \u05db\u05de\u05d4 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05d5\u05d0\u05d6 \u05e7\u05d5\u05e8\u05d0\u05ea \u05e9\u05d5\u05e8\u05d5\u05ea \u05de\u05e7\u05d5\u05d1\u05e5,\u00a0 \u05d5\u05e2\u05dc \u05db\u05dc \u05e9\u05d5\u05e8\u05d4 \u05de\u05e4\u05e2\u05d9\u05dc\u05d4 \u05d0\u05ea \u05d4\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d4 process.<br \/>\n\u05dc\u05d1\u05e1\u05d5\u05e3 \u05d4\u05d9\u05d0 \u05e9\u05d5\u05dc\u05d7\u05ea \u05d4\u05d5\u05d3\u05e2\u05ea Stop \u05dcActor \u05e9\u05dc \u05d4Downloader.<br \/>\n\u05d0\u05e4\u05e9\u05e8 \u05dc\u05e9\u05d9\u05dd \u05de\u05d9\u05d3 \u05dc\u05d1 \u05dc\u05db\u05de\u05d4 \u05d3\u05d1\u05e8\u05d9\u05dd:<\/p>\n<ul>\n<li>\u05db\u05e9\u05de\u05e6\u05d4\u05d9\u05e8\u05d9\u05dd \u05e2\u05dc object, \u05d6\u05d4 \u05d1\u05e2\u05e6\u05dd \u05e1\u05d9\u05e0\u05d2\u05dc\u05d8\u05d5\u05df.<\/li>\n<li>\u05d0\u05d9\u05df \u05e0\u05e7\u05d5\u05d3\u05d4-\u05e4\u05e1\u05d9\u05e7 \u05d1\u05e1\u05d5\u05e3 \u05e9\u05d5\u05e8\u05d4, \u05d1\u05e1\u05e7\u05dc\u05d4 \u05d6\u05d4 \u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9.<\/li>\n<li>\u05dc\u05d0 \u05d7\u05d9\u05d9\u05d1\u05d9\u05dd \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05e1\u05d5\u05d2\u05e8\u05d9\u05d9\u05dd \u05db\u05e9\u05e7\u05d5\u05e8\u05d0\u05d9\u05dd \u05dc\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d4 \u05d1\u05dc\u05d9 \u05e4\u05e8\u05de\u05d8\u05e8\u05d9\u05dd (\u05dc\u05de\u05e2\u05e9\u05d4, \u05d0\u05dd \u05d9\u05e9 \u05dc\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d4 \u05e4\u05e8\u05de\u05d8\u05e8 \u05d1\u05d5\u05d3\u05d3 &#8211; \u05d0\u05e4\u05e9\u05e8 \u05d1\u05d3\u05e8\u05da \u05db\u05dc\u05dc \u05dc\u05d5\u05d5\u05ea\u05e8 \u05e2\u05dc \u05d4\u05e1\u05d5\u05d2\u05e8\u05d9\u05d9\u05dd \u05d2\u05dd \u05d0\u05d6)<\/li>\n<li>\u05d1\u05e1\u05e7\u05dc\u05d4 \u05db\u05de\u05e2\u05d8 \u05db\u05dc \u05d3\u05d1\u05e8 \u05d7\u05d5\u05e7\u05d9 \u05db\u05e9\u05dd \u05e9\u05dc \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d4, \u05e1\u05d9\u05de\u05df \u05e7\u05e8\u05d9\u05d0\u05d4 \u05d4\u05d9\u05d0 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d4 \u05d3\u05d9 \u05e0\u05e4\u05d5\u05e6\u05d4 \u05d1\u05d4\u05e8\u05d1\u05d4 \u05e1\u05e4\u05e8\u05d9\u05d5\u05ea.<\/li>\n<\/ul>\n<p>\u05d4\u05e0\u05d4 \u05e2\u05d5\u05d3 \u05e7\u05e6\u05ea \u05de\u05d4\u05ea\u05d5\u05db\u05e0\u05d9\u05ea:<\/p>\n<p><code lang=\"scala\"><br \/>\nobject Conf<br \/>\n{<br \/>\n    val YOUTUBE_CHANNEL_URL = \"http:\/\/gdata.youtube.com\/feeds\/api\/users\/%s\/uploads\"<br \/>\n    val YOUTUBE_PROFILE_URL = \"http:\/\/gdata.youtube.com\/feeds\/api\/users\/%s\"<br \/>\n    val BIN_DIR = \"\/home\/omry\/youtube-rss-2\/bin\"<br \/>\n    val DOWNLOAD_DIR = \"\/home\/omry\/youtube-rss-2\/download\"<br \/>\n    val RSS_WEB_DIR=\"\/home\/omry\/www\/youtube-rss.firefang.net\"<br \/>\n    val RSS_BASE_URL=\"http:\/\/youtube-rss.firefang.net\"<br \/>\n    val DELETE_OLDER=14<br \/>\n}<\/p>\n<p>object YoutubeRSS<br \/>\n{<br \/>\n    \/\/...<br \/>\n    def process(channel : String)<br \/>\n    {<br \/>\n        println(\"Processing channel \" + channel)<br \/>\n        updateFeed(channel)<br \/>\n        val url = Conf.YOUTUBE_CHANNEL_URL.format(channel)<br \/>\n        val rss = Source.fromURL(url).mkString<br \/>\n        val xml = XML.loadString(rss)<br \/>\n        val entries = xml\\\"entry\";<br \/>\n        entries foreach(download(_,channel))<br \/>\n        println(\"Done processing \" + channel)<br \/>\n    }<br \/>\n}<br \/>\n<\/code><\/p>\n<p>\u05d4\u05e7\u05d5\u05e0\u05e4\u05d9\u05d2\u05d5\u05e8\u05e6\u05d9\u05d4 \u05db\u05e8\u05d2\u05e2 \u05d4\u05d9\u05d0 \u05d9\u05e9\u05d9\u05e8\u05d5\u05ea \u05d1\u05e7\u05d5\u05d3 \u05d1\u05ea\u05d5\u05da \u05d0\u05d5\u05d1\u05d9\u05d9\u05e7\u05d8 Conf.<br \/>\n\u05e9\u05d9\u05de\u05d5 \u05dc\u05d1 \u05dc\u05d0\u05dc\u05d2\u05e0\u05d8\u05d9\u05d5\u05ea \u05e9\u05dc \u05d4\u05d1\u05d0\u05ea \u05d4\u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05de\u05d4URL \u05d5\u05d1\u05e2\u05d9\u05e7\u05e8 \u05e9\u05dc \u05e4\u05e8\u05e1\u05d5\u05e8 \u05d4XML,<br \/>\n\u05d4\u05e9\u05d5\u05e8\u05d4 \u05d4\u05e4\u05e9\u05d5\u05d8\u05d4<br \/>\n<code lang=\"scala\"><br \/>\nval entries = xml\\\"entry\";<br \/>\n<\/code><br \/>\n\u05de\u05d7\u05d6\u05d9\u05e8\u05d4 \u05e8\u05e9\u05d9\u05de\u05d4 \u05e9\u05dc entries \u05de\u05ea\u05d5\u05da \u05d4XML (\u05e9\u05d4\u05d5\u05d0 \u05e4\u05d9\u05d3 \u05e8\u05e1\u05e1).<\/p>\n<p>\u05e2\u05d5\u05d3 \u05e7\u05e6\u05ea \u05e7\u05d5\u05d3 \u05de\u05d4\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d4 \u05e9\u05de\u05db\u05d9\u05e0\u05d4 \u05d0\u05ea \u05e7\u05d5\u05d1\u05e5 \u05d4RSS \u05d4\u05e1\u05d5\u05e4\u05d9:<\/p>\n<p><code lang=\"scala\"><br \/>\nnew File(dir).listFiles.<br \/>\n                sortBy(_.lastModified).reverse.<br \/>\n                filter(_.getName().endsWith(\".mp4\")).<br \/>\n                map(file => file.substring(dir.length + 1)).<br \/>\n                foreach(file =><br \/>\n                {<br \/>\n                    val f = new File(dir,file)<br \/>\n                    val entry = new SyndEntryImpl()<br \/>\n                    \/\/..<br \/>\n<\/code><br \/>\n\u05d4\u05e7\u05d5\u05d3 \u05e4\u05d4 \u05de\u05e7\u05d1\u05dc (\u05e2\u05dd API \u05e9\u05dc \u05d2'\u05d0\u05d5\u05d5\u05d4) \u05d0\u05ea \u05e8\u05e9\u05d9\u05de\u05ea \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05d1\u05e1\u05e4\u05e8\u05d9\u05d4, \u05de\u05de\u05d9\u05d9\u05df \u05d0\u05d5\u05ea\u05df \u05dc\u05e4\u05d9 \u05ea\u05d0\u05e8\u05d9\u05da \u05e9\u05d9\u05e0\u05d5\u05d9, \u05d4\u05d5\u05e4\u05da \u05d0\u05ea \u05d4\u05e1\u05d3\u05e8, \u05de\u05e4\u05e2\u05d9\u05dc \u05e4\u05d9\u05dc\u05d8\u05e8 \u05e9\u05de\u05e9\u05d0\u05d9\u05e8 \u05e8\u05e7 \u05e7\u05d1\u05e6\u05d9 mp4, \u05de\u05e4\u05e2\u05d9\u05dc \u05e4\u05d5\u05e7\u05e6\u05d9\u05d9\u05ea map \u05e9\u05de\u05d5\u05e8\u05d9\u05d3\u05d4 \u05d0\u05ea \u05d4\u05e1\u05e4\u05e8\u05d9\u05d4 \u05de\u05e9\u05dd \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d5\u05dc\u05d1\u05e1\u05d5\u05e3 \u05de\u05e4\u05e2\u05d9\u05dc \u05e7\u05d5\u05d3 \u05db\u05dc \u05e1\u05d8\u05e8\u05d9\u05e0\u05d2.<\/p>\n<p>\u05e7\u05e6\u05ea \u05e2\u05dc \u05d4\u05e4\u05e2\u05dc\u05ea \u05ea\u05d4\u05dc\u05d9\u05db\u05d9\u05dd \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9\u05d9\u05dd:<br \/>\n\u05de\u05d9 \u05e9\u05e0\u05d9\u05e1\u05d4 \u05dc\u05d4\u05e4\u05e2\u05d9\u05dc \u05e4\u05e8\u05d5\u05e1\u05e1 \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9 \u05de\u05d2'\u05d0\u05d5\u05d5\u05d4 \u05d1\u05d5\u05d5\u05d3\u05d0\u05d9 \u05d6\u05d5\u05db\u05e8 \u05e9\u05d6\u05d5 \u05dc\u05d0 \u05d7\u05d5\u05d5\u05d9\u05d4 \u05de\u05e8\u05e0\u05d9\u05e0\u05d4, \u05e6\u05e8\u05d9\u05da \u05e9\u05e0\u05d9 Thread\u05d9\u05dd \u05e9\u05d9\u05e7\u05e8\u05d0\u05d5 \u05d0\u05ea \u05d4\u05e4\u05dc\u05d8 \u05e9\u05dc \u05d4\u05ea\u05d4\u05dc\u05d9\u05da (\u05d0\u05d7\u05d3 \u05dc\u05e4\u05dc\u05d8 \u05e1\u05d8\u05e0\u05d3\u05e8\u05d8\u05d9 \u05d5\u05d0\u05d7\u05d3 \u05dc\u05e9\u05d2\u05d9\u05d0\u05d4 \u05e1\u05d8\u05e0\u05d3\u05e8\u05d8\u05d9) \u05d5\u05d1\u05d0\u05d5\u05e4\u05df \u05db\u05dc\u05dc\u05d9 \u05d6\u05d4 \u05d3\u05d9 \u05de\u05e1\u05d5\u05e8\u05d1\u05dc.<br \/>\n\u05d1\u05e1\u05e7\u05dc\u05d4 (2.9 \u05d5\u05de\u05e2\u05dc\u05d4) \u05d6\u05d4 \u05d4\u05e8\u05d1\u05d4 \u05d9\u05d5\u05ea\u05e8 \u05e4\u05e9\u05d5\u05d8:<br \/>\n<code lang=\"scala\"><br \/>\n\/\/ Run process<br \/>\n\"ls -l\"!<br \/>\n\/\/ Run process and get output into string:<br \/>\nval output = \"ls -l\"!!<br \/>\n\/\/ Run process from a list of arguments<br \/>\nval fname = List(\"youtube-dl\", \"--get-filename\",\"-o\",\"download\/\"+channel+\"\/%(uploader)s-%(stitle)s.%(ext)s\",link.toString)!!<br \/>\n<\/code><br \/>\n\u05d4\u05e8\u05d1\u05d4 \u05d9\u05d5\u05ea\u05e8 \u05e0\u05d7\u05de\u05d3 \u05de\u05d1\u05d2'\u05d0\u05d5\u05d5\u05d4.<\/p>\n<p>\u05d0\u05e4\u05e9\u05e8 \u05dc\u05d4\u05d5\u05e8\u05d9\u05d3 \u05d0\u05ea \u05d4\u05db\u05dc <a href=\"http:\/\/files.firefang.net\/YoutubeRSS.zip\">\u05de\u05e4\u05d4<\/a>.<\/p>\n<p>\u05d1\u05e9\u05d5\u05e8\u05d4 \u05d4\u05ea\u05d7\u05ea\u05d5\u05e0\u05d4, \u05d1\u05d9\u05e0\u05ea\u05d9\u05d9\u05dd \u05d0\u05e0\u05d9 \u05d0\u05d5\u05d4\u05d1 \u05d0\u05ea \u05e1\u05e7\u05dc\u05d4, \u05d5\u05e0\u05e8\u05d0\u05d4 \u05dc\u05d9 \u05e9\u05d0\u05e0\u05d9 \u05d0\u05ea\u05d7\u05d9\u05dc \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d4 \u05d1\u05d0\u05d5\u05e4\u05df \u05d9\u05d5\u05ea\u05e8 \u05e7\u05d1\u05d5\u05e2.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u05d1\u05e4\u05d5\u05e1\u05d8 \u05d4\u05e7\u05d5\u05d3\u05dd \u05d3\u05d9\u05d1\u05e8\u05ea\u05d9 \u05e2\u05dc \u05d4\u05e6\u05d5\u05e8\u05da \u05e9\u05dc\u05d9 \u05d1\u05e6\u05e4\u05d9\u05d4 \u05e9\u05dc \u05e1\u05e8\u05d8\u05d5\u05e0\u05d9 \u05d9\u05d5\u05d8\u05d9\u05d5\u05d1 \u05e2\u05dc \u05d4\u05d0\u05d9\u05d9\u05e4\u05d3 \u05db\u05e9\u05d0\u05e0\u05d9 \u05dc\u05d0 \u05de\u05d7\u05d5\u05d1\u05e8, \u05d5\u05e2\u05dc \u05d4\u05e4\u05ea\u05e8\u05d5\u05df \u05e9\u05dc\u05d9 &#8211; \u05e9\u05de\u05d1\u05d5\u05e1\u05e1 \u05e2\u05dc \u05db\u05de\u05d4 \u05e1\u05e7\u05e8\u05d9\u05e4\u05d8\u05d9\u05dd \u05e9\u05e7\u05d5\u05e9\u05e8\u05d9\u05dd \u05d1\u05d9\u05d7\u05d3 \u05d0\u05ea \u05d4\u05dc\u05d5\u05d2\u05d9\u05e7\u05d4 \u05d4\u05d1\u05d0\u05d4: \u05d4\u05d1\u05d0 \u05de\u05d4API \u05e9\u05dc \u05d9\u05d5\u05d8\u05d9\u05d5\u05d1 \u05e4\u05d9\u05d3 RSS \u05e8\u05dc\u05d5\u05d5\u05e0\u05d8\u05d9 \u05d7\u05dc\u05e5 \u05de\u05de\u05e0\u05d5 URL\u05d9\u05dd \u05e9\u05dc \u05e1\u05e8\u05d8\u05d5\u05e0\u05d9\u05dd \u05d4\u05d5\u05e8\u05d3 \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05e0\u05d9\u05dd \u05e2\u05e6\u05de\u05dd \u05de\u05d9\u05d5\u05d8\u05d9\u05d5\u05d1 \u05e2\u05dd youtube-dl \u05e7\u05d5\u05d3\u05d3 \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05e0\u05d9\u05dd \u05dc\u05e4\u05d5\u05e8\u05de\u05d8 \u05e9\u05dc \u05d0\u05d9\u05d9\u05e4\u05d3 \u05e2\u05dd HandBreak &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/firefang.net\/blog\/1840\" class=\"more-link\">\u05dc\u05d4\u05de\u05e9\u05d9\u05da \u05dc\u05e7\u05e8\u05d5\u05d0<span class=\"screen-reader-text\"> \u05e1\u05e7\u05dc\u05d4<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[95,14,17],"tags":[],"class_list":["post-1840","post","type-post","status-publish","format-standard","hentry","category-scala","category-internet","category-open-soruce"],"_links":{"self":[{"href":"https:\/\/firefang.net\/blog\/wp-json\/wp\/v2\/posts\/1840","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/firefang.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/firefang.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/firefang.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/firefang.net\/blog\/wp-json\/wp\/v2\/comments?post=1840"}],"version-history":[{"count":18,"href":"https:\/\/firefang.net\/blog\/wp-json\/wp\/v2\/posts\/1840\/revisions"}],"predecessor-version":[{"id":1857,"href":"https:\/\/firefang.net\/blog\/wp-json\/wp\/v2\/posts\/1840\/revisions\/1857"}],"wp:attachment":[{"href":"https:\/\/firefang.net\/blog\/wp-json\/wp\/v2\/media?parent=1840"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/firefang.net\/blog\/wp-json\/wp\/v2\/categories?post=1840"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/firefang.net\/blog\/wp-json\/wp\/v2\/tags?post=1840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}