0

How to schedule a DirecTV Now recording

I have installed Playon desktop, and I think I must be missing something obvious.  How to I schedule a DirecTV Now recording?  I'm trying to set it up to record a certain network, at a certain date & time.  If someone can please walk me through this, I would appreciate it.

Thank you!

7 comments

  • 0
    Avatar
    Robert Brown

    PlayOn does not work that way John. You navigate to the "folder" which would be the show you're interested in, and you hit Subscribe. If there are shows already in the folder, click on the record button to start with those right away. If you subscribe to a "folder" then when something new hits the folder, PlayOn will record the new show for you.

  • 0
    Avatar
    John V

    OK, thanks for the clarification.  The marketing says it "works like a DVR" so I assumed that meant you could schedule a recording.  The ability to download an on-demand program to your hard drive hardly qualifies as a DVR in my view, but that's just my opinion.

    I'll be requesting a refund . . .

  • 0
    Avatar
    Robert Brown

    I use both PlayOn for the episodes I miss or the picture wasn't clear from my Plex server's OTA DVR. If you have an over the air antenna and a spare PC, you can add a quad tuner card to your PC and have Plex record your shows. Or if you have a Hulu subscription, you subscribe to the show in the channel folder and PlayOn will record that stream every time a new show pops up. Between both services, I'm covered if something hickups. I'll get my show one way or the other. 

  • 0
    Avatar
    John V

    Robert, do you use PlayOn to record from DirecTV Now?

  • 0
    Avatar
    Robert Brown

    I have. Just keep in mind that you're recording from VOD and not live streaming events. But that being said, I'm having sound quality issues in the Cloud and Desktop products. I'm assuming that compression or something was causing the sound quality issues. It was good enough to get me caught up. I think I'll add Hulu subscription and record from there instead of DTVNow.

  • 1
    Avatar
    Tommy Paulk

    I recently got PlayOn and was disappointed it didn't have a way to record DirecTV Now live tv.

    I play around with Powershell scripts, so I created on. It's pretty rough but maybe someone can use it.

    Since I can't attach files it seems, I'll just lay it out here:

     

    $playonserver=(hostname)
    $loginpage='m.playon.tv' #Home page
    $showiewindow=$False #Show IE window when selecting the recording
    $playondir="D:\Videos" #PlayOn Recording Directory
    $zapexe="C:\Users\Public\NPVR\Scripts\zap2xml.exe" #from http://zap2xml.awardspace.info/
    $comskip="C:\Users\Public\NPVR\Scripts\comskip.exe" #from http://www.comskip.org/
    $recorddb="C:\ProgramData\MediaMall\Recording\recording.db"
    $sqlite="C:\Users\Public\NPVR\Scripts\sqlite3.exe" #from https://www.sqlite.org/download.html
    $username="" #TVguide.com username
    $password="" #TVguide.com password
    $waittime=2000 #Time in milliseconds to wait between some actions
    $renamefile=$True #Set to $True to rename the recording file and run comskip
    $videopath="$playondir\DIRECTV NOW" #Video Path to DirecTV NOW recodings
    $recording=@()
    #$recording+=,((Get-Date "12:00 AM"),1,"TBS",16,"$(Get-Date -Format yyyyMMdd) The Big Bang Theory") #Example of manual recording. Date, priority,channel, minutes, filename
    $shows=@()
    #$shows+=,(6,"TBS","*",$False) #Example, record all new shows on channel TBS
    #$shows+=,(6,"","family guy",$True) #Example, record all family guy episodes on any channel
    #$shows+=,(2,"TBS","The Big Bang*",$True) #Priority (1=High),channel,show name, $True means record all and $False is to only record new episodes

     

    #-------------- DO NOT EDIT BELOW THIS LINE ---------------

    Push-Location
    cd "$([environment]::getfolderpath("mydocuments"))"

    Function Use-RunAs {
    $IsAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")

    if ($MyInvocation.ScriptName -ne "")
    {
    if (-not $IsAdmin)
    {
    try
    {
    Start-Process "$psHome\powershell.exe" -Verb Runas -ArgumentList "-file $($MyInvocation.ScriptName)"
    }
    catch
    {
    Write-Warning "Error - Failed to restart script with runas"
    break
    }
    exit # Quit this session of powershell
    }
    }
    else
    {
    Write-Warning "Error - Script must be saved as a .ps1 file first"
    break
    }
    }

    Use-RunAs
    $ie=new-object -ComObject "InternetExplorer.Application"
    $ie.Visible=$showiewindow
    $ie.Navigate($loginpage)
    while ($ie.readystate -ne 4) {Sleep -milliseconds $waittime}
    $newurl=($ie.Document.all | ?{$_.src -like "http://*"})[0].src
    if ($newurl -eq $null) {sleep 2;$newurl=($ie.Document.all | ?{$_.src -like "http://*"})[0].src}
    $newurl=$newurl -replace "http://", ""
    $newurl="http://$($newurl.Substring(0,$newurl.IndexOf("/")))"
    $ie.quit()
    echo "$(Get-Date) URL set to $newurl" >> shows-record.log
    if (-not (Test-Path guide.xml) -or (dir guide.xml).LastWriteTime -lt (Get-Date).AddHours(-10)) {
    Invoke-Expression "& $zapexe -o guide.xml -z -u ""$username"" -p ""$password"" -d 1"
    }
    E:\users\family\Documents\Daily-WPL-Playlists.ps1
    $xdoc = [xml](gc 'guide.xml')
    $existingrecs=(dir $playondir -Recurse -Include "*.mp4").name
    Foreach ($show in $shows) {
    Foreach ($node in $xdoc.DocumentElement.channel) {
    if ($node.'display-name'[2] -like $show[1] -or $show[1].length -eq 0) {
    $xdoc.DocumentElement.programme | ?{$_.channel -eq $node.id} | foreach {
    If ($_.title.'#text' -like "$($show[2])") {
    if (($_.new -eq "" -and $show[3] -eq $False) -or ($show[3])) {
    $start=$_.start
    $stop=$_.stop
    $start=Get-Date -Year $start.Substring(0,4) -Month $start.Substring(4,2) -day $start.Substring(6,2) -Hour $start.Substring(8,2) -Minute $start.Substring(10,2) -Second 0
    $se="Unk"
    $se="$($_.'episode-num'.'#text'[0])"
    $name="$($_.title.'#text') - $se - $($_.'sub-title'.'#text')"
    $fname=$existingrecs | findstr /I /C:"$($name.Substring($name.lastindexof('-')+2))"
    if ((($start.addseconds(300))) -ge (Get-Date) -and ($fname.length) -lt 1) {
    $stop=Get-Date -Year $stop.Substring(0,4) -Month $stop.Substring(4,2) -day $stop.Substring(6,2) -Hour $stop.Substring(8,2) -Minute $stop.Substring(10,2) -Second 0
    $recording+=,($start,$show[0],$node.'display-name'[2],[int](($stop-$start).totalminutes),$name)
    }
    }

    }
    }
    }
    }
    }

    if ($recording.count -lt 6) {$recording+=,((Get-Date "1/1/1"),99,"Dummy",1,"Dummy")} #Dummy
    $recording = $recording | sort-object @{Expression={$_[0]}; Ascending=$True}
    $filerename=$null
    Foreach ($rec in $recording) {
    Write-Host "Scheduled channel $($rec[2]) with priority $($rec[1]) at $($rec[0]) for $($rec[4])"
    echo "Scheduled channel $($rec[2]) with priority $($rec[1]) at $($rec[0]) for $($rec[4])" >> shows-record.log
    }
    Foreach ($rec in $recording) {
    $name="Test"
    $time=$rec[0]
    $waitsec= [int](($time) - (get-Date)).totalseconds
    if ($waitsec -gt -600 -and (dir "$playondir" -Include "*$($rec[4])*" -Recurse -File).count -eq 0) {
    $waitsec=$waitsec-40
    Write-Host "Recording channel $($rec[2]) at $($rec[0]) for $($rec[3]) minutes"
    echo "$(Get-Date) Recording channel $($rec[2]) at $($rec[0]) for $($rec[3]) minutes" >> shows-record.log
    if ($waitsec -gt 60) {
    If ($filerename) {
    if ((($recdone-(get-date)).totalseconds+300) -lt $waitsec) {
    sleep ([int]($recdone-(get-date)).totalseconds+300)
    Write-Host "Renaming $filerename to $filerename2"
    echo "$(Get-Date) Renaming $filerename to $filerename2" >> shows-record.log
    Rename-Item $filerename $filerename2
    Start-Process $comskip -ArgumentList @("`"$($filerename2)`"")
    $filerename=$null
    $filerename2=$null
    }
    }
    Sleep ($waitsec)
    } else {if ($waitsec -gt 0) {Sleep $waitsec} }
    $waitsec=[int](((Get-Date).AddMinutes($rec[3]) - (get-Date)).totalseconds)
    $waitms=($waitsec*1000)
    $station="$($rec[2])"
    $name="$($rec[4])"
    Switch($station) {
    "TVLAND" {$station='TV Land'}
    "TOON" {$station='Cartoon'}
    "NIK" {$station='Nickelodeon'}
    "NikJr" {$station='Nick Jr'}
    "MTV2-E" {$station='MTV2'}
    "CSPAN" {$station='C-SPAN'}
    }

    echo "Started Recording at $(Get-Date)"
    echo "$(Get-Date) Started Recording" >> shows-record.log
    do {
    Get-Process iexplore -ErrorAction SilentlyContinue | ?{$_.starttime -gt (Get-Date).addminutes(-5)} | Stop-Process
    Sleep -milliseconds ($waittime*2)
    $ie=new-object -ComObject "InternetExplorer.Application"
    $ie.Visible=$showiewindow
    $ie.Navigate("about:blank")
    $ie.refresh()
    sleep -milliseconds ($waittime*4)
    $ie.Navigate($newurl)
    Sleep -Milliseconds $waittime
    while ($ie.readystate -ne 4) {Sleep 1}
    $ie.Document.all | foreach {$_.focus()}
    $tt=0
    $music=$ie.Document.all | ?{$_.id -eq 'category_all'}
    sleep -milliseconds ($waittime*2)
    $ie.Document.all | foreach {$_.focus()}
    If ($music -eq $null) {$music=$ie.Document.all | ?{$_.id -eq 'category_all'}}
    If ($music -eq $null) {
    $tt=31
    } else {
    echo "$(Get-Date) Found ALL at $($music.innertext)" >> shows-record.log
    (1..2) | foreach {$music.click();sleep -milliseconds $waittime}
    while ($ie.readystate -ne 4) {Sleep -milliseconds $waittime}
    $dtvnow=$ie.Document.all | ?{$_.innertext -like 'DIRECTV NOW'}
    If ($dtvnow -eq $null) {
    Sleep -milliseconds $waittime
    $dtvnow=$ie.Document.all | ?{$_.innertext -like 'DIRECTV NOW'}
    }
    (1..2) | foreach {$dtvnow.click();sleep -milliseconds $waittime}
    echo "$(Get-Date) Found DirecTV Now at $($dtvnow.innertext)" >> shows-record.log
    Write-Host "Direct now $($dtvnow.tabindex)"
    Write-Host $dtvnow.innertext
    while ($ie.readystate -ne 4) {Sleep -milliseconds $waittime}
    $nstep=$ie.Document.all | ?{$_.innertext -like 'Home'}
    If ($nstep -eq $null) {
    Sleep -milliseconds $waittime
    $nstep=$ie.Document.all | ?{$_.innertext -like 'Home'}
    }
    echo "$(Get-Date) Found Home at $($nstep.innertext)" >> shows-record.log
    (1..2) | foreach {$nstep.click();sleep -milliseconds $waittime}
    $livetv=$null
    $whatson=$null
    $oldurl=$ie.LocationURL
    (1..3) | foreach {$ie.Document.all | ?{$_.tabindex -eq 3} | foreach {$_.focus()};$whatson=$ie.Document.all | ?{$_.innertext -like "What's On Now"};Sleep -Milliseconds ($waittime*2)}
    if ($whatson -eq $null) {$tt=31}
    $tt++
    }
    } while ($tt -gt 30)
    echo "$(Get-Date) Found What's On Now at $($whatson.innertext)" >> shows-record.log
    if (([int](($time) - (get-Date)).totalseconds+1) -gt 0) {Sleep ([int](($time) - (get-Date)).totalseconds+1)}
    (1..2) | foreach {$whatson.click();sleep -milliseconds $waittime}
    while ($ie.readystate -ne 4) {Sleep -milliseconds $waittime}
    $tt=0
    do {$livetv=$ie.Document.all | ?{$_.innertext -like "Live *"};sleep -Milliseconds $waittime;$tt++} while($livetv -eq $null -and $tt -lt 100)
    $livetv=$null
    $livetv=$ie.Document.all | ?{$_.innertext -like "Live *$station *"}
    echo "$(Get-Date) Found LiveTV at $($livetv.innertext)" >> shows-record.log
    if ($livetv -ne $null) {
    $oldurl=$ie.LocationURL
    $show=$livetv.innertext
    (1..2) | foreach{$livetv.click();sleep -milliseconds $waittime}
    sleep -milliseconds ($waittime*5)
    $ie.Document.all | ?{$_.tabindex -eq 3} | foreach {$_.focus()}
    $oldurl=$ie.LocationURL
    $record=$ie.Document.all | ?{$_.innertext -like 'Record'}
    echo "$(Get-Date) Found Record button at $($record.innertext)" >> shows-record.log
    sleep -milliseconds ($waittime*5)
    $desc=$ie.Document.documentElement.getElementsByClassName('video_info_description')[0].innertext
    while ($ie.readystate -ne 4) {Sleep -Milliseconds $waittime}
    $wname=$ie.LocationName
    $record | foreach {$_.click() }
    $status=Invoke-Expression "& $sqlite $recorddb ""SELECT Status from RecordQueueItems WHERE Status=1;"""
    $dpc=($ie.Document.all | ?{$_.innertext -like $playonserver})[0]
    echo "$(Get-Date) PlayOn server is $($dpc.innertext)" >> shows-record.log
    $dpc.click()
    if (-not ($status)) {Stop-Service "MediaMall Server"}
    sleep -milliseconds $waittime
    $Error.Clear()
    Invoke-Expression "& $sqlite $recorddb ""UPDATE RecordQueueItems SET Status=0,TimeLimit=$waitsec,Description='$name' WHERE id=(SELECT MAX(id) from RecordQueueItems);"""
    $Error.clear()
    if (-not ($status)) {Start-Service "MediaMall Server"}
    if ($Error.count) {$Error.clear();sleep -milliseconds ($waittime*2);Start-Service "MediaMall Server"}
    if ($Error.count) {$Error.clear();sleep -milliseconds ($waittime*2);Start-Service "MediaMall Server"}
    if ($Error.count) {$Error.clear();sleep -milliseconds ($waittime*2);Start-Service "MediaMall Server"}
    Write-Host "Recording $show"
    echo "$(Get-Date) Recording $show" >> shows-record.log
    Write-Host "Description is $desc"
    echo "$(Get-Date) Description is $desc" >> shows-record.log
    $recdone=(get-date).addseconds($waitsec)
    sleep -Milliseconds $waittime
    $ie.quit()
    Get-Process iexplore -ErrorAction SilentlyContinue | ?{$_.starttime -gt (Get-Date).addminutes(-5)} | Stop-Process
    Sleep 600
    If ($filerename -ne $null) {
    Write-Host "Renaming $filerename to $filerename2"
    echo "$(Get-Date) Renaming $filerename to $filerename2" >> shows-record.log
    Rename-Item $filerename $filerename2
    Start-Process $comskip -ArgumentList @("`"$($filerename2)`"")
    }
    $filerename=$null
    $filerename2=$null
    If ($renamefile) {$filerename=("$videopath\$($show).mp4");$filerename2=("$videopath\$($name).mp4")}
    sleep ($waitsec-900)
    } else {
    Get-Process iexplore -ErrorAction SilentlyContinue | ?{$_.starttime -gt (Get-Date).addminutes(-5)} | Stop-Process
    Write-Host "Recording failed for $rec"
    echo "$(Get-Date) Recording failed for $rec" >> shows-record.log
    $waitsec=0
    }
    } else {
    if ($waitsec -gt -86400) {Write-Host "Conflict detected for record time at $rec";echo "$(Get-Date) Conflict detected for record time at $rec" >> shows-record.log}
    else {if ($rec[1] -ne 99) {Write-Host "Recording exists for $($rec[4])";echo "$(Get-Date) Recording exists for $($rec[4])" >> shows-record.log}}
    $waitsec=0
    }
    }
    If ($filerename -ne $null) {
    do {sleep $waittime} while ((dir $filerename).LastWriteTime -gt ((Get-date).AddMinutes(-3)))
    Write-Host "Renaming $filerename to $filerename2"
    echo "$(Get-Date) Renaming $filerename to $filerename2" >> shows-record.log
    Rename-Item $filerename $filerename2
    Start-Process $comskip -ArgumentList @("`"$($filerename2)`"")
    }
    Pop-Location

     

  • 0
    Avatar
    bruce clark

    PlayOn can record DirectTV Now live TV but only while the event is airing, not in advance. If you navigate to the channel you want to record and select "Live TV" then click on record, it will ask you to set how long you want to record. There are times my show comes on at 9PM but I have to start the recording in advance at 8PM then set it to record for 2 hours. Then when I watch it I just drag the slider ahead 1 hour and skip whatever recorded at 8. You can record up to 4 hours then DirecTv Now will throw up a prompt asking if anyone is watching. If you are not there to reply it will stop your recording after 4 hours.

Please sign in to leave a comment.