Is there a way to directly manipulate ligand dihedrals in PyRosetta? If so, which mover does this?
From the Python level, I wouldn't necessarily use a mover to do it - instead I'd manipulate the pose directly.
Ligand dihedrals are treated identically to residue chi angles, so the pose.set_chi(chinum, resnum, setting) method would be what you want. (Note that that's different from the pose.set_chi(resnum, setting) method, which sets the backbone chi angle on non-protein polymeric residues.)
The tricky bit is getting the chi number you want to move. First get the residue type of the ligand you want to move with pose.residue_type(resnum) On the ResidueType objexct there is a residue_type.last_controling_chi(atomnum) function which gets the chi number for the chi which controls that atom, if any. You can also use the residue_type.chi_atoms(chinum) to get a list of the four atom numbers which make up the chi angle. (The bond being rotated is between the middle two atoms, the fourth atom and anything attached to it is what moves, and the first atom is what is used as the zero angle reference.) Alternatively, you can use residue_type.chi_atoms() with no parameters to get a list of lists. The outer list being an entry for each chi (Remember to compensate for zero-based/one-based indexing differences) and the inner list being the same four atom lists that the parameterized version gets you.
You can convert between atom numbers and atom names with the residue_type.atom_name(atomnum) and residue_type.atom_index(atom_name) methods.